aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2015-07-18 22:05:51 +0300
committerArnold D. Robbins <arnold@skeeve.com>2015-07-18 22:05:51 +0300
commit0847d0ee2cc5c7cad917a47c9427dd5e3d9f51ea (patch)
tree4f84272193956bf760f96649a09f98873cbea546
parentbcaab97477a3718e3197a59f4bef5a7e0a5fb84a (diff)
parent6a7fee22e26533467b221c5773d600c7b7a189d1 (diff)
downloadegawk-0847d0ee2cc5c7cad917a47c9427dd5e3d9f51ea.tar.gz
egawk-0847d0ee2cc5c7cad917a47c9427dd5e3d9f51ea.tar.bz2
egawk-0847d0ee2cc5c7cad917a47c9427dd5e3d9f51ea.zip
Merge branch 'gawk-4.1-stable'
-rw-r--r--ChangeLog4
-rw-r--r--dfa.c50
2 files changed, 42 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index e8980e26..17b6a7e8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2015-07-18 Arnold D. Robbins <arnold@skeeve.com>
+
+ * dfa.c: Sync with GNU grep.
+
2015-07-08 Arnold D. Robbins <arnold@skeeve.com>
* dfa.h, dfa.c: Sync with GNU grep.
diff --git a/dfa.c b/dfa.c
index ca154780..8f5770b2 100644
--- a/dfa.c
+++ b/dfa.c
@@ -3995,13 +3995,13 @@ struct must
};
static must *
-allocmust (must *mp)
+allocmust (must *mp, size_t size)
{
must *new_mp = xmalloc (sizeof *new_mp);
new_mp->in = xzalloc (sizeof *new_mp->in);
- new_mp->left = xzalloc (2);
- new_mp->right = xzalloc (2);
- new_mp->is = xzalloc (2);
+ new_mp->left = xzalloc (size);
+ new_mp->right = xzalloc (size);
+ new_mp->is = xzalloc (size);
new_mp->begline = false;
new_mp->endline = false;
new_mp->prev = mp;
@@ -4046,11 +4046,11 @@ dfamust (struct dfa const *d)
switch (t)
{
case BEGLINE:
- mp = allocmust (mp);
+ mp = allocmust (mp, 2);
mp->begline = true;
break;
case ENDLINE:
- mp = allocmust (mp);
+ mp = allocmust (mp, 2);
mp->endline = true;
break;
case LPAREN:
@@ -4065,7 +4065,7 @@ dfamust (struct dfa const *d)
case BACKREF:
case ANYCHAR:
case MBCSET:
- mp = allocmust (mp);
+ mp = allocmust (mp, 2);
break;
case STAR:
@@ -4182,7 +4182,6 @@ dfamust (struct dfa const *d)
goto done;
default:
- mp = allocmust (mp);
if (CSET <= t)
{
/* If T is a singleton, or if case-folding in a unibyte
@@ -4195,7 +4194,10 @@ dfamust (struct dfa const *d)
if (tstbit (j, *ccl))
break;
if (! (j < NOTCHAR))
- break;
+ {
+ mp = allocmust (mp, 2);
+ break;
+ }
t = j;
while (++j < NOTCHAR)
if (tstbit (j, *ccl)
@@ -4203,12 +4205,36 @@ dfamust (struct dfa const *d)
&& toupper (j) == toupper (t)))
break;
if (j < NOTCHAR)
- break;
+ {
+ mp = allocmust (mp, 2);
+ break;
+ }
}
+
+ size_t rj = ri + 2;
+ if (d->tokens[ri + 1] == CAT)
+ {
+ for (; rj < d->tindex - 1; rj += 2)
+ {
+ if ((rj != ri && (d->tokens[rj] <= 0
+ || NOTCHAR <= d->tokens[rj]))
+ || d->tokens[rj + 1] != CAT)
+ break;
+ }
+ }
+ mp = allocmust (mp, ((rj - ri) >> 1) + 1);
mp->is[0] = mp->left[0] = mp->right[0]
= case_fold && MB_CUR_MAX == 1 ? toupper (t) : t;
- mp->is[1] = mp->left[1] = mp->right[1] = '\0';
- mp->in = enlist (mp->in, mp->is, 1);
+
+ for (i = 1; ri + 2 < rj; i++)
+ {
+ ri += 2;
+ t = d->tokens[ri];
+ mp->is[i] = mp->left[i] = mp->right[i]
+ = case_fold && MB_CUR_MAX == 1 ? toupper (t) : t;
+ }
+ mp->is[i] = mp->left[i] = mp->right[i] = '\0';
+ mp->in = enlist (mp->in, mp->is, i - 1);
break;
}
}