Alexandre Julliard : makedep: Use string arrays for include paths and object extensions.

Alexandre Julliard julliard at winehq.org
Tue Nov 19 13:28:35 CST 2013


Module: wine
Branch: master
Commit: a072dbc1806375c0e5445e4285689bb5843e5703
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=a072dbc1806375c0e5445e4285689bb5843e5703

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Nov 19 11:36:25 2013 +0100

makedep: Use string arrays for include paths and object extensions.

---

 tools/makedep.c |  120 +++++++++++++++++-------------------------------------
 1 files changed, 38 insertions(+), 82 deletions(-)

diff --git a/tools/makedep.c b/tools/makedep.c
index eb69bec..29e78d0 100644
--- a/tools/makedep.c
+++ b/tools/makedep.c
@@ -81,22 +81,6 @@ static const struct
 static struct list sources = LIST_INIT(sources);
 static struct list includes = LIST_INIT(includes);
 
-struct object_extension
-{
-    struct list entry;
-    const char *extension;
-};
-
-static struct list object_extensions = LIST_INIT(object_extensions);
-
-struct incl_path
-{
-    struct list entry;
-    const char *name;
-};
-
-static struct list paths = LIST_INIT(paths);
-
 struct strarray
 {
     unsigned int count;  /* strings in use */
@@ -104,6 +88,9 @@ struct strarray
     const char **str;
 };
 
+static struct strarray paths;
+static struct strarray object_extensions;
+
 static const char *src_dir;
 static const char *top_src_dir;
 static const char *top_obj_dir;
@@ -291,6 +278,19 @@ static void strarray_add( struct strarray *array, const char *str )
 
 
 /*******************************************************************
+ *         strarray_insert
+ */
+static void strarray_insert( struct strarray *array, unsigned int pos, const char *str )
+{
+    unsigned int i;
+
+    strarray_add( array, NULL );
+    for (i = array->count - 1; i > pos; i--) array->str[i] = array->str[i - 1];
+    array->str[pos] = str;
+}
+
+
+/*******************************************************************
  *         output_filename
  */
 static void output_filename( const char *name, int *column )
@@ -418,30 +418,6 @@ static char *get_line( FILE *file )
 }
 
 /*******************************************************************
- *         add_object_extension
- *
- * Add an extension for object files.
- */
-static void add_object_extension( const char *ext )
-{
-    struct object_extension *object_extension = xmalloc( sizeof(*object_extension) );
-    list_add_tail( &object_extensions, &object_extension->entry );
-    object_extension->extension = ext;
-}
-
-/*******************************************************************
- *         add_include_path
- *
- * Add a directory to the include path.
- */
-static void add_include_path( const char *name )
-{
-    struct incl_path *path = xmalloc( sizeof(*path) );
-    list_add_tail( &paths, &path->entry );
-    path->name = name;
-}
-
-/*******************************************************************
  *         find_src_file
  */
 static struct incl_file *find_src_file( const char *name )
@@ -560,7 +536,7 @@ static FILE *open_include_file( struct incl_file *pFile )
 {
     FILE *file = NULL;
     char *filename, *p;
-    struct incl_path *path;
+    unsigned int i;
 
     errno = ENOENT;
 
@@ -666,24 +642,17 @@ static FILE *open_include_file( struct incl_file *pFile )
         free( filename );
     }
 
-    /* now try in global includes */
-    if (top_obj_dir)
-    {
-        filename = strmake( "%s/include/%s", top_obj_dir, pFile->name );
-        if ((file = fopen( filename, "r" ))) goto found;
-        free( filename );
-    }
-    if (top_src_dir)
-    {
-        filename = strmake( "%s/include/%s", top_src_dir, pFile->name );
-        if ((file = fopen( filename, "r" ))) goto found;
-        free( filename );
-    }
-
     /* now search in include paths */
-    LIST_FOR_EACH_ENTRY( path, &paths, struct incl_path, entry )
+    for (i = 0; i < paths.count; i++)
     {
-        filename = strmake( "%s/%s", path->name, pFile->name );
+        if (paths.str[i][0] == '/')
+        {
+            /* ignore absolute paths that don't point into the source dir */
+            if (!top_src_dir) continue;
+            if (strncmp( paths.str[i], top_src_dir, strlen(top_src_dir) )) continue;
+            if (paths.str[i][strlen(top_src_dir)] != '/') continue;
+        }
+        filename = strmake( "%s/%s", paths.str[i], pFile->name );
         if ((file = fopen( filename, "r" ))) goto found;
         free( filename );
     }
@@ -1300,12 +1269,11 @@ static void output_sources(void)
         }
         else
         {
-            struct object_extension *obj_ext;
-            LIST_FOR_EACH_ENTRY( obj_ext, &object_extensions, struct object_extension, entry )
+            for (i = 0; i < object_extensions.count; i++)
             {
-                strarray_add( &clean_files, strmake( "%s.%s", obj, obj_ext->extension ));
-                output( "%s.%s: %s\n", obj, obj_ext->extension, source->filename );
-                if (strstr( obj_ext->extension, "cross" ))
+                strarray_add( &clean_files, strmake( "%s.%s", obj, object_extensions.str[i] ));
+                output( "%s.%s: %s\n", obj, object_extensions.str[i], source->filename );
+                if (strstr( object_extensions.str[i], "cross" ))
                     output( "\t$(CROSSCC) -c $(ALLCROSSCFLAGS) -o $@ %s\n", source->filename );
                 else
                     output( "\t$(CC) -c $(ALLCFLAGS) -o $@ %s\n", source->filename );
@@ -1321,8 +1289,8 @@ static void output_sources(void)
                 output( "%s.ok:\n", obj );
                 output( "\t$(RUNTEST) $(RUNTESTFLAGS) %s && touch $@\n", obj );
             }
-            LIST_FOR_EACH_ENTRY( obj_ext, &object_extensions, struct object_extension, entry )
-                column += output( "%s.%s ", obj, obj_ext->extension );
+            for (i = 0; i < object_extensions.count; i++)
+                column += output( "%s.%s ", obj, object_extensions.str[i] );
             if (source->flags & FLAG_C_IMPLIB) column += output( "%s.cross.o", obj );
             column += output( ":" );
         }
@@ -1498,7 +1466,7 @@ static void parse_option( const char *opt )
     switch(opt[1])
     {
     case 'I':
-        if (opt[2]) add_include_path( opt + 2 );
+        if (opt[2]) strarray_add( &paths, xstrdup( opt + 2 ));
         break;
     case 'C':
         src_dir = opt + 2;
@@ -1523,7 +1491,7 @@ static void parse_option( const char *opt )
         else Separator = NULL;
         break;
     case 'x':
-        if (opt[2]) add_object_extension( opt + 2 );
+        if (opt[2]) strarray_add( &object_extensions, xstrdup( opt + 2 ));
         break;
     default:
         fprintf( stderr, "Unknown option '%s'\n%s", opt, Usage );
@@ -1538,7 +1506,6 @@ static void parse_option( const char *opt )
 int main( int argc, char *argv[] )
 {
     struct incl_file *pFile;
-    struct incl_path *path, *next;
     int i, j;
 
     i = 1;
@@ -1571,22 +1538,11 @@ int main( int argc, char *argv[] )
     if (src_dir && !strcmp( src_dir, "." )) src_dir = NULL;
     if (top_src_dir && top_obj_dir && !strcmp( top_src_dir, top_obj_dir )) top_src_dir = NULL;
 
-    /* set the default extension list for object files */
-    if (list_empty( &object_extensions ))
-        add_object_extension( "o" );
+    if (top_src_dir) strarray_insert( &paths, 0, strmake( "%s/include", top_src_dir ));
+    if (top_obj_dir) strarray_insert( &paths, 0, strmake( "%s/include", top_obj_dir ));
 
-    /* get rid of absolute paths that don't point into the source dir */
-    LIST_FOR_EACH_ENTRY_SAFE( path, next, &paths, struct incl_path, entry )
-    {
-        if (path->name[0] != '/') continue;
-        if (top_src_dir)
-        {
-            if (!strncmp( path->name, top_src_dir, strlen(top_src_dir) ) &&
-                path->name[strlen(top_src_dir)] == '/') continue;
-        }
-        list_remove( &path->entry );
-        free( path );
-    }
+    /* set the default extension list for object files */
+    if (!object_extensions.count) strarray_add( &object_extensions, "o" );
 
     for (i = 1; i < argc; i++) add_src_file( argv[i] );
     add_generated_sources();




More information about the wine-cvs mailing list