From: Wolfgang Bumiller Date: Thu, 26 Jul 2012 21:33:19 +0000 (+0200) Subject: Parse named parameters of functions X-Git-Tag: 0.1-rc1~391 X-Git-Url: https://git.xonotic.org/?a=commitdiff_plain;h=a99972d7dd61f0ff3e94cd45f7b0bc2c5c231b7a;hp=5d766f60b28c32e14674ca1c7124c97d5efa48b4;p=xonotic%2Fgmqcc.git Parse named parameters of functions --- diff --git a/parser.c b/parser.c index f644433..4ffb61c 100644 --- a/parser.c +++ b/parser.c @@ -118,6 +118,7 @@ static ast_value *parser_parse_type(parser_t *parser, int basetype, bool *isfunc lex_ctx ctx = parser_ctx(parser); int vtype = basetype; int temptype; + size_t i; MEM_VECTOR_INIT(¶ms, p); @@ -129,54 +130,56 @@ static ast_value *parser_parse_type(parser_t *parser, int basetype, bool *isfunc ast_value *param; bool dummy; - if (!parser_next(parser)) { - MEM_VECTOR_CLEAR(¶ms, p); - return NULL; - } + if (!parser_next(parser)) + goto on_error; if (parser->tok == ')') break; temptype = parser_token(parser)->constval.t; - if (!parser_next(parser)) { - MEM_VECTOR_CLEAR(¶ms, p); - return NULL; - } + if (!parser_next(parser)) + goto on_error; + param = parser_parse_type(parser, temptype, &dummy); (void)dummy; - if (!param) { - MEM_VECTOR_CLEAR(¶ms, p); - return NULL; + if (!param) + goto on_error; + + if (parser->tok == TOKEN_IDENT) { + /* named parameter */ + if (!ast_value_set_name(param, parser_tokval(parser))) + goto on_error; + if (!parser_next(parser)) + goto on_error; } if (!paramlist_t_p_add(¶ms, param)) { - MEM_VECTOR_CLEAR(¶ms, p); parseerror(parser, "Out of memory while parsing typename"); - return NULL; + goto on_error; } if (parser->tok == ',') continue; if (parser->tok == ')') break; - MEM_VECTOR_CLEAR(¶ms, p); parseerror(parser, "Unexpected token"); - return NULL; - } - if (!parser_next(parser)) { - MEM_VECTOR_CLEAR(¶ms, p); - return NULL; + goto on_error; } + if (!parser_next(parser)) + goto on_error; } var = ast_value_new(ctx, "", vtype); - if (!var) { - MEM_VECTOR_CLEAR(¶ms, p); - return NULL; - } + if (!var) + goto on_error; MEM_VECTOR_MOVE(¶ms, p, var, params); return var; +on_error: + for (i = 0; i < params.p_count; ++i) + ast_value_delete(params.p[i]); + MEM_VECTOR_CLEAR(¶ms, p); + return NULL; } typedef struct