X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Flexer%2Fmacro.c;h=e5805f035670b33e7b6f62aea55b58a623818ad4;hb=e86d3e8623564b379e6097a3df9e7232e8087160;hp=814740bfac4e29bea9dc1365864c725034acbad0;hpb=340f224bd085965d5ff724afdafa04759f8a040f;p=pspp diff --git a/src/language/lexer/macro.c b/src/language/lexer/macro.c index 814740bfac..e5805f0356 100644 --- a/src/language/lexer/macro.c +++ b/src/language/lexer/macro.c @@ -334,6 +334,8 @@ classify_token (enum token_type type) case T_RPAREN: case T_LBRACK: case T_RBRACK: + case T_LCURLY: + case T_RCURLY: return TC_PUNCT; case T_PLUS: @@ -341,6 +343,7 @@ classify_token (enum token_type type) case T_ASTERISK: case T_SLASH: case T_EQUALS: + case T_COLON: case T_AND: case T_OR: case T_NOT: @@ -359,6 +362,7 @@ classify_token (enum token_type type) return TC_BINOP; case T_COMMA: + case T_SEMICOLON: return TC_COMMA; } @@ -707,7 +711,8 @@ mc_enclose (struct macro_call *mc, const struct macro_token *mt, mc->n_tokens++; struct macro_tokens **argp = &mc->args[p - mc->macro->params]; - *argp = xzalloc (sizeof **argp); + if (!*argp) + *argp = xzalloc (sizeof **argp); mc->state = MC_ARG; return 0; } @@ -1134,7 +1139,10 @@ expand_macro_function (const struct macro_expander *me, struct string_array args = STRING_ARRAY_INITIALIZER; size_t n_consumed = parse_function_args (me, input, n_input, mf->name, &args); if (!n_consumed) - return 0; + { + string_array_destroy (&args); + return 0; + } if (args.n < mf->min_args || args.n > mf->max_args) { @@ -1157,6 +1165,7 @@ expand_macro_function (const struct macro_expander *me, mf->name); else NOT_REACHED (); + string_array_destroy (&args); return 0; } @@ -1835,6 +1844,7 @@ macro_expand_do (const struct macro_token *tokens, size_t n_tokens, macro_expand (p, do_end - p, &subme, exp); } + macro_tokens_uninit (&items); return do_end - tokens + 1; } else if (p < end && p->token.type == T_EQUALS)