1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-06-05 00:22:17 +03:00

Fix a few more cases of ignored return values in regex.

This commit is contained in:
Ulrich Drepper 2010-01-15 12:03:16 -08:00
parent 635bc2a20f
commit 2da42bc065
4 changed files with 150 additions and 130 deletions

View File

@ -1,5 +1,9 @@
2010-01-15 Ulrich Drepper <drepper@redhat.com> 2010-01-15 Ulrich Drepper <drepper@redhat.com>
* posix/regcomp.c: Fix a few more cases of ignored return values.
* posix/regex_internal.c: Likewise.
* posix/regexec.c: Likewise.
* include/features.h: _XOPEN_SOURCE_EXTENDED is not defined to be * include/features.h: _XOPEN_SOURCE_EXTENDED is not defined to be
used without _XOPEN_SOURCE. Don't base any decisions on this macro used without _XOPEN_SOURCE. Don't base any decisions on this macro
if _XOPEN_SOURCE is not defined as well. if _XOPEN_SOURCE is not defined as well.
@ -13,7 +17,7 @@
* elf/elf.h (EF_S390_HIGH_GPRS): Added macro definition for the * elf/elf.h (EF_S390_HIGH_GPRS): Added macro definition for the
new elf header flag. new elf header flag.
XS2010-01-13 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> 2010-01-13 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
* elf/dl-sysdep.c (_dl_sysdep_start): Added the auxv parameter to * elf/dl-sysdep.c (_dl_sysdep_start): Added the auxv parameter to
dl_main. dl_main.

View File

@ -999,7 +999,11 @@ create_initial_state (re_dfa_t *dfa)
int dest_idx = dfa->edests[node_idx].elems[0]; int dest_idx = dfa->edests[node_idx].elems[0];
if (!re_node_set_contains (&init_nodes, dest_idx)) if (!re_node_set_contains (&init_nodes, dest_idx))
{ {
re_node_set_merge (&init_nodes, dfa->eclosures + dest_idx); reg_errcode_t err = re_node_set_merge (&init_nodes,
dfa->eclosures
+ dest_idx);
if (err != REG_NOERROR)
return err;
i = 0; i = 0;
} }
} }
@ -1414,7 +1418,7 @@ link_nfa_nodes (void *extra, bin_tree_t *node)
case OP_BACK_REF: case OP_BACK_REF:
dfa->nexts[idx] = node->next->node_idx; dfa->nexts[idx] = node->next->node_idx;
if (node->token.type == OP_BACK_REF) if (node->token.type == OP_BACK_REF)
re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]); err = re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]);
break; break;
default: default:
@ -1690,7 +1694,9 @@ calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, int node, int root)
else else
eclosure_elem = dfa->eclosures[edest]; eclosure_elem = dfa->eclosures[edest];
/* Merge the epsilon closure of `edest'. */ /* Merge the epsilon closure of `edest'. */
re_node_set_merge (&eclosure, &eclosure_elem); err = re_node_set_merge (&eclosure, &eclosure_elem);
if (BE (err != REG_NOERROR, 0))
return err;
/* If the epsilon closure of `edest' is incomplete, /* If the epsilon closure of `edest' is incomplete,
the epsilon closure of this node is also incomplete. */ the epsilon closure of this node is also incomplete. */
if (dfa->eclosures[edest].nelem == 0) if (dfa->eclosures[edest].nelem == 0)

View File

