diff options
Diffstat (limited to 'editors')
-rw-r--r-- | editors/awk.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/editors/awk.c b/editors/awk.c index 1115085da..c05d5d651 100644 --- a/editors/awk.c +++ b/editors/awk.c | |||
@@ -139,6 +139,7 @@ typedef struct chain_s { | |||
139 | /* Function */ | 139 | /* Function */ |
140 | typedef struct func_s { | 140 | typedef struct func_s { |
141 | unsigned nargs; | 141 | unsigned nargs; |
142 | smallint defined; | ||
142 | struct chain_s body; | 143 | struct chain_s body; |
143 | } func; | 144 | } func; |
144 | 145 | ||
@@ -1662,9 +1663,11 @@ static void parse_program(char *p) | |||
1662 | debug_printf_parse("%s: TC_FUNCDECL\n", __func__); | 1663 | debug_printf_parse("%s: TC_FUNCDECL\n", __func__); |
1663 | next_token(TC_FUNCTION); | 1664 | next_token(TC_FUNCTION); |
1664 | f = newfunc(t_string); | 1665 | f = newfunc(t_string); |
1665 | //FIXME: dup check: functions can't be redefined, this is not ok: awk 'func f(){}; func f(){}' | 1666 | if (f->defined) |
1666 | f->body.first = NULL; | 1667 | syntax_error("Duplicate function"); |
1667 | f->nargs = 0; | 1668 | f->defined = 1; |
1669 | //f->body.first = NULL; - already is | ||
1670 | //f->nargs = 0; - already is | ||
1668 | /* func arg list: comma sep list of args, and a close paren */ | 1671 | /* func arg list: comma sep list of args, and a close paren */ |
1669 | for (;;) { | 1672 | for (;;) { |
1670 | if (next_token(TC_VARIABLE | TC_RPAREN) == TC_RPAREN) { | 1673 | if (next_token(TC_VARIABLE | TC_RPAREN) == TC_RPAREN) { |
@@ -2912,7 +2915,7 @@ static var *evaluate(node *op, var *res) | |||
2912 | 2915 | ||
2913 | debug_printf_eval("FUNC\n"); | 2916 | debug_printf_eval("FUNC\n"); |
2914 | 2917 | ||
2915 | if (op->r.f->nargs == 0 && !op->r.f->body.first) | 2918 | if (!op->r.f->defined) |
2916 | syntax_error(EMSG_UNDEF_FUNC); | 2919 | syntax_error(EMSG_UNDEF_FUNC); |
2917 | 2920 | ||
2918 | /* The body might be empty, still has to eval the args */ | 2921 | /* The body might be empty, still has to eval the args */ |