diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-12-22 06:52:35 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-12-22 06:52:35 +0000 |
commit | 1cef7b3caef9c520148f15511ec193dcce80d1b2 (patch) | |
tree | 8acf73aea465bfc031b6012c4164f3ff43206286 /posix/regexec.c | |
parent | 7de661083b26a7cba6d136f7b7311e732c0ff9e0 (diff) | |
download | glibc-1cef7b3caef9c520148f15511ec193dcce80d1b2.tar.gz glibc-1cef7b3caef9c520148f15511ec193dcce80d1b2.tar.xz glibc-1cef7b3caef9c520148f15511ec193dcce80d1b2.zip |
Update.
2003-12-21 Jakub Jelinek <jakub@redhat.com> * posix/regcomp.c (duplicate_node, duplicate_node_closure): Revert 2003-11-24 changes. * posix/regexec.c (group_nodes_into_DFAstates): For CHARACTER with NEXT_{,NOT}WORD_CONSTRAINT check word_char bit. * posix/bug-regex19.c (tests): Add new tests. * posix/regexec.c (check_dst_limits_calc_pos): Fix formatting. * posix/regcomp.c (parse_dup_op): Return NULL if dup_elem is NULL, after checking syntax. Optimize. (calc_first): Fix comment. * posix/bug-regex13.c (tests): Add new tests.
Diffstat (limited to 'posix/regexec.c')
-rw-r--r-- | posix/regexec.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/posix/regexec.c b/posix/regexec.c index 72b26f112b..7f8fac8961 100644 --- a/posix/regexec.c +++ b/posix/regexec.c @@ -1746,7 +1746,7 @@ check_dst_limits_calc_pos (dfa, mctx, limit, eclosures, subexp_idx, from_node, int limit, subexp_idx, from_node, str_idx; { struct re_backref_cache_entry *lim = mctx->bkref_ents + limit; - int node_idx; + int node_idx; /* If we are outside the range of the subexpression, return -1 or 1. */ if (str_idx < lim->subexp_from) @@ -1761,23 +1761,23 @@ check_dst_limits_calc_pos (dfa, mctx, limit, eclosures, subexp_idx, from_node, /* Else, we are on the boundary: examine the nodes on the epsilon closure. */ - for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx) - { - int node = eclosures->elems[node_idx]; + for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx) + { + int node = eclosures->elems[node_idx]; switch (dfa->nodes[node].type) { case OP_BACK_REF: - { - int bi = search_cur_bkref_entry (mctx, str_idx); - for (; bi < mctx->nbkref_ents; ++bi) - { - struct re_backref_cache_entry *ent = mctx->bkref_ents + bi; + { + int bi = search_cur_bkref_entry (mctx, str_idx); + for (; bi < mctx->nbkref_ents; ++bi) + { + struct re_backref_cache_entry *ent = mctx->bkref_ents + bi; int dst, cpos; /* If this backreference goes beyond the point we're examining, don't go any further. */ - if (ent->str_idx > str_idx) - break; + if (ent->str_idx > str_idx) + break; if (ent->node != node || ent->subexp_from != ent->subexp_to) continue; @@ -1788,7 +1788,7 @@ check_dst_limits_calc_pos (dfa, mctx, limit, eclosures, subexp_idx, from_node, node, don't recurse because it would cause an infinite loop: a regex that exhibits this behavior is ()\1*\1* */ - dst = dfa->edests[node].elems[0]; + dst = dfa->edests[node].elems[0]; if (dst == from_node) { if (str_idx == lim->subexp_from) @@ -1797,17 +1797,17 @@ check_dst_limits_calc_pos (dfa, mctx, limit, eclosures, subexp_idx, from_node, return 0; } - cpos = check_dst_limits_calc_pos (dfa, mctx, limit, - dfa->eclosures + dst, - subexp_idx, dst, - str_idx); + cpos = check_dst_limits_calc_pos (dfa, mctx, limit, + dfa->eclosures + dst, + subexp_idx, dst, + str_idx); if (cpos == -1 && str_idx == lim->subexp_from) return -1; if (cpos == 0 /* && str_idx == lim->lim->subexp_to */) return 0; - } + } break; } @@ -3416,6 +3416,11 @@ group_nodes_into_DFAstates (preg, state, dests_node, dests_ch) if (constraint & NEXT_WORD_CONSTRAINT) { unsigned int any_set = 0; + if (type == CHARACTER && !node->word_char) + { + bitset_empty (accepts); + continue; + } #ifdef RE_ENABLE_I18N if (dfa->mb_cur_max > 1) for (j = 0; j < BITSET_UINTS; ++j) @@ -3430,6 +3435,11 @@ group_nodes_into_DFAstates (preg, state, dests_node, dests_ch) if (constraint & NEXT_NOTWORD_CONSTRAINT) { unsigned int any_set = 0; + if (type == CHARACTER && node->word_char) + { + bitset_empty (accepts); + continue; + } #ifdef RE_ENABLE_I18N if (dfa->mb_cur_max > 1) for (j = 0; j < BITSET_UINTS; ++j) |