Files
@ 3c7d72a33482
Branch filter:
Location: ohnobinki_overlay/dev-libs/confuse/files/confuse-2.6-relativeincludes.patch - annotation
3c7d72a33482
1.5 KiB
text/x-diff
app-text/openjade: manifest
3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e 3bd101344e8e | --- a/src/lexer.l
+++ b/src/lexer.l
@@ -298,12 +298,51 @@ int cfg_lexer_include(cfg_t *cfg, const char *filename)
cfg_include_stack[cfg_include_stack_ptr].line = cfg->line;
cfg_include_stack_ptr++;
- xfilename = cfg_tilde_expand(filename);
+ xfilename = NULL;
+
+ if(filename[0] != '/'
+ && filename[0] != '~'
+ /* ensure that the existing file has directories in it */
+#ifdef _WIN32
+ && (strchr(cfg->filename, '\\')
+ || strchr(cfg->filename, '/'))
+#else
+ && cfg->filename[0] == '/'
+#endif
+ )
+ /* then this path is relative to the file it was included from */
+ {
+ char *lastslash;
+ size_t prefixlen;
+
+ lastslash = strrchr(cfg->filename, '/');
+#ifdef _WIN32
+ {
+ char *win32slash;
+
+ win32slash = strrchr(cfg->filename, '\\');
+ if(!lastslash
+ || win32slash > lastslash)
+ lastslash = win32slash;
+ }
+#endif
+ assert(lastslash);
+ prefixlen = lastslash - cfg->filename + 1; /* length of prefix including slash */
+ xfilename = malloc(prefixlen
+ + strlen(filename)
+ + 1); /* NULL terminator */
+ assert(xfilename);
+ strncpy(xfilename, cfg->filename, prefixlen);
+ strcpy(xfilename + prefixlen, filename);
+ }
+
+ if(!xfilename)
+ xfilename = cfg_tilde_expand(filename);
cfg_yyin = fopen(xfilename, "r");
if(!cfg_yyin) {
- cfg_error(cfg, "%s: %s", xfilename, strerror(errno));
+ cfg_error(cfg, "%s (expanded from %s): %s", xfilename, filename, strerror(errno));
free(xfilename);
return 1;
}
|