diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2015-10-16 08:21:48 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2015-10-16 08:21:48 +0300 |
commit | 549ec39ca7c3abea376dbc00df94c8e52c0146b2 (patch) | |
tree | 1ec237dea2e57d5e97c02b4611c2673e11e736a5 /dfa.c | |
parent | c867589418a96bc619799854c1b2258bb23e2c4e (diff) | |
parent | 4423a72864dbeecf6251ce5543404f7baa20bf82 (diff) | |
download | egawk-549ec39ca7c3abea376dbc00df94c8e52c0146b2.tar.gz egawk-549ec39ca7c3abea376dbc00df94c8e52c0146b2.tar.bz2 egawk-549ec39ca7c3abea376dbc00df94c8e52c0146b2.zip |
Merge branch 'gawk-4.1-stable'
Diffstat (limited to 'dfa.c')
-rw-r--r-- | dfa.c | 17 |
1 files changed, 12 insertions, 5 deletions
@@ -3970,6 +3970,9 @@ dfamust (struct dfa const *d) bool begline = false; bool endline = false; size_t rj; + bool need_begline = false; + bool need_endline = false; + bool case_fold_unibyte = case_fold && MB_CUR_MAX == 1; struct dfamust *dm; for (ri = 0; ri < d->tindex; ++ri) @@ -3980,10 +3983,12 @@ dfamust (struct dfa const *d) case BEGLINE: mp = allocmust (mp, 2); mp->begline = true; + need_begline = true; break; case ENDLINE: mp = allocmust (mp, 2); mp->endline = true; + need_endline = true; break; case LPAREN: case RPAREN: @@ -4060,7 +4065,9 @@ dfamust (struct dfa const *d) result = mp->in[i]; if (STREQ (result, mp->is)) { - exact = true; + if ((!need_begline || mp->begline) && (!need_endline + || mp->endline)) + exact = true; begline = mp->begline; endline = mp->endline; } @@ -4133,7 +4140,7 @@ dfamust (struct dfa const *d) t = j; while (++j < NOTCHAR) if (tstbit (j, *ccl) - && ! (case_fold && MB_CUR_MAX == 1 + && ! (case_fold_unibyte && toupper (j) == toupper (t))) break; if (j < NOTCHAR) @@ -4156,17 +4163,17 @@ dfamust (struct dfa const *d) } 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; + = case_fold_unibyte ? toupper (t) : t; 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; + = case_fold_unibyte ? toupper (t) : t; } mp->is[i] = mp->left[i] = mp->right[i] = '\0'; - mp->in = enlist (mp->in, mp->is, i - 1); + mp->in = enlist (mp->in, mp->is, i); break; } } |