Files
@ 3bd101344e8e
Branch filter:
Location: ohnobinki_overlay/dev-libs/confuse/files/confuse-2.6-relativeincludes.patch - annotation
3bd101344e8e
1.5 KiB
text/x-diff
added confuse with relative includes patch
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;
}
|