diff --git a/include/asm/macro.h b/include/asm/macro.h index 2f60ee68..2142ea71 100644 --- a/include/asm/macro.h +++ b/include/asm/macro.h @@ -20,7 +20,7 @@ struct MacroArgs; struct MacroArgs *macro_GetCurrentArgs(void); struct MacroArgs *macro_NewArgs(void); -void macro_AppendArg(struct MacroArgs *args, char *s); +void macro_AppendArg(struct MacroArgs **args, char *s); void macro_UseNewArgs(struct MacroArgs *args); void macro_FreeArgs(struct MacroArgs *args); char const *macro_GetArg(uint32_t i); diff --git a/src/asm/asmy.y b/src/asm/asmy.y index 0452d79f..bfa0ef68 100644 --- a/src/asm/asmy.y +++ b/src/asm/asmy.y @@ -720,10 +720,10 @@ macroargs : /* empty */ { } | T_STRING { $$ = macro_NewArgs(); - macro_AppendArg($$, strdup($1)); + macro_AppendArg(&($$), strdup($1)); } | macroargs ',' T_STRING { - macro_AppendArg($$, strdup($3)); + macro_AppendArg(&($$), strdup($3)); } ; diff --git a/src/asm/macro.c b/src/asm/macro.c index 6e8ecf42..00cc139c 100644 --- a/src/asm/macro.c +++ b/src/asm/macro.c @@ -10,13 +10,12 @@ #include "asm/warning.h" struct MacroArgs { - char *args[MAXMACROARGS]; unsigned int nbArgs; unsigned int shift; + char *args[]; }; -static struct MacroArgs defaultArgs = { .nbArgs = 0, .shift = 0 }; -static struct MacroArgs *macroArgs = &defaultArgs; +static struct MacroArgs *macroArgs = NULL; static uint32_t uniqueID = -1; /* * The initialization is somewhat harmful, since it is never used, but it @@ -40,12 +39,13 @@ struct MacroArgs *macro_NewArgs(void) return args; } -void macro_AppendArg(struct MacroArgs *args, char *s) +void macro_AppendArg(struct MacroArgs **args, char *s) { - if (args->nbArgs == MAXMACROARGS) + if ((**args).nbArgs == MAXMACROARGS) yyerror("A maximum of " EXPAND_AND_STR(MAXMACROARGS) " arguments is allowed"); - args->args[args->nbArgs++] = s; + *args = realloc(*args, sizeof **args + sizeof (char *) * (1 + (**args).nbArgs)); + (**args).args[(**args).nbArgs++] = s; } void macro_UseNewArgs(struct MacroArgs *args)