aboutsummaryrefslogtreecommitdiffstats
path: root/awkgram.y
diff options
context:
space:
mode:
Diffstat (limited to 'awkgram.y')
-rw-r--r--awkgram.y27
1 files changed, 16 insertions, 11 deletions
diff --git a/awkgram.y b/awkgram.y
index db70ccb8..c10701f8 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -1312,9 +1312,12 @@ param_list
}
| param_list comma NAME
{
- $3->param_count = $1->lasti->param_count + 1;
- $$ = list_append($1, $3);
- yyerrok;
+ if ($1 != NULL && $3 != NULL) {
+ $3->param_count = $1->lasti->param_count + 1;
+ $$ = list_append($1, $3);
+ yyerrok;
+ } else
+ $$ = NULL;
}
| error
{ $$ = NULL; }
@@ -3316,7 +3319,7 @@ collect_regexp:
/*
* Here is what's ok with brackets:
*
- * [[] [^[] []] [^]] [.../...]
+ * [..[..] []] [^]] [.../...]
* [...\[...] [...\]...] [...\/...]
*
* (Remember that all of the above are inside /.../)
@@ -3324,7 +3327,7 @@ collect_regexp:
* The code for \ handles \[, \] and \/.
*
* Otherwise, track the first open [ position, and if
- * an embedded [ or ] occurs, allow it to pass through
+ * an embedded ] occurs, allow it to pass through
* if it's right after the first [ or after [^.
*
* Whew!
@@ -3335,19 +3338,21 @@ collect_regexp:
for (;;) {
c = nextc(false);
+ cur_index = tok - tokstart;
if (gawk_mb_cur_max == 1 || nextc_is_1stbyte) switch (c) {
case '[':
+ if (nextc(false) == ':' || in_brack == 0)
+ in_brack++;
+ pushback();
+ if (in_brack == 1)
+ b_index = tok - tokstart;
+ break;
case ']':
- cur_index = tok - tokstart;
if (in_brack > 0
&& (cur_index == b_index + 1
|| (cur_index == b_index + 2 && tok[-1] == '^')))
; /* do nothing */
- else if (c == '[') {
- in_brack++;
- if (in_brack == 1)
- b_index = tok - tokstart;
- } else {
+ else {
in_brack--;
if (in_brack == 0)
b_index = -1;