makedep: Use a string array to store makefile variables.
This commit is contained in:
parent
708d6d3ae8
commit
c29ea61087
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue