diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2015-07-18 22:05:51 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2015-07-18 22:05:51 +0300 |
commit | 0847d0ee2cc5c7cad917a47c9427dd5e3d9f51ea (patch) | |
tree | 4f84272193956bf760f96649a09f98873cbea546 /dfa.c | |
parent | bcaab97477a3718e3197a59f4bef5a7e0a5fb84a (diff) | |
parent | 6a7fee22e26533467b221c5773d600c7b7a189d1 (diff) | |
download | egawk-0847d0ee2cc5c7cad917a47c9427dd5e3d9f51ea.tar.gz egawk-0847d0ee2cc5c7cad917a47c9427dd5e3d9f51ea.tar.bz2 egawk-0847d0ee2cc5c7cad917a47c9427dd5e3d9f51ea.zip |
Merge branch 'gawk-4.1-stable'
Diffstat (limited to 'dfa.c')
-rw-r--r-- | dfa.c | 50 |
1 files changed, 38 insertions, 12 deletions
@@ -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; } } |