diff options
Diffstat (limited to 'editors')
-rw-r--r-- | editors/awk.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/editors/awk.c b/editors/awk.c index 90edec82c..d25508e5d 100644 --- a/editors/awk.c +++ b/editors/awk.c | |||
@@ -1613,12 +1613,25 @@ static void parse_program(char *p) | |||
1613 | f = newfunc(t_string); | 1613 | f = newfunc(t_string); |
1614 | f->body.first = NULL; | 1614 | f->body.first = NULL; |
1615 | f->nargs = 0; | 1615 | f->nargs = 0; |
1616 | while (next_token(TC_VARIABLE | TC_SEQTERM) & TC_VARIABLE) { | 1616 | /* Match func arg list: a comma sep list of >= 0 args, and a close paren */ |
1617 | while (next_token(TC_VARIABLE | TC_SEQTERM | TC_COMMA)) { | ||
1618 | /* Either an empty arg list, or trailing comma from prev iter | ||
1619 | * must be followed by an arg */ | ||
1620 | if (f->nargs == 0 && t_tclass == TC_SEQTERM) | ||
1621 | break; | ||
1622 | |||
1623 | /* TC_SEQSTART/TC_COMMA must be followed by TC_VARIABLE */ | ||
1624 | if (t_tclass != TC_VARIABLE) | ||
1625 | syntax_error(EMSG_UNEXP_TOKEN); | ||
1626 | |||
1617 | v = findvar(ahash, t_string); | 1627 | v = findvar(ahash, t_string); |
1618 | v->x.aidx = f->nargs++; | 1628 | v->x.aidx = f->nargs++; |
1619 | 1629 | ||
1630 | /* Arg followed either by end of arg list or 1 comma */ | ||
1620 | if (next_token(TC_COMMA | TC_SEQTERM) & TC_SEQTERM) | 1631 | if (next_token(TC_COMMA | TC_SEQTERM) & TC_SEQTERM) |
1621 | break; | 1632 | break; |
1633 | if (t_tclass != TC_COMMA) | ||
1634 | syntax_error(EMSG_UNEXP_TOKEN); | ||
1622 | } | 1635 | } |
1623 | seq = &f->body; | 1636 | seq = &f->body; |
1624 | chain_group(); | 1637 | chain_group(); |