Sync to Wine-0_9: Alexandre Julliard julliard@winehq.org - Default search path for an include file should be based on the path of the parent source file, not the current directory. Modified: trunk/reactos/include/wine/wpp.h Modified: trunk/reactos/tools/widl/lex.yy.c Modified: trunk/reactos/tools/widl/parser.l Modified: trunk/reactos/tools/wpp/lex.yy.c Modified: trunk/reactos/tools/wpp/ppl.l Modified: trunk/reactos/tools/wpp/preproc.c Modified: trunk/reactos/tools/wpp/wpp_private.h _____
Modified: trunk/reactos/include/wine/wpp.h --- trunk/reactos/include/wine/wpp.h 2005-10-27 14:17:43 UTC (rev 18787) +++ trunk/reactos/include/wine/wpp.h 2005-10-27 17:40:32 UTC (rev 18788) @@ -29,7 +29,7 @@
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 ); +char *wpp_find_include( const char *name, const char *parent_name, int type ); extern int wpp_parse( const char *input, FILE *output ); extern int wpp_parse_temp( const char *input, const char *output_base, char **output_name );
_____
Modified: trunk/reactos/tools/widl/lex.yy.c --- trunk/reactos/tools/widl/lex.yy.c 2005-10-27 14:17:43 UTC (rev 18787) +++ trunk/reactos/tools/widl/lex.yy.c 2005-10-27 17:40:32 UTC (rev 18788) @@ -1,4 +1,3 @@
-#line 2 "lex.yy.c" /* A lexical scanner generated by flex */
/* Scanner skeleton version: @@ -10,6 +9,7 @@ #define YY_FLEX_MINOR_VERSION 5
#include <stdio.h> +#include <unistd.h>
/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ @@ -23,7 +23,6 @@ #ifdef __cplusplus
#include <stdlib.h> -#include <unistd.h>
/* Use prototypes in function declarations. */ #define YY_USE_PROTOS @@ -3186,7 +3185,7 @@ * The flexer starts here
************************************************************************ ** */ -#line 3190 "lex.yy.c" +#line 3189 "lex.yy.c"
/* Macros after this point can all be overridden by user definitions in * section 1. @@ -3337,12 +3336,12 @@ YY_DECL { register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; + register char *yy_cp = NULL, *yy_bp = NULL; register int yy_act;
#line 108 "parser.l"
-#line 3346 "lex.yy.c" +#line 3345 "lex.yy.c"
if ( yy_init ) { @@ -3559,7 +3558,7 @@ #line 164 "parser.l" ECHO; YY_BREAK -#line 3563 "lex.yy.c" +#line 3562 "lex.yy.c"
case YY_END_OF_BUFFER: { @@ -3935,6 +3934,7 @@ #endif /* ifndef YY_NO_UNPUT */
+#ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput() #else @@ -4007,8 +4007,8 @@
return c; } +#endif /* YY_NO_INPUT */
- #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else @@ -4118,11 +4118,6 @@ }
-#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif
#ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) @@ -4696,7 +4691,7 @@ import->next = first_import; first_import = import;
- if (!(path = wpp_find_include( fname, 1 ))) + if (!(path = wpp_find_include( fname, input_name, 1 ))) yyerror("Unable to open include file %s", fname);
import_stack[ptr].temp_name = temp_name; _____
Modified: trunk/reactos/tools/widl/parser.l --- trunk/reactos/tools/widl/parser.l 2005-10-27 14:17:43 UTC (rev 18787) +++ trunk/reactos/tools/widl/parser.l 2005-10-27 17:40:32 UTC (rev 18788) @@ -416,7 +416,7 @@
import->next = first_import; first_import = import;
- if (!(path = wpp_find_include( fname, 1 ))) + if (!(path = wpp_find_include( fname, input_name, 1 ))) yyerror("Unable to open include file %s", fname);
import_stack[ptr].temp_name = temp_name; _____
Modified: trunk/reactos/tools/wpp/lex.yy.c --- trunk/reactos/tools/wpp/lex.yy.c 2005-10-27 14:17:43 UTC (rev 18787) +++ trunk/reactos/tools/wpp/lex.yy.c 2005-10-27 17:40:32 UTC (rev 18788) @@ -28,8 +28,9 @@
#define YY_FLEX_MINOR_VERSION 5
#include <stdio.h> -#include <errno.h> +#include <unistd.h>
+ /* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ #ifdef c_plusplus #ifndef __cplusplus @@ -41,9 +42,6 @@ #ifdef __cplusplus
#include <stdlib.h> -#ifndef _WIN32 -#include <unistd.h> -#endif
/* Use prototypes in function declarations. */ #define YY_USE_PROTOS @@ -83,7 +81,6 @@ #define YY_PROTO(proto) () #endif
- /* Returned upon end-of-file. */ #define YY_NULL 0
@@ -14031,7 +14028,7 @@ * The scanner starts here
************************************************************************ ** */ -#line 14035 "lex.yy.c" +#line 14032 "lex.yy.c"
/* Macros after this point can all be overridden by user definitions in * section 1. @@ -14131,20 +14128,9 @@ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ - else \ - { \ - errno=0; \ - while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ - { \ - if( errno != EINTR) \ - { \ - YY_FATAL_ERROR( "input in flex scanner failed" ); \ - break; \ - } \ - errno=0; \ - clearerr(yyin); \ - } \ - } + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); #endif
/* No semi-colon after return; correct usage is to write "yyterminate();" - @@ -14193,7 +14179,7 @@ YY_DECL { register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; + register char *yy_cp = NULL, *yy_bp = NULL; register int yy_act;
#line 299 "ppl.l" @@ -14210,7 +14196,7 @@ /* * Detect the leading # of a preprocessor directive. */ -#line 14214 "lex.yy.c" +#line 14200 "lex.yy.c"
if ( yy_init ) { @@ -15286,7 +15272,7 @@ #line 724 "ppl.l" ECHO; YY_BREAK -#line 15290 "lex.yy.c" +#line 15276 "lex.yy.c"
case YY_END_OF_BUFFER: { @@ -15662,6 +15648,7 @@ #endif /* ifndef YY_NO_UNPUT */
+#ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput() #else @@ -15734,8 +15721,8 @@
return c; } +#endif /* YY_NO_INPUT */
- #ifdef YY_USE_PROTOS void yyrestart( FILE *input_file ) #else @@ -15845,15 +15832,6 @@ }
-#ifndef _WIN32 -#include <unistd.h> -#else -#ifndef YY_ALWAYS_INTERACTIVE -#ifndef YY_NEVER_INTERACTIVE -extern int isatty YY_PROTO(( int )); -#endif -#endif -#endif
#ifdef YY_USE_PROTOS void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) @@ -16899,7 +16877,7 @@ /* 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 */ _____
Modified: trunk/reactos/tools/wpp/ppl.l --- trunk/reactos/tools/wpp/ppl.l 2005-10-27 14:17:43 UTC (rev 18787) +++ trunk/reactos/tools/wpp/ppl.l 2005-10-27 17:40:32 UTC (rev 18788) @@ -1448,7 +1448,7 @@
/* 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 */ _____
Modified: trunk/reactos/tools/wpp/preproc.c --- trunk/reactos/tools/wpp/preproc.c 2005-10-27 14:17:43 UTC (rev 18787) +++ trunk/reactos/tools/wpp/preproc.c 2005-10-27 17:40:32 UTC (rev 18788) @@ -354,10 +354,11 @@
free(cpy); }
-char *wpp_find_include(const char *name, int type) +char *wpp_find_include(const char *name, const char *parent_name, int type) { char *cpy; char *cptr; + char *path; const char *ccptr; int i, fd;
@@ -379,15 +380,24 @@ } *cptr = '\0';
- if(type == LOCAL_INCLUDE) + if(type == LOCAL_INCLUDE && 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 ); }
/* Skip all directories till the current include file for #include_next. */ @@ -416,7 +426,6 @@ /* Search -I path */ for(; i < nincludepath; i++) { - char *path; path = pp_xmalloc(strlen(includepath[i]) + strlen(cpy) + 2); strcpy(path, includepath[i]); strcat(path, "/"); @@ -434,12 +443,12 @@ return NULL; }
-FILE *pp_open_include(const char *name, int type, char **newpath) +FILE *pp_open_include(const char *name, const char *parent_name, char **newpath, int type) { char *path; FILE *fp;
- if (!(path = wpp_find_include( name, type ))) return NULL; + if (!(path = wpp_find_include( name, parent_name, type ))) return NULL; fp = fopen(path, "rt");
if (fp) _____
Modified: trunk/reactos/tools/wpp/wpp_private.h --- trunk/reactos/tools/wpp/wpp_private.h 2005-10-27 14:17:43 UTC (rev 18787) +++ trunk/reactos/tools/wpp/wpp_private.h 2005-10-27 17:40:32 UTC (rev 18788) @@ -204,7 +204,7 @@
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, int type); void pp_push_if(pp_if_state_t s); void pp_next_if_state(int); pp_if_state_t pp_pop_if(void);