aboutsummaryrefslogtreecommitdiff
path: root/posix/regexec.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-12-22 06:52:35 +0000
committerUlrich Drepper <drepper@redhat.com>2003-12-22 06:52:35 +0000
commit1cef7b3caef9c520148f15511ec193dcce80d1b2 (patch)
tree8acf73aea465bfc031b6012c4164f3ff43206286 /posix/regexec.c
parent7de661083b26a7cba6d136f7b7311e732c0ff9e0 (diff)
downloadglibc-1cef7b3caef9c520148f15511ec193dcce80d1b2.zip
glibc-1cef7b3caef9c520148f15511ec193dcce80d1b2.tar.gz
glibc-1cef7b3caef9c520148f15511ec193dcce80d1b2.tar.bz2
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.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/posix/regexec.c b/posix/regexec.c
index 72b26f1..7f8fac8 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)