@ -1,5 +1,5 @@
/* Extended regular expression matching and search library. /* Extended regular expression matching and search library.
Copyright (C) 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. Copyright (C) 2002-2006, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
@ -36,7 +36,7 @@ static re_dfastate_t *create_cd_newstate (const re_dfa_t *dfa,
re_string_reconstruct before using the object. */ re_string_reconstruct before using the object. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_string_allocate (re_string_t *pstr, const char *str, int len, int init_len, re_string_allocate (re_string_t *pstr, const char *str, int len, int init_len,
RE_TRANSLATE_TYPE trans, int icase, const re_dfa_t *dfa) RE_TRANSLATE_TYPE trans, int icase, const re_dfa_t *dfa)
{ {
@ -64,7 +64,7 @@ re_string_allocate (re_string_t *pstr, const char *str, int len, int init_len,
/* This function allocate the buffers, and initialize them. */ /* This function allocate the buffers, and initialize them. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_string_construct (re_string_t *pstr, const char *str, int len, re_string_construct (re_string_t *pstr, const char *str, int len,
RE_TRANSLATE_TYPE trans, int icase, const re_dfa_t *dfa) RE_TRANSLATE_TYPE trans, int icase, const re_dfa_t *dfa)
{ {
@ -127,7 +127,7 @@ re_string_construct (re_string_t *pstr, const char *str, int len,
/* Helper functions for re_string_allocate, and re_string_construct. */ /* Helper functions for re_string_allocate, and re_string_construct. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_string_realloc_buffers (re_string_t *pstr, int new_buf_len) re_string_realloc_buffers (re_string_t *pstr, int new_buf_len)
{ {
#ifdef RE_ENABLE_I18N #ifdef RE_ENABLE_I18N
@ -260,7 +260,7 @@ build_wcs_buffer (re_string_t *pstr)
but for REG_ICASE. */ but for REG_ICASE. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
build_wcs_upper_buffer (re_string_t *pstr) build_wcs_upper_buffer (re_string_t *pstr)
{ {
mbstate_t prev_st; mbstate_t prev_st;
@ -423,8 +423,8 @@ build_wcs_upper_buffer (re_string_t *pstr)
src_idx += mbclen; src_idx += mbclen;
continue; continue;
} }
else else
memcpy (pstr->mbs + byte_idx, p, mbclen); memcpy (pstr->mbs + byte_idx, p, mbclen);
} }
else else
memcpy (pstr->mbs + byte_idx, p, mbclen); memcpy (pstr->mbs + byte_idx, p, mbclen);
@ -559,7 +559,7 @@ re_string_translate_buffer (re_string_t *pstr)
convert to upper case in case of REG_ICASE, apply translation. */ convert to upper case in case of REG_ICASE, apply translation. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_string_reconstruct (re_string_t *pstr, int idx, int eflags) re_string_reconstruct (re_string_t *pstr, int idx, int eflags)
{ {
int offset = idx - pstr->raw_mbs_idx; int offset = idx - pstr->raw_mbs_idx;
@ -951,7 +951,7 @@ re_string_context_at (const re_string_t *input, int idx, int eflags)
/* Functions for set operation. */ /* Functions for set operation. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_node_set_alloc (re_node_set *set, int size) re_node_set_alloc (re_node_set *set, int size)
{ {
set->alloc = size; set->alloc = size;
@ -963,7 +963,7 @@ re_node_set_alloc (re_node_set *set, int size)
} }
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_node_set_init_1 (re_node_set *set, int elem) re_node_set_init_1 (re_node_set *set, int elem)
{ {
set->alloc = 1; set->alloc = 1;
@ -979,7 +979,7 @@ re_node_set_init_1 (re_node_set *set, int elem)
} }
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_node_set_init_2 (re_node_set *set, int elem1, int elem2) re_node_set_init_2 (re_node_set *set, int elem1, int elem2)
{ {
set->alloc = 2; set->alloc = 2;
@ -1009,7 +1009,7 @@ re_node_set_init_2 (re_node_set *set, int elem1, int elem2)
} }
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_node_set_init_copy (re_node_set *dest, const re_node_set *src) re_node_set_init_copy (re_node_set *dest, const re_node_set *src)
{ {
dest->nelem = src->nelem; dest->nelem = src->nelem;
@ -1034,7 +1034,7 @@ re_node_set_init_copy (re_node_set *dest, const re_node_set *src)
Note: We assume dest->elems is NULL, when dest->alloc is 0. */ Note: We assume dest->elems is NULL, when dest->alloc is 0. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1, re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1,
const re_node_set *src2) const re_node_set *src2)
{ {
@ -1049,7 +1049,7 @@ re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1,
int new_alloc = src1->nelem + src2->nelem + dest->alloc; int new_alloc = src1->nelem + src2->nelem + dest->alloc;
int *new_elems = re_realloc (dest->elems, int, new_alloc); int *new_elems = re_realloc (dest->elems, int, new_alloc);
if (BE (new_elems == NULL, 0)) if (BE (new_elems == NULL, 0))
return REG_ESPACE; return REG_ESPACE;
dest->elems = new_elems; dest->elems = new_elems;
dest->alloc = new_alloc; dest->alloc = new_alloc;
} }
@ -1068,8 +1068,8 @@ re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1,
while (id >= 0 && dest->elems[id] > src1->elems[i1]) while (id >= 0 && dest->elems[id] > src1->elems[i1])
--id; --id;
if (id < 0 || dest->elems[id] != src1->elems[i1]) if (id < 0 || dest->elems[id] != src1->elems[i1])
dest->elems[--sbase] = src1->elems[i1]; dest->elems[--sbase] = src1->elems[i1];
if (--i1 < 0 || --i2 < 0) if (--i1 < 0 || --i2 < 0)
break; break;
@ -1099,20 +1099,20 @@ re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1,
if (delta > 0 && id >= 0) if (delta > 0 && id >= 0)
for (;;) for (;;)
{ {
if (dest->elems[is] > dest->elems[id]) if (dest->elems[is] > dest->elems[id])
{ {
/* Copy from the top. */ /* Copy from the top. */
dest->elems[id + delta--] = dest->elems[is--]; dest->elems[id + delta--] = dest->elems[is--];
if (delta == 0) if (delta == 0)
break; break;
} }
else else
{ {
/* Slide from the bottom. */ /* Slide from the bottom. */
dest->elems[id + delta] = dest->elems[id]; dest->elems[id + delta] = dest->elems[id];
if (--id < 0) if (--id < 0)
break; break;
} }
} }
/* Copy remaining SRC elements. */ /* Copy remaining SRC elements. */
@ -1125,7 +1125,7 @@ re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1,
DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ DEST. Return value indicate the error code or REG_NOERROR if succeeded. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_node_set_init_union (re_node_set *dest, const re_node_set *src1, re_node_set_init_union (re_node_set *dest, const re_node_set *src1,
const re_node_set *src2) const re_node_set *src2)
{ {
@ -1178,7 +1178,7 @@ re_node_set_init_union (re_node_set *dest, const re_node_set *src1,
DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ DEST. Return value indicate the error code or REG_NOERROR if succeeded. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
re_node_set_merge (re_node_set *dest, const re_node_set *src) re_node_set_merge (re_node_set *dest, const re_node_set *src)
{ {
int is, id, sbase, delta; int is, id, sbase, delta;
@ -1207,11 +1207,11 @@ re_node_set_merge (re_node_set *dest, const re_node_set *src)
is = src->nelem - 1, id = dest->nelem - 1; is >= 0 && id >= 0; ) is = src->nelem - 1, id = dest->nelem - 1; is >= 0 && id >= 0; )
{ {
if (dest->elems[id] == src->elems[is]) if (dest->elems[id] == src->elems[is])
is--, id--; is--, id--;
else if (dest->elems[id] < src->elems[is]) else if (dest->elems[id] < src->elems[is])
dest->elems[--sbase] = src->elems[is--]; dest->elems[--sbase] = src->elems[is--];
else /* if (dest->elems[id] > src->elems[is]) */ else /* if (dest->elems[id] > src->elems[is]) */
--id; --id;
} }
if (is >= 0) if (is >= 0)
@ -1233,21 +1233,21 @@ re_node_set_merge (re_node_set *dest, const re_node_set *src)
for (;;) for (;;)
{ {
if (dest->elems[is] > dest->elems[id]) if (dest->elems[is] > dest->elems[id])
{ {
/* Copy from the top. */ /* Copy from the top. */
dest->elems[id + delta--] = dest->elems[is--]; dest->elems[id + delta--] = dest->elems[is--];
if (delta == 0) if (delta == 0)
break; break;
} }
else else
{ {
/* Slide from the bottom. */ /* Slide from the bottom. */
dest->elems[id + delta] = dest->elems[id]; dest->elems[id + delta] = dest->elems[id];
if (--id < 0) if (--id < 0)
{ {
/* Copy remaining SRC elements. */ /* Copy remaining SRC elements. */
memcpy (dest->elems, dest->elems + sbase, memcpy (dest->elems, dest->elems + sbase,
delta * sizeof (int)); delta * sizeof (int));
break; break;
} }
} }
@ -1261,7 +1261,7 @@ re_node_set_merge (re_node_set *dest, const re_node_set *src)
return -1 if an error is occured, return 1 otherwise. */ return -1 if an error is occured, return 1 otherwise. */
static int static int
internal_function internal_function __attribute_warn_unused_result__
re_node_set_insert (re_node_set *set, int elem) re_node_set_insert (re_node_set *set, int elem)
{ {
int idx; int idx;
@ -1299,12 +1299,12 @@ re_node_set_insert (re_node_set *set, int elem)
{ {
idx = 0; idx = 0;
for (idx = set->nelem; idx > 0; idx--) for (idx = set->nelem; idx > 0; idx--)
set->elems[idx] = set->elems[idx - 1]; set->elems[idx] = set->elems[idx - 1];
} }
else else
{ {
for (idx = set->nelem; set->elems[idx - 1] > elem; idx--) for (idx = set->nelem; set->elems[idx - 1] > elem; idx--)
set->elems[idx] = set->elems[idx - 1]; set->elems[idx] = set->elems[idx - 1];
} }
/* Insert the new element. */ /* Insert the new element. */
@ -1318,7 +1318,7 @@ re_node_set_insert (re_node_set *set, int elem)
Return -1 if an error is occured, return 1 otherwise. */ Return -1 if an error is occured, return 1 otherwise. */
static int static int
internal_function internal_function __attribute_warn_unused_result__
re_node_set_insert_last (re_node_set *set, int elem) re_node_set_insert_last (re_node_set *set, int elem)
{ {
/* Realloc if we need. */ /* Realloc if we need. */
@ -1458,7 +1458,7 @@ calc_state_hash (const re_node_set *nodes, unsigned int context)
optimization. */ optimization. */
static re_dfastate_t * static re_dfastate_t *
internal_function internal_function __attribute_warn_unused_result__
re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa, re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa,
const re_node_set *nodes) const re_node_set *nodes)
{ {
@ -1502,7 +1502,7 @@ re_acquire_state (reg_errcode_t *err, const re_dfa_t *dfa,
optimization. */ optimization. */
static re_dfastate_t * static re_dfastate_t *
internal_function internal_function __attribute_warn_unused_result__
re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa, re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa,
const re_node_set *nodes, unsigned int context) const re_node_set *nodes, unsigned int context)
{ {
@ -1539,6 +1539,7 @@ re_acquire_state_context (reg_errcode_t *err, const re_dfa_t *dfa,
indicates the error code if failed. */ indicates the error code if failed. */
static reg_errcode_t static reg_errcode_t
__attribute_warn_unused_result__
register_state (const re_dfa_t *dfa, re_dfastate_t *newstate, register_state (const re_dfa_t *dfa, re_dfastate_t *newstate,
unsigned int hash) unsigned int hash)
{ {
@ -1554,7 +1555,8 @@ register_state (const re_dfa_t *dfa, re_dfastate_t *newstate,
{ {
int elem = newstate->nodes.elems[i]; int elem = newstate->nodes.elems[i];
if (!IS_EPSILON_NODE (dfa->nodes[elem].type)) if (!IS_EPSILON_NODE (dfa->nodes[elem].type))
re_node_set_insert_last (&newstate->non_eps_nodes, elem); if (re_node_set_insert_last (&newstate->non_eps_nodes, elem) < 0)
return REG_ESPACE;
} }
spot = dfa->state_table + (hash & dfa->state_hash_mask); spot = dfa->state_table + (hash & dfa->state_hash_mask);
@ -1592,7 +1594,7 @@ free_state (re_dfastate_t *state)
Return the new state if succeeded, otherwise return NULL. */ Return the new state if succeeded, otherwise return NULL. */
static re_dfastate_t * static re_dfastate_t *
internal_function internal_function __attribute_warn_unused_result__
create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes, create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
unsigned int hash) unsigned int hash)
{ {
@ -1642,7 +1644,7 @@ create_ci_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
Return the new state if succeeded, otherwise return NULL. */ Return the new state if succeeded, otherwise return NULL. */
static re_dfastate_t * static re_dfastate_t *
internal_function internal_function __attribute_warn_unused_result__
create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes, create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
unsigned int context, unsigned int hash) unsigned int context, unsigned int hash)
{ {
@ -1691,7 +1693,9 @@ create_cd_newstate (const re_dfa_t *dfa, const re_node_set *nodes,
free_state (newstate); free_state (newstate);
return NULL; return NULL;
} }
re_node_set_init_copy (newstate->entrance_nodes, nodes); if (re_node_set_init_copy (newstate->entrance_nodes, nodes)
!= REG_NOERROR)
return NULL;
nctx_nodes = 0; nctx_nodes = 0;
newstate->has_constraint = 1; newstate->has_constraint = 1;
} }

View File

@ -1,5 +1,5 @@
/* Extended regular expression matching and search library. /* Extended regular expression matching and search library.
Copyright (C) 2002, 2003, 2004, 2005, 2007, 2009 Free Software Foundation, Inc. Copyright (C) 2002-2005, 2007, 2009, 2010 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>. Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
@ -617,6 +617,7 @@ re_exec (s)
(START + RANGE >= 0 && START + RANGE <= LENGTH) */ (START + RANGE >= 0 && START + RANGE <= LENGTH) */
static reg_errcode_t static reg_errcode_t
__attribute_warn_unused_result__
re_search_internal (preg, string, length, start, range, stop, nmatch, pmatch, re_search_internal (preg, string, length, start, range, stop, nmatch, pmatch,
eflags) eflags)
const regex_t *preg; const regex_t *preg;
@ -668,7 +669,7 @@ re_search_internal (preg, string, length, start, range, stop, nmatch, pmatch,
|| !preg->newline_anchor)) || !preg->newline_anchor))
{ {
if (start != 0 && start + range != 0) if (start != 0 && start + range != 0)
return REG_NOMATCH; return REG_NOMATCH;
start = range = 0; start = range = 0;
} }
@ -800,10 +801,10 @@ re_search_internal (preg, string, length, start, range, stop, nmatch, pmatch,
break; break;
match_first += incr; match_first += incr;
if (match_first < left_lim || match_first > right_lim) if (match_first < left_lim || match_first > right_lim)
{ {
err = REG_NOMATCH; err = REG_NOMATCH;
goto free_return; goto free_return;
} }
} }
break; break;
} }
@ -917,14 +918,14 @@ re_search_internal (preg, string, length, start, range, stop, nmatch, pmatch,
} }
if (dfa->subexp_map) if (dfa->subexp_map)
for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++) for (reg_idx = 0; reg_idx + 1 < nmatch; reg_idx++)
if (dfa->subexp_map[reg_idx] != reg_idx) if (dfa->subexp_map[reg_idx] != reg_idx)
{ {
pmatch[reg_idx + 1].rm_so pmatch[reg_idx + 1].rm_so
= pmatch[dfa->subexp_map[reg_idx] + 1].rm_so; = pmatch[dfa->subexp_map[reg_idx] + 1].rm_so;
pmatch[reg_idx + 1].rm_eo pmatch[reg_idx + 1].rm_eo
= pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo; = pmatch[dfa->subexp_map[reg_idx] + 1].rm_eo;
} }
} }
free_return: free_return:
@ -936,6 +937,7 @@ re_search_internal (preg, string, length, start, range, stop, nmatch, pmatch,
} }
static reg_errcode_t static reg_errcode_t
__attribute_warn_unused_result__
prune_impossible_nodes (mctx) prune_impossible_nodes (mctx)
re_match_context_t *mctx; re_match_context_t *mctx;
{ {
@ -1069,7 +1071,7 @@ acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx,
index of the buffer. */ index of the buffer. */
static int static int
internal_function internal_function __attribute_warn_unused_result__
check_matching (re_match_context_t *mctx, int fl_longest_match, check_matching (re_match_context_t *mctx, int fl_longest_match,
int *p_match_first) int *p_match_first)
{ {
@ -1108,7 +1110,7 @@ check_matching (re_match_context_t *mctx, int fl_longest_match,
{ {
err = transit_state_bkref (mctx, &cur_state->nodes); err = transit_state_bkref (mctx, &cur_state->nodes);
if (BE (err != REG_NOERROR, 0)) if (BE (err != REG_NOERROR, 0))
return err; return err;
} }
} }
} }
@ -1135,16 +1137,16 @@ check_matching (re_match_context_t *mctx, int fl_longest_match,
int next_char_idx = re_string_cur_idx (&mctx->input) + 1; int next_char_idx = re_string_cur_idx (&mctx->input) + 1;
if (BE (next_char_idx >= mctx->input.bufs_len, 0) if (BE (next_char_idx >= mctx->input.bufs_len, 0)
|| (BE (next_char_idx >= mctx->input.valid_len, 0) || (BE (next_char_idx >= mctx->input.valid_len, 0)
&& mctx->input.valid_len < mctx->input.len)) && mctx->input.valid_len < mctx->input.len))
{ {
err = extend_buffers (mctx); err = extend_buffers (mctx);
if (BE (err != REG_NOERROR, 0)) if (BE (err != REG_NOERROR, 0))
{ {
assert (err == REG_ESPACE); assert (err == REG_ESPACE);
return -2; return -2;
} }
} }
cur_state = transit_state (&err, mctx, cur_state); cur_state = transit_state (&err, mctx, cur_state);
if (mctx->state_log != NULL) if (mctx->state_log != NULL)
@ -1263,20 +1265,20 @@ proceed_next_node (const re_match_context_t *mctx, int nregs, regmatch_t *regs,
int candidate = edests->elems[i]; int candidate = edests->elems[i];
if (!re_node_set_contains (cur_nodes, candidate)) if (!re_node_set_contains (cur_nodes, candidate))
continue; continue;
if (dest_node == -1) if (dest_node == -1)
dest_node = candidate; dest_node = candidate;
else else
{ {
/* In order to avoid infinite loop like "(a*)*", return the second /* In order to avoid infinite loop like "(a*)*", return the second
epsilon-transition if the first was already considered. */ epsilon-transition if the first was already considered. */
if (re_node_set_contains (eps_via_nodes, dest_node)) if (re_node_set_contains (eps_via_nodes, dest_node))
return candidate; return candidate;
/* Otherwise, push the second epsilon-transition on the fail stack. */ /* Otherwise, push the second epsilon-transition on the fail stack. */
else if (fs != NULL else if (fs != NULL
&& push_fail_stack (fs, *pidx, candidate, nregs, regs, && push_fail_stack (fs, *pidx, candidate, nregs, regs,
eps_via_nodes)) eps_via_nodes))
return -2; return -2;
/* We know we are going to exit. */ /* We know we are going to exit. */
@ -1342,7 +1344,7 @@ proceed_next_node (const re_match_context_t *mctx, int nregs, regmatch_t *regs,
} }
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
push_fail_stack (struct re_fail_stack_t *fs, int str_idx, int dest_node, push_fail_stack (struct re_fail_stack_t *fs, int str_idx, int dest_node,
int nregs, regmatch_t *regs, re_node_set *eps_via_nodes) int nregs, regmatch_t *regs, re_node_set *eps_via_nodes)
{ {
@ -1389,7 +1391,7 @@ pop_fail_stack (struct re_fail_stack_t *fs, int *pidx, int nregs,
pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch. */ pmatch[i].rm_so == pmatch[i].rm_eo == -1 for 0 < i < nmatch. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch, set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch,
regmatch_t *pmatch, int fl_backtrack) regmatch_t *pmatch, int fl_backtrack)
{ {
@ -1624,7 +1626,7 @@ sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx)
if (mctx->state_log[str_idx]) if (mctx->state_log[str_idx])
{ {
err = build_sifted_states (mctx, sctx, str_idx, &cur_dest); err = build_sifted_states (mctx, sctx, str_idx, &cur_dest);
if (BE (err != REG_NOERROR, 0)) if (BE (err != REG_NOERROR, 0))
goto free_return; goto free_return;
} }
@ -1643,7 +1645,7 @@ sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx)
} }
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx, build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx,
int str_idx, re_node_set *cur_dest) int str_idx, re_node_set *cur_dest)
{ {
@ -1805,7 +1807,7 @@ update_cur_sifted_state (const re_match_context_t *mctx,
} }
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes, add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes,
const re_node_set *candidates) const re_node_set *candidates)
{ {
@ -1820,10 +1822,14 @@ add_epsilon_src_nodes (const re_dfa_t *dfa, re_node_set *dest_nodes,
{ {
err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem); err = re_node_set_alloc (&state->inveclosure, dest_nodes->nelem);
if (BE (err != REG_NOERROR, 0)) if (BE (err != REG_NOERROR, 0))
return REG_ESPACE; return REG_ESPACE;
for (i = 0; i < dest_nodes->nelem; i++) for (i = 0; i < dest_nodes->nelem; i++)
re_node_set_merge (&state->inveclosure, {
dfa->inveclosures + dest_nodes->elems[i]); err = re_node_set_merge (&state->inveclosure,
dfa->inveclosures + dest_nodes->elems[i]);
if (BE (err != REG_NOERROR, 0))
return REG_ESPACE;
}
} }
return re_node_set_add_intersect (dest_nodes, candidates, return re_node_set_add_intersect (dest_nodes, candidates,
&state->inveclosure); &state->inveclosure);
@ -1935,7 +1941,7 @@ check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries,
{ {
struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx; struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx;
do do
{ {
int dst, cpos; int dst, cpos;
if (ent->node != node) if (ent->node != node)
@ -1956,9 +1962,9 @@ check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries,
if (dst == from_node) if (dst == from_node)
{ {
if (boundaries & 1) if (boundaries & 1)
return -1; return -1;
else /* if (boundaries & 2) */ else /* if (boundaries & 2) */
return 0; return 0;
} }
cpos = cpos =
@ -1972,7 +1978,7 @@ check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries,
if (subexp_idx < BITSET_WORD_BITS) if (subexp_idx < BITSET_WORD_BITS)
ent->eps_reachable_subexps_map ent->eps_reachable_subexps_map
&= ~((bitset_word_t) 1 << subexp_idx); &= ~((bitset_word_t) 1 << subexp_idx);
} }
while (ent++->more); while (ent++->more);
} }
break; break;
@ -2114,7 +2120,7 @@ check_subexp_limits (const re_dfa_t *dfa, re_node_set *dest_nodes,
} }
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx, sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx,
int str_idx, const re_node_set *candidates) int str_idx, const re_node_set *candidates)
{ {
@ -2197,7 +2203,7 @@ sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx,
re_node_set_remove (&local_sctx.limits, enabled_idx); re_node_set_remove (&local_sctx.limits, enabled_idx);
/* mctx->bkref_ents may have changed, reload the pointer. */ /* mctx->bkref_ents may have changed, reload the pointer. */
entry = mctx->bkref_ents + enabled_idx; entry = mctx->bkref_ents + enabled_idx;
} }
while (enabled_idx++, entry++->more); while (enabled_idx++, entry++->more);
} }
@ -2244,7 +2250,7 @@ sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx,
update the destination of STATE_LOG. */ update the destination of STATE_LOG. */
static re_dfastate_t * static re_dfastate_t *
internal_function internal_function __attribute_warn_unused_result__
transit_state (reg_errcode_t *err, re_match_context_t *mctx, transit_state (reg_errcode_t *err, re_match_context_t *mctx,
re_dfastate_t *state) re_dfastate_t *state)
{ {
@ -2278,7 +2284,7 @@ transit_state (reg_errcode_t *err, re_match_context_t *mctx,
trtable = state->word_trtable; trtable = state->word_trtable;
if (BE (trtable != NULL, 1)) if (BE (trtable != NULL, 1))
{ {
unsigned int context; unsigned int context;
context context
= re_string_context_at (&mctx->input, = re_string_context_at (&mctx->input,
@ -2324,21 +2330,21 @@ merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx,
unsigned int context; unsigned int context;
re_node_set next_nodes, *log_nodes, *table_nodes = NULL; re_node_set next_nodes, *log_nodes, *table_nodes = NULL;
/* If (state_log[cur_idx] != 0), it implies that cur_idx is /* If (state_log[cur_idx] != 0), it implies that cur_idx is
the destination of a multibyte char/collating element/ the destination of a multibyte char/collating element/
back reference. Then the next state is the union set of back reference. Then the next state is the union set of
these destinations and the results of the transition table. */ these destinations and the results of the transition table. */
pstate = mctx->state_log[cur_idx]; pstate = mctx->state_log[cur_idx];
log_nodes = pstate->entrance_nodes; log_nodes = pstate->entrance_nodes;
if (next_state != NULL) if (next_state != NULL)
{ {
table_nodes = next_state->entrance_nodes; table_nodes = next_state->entrance_nodes;
*err = re_node_set_init_union (&next_nodes, table_nodes, *err = re_node_set_init_union (&next_nodes, table_nodes,
log_nodes); log_nodes);
if (BE (*err != REG_NOERROR, 0)) if (BE (*err != REG_NOERROR, 0))
return NULL; return NULL;
} }
else else
next_nodes = *log_nodes; next_nodes = *log_nodes;
/* Note: We already add the nodes of the initial state, /* Note: We already add the nodes of the initial state,
then we don't need to add them here. */ then we don't need to add them here. */
@ -2346,12 +2352,12 @@ merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx,
re_string_cur_idx (&mctx->input) - 1, re_string_cur_idx (&mctx->input) - 1,
mctx->eflags); mctx->eflags);
next_state = mctx->state_log[cur_idx] next_state = mctx->state_log[cur_idx]
= re_acquire_state_context (err, dfa, &next_nodes, context); = re_acquire_state_context (err, dfa, &next_nodes, context);
/* We don't need to check errors here, since the return value of /* We don't need to check errors here, since the return value of
this function is next_state and ERR is already set. */ this function is next_state and ERR is already set. */
if (table_nodes != NULL) if (table_nodes != NULL)
re_node_set_free (&next_nodes); re_node_set_free (&next_nodes);
} }
if (BE (dfa->nbackref, 0) && next_state != NULL) if (BE (dfa->nbackref, 0) && next_state != NULL)
@ -2392,9 +2398,9 @@ find_recover_state (reg_errcode_t *err, re_match_context_t *mctx)
do do
{ {
if (++cur_str_idx > max) if (++cur_str_idx > max)
return NULL; return NULL;
re_string_skip_bytes (&mctx->input, 1); re_string_skip_bytes (&mctx->input, 1);
} }
while (mctx->state_log[cur_str_idx] == NULL); while (mctx->state_log[cur_str_idx] == NULL);
@ -2501,7 +2507,7 @@ transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate)
re_dfastate_t *dest_state; re_dfastate_t *dest_state;
if (!dfa->nodes[cur_node_idx].accept_mb) if (!dfa->nodes[cur_node_idx].accept_mb)
continue; continue;
if (dfa->nodes[cur_node_idx].constraint) if (dfa->nodes[cur_node_idx].constraint)
{ {
@ -2669,7 +2675,7 @@ transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes)
delay these checking for prune_impossible_nodes(). */ delay these checking for prune_impossible_nodes(). */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
get_subexp (re_match_context_t *mctx, int bkref_node, int bkref_str_idx) get_subexp (re_match_context_t *mctx, int bkref_node, int bkref_str_idx)
{ {
const re_dfa_t *const dfa = mctx->dfa; const re_dfa_t *const dfa = mctx->dfa;
@ -2682,7 +2688,7 @@ get_subexp (re_match_context_t *mctx, int bkref_node, int bkref_str_idx)
const struct re_backref_cache_entry *entry const struct re_backref_cache_entry *entry
= mctx->bkref_ents + cache_idx; = mctx->bkref_ents + cache_idx;
do do
if (entry->node == bkref_node) if (entry->node == bkref_node)
return REG_NOERROR; /* We already checked it. */ return REG_NOERROR; /* We already checked it. */
while (entry++->more); while (entry++->more);
} }
@ -2869,7 +2875,7 @@ find_subexp_node (const re_dfa_t *dfa, const re_node_set *nodes,
Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise. */ Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
check_arrival (re_match_context_t *mctx, state_array_t *path, int top_node, check_arrival (re_match_context_t *mctx, state_array_t *path, int top_node,
int top_str, int last_node, int last_str, int type) int top_str, int last_node, int last_str, int type)
{ {
@ -3030,7 +3036,7 @@ check_arrival (re_match_context_t *mctx, state_array_t *path, int top_node,
Can't we unify them? */ Can't we unify them? */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
check_arrival_add_next_nodes (re_match_context_t *mctx, int str_idx, check_arrival_add_next_nodes (re_match_context_t *mctx, int str_idx,
re_node_set *cur_nodes, re_node_set *next_nodes) re_node_set *cur_nodes, re_node_set *next_nodes)
{ {
@ -3162,7 +3168,7 @@ check_arrival_expand_ecl (const re_dfa_t *dfa, re_node_set *cur_nodes,
problematic append it to DST_NODES. */ problematic append it to DST_NODES. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes, check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes,
int target, int ex_subexp, int type) int target, int ex_subexp, int type)
{ {
@ -3206,7 +3212,7 @@ check_arrival_expand_ecl_sub (const re_dfa_t *dfa, re_node_set *dst_nodes,
in MCTX->BKREF_ENTS. */ in MCTX->BKREF_ENTS. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes, expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes,
int cur_str, int subexp_num, int type) int cur_str, int subexp_num, int type)
{ {
@ -3564,13 +3570,13 @@ group_nodes_into_DFAstates (const re_dfa_t *dfa, const re_dfastate_t *state,
} }
#ifdef RE_ENABLE_I18N #ifdef RE_ENABLE_I18N
else if (type == OP_UTF8_PERIOD) else if (type == OP_UTF8_PERIOD)
{ {
memset (accepts, '\xff', sizeof (bitset_t) / 2); memset (accepts, '\xff', sizeof (bitset_t) / 2);
if (!(dfa->syntax & RE_DOT_NEWLINE)) if (!(dfa->syntax & RE_DOT_NEWLINE))
bitset_clear (accepts, '\n'); bitset_clear (accepts, '\n');
if (dfa->syntax & RE_DOT_NOT_NULL) if (dfa->syntax & RE_DOT_NOT_NULL)
bitset_clear (accepts, '\0'); bitset_clear (accepts, '\0');
} }
#endif #endif
else else
continue; continue;
@ -3775,7 +3781,7 @@ check_node_accept_bytes (const re_dfa_t *dfa, int node_idx,
if (node->type == OP_PERIOD) if (node->type == OP_PERIOD)
{ {
if (char_len <= 1) if (char_len <= 1)
return 0; return 0;
/* FIXME: I don't think this if is needed, as both '\n' /* FIXME: I don't think this if is needed, as both '\n'
and '\0' are char_len == 1. */ and '\0' are char_len == 1. */
/* '.' accepts any one character except the following two cases. */ /* '.' accepts any one character except the following two cases. */
@ -4025,18 +4031,18 @@ check_node_accept (const re_match_context_t *mctx, const re_token_t *node,
{ {
case CHARACTER: case CHARACTER:
if (node->opr.c != ch) if (node->opr.c != ch)
return 0; return 0;
break; break;
case SIMPLE_BRACKET: case SIMPLE_BRACKET:
if (!bitset_contain (node->opr.sbcset, ch)) if (!bitset_contain (node->opr.sbcset, ch))
return 0; return 0;
break; break;
#ifdef RE_ENABLE_I18N #ifdef RE_ENABLE_I18N
case OP_UTF8_PERIOD: case OP_UTF8_PERIOD:
if (ch >= 0x80) if (ch >= 0x80)
return 0; return 0;
/* FALLTHROUGH */ /* FALLTHROUGH */
#endif #endif
case OP_PERIOD: case OP_PERIOD:
@ -4065,7 +4071,7 @@ check_node_accept (const re_match_context_t *mctx, const re_token_t *node,
/* Extend the buffers, if the buffers have run out. */ /* Extend the buffers, if the buffers have run out. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
extend_buffers (re_match_context_t *mctx) extend_buffers (re_match_context_t *mctx)
{ {
reg_errcode_t ret; reg_errcode_t ret;
@ -4124,7 +4130,7 @@ extend_buffers (re_match_context_t *mctx)
/* Initialize MCTX. */ /* Initialize MCTX. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
match_ctx_init (re_match_context_t *mctx, int eflags, int n) match_ctx_init (re_match_context_t *mctx, int eflags, int n)
{ {
mctx->eflags = eflags; mctx->eflags = eflags;
@ -4197,7 +4203,7 @@ match_ctx_free (re_match_context_t *mctx)
*/ */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
match_ctx_add_entry (re_match_context_t *mctx, int node, int str_idx, int from, match_ctx_add_entry (re_match_context_t *mctx, int node, int str_idx, int from,
int to) int to)
{ {
@ -4269,7 +4275,7 @@ search_cur_bkref_entry (const re_match_context_t *mctx, int str_idx)
at STR_IDX. */ at STR_IDX. */
static reg_errcode_t static reg_errcode_t
internal_function internal_function __attribute_warn_unused_result__
match_ctx_add_subtop (re_match_context_t *mctx, int node, int str_idx) match_ctx_add_subtop (re_match_context_t *mctx, int node, int str_idx)
{ {
#ifdef DEBUG #ifdef DEBUG