Default search path for an include file should be based on the path of

the parent source file, not the current directory.
This commit is contained in:
Alexandre Julliard 2005-10-10 18:06:50 +00:00
parent e573caf8f9
commit 36c3199782
6 changed files with 22 additions and 13 deletions

View File

@ -29,7 +29,7 @@ extern void wpp_add_cmdline_define( const char *value );
extern void wpp_set_debug( int lex_debug, int parser_debug, int msg_debug );
extern void wpp_set_pedantic( int on );
extern void wpp_add_include_path( const char *path );
extern char *wpp_find_include( const char *name, int search );
extern char *wpp_find_include( const char *name, const char *parent_name );
extern int wpp_parse( const char *input, FILE *output );
extern int wpp_parse_temp( const char *input, const char *output_base, char **output_name );

View File

@ -1445,7 +1445,7 @@ void pp_do_include(char *fname, int type)
/* Undo the effect of the quotation */
fname[n-1] = '\0';
if((ppin = pp_open_include(fname+1, type, &newpath)) == NULL)
if((ppin = pp_open_include(fname+1, type ? pp_status.input : NULL, &newpath)) == NULL)
pperror("Unable to open include file %s", fname+1);
fname[n-1] = *fname; /* Redo the quotes */

View File

@ -355,10 +355,11 @@ void wpp_add_include_path(const char *path)
free(cpy);
}
char *wpp_find_include(const char *name, int search)
char *wpp_find_include(const char *name, const char *parent_name)
{
char *cpy;
char *cptr;
char *path;
const char *ccptr;
int i, fd;
@ -380,20 +381,28 @@ char *wpp_find_include(const char *name, int search)
}
*cptr = '\0';
if(search)
if(parent_name)
{
/* Search current dir and then -I path */
fd = open( cpy, O_RDONLY );
/* Search directory of parent include and then -I path */
const char *p;
if ((p = strrchr( parent_name, '/' ))) p++;
else p = parent_name;
path = pp_xmalloc( (p - parent_name) + strlen(cpy) + 1 );
memcpy( path, parent_name, p - parent_name );
strcpy( path + (p - parent_name), cpy );
fd = open( path, O_RDONLY );
if (fd != -1)
{
close( fd );
return cpy;
free( cpy );
return path;
}
free( path );
}
/* Search -I path */
for(i = 0; i < nincludepath; i++)
{
char *path;
path = pp_xmalloc(strlen(includepath[i]) + strlen(cpy) + 2);
strcpy(path, includepath[i]);
strcat(path, "/");
@ -411,12 +420,12 @@ char *wpp_find_include(const char *name, int search)
return NULL;
}
FILE *pp_open_include(const char *name, int search, char **newpath)
FILE *pp_open_include(const char *name, const char *parent_name, char **newpath)
{
char *path;
FILE *fp;
if (!(path = wpp_find_include( name, search ))) return NULL;
if (!(path = wpp_find_include( name, parent_name ))) return NULL;
fp = fopen(path, "rt");
if (fp)

View File

@ -200,7 +200,7 @@ void pp_pop_define_state(void);
pp_entry_t *pp_add_define(char *def, char *text);
pp_entry_t *pp_add_macro(char *ident, marg_t *args[], int nargs, mtext_t *exp);
void pp_del_define(const char *name);
FILE *pp_open_include(const char *name, int search, char **newpath);
FILE *pp_open_include(const char *name, const char *parent_name, char **newpath);
void pp_push_if(pp_if_state_t s);
void pp_next_if_state(int);
pp_if_state_t pp_pop_if(void);

View File

@ -417,7 +417,7 @@ int do_import(char *fname)
import->next = first_import;
first_import = import;
if (!(path = wpp_find_include( fname, 1 )))
if (!(path = wpp_find_include( fname, input_name )))
yyerror("Unable to open include file %s", fname);
import_stack[ptr].temp_name = temp_name;

View File

@ -2311,7 +2311,7 @@ static raw_data_t *load_file(string_t *filename, language_t *lang)
if (codepage <= 0 && filename->type != str_char)
yyerror("Cannot convert filename to ASCII string");
name = convert_string( filename, str_char, codepage );
if (!(path = wpp_find_include(name->str.cstr, 1)))
if (!(path = wpp_find_include(name->str.cstr, input_name)))
yyerror("Cannot open file %s", name->str.cstr);
if (!(fp = fopen( path, "rb" )))
yyerror("Cannot open file %s", name->str.cstr);