makedep: Use a string array to store makefile variables.

This commit is contained in:
Alexandre Julliard 2013-12-26 19:25:57 +01:00
parent 708d6d3ae8
commit c29ea61087
1 changed files with 48 additions and 47 deletions

View File

@ -92,15 +92,7 @@ static const struct strarray empty_strarray;
static struct strarray include_args; static struct strarray include_args;
static struct strarray object_extensions; static struct strarray object_extensions;
static struct strarray make_vars;
struct make_var
{
char *name;
char *value;
};
static struct make_var *make_vars;
static unsigned int nb_make_vars;
static const char *base_dir = "."; static const char *base_dir = ".";
static const char *src_dir; static const char *src_dir;
@ -1212,9 +1204,9 @@ static char *get_make_variable( const char *name )
{ {
unsigned int i; unsigned int i;
for (i = 0; i < nb_make_vars; i++) for (i = 0; i < make_vars.count; i += 2)
if (!strcmp( make_vars[i].name, name )) if (!strcmp( make_vars.str[i], name ))
return xstrdup( make_vars[i].value ); return xstrdup( make_vars.str[i + 1] );
return NULL; return NULL;
} }
@ -1252,7 +1244,13 @@ static char *get_expanded_make_variable( const char *name )
free( expand ); free( expand );
expand = tmp; expand = tmp;
} }
return expand;
/* consider empty variables undefined */
p = expand;
while (*p && isspace(*p)) p++;
if (*p) return expand;
free( expand );
return NULL;
} }
@ -1271,13 +1269,45 @@ static struct strarray get_expanded_make_var_array( const char *name )
} }
/*******************************************************************
* set_make_variable
*/
static int set_make_variable( struct strarray *array, const char *assignment )
{
unsigned int i;
char *p, *name;
p = name = xstrdup( assignment );
while (isalnum(*p) || *p == '_') p++;
if (name == p) return 0; /* not a variable */
if (isspace(*p))
{
*p++ = 0;
while (isspace(*p)) p++;
}
if (*p != '=') return 0; /* not an assignment */
*p++ = 0;
while (isspace(*p)) p++;
/* redefining a variable replaces the previous value */
for (i = 0; i < array->count; i += 2)
{
if (strcmp( array->str[i], name )) continue;
array->str[i + 1] = p;
return 1;
}
strarray_add( array, name );
strarray_add( array, p );
return 1;
}
/******************************************************************* /*******************************************************************
* parse_makefile * parse_makefile
*/ */
static void parse_makefile(void) static void parse_makefile(void)
{ {
char *buffer; char *buffer;
unsigned int i, vars_size = 0;
FILE *file; FILE *file;
input_file_name = strmake( "%s/%s", base_dir, makefile_name ); input_file_name = strmake( "%s/%s", base_dir, makefile_name );
@ -1287,43 +1317,14 @@ static void parse_makefile(void)
exit( 1 ); exit( 1 );
} }
nb_make_vars = 0;
input_line = 0; input_line = 0;
while ((buffer = get_line( file ))) while ((buffer = get_line( file )))
{ {
char *name, *p = buffer;
if (Separator && !strncmp( buffer, Separator, strlen(Separator) )) break; if (Separator && !strncmp( buffer, Separator, strlen(Separator) )) break;
while (isspace(*p)) p++; if (*buffer == '\t') continue; /* command */
if (*p == '#') continue; /* comment */ while (isspace( *buffer )) buffer++;
name = p; if (*buffer == '#') continue; /* comment */
while (isalnum(*p) || *p == '_') p++; set_make_variable( &make_vars, buffer );
if (name == p) continue; /* not a variable */
if (isspace(*p))
{
*p++ = 0;
while (isspace(*p)) p++;
}
if (*p != '=') continue; /* not an assignment */
*p++ = 0;
while (isspace(*p)) p++;
/* redefining a variable replaces the previous value */
for (i = 0; i < nb_make_vars; i++)
if (!strcmp( make_vars[i].name, name )) break;
if (i == nb_make_vars)
{
if (nb_make_vars == vars_size)
{
vars_size *= 2;
if (!vars_size) vars_size = 32;
make_vars = xrealloc( make_vars, vars_size * sizeof(*make_vars) );
}
make_vars[nb_make_vars++].name = xstrdup( name );
}
else free( make_vars[i].value );
make_vars[i].value = xstrdup( p );
} }
fclose( file ); fclose( file );
input_file_name = NULL; input_file_name = NULL;