Sync to Wine-0_9:
authorGé van Geldorp <ge@gse.nl>
Thu, 27 Oct 2005 17:40:32 +0000 (17:40 +0000)
committerGé van Geldorp <ge@gse.nl>
Thu, 27 Oct 2005 17:40:32 +0000 (17:40 +0000)
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.

svn path=/trunk/; revision=18788

reactos/include/wine/wpp.h
reactos/tools/widl/lex.yy.c
reactos/tools/widl/parser.l
reactos/tools/wpp/lex.yy.c
reactos/tools/wpp/ppl.l
reactos/tools/wpp/preproc.c
reactos/tools/wpp/wpp_private.h

index 681dca7..a6e8657 100644 (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 );
+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 );
 
index d6120ac..ab475b5 100644 (file)
@@ -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 @@ static UUID* parse_uuid(const char*u)
  * 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_MALLOC_DECL
 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 @@ YY_RULE_SETUP
 #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 @@ register char *yy_bp;
 #endif /* ifndef YY_NO_UNPUT */
 
 
+#ifndef YY_NO_INPUT
 #ifdef __cplusplus
 static int yyinput()
 #else
@@ -4007,7 +4007,7 @@ static int input()
 
        return c;
        }
-
+#endif /* YY_NO_INPUT */
 
 #ifdef YY_USE_PROTOS
 void yyrestart( FILE *input_file )
@@ -4118,11 +4118,6 @@ YY_BUFFER_STATE b;
        }
 
 
-#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 @@ 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, 1 )))
             yyerror("Unable to open include file %s", fname);
 
        import_stack[ptr].temp_name = temp_name;
index fba310c..5ea0ed7 100644 (file)
@@ -416,7 +416,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, 1 )))
             yyerror("Unable to open include file %s", fname);
 
        import_stack[ptr].temp_name = temp_name;
index cd83010..51af61c 100644 (file)
@@ -28,7 +28,8 @@
 #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
@@ -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 @@ includelogicentry_t *pp_includelogiclist = NULL;
  * 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_MALLOC_DECL
                        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_MALLOC_DECL
 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 @@ YY_DECL
        /*
         * Detect the leading # of a preprocessor directive.
         */
-#line 14214 "lex.yy.c"
+#line 14200 "lex.yy.c"
 
        if ( yy_init )
                {
@@ -15286,7 +15272,7 @@ YY_RULE_SETUP
 #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 @@ register char *yy_bp;
 #endif /* ifndef YY_NO_UNPUT */
 
 
+#ifndef YY_NO_INPUT
 #ifdef __cplusplus
 static int yyinput()
 #else
@@ -15734,7 +15721,7 @@ static int input()
 
        return c;
        }
-
+#endif /* YY_NO_INPUT */
 
 #ifdef YY_USE_PROTOS
 void yyrestart( FILE *input_file )
@@ -15845,15 +15832,6 @@ YY_BUFFER_STATE b;
        }
 
 
-#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 @@ 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 */
index 9e11301..3a664b3 100644 (file)
@@ -1448,7 +1448,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 */
index e16176c..08c8fba 100644 (file)
@@ -354,10 +354,11 @@ void wpp_add_include_path(const char *path)
        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 @@ char *wpp_find_include(const char *name, int type)
     }
     *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 @@ char *wpp_find_include(const char *name, int type)
     /* 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 @@ char *wpp_find_include(const char *name, int type)
     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)
index 0b3865b..43f078e 100644 (file)
@@ -204,7 +204,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, 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);