Main Page | Class List | Directories | File List | Class Members | File Members

regex_internal.c File Reference

Go to the source code of this file.

Functions

static void re_string_construct_common _RE_ARGS ((const char *str, int len, re_string_t *pstr, RE_TRANSLATE_TYPE trans, int icase))
static reg_errcode_t re_string_allocate (re_string_t *pstr, const char *str, int len, int init_len, RE_TRANSLATE_TYPE trans, int icase)
static reg_errcode_t re_string_construct (re_string_t *pstr, const char *str, int len, RE_TRANSLATE_TYPE trans, int icase)
static reg_errcode_t re_string_realloc_buffers (re_string_t *pstr, int new_buf_len)
static void re_string_construct_common (char *str, int len, re_string_t *pstr, RE_TRANSLATE_TYPE trans, int icase) const
static void build_upper_buffer (re_string_t *pstr)
static void re_string_translate_buffer (re_string_t *pstr)
static reg_errcode_t re_string_reconstruct (re_string_t *pstr, int idx, int eflags, int newline)
static void re_string_destruct (re_string_t *pstr)
static unsigned int re_string_context_at (re_string_t *input, int idx, int eflags, int newline_anchor) const
static reg_errcode_t re_node_set_alloc (re_node_set *set, int size)
static reg_errcode_t re_node_set_init_1 (re_node_set *set, int elem)
static reg_errcode_t re_node_set_init_2 (re_node_set *set, int elem1, int elem2)
static reg_errcode_t re_node_set_init_copy (re_node_set *dest, const re_node_set *src)
static reg_errcode_t re_node_set_add_intersect (re_node_set *dest, const re_node_set *src1, const re_node_set *src2)
static reg_errcode_t re_node_set_init_union (re_node_set *dest, const re_node_set *src1, const re_node_set *src2)
static reg_errcode_t re_node_set_merge (re_node_set *dest, const re_node_set *src)
static int re_node_set_insert (re_node_set *set, int elem)
static int re_node_set_compare (re_node_set *set1, re_node_set *set2) const
static int re_node_set_contains (re_node_set *set, int elem) const
static void re_node_set_remove_at (re_node_set *set, int idx)
static int re_dfa_add_node (re_dfa_t *dfa, re_token_t token, int mode)
static unsigned int calc_state_hash (re_node_set *nodes, unsigned int context) const
static re_dfastate_tre_acquire_state (reg_errcode_t *err, re_dfa_t *dfa, const re_node_set *nodes)
static re_dfastate_tre_acquire_state_context (reg_errcode_t *err, re_dfa_t *dfa, const re_node_set *nodes, unsigned int context)
static re_dfastate_tcreate_newstate_common (re_dfa_t *dfa, const re_node_set *nodes, unsigned int hash)
static reg_errcode_t register_state (re_dfa_t *dfa, re_dfastate_t *newstate, unsigned int hash)
static re_dfastate_tcreate_ci_newstate (re_dfa_t *dfa, const re_node_set *nodes, unsigned int hash)
static re_dfastate_tcreate_cd_newstate (re_dfa_t *dfa, const re_node_set *nodes, unsigned int context, unsigned int hash)
static void free_state (re_dfastate_t *state)


Function Documentation

static void re_string_construct_common _RE_ARGS (const char *str, int len, re_string_t *pstr, RE_TRANSLATE_TYPE trans, int icase)   )  [static]
 

static void build_upper_buffer re_string_t pstr  )  [static]
 

Definition at line 337 of file regex_internal.c.

References NULL.

Referenced by extend_buffers(), re_string_construct(), and re_string_reconstruct().

00339 {
00340   int char_idx, end_idx;
00341   end_idx = (pstr->bufs_len > pstr->len) ? pstr->len : pstr->bufs_len;
00342 
00343   for (char_idx = pstr->valid_len; char_idx < end_idx; ++char_idx)
00344     {
00345       int ch = pstr->raw_mbs[pstr->raw_mbs_idx + char_idx];
00346       if (pstr->trans != NULL)
00347         {
00348           ch =  pstr->trans[ch];
00349           pstr->mbs_case[char_idx] = ch;
00350         }
00351       if (islower (ch))
00352         pstr->mbs[char_idx] = toupper (ch);
00353       else
00354         pstr->mbs[char_idx] = ch;
00355     }
00356   pstr->valid_len = char_idx;
00357 }

static unsigned int calc_state_hash re_node_set nodes,
unsigned int  context
const [inline, static]
 

Definition at line 976 of file regex_internal.c.

References i.

Referenced by re_acquire_state(), and re_acquire_state_context().

00979 {
00980   unsigned int hash = nodes->nelem + context;
00981   int i;
00982   for (i = 0 ; i < nodes->nelem ; i++)
00983     hash += nodes->elems[i];
00984   return hash;
00985 }

static re_dfastate_t* create_cd_newstate re_dfa_t dfa,
const re_node_set nodes,
unsigned int  context,
unsigned int  hash
[static]
 

Definition at line 1184 of file regex_internal.c.

References re_dfastate_t::accept_mb, ANCHOR, BE, CHARACTER, re_token_t::constraint, re_dfastate_t::context, create_newstate_common(), re_node_set::elems, END_OF_RE, re_dfastate_t::entrance_nodes, err(), free_state(), re_dfastate_t::halt, re_dfastate_t::has_backref, re_dfastate_t::has_constraint, i, node(), re_dfastate_t::nodes, NOT_SATISFY_PREV_CONSTRAINT, NULL, OP_BACK_REF, OP_PERIOD, re_token_t::opr, re_malloc, re_node_set_init_copy(), re_node_set_remove_at(), REG_NOERROR, register_state(), and re_token_t::type.

Referenced by re_acquire_state_context().

01188 {
01189   int i, nctx_nodes = 0;
01190   reg_errcode_t err;
01191   re_dfastate_t *newstate;
01192 
01193   newstate = create_newstate_common (dfa, nodes, hash);
01194   if (BE (newstate == NULL, 0))
01195     return NULL;
01196   newstate->context = context;
01197   newstate->entrance_nodes = &newstate->nodes;
01198 
01199   for (i = 0 ; i < nodes->nelem ; i++)
01200     {
01201       unsigned int constraint = 0;
01202       re_token_t *node = dfa->nodes + nodes->elems[i];
01203       re_token_type_t type = node->type;
01204       if (node->constraint)
01205         constraint = node->constraint;
01206 
01207       if (type == CHARACTER && !constraint)
01208         continue;
01209       /* If the state has the halt node, the state is a halt state.  */
01210       else if (type == END_OF_RE)
01211         newstate->halt = 1;
01212 #ifdef RE_ENABLE_I18N
01213       else if (type == COMPLEX_BRACKET
01214                || (type == OP_PERIOD && re_mb_cur_max > 1))
01215         newstate->accept_mb = 1;
01216 #endif /* RE_ENABLE_I18N */
01217       else if (type == OP_BACK_REF)
01218         newstate->has_backref = 1;
01219       else if (type == ANCHOR)
01220         constraint = node->opr.ctx_type;
01221 
01222       if (constraint)
01223         {
01224           if (newstate->entrance_nodes == &newstate->nodes)
01225             {
01226               newstate->entrance_nodes = re_malloc (re_node_set, 1);
01227               if (BE (newstate->entrance_nodes == NULL, 0))
01228                 {
01229                   free_state (newstate);
01230                   return NULL;
01231                 }
01232               re_node_set_init_copy (newstate->entrance_nodes, nodes);
01233               nctx_nodes = 0;
01234               newstate->has_constraint = 1;
01235             }
01236 
01237           if (NOT_SATISFY_PREV_CONSTRAINT (constraint,context))
01238             {
01239               re_node_set_remove_at (&newstate->nodes, i - nctx_nodes);
01240               ++nctx_nodes;
01241             }
01242         }
01243     }
01244   err = register_state (dfa, newstate, hash);
01245   if (BE (err != REG_NOERROR, 0))
01246     {
01247       free_state (newstate);
01248       newstate = NULL;
01249     }
01250   return  newstate;
01251 }

static re_dfastate_t* create_ci_newstate re_dfa_t dfa,
const re_node_set nodes,
unsigned int  hash
[static]
 

Definition at line 1138 of file regex_internal.c.

References re_dfastate_t::accept_mb, ANCHOR, BE, CHARACTER, re_token_t::constraint, create_newstate_common(), re_node_set::elems, END_OF_RE, re_dfastate_t::entrance_nodes, err(), free_state(), re_dfastate_t::halt, re_dfastate_t::has_backref, re_dfastate_t::has_constraint, i, node(), re_dfastate_t::nodes, NULL, OP_BACK_REF, OP_PERIOD, REG_NOERROR, register_state(), and re_token_t::type.

Referenced by re_acquire_state().

01142 {
01143   int i;
01144   reg_errcode_t err;
01145   re_dfastate_t *newstate;
01146   newstate = create_newstate_common (dfa, nodes, hash);
01147   if (BE (newstate == NULL, 0))
01148     return NULL;
01149   newstate->entrance_nodes = &newstate->nodes;
01150 
01151   for (i = 0 ; i < nodes->nelem ; i++)
01152     {
01153       re_token_t *node = dfa->nodes + nodes->elems[i];
01154       re_token_type_t type = node->type;
01155       if (type == CHARACTER && !node->constraint)
01156         continue;
01157 
01158       /* If the state has the halt node, the state is a halt state.  */
01159       else if (type == END_OF_RE)
01160         newstate->halt = 1;
01161 #ifdef RE_ENABLE_I18N
01162       else if (type == COMPLEX_BRACKET
01163                || (type == OP_PERIOD && re_mb_cur_max > 1))
01164         newstate->accept_mb = 1;
01165 #endif /* RE_ENABLE_I18N */
01166       else if (type == OP_BACK_REF)
01167         newstate->has_backref = 1;
01168       else if (type == ANCHOR || node->constraint)
01169         newstate->has_constraint = 1;
01170     }
01171   err = register_state (dfa, newstate, hash);
01172   if (BE (err != REG_NOERROR, 0))
01173     {
01174       free_state (newstate);
01175       newstate = NULL;
01176     }
01177   return newstate;
01178 }

static re_dfastate_t* create_newstate_common re_dfa_t dfa,
const re_node_set nodes,
unsigned int  hash
[static]
 

Definition at line 1087 of file regex_internal.c.

References BE, err(), re_dfastate_t::hash, re_dfastate_t::nodes, NULL, re_free, re_node_set_init_copy(), REG_NOERROR, re_dfastate_t::trtable, and re_dfastate_t::trtable_search.

Referenced by create_cd_newstate(), and create_ci_newstate().

01091 {
01092   re_dfastate_t *newstate;
01093   reg_errcode_t err;
01094   newstate = (re_dfastate_t *) calloc (sizeof (re_dfastate_t), 1);
01095   if (BE (newstate == NULL, 0))
01096     return NULL;
01097   err = re_node_set_init_copy (&newstate->nodes, nodes);
01098   if (BE (err != REG_NOERROR, 0))
01099     {
01100       re_free (newstate);
01101       return NULL;
01102     }
01103   newstate->trtable = NULL;
01104   newstate->trtable_search = NULL;
01105   newstate->hash = hash;
01106   return newstate;
01107 }

static void free_state re_dfastate_t state  )  [static]
 

Definition at line 1254 of file regex_internal.c.

References re_free, and re_node_set_free.

Referenced by create_cd_newstate(), create_ci_newstate(), and free_dfa_content().

01256 {
01257   if (state->entrance_nodes != &state->nodes)
01258     {
01259       re_node_set_free (state->entrance_nodes);
01260       re_free (state->entrance_nodes);
01261     }
01262   re_node_set_free (&state->nodes);
01263   re_free (state->trtable);
01264   re_free (state->trtable_search);
01265   re_free (state);
01266 }

static re_dfastate_t* re_acquire_state reg_errcode_t err,
re_dfa_t dfa,
const re_node_set nodes
[static]
 

Definition at line 997 of file regex_internal.c.

References re_state_table_entry::array, BE, calc_state_hash(), create_ci_newstate(), re_dfastate_t::hash, i, re_node_set::nelem, re_dfastate_t::nodes, NULL, re_state_table_entry::num, re_node_set_compare(), REG_ESPACE, REG_NOERROR, state, re_dfa_t::state_hash_mask, and re_dfa_t::state_table.

Referenced by check_arrival_add_next_nodes(), expand_bkref_cache(), merge_state_array(), and update_cur_sifted_state().

01001 {
01002   unsigned int hash;
01003   re_dfastate_t *new_state;
01004   struct re_state_table_entry *spot;
01005   int i;
01006   if (BE (nodes->nelem == 0, 0))
01007     {
01008       *err = REG_NOERROR;
01009       return NULL;
01010     }
01011   hash = calc_state_hash (nodes, 0);
01012   spot = dfa->state_table + (hash & dfa->state_hash_mask);
01013 
01014   for (i = 0 ; i < spot->num ; i++)
01015     {
01016       re_dfastate_t *state = spot->array[i];
01017       if (hash != state->hash)
01018         continue;
01019       if (re_node_set_compare (&state->nodes, nodes))
01020         return state;
01021     }
01022 
01023   /* There are no appropriate state in the dfa, create the new one.  */
01024   new_state = create_ci_newstate (dfa, nodes, hash);
01025   if (BE (new_state != NULL, 1))
01026     return new_state;
01027   else
01028     {
01029       *err = REG_ESPACE;
01030       return NULL;
01031     }
01032 }

static re_dfastate_t* re_acquire_state_context reg_errcode_t err,
re_dfa_t dfa,
const re_node_set nodes,
unsigned int  context
[static]
 

Definition at line 1045 of file regex_internal.c.

References re_state_table_entry::array, BE, calc_state_hash(), re_dfastate_t::context, create_cd_newstate(), re_dfastate_t::entrance_nodes, re_dfastate_t::hash, i, re_node_set::nelem, NULL, re_state_table_entry::num, re_node_set_compare(), REG_ESPACE, REG_NOERROR, state, re_dfa_t::state_hash_mask, and re_dfa_t::state_table.

Referenced by acquire_init_state_context(), build_trtable(), check_arrival(), create_initial_state(), transit_state(), transit_state_bkref(), and transit_state_sb().

01050 {
01051   unsigned int hash;
01052   re_dfastate_t *new_state;
01053   struct re_state_table_entry *spot;
01054   int i;
01055   if (nodes->nelem == 0)
01056     {
01057       *err = REG_NOERROR;
01058       return NULL;
01059     }
01060   hash = calc_state_hash (nodes, context);
01061   spot = dfa->state_table + (hash & dfa->state_hash_mask);
01062 
01063   for (i = 0 ; i < spot->num ; i++)
01064     {
01065       re_dfastate_t *state = spot->array[i];
01066       if (hash != state->hash)
01067         continue;
01068       if (re_node_set_compare (state->entrance_nodes, nodes)
01069           && state->context == context)
01070         return state;
01071     }
01072   /* There are no appropriate state in `dfa', create the new one.  */
01073   new_state = create_cd_newstate (dfa, nodes, context, hash);
01074   if (BE (new_state != NULL, 1))
01075     return new_state;
01076   else
01077     {
01078       *err = REG_ESPACE;
01079       return NULL;
01080     }
01081 }

static int re_dfa_add_node re_dfa_t dfa,
re_token_t  token,
int  mode
[static]
 

Definition at line 932 of file regex_internal.c.

References BE, re_token_t::duplicated, NULL, and re_realloc.

Referenced by build_word_op(), duplicate_node(), duplicate_tree(), parse(), parse_bracket_exp(), parse_dup_op(), parse_expression(), parse_reg_exp(), and parse_sub_exp().

00936 {
00937   if (dfa->nodes_len >= dfa->nodes_alloc)
00938     {
00939       re_token_t *new_array;
00940       dfa->nodes_alloc *= 2;
00941       new_array = re_realloc (dfa->nodes, re_token_t, dfa->nodes_alloc);
00942       if (BE (new_array == NULL, 0))
00943         return -1;
00944       else
00945         dfa->nodes = new_array;
00946       if (mode)
00947         {
00948           int *new_nexts, *new_indices;
00949           re_node_set *new_edests, *new_eclosures, *new_inveclosures;
00950 
00951           new_nexts = re_realloc (dfa->nexts, int, dfa->nodes_alloc);
00952           new_indices = re_realloc (dfa->org_indices, int, dfa->nodes_alloc);
00953           new_edests = re_realloc (dfa->edests, re_node_set, dfa->nodes_alloc);
00954           new_eclosures = re_realloc (dfa->eclosures, re_node_set,
00955                                       dfa->nodes_alloc);
00956           new_inveclosures = re_realloc (dfa->inveclosures, re_node_set,
00957                                          dfa->nodes_alloc);
00958           if (BE (new_nexts == NULL || new_indices == NULL
00959                   || new_edests == NULL || new_eclosures == NULL
00960                   || new_inveclosures == NULL, 0))
00961             return -1;
00962           dfa->nexts = new_nexts;
00963           dfa->org_indices = new_indices;
00964           dfa->edests = new_edests;
00965           dfa->eclosures = new_eclosures;
00966           dfa->inveclosures = new_inveclosures;
00967         }
00968     }
00969   dfa->nodes[dfa->nodes_len] = token;
00970   dfa->nodes[dfa->nodes_len].duplicated = 0;
00971   dfa->nodes[dfa->nodes_len].constraint = 0;
00972   return dfa->nodes_len++;
00973 }

static reg_errcode_t re_node_set_add_intersect re_node_set dest,
const re_node_set src1,
const re_node_set src2
[static]
 

Definition at line 644 of file regex_internal.c.

References BE, re_node_set::elems, re_node_set::nelem, NULL, re_realloc, REG_ESPACE, and REG_NOERROR.

Referenced by add_epsilon_src_nodes(), and sub_epsilon_src_nodes().

00647 {
00648   int i1, i2, id;
00649   if (src1->nelem > 0 && src2->nelem > 0)
00650     {
00651       if (src1->nelem + src2->nelem + dest->nelem > dest->alloc)
00652         {
00653           dest->alloc = src1->nelem + src2->nelem + dest->nelem;
00654           dest->elems = re_realloc (dest->elems, int, dest->alloc);
00655           if (BE (dest->elems == NULL, 0))
00656             return REG_ESPACE;
00657         }
00658     }
00659   else
00660     return REG_NOERROR;
00661 
00662   for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;)
00663     {
00664       if (src1->elems[i1] > src2->elems[i2])
00665         {
00666           ++i2;
00667           continue;
00668         }
00669       if (src1->elems[i1] == src2->elems[i2])
00670         {
00671           while (id < dest->nelem && dest->elems[id] < src2->elems[i2])
00672             ++id;
00673           if (id < dest->nelem && dest->elems[id] == src2->elems[i2])
00674             ++id;
00675           else
00676             {
00677               memmove (dest->elems + id + 1, dest->elems + id,
00678                        sizeof (int) * (dest->nelem - id));
00679               dest->elems[id++] = src2->elems[i2++];
00680               ++dest->nelem;
00681             }
00682         }
00683       ++i1;
00684     }
00685   return REG_NOERROR;
00686 }

static reg_errcode_t re_node_set_alloc re_node_set set,
int  size
[static]
 

Definition at line 557 of file regex_internal.c.

References BE, NULL, re_malloc, REG_ESPACE, and REG_NOERROR.

Referenced by build_trtable(), calc_eclosure_iter(), check_arrival_expand_ecl(), and transit_state_sb().

00560 {
00561   set->alloc = size;
00562   set->nelem = 0;
00563   set->elems = re_malloc (int, size);
00564   if (BE (set->elems == NULL, 0))
00565     return REG_ESPACE;
00566   return REG_NOERROR;
00567 }

static int re_node_set_compare re_node_set set1,
re_node_set set2
const [static]
 

Definition at line 877 of file regex_internal.c.

References i, and NULL.

Referenced by re_acquire_state(), and re_acquire_state_context().

00879 {
00880   int i;
00881   if (set1 == NULL || set2 == NULL || set1->nelem != set2->nelem)
00882     return 0;
00883   for (i = 0 ; i < set1->nelem ; i++)
00884     if (set1->elems[i] != set2->elems[i])
00885       return 0;
00886   return 1;
00887 }

static int re_node_set_contains re_node_set set,
int  elem
const [static]
 

Definition at line 892 of file regex_internal.c.

Referenced by check_arrival(), check_arrival_expand_ecl_sub(), check_subexp_limits(), create_initial_state(), expand_bkref_cache(), proceed_next_node(), and sub_epsilon_src_nodes().

00895 {
00896   int idx, right, mid;
00897   if (set->nelem <= 0)
00898     return 0;
00899 
00900   /* Binary search the element.  */
00901   idx = 0;
00902   right = set->nelem - 1;
00903   while (idx < right)
00904     {
00905       mid = (idx + right) / 2;
00906       if (set->elems[mid] < elem)
00907         idx = mid + 1;
00908       else
00909         right = mid;
00910     }
00911   return set->elems[idx] == elem ? idx + 1 : 0;
00912 }

static reg_errcode_t re_node_set_init_1 re_node_set set,
int  elem
[static]
 

Definition at line 570 of file regex_internal.c.

References BE, NULL, re_malloc, REG_ESPACE, and REG_NOERROR.

Referenced by calc_epsdest(), check_arrival(), expand_bkref_cache(), group_nodes_into_DFAstates(), re_node_set_insert(), and sift_states_backward().

00573 {
00574   set->alloc = 1;
00575   set->nelem = 1;
00576   set->elems = re_malloc (int, 1);
00577   if (BE (set->elems == NULL, 0))
00578     {
00579       set->alloc = set->nelem = 0;
00580       return REG_ESPACE;
00581     }
00582   set->elems[0] = elem;
00583   return REG_NOERROR;
00584 }

static reg_errcode_t re_node_set_init_2 re_node_set set,
int  elem1,
int  elem2
[static]
 

Definition at line 587 of file regex_internal.c.

References BE, NULL, re_malloc, REG_ESPACE, and REG_NOERROR.

Referenced by calc_epsdest().

00590 {
00591   set->alloc = 2;
00592   set->elems = re_malloc (int, 2);
00593   if (BE (set->elems == NULL, 0))
00594     return REG_ESPACE;
00595   if (elem1 == elem2)
00596     {
00597       set->nelem = 1;
00598       set->elems[0] = elem1;
00599     }
00600   else
00601     {
00602       set->nelem = 2;
00603       if (elem1 < elem2)
00604         {
00605           set->elems[0] = elem1;
00606           set->elems[1] = elem2;
00607         }
00608       else
00609         {
00610           set->elems[0] = elem2;
00611           set->elems[1] = elem1;
00612         }
00613     }
00614   return REG_NOERROR;
00615 }

static reg_errcode_t re_node_set_init_copy re_node_set dest,
const re_node_set src
[static]
 

Definition at line 618 of file regex_internal.c.

References BE, re_node_set::elems, memcpy, re_node_set::nelem, NULL, re_malloc, re_node_set_init_empty, REG_ESPACE, and REG_NOERROR.

Referenced by add_epsilon_src_nodes(), check_arrival(), create_cd_newstate(), create_initial_state(), create_newstate_common(), expand_bkref_cache(), group_nodes_into_DFAstates(), push_fail_stack(), re_node_set_init_union(), and sift_states_bkref().

00621 {
00622   dest->nelem = src->nelem;
00623   if (src->nelem > 0)
00624     {
00625       dest->alloc = dest->nelem;
00626       dest->elems = re_malloc (int, dest->alloc);
00627       if (BE (dest->elems == NULL, 0))
00628         {
00629           dest->alloc = dest->nelem = 0;
00630           return REG_ESPACE;
00631         }
00632       memcpy (dest->elems, src->elems, src->nelem * sizeof (int));
00633     }
00634   else
00635     re_node_set_init_empty (dest);
00636   return REG_NOERROR;
00637 }

static reg_errcode_t re_node_set_init_union re_node_set dest,
const re_node_set src1,
const re_node_set src2
[static]
 

Definition at line 692 of file regex_internal.c.

References BE, re_node_set::elems, memcpy, re_node_set::nelem, NULL, re_malloc, re_node_set_init_copy(), re_node_set_init_empty, REG_ESPACE, and REG_NOERROR.

Referenced by merge_state_array(), transit_state(), and transit_state_bkref().

00695 {
00696   int i1, i2, id;
00697   if (src1 != NULL && src1->nelem > 0 && src2 != NULL && src2->nelem > 0)
00698     {
00699       dest->alloc = src1->nelem + src2->nelem;
00700       dest->elems = re_malloc (int, dest->alloc);
00701       if (BE (dest->elems == NULL, 0))
00702         return REG_ESPACE;
00703     }
00704   else
00705     {
00706       if (src1 != NULL && src1->nelem > 0)
00707         return re_node_set_init_copy (dest, src1);
00708       else if (src2 != NULL && src2->nelem > 0)
00709         return re_node_set_init_copy (dest, src2);
00710       else
00711         re_node_set_init_empty (dest);
00712       return REG_NOERROR;
00713     }
00714   for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;)
00715     {
00716       if (src1->elems[i1] > src2->elems[i2])
00717         {
00718           dest->elems[id++] = src2->elems[i2++];
00719           continue;
00720         }
00721       if (src1->elems[i1] == src2->elems[i2])
00722         ++i2;
00723       dest->elems[id++] = src1->elems[i1++];
00724     }
00725   if (i1 < src1->nelem)
00726     {
00727       memcpy (dest->elems + id, src1->elems + i1,
00728              (src1->nelem - i1) * sizeof (int));
00729       id += src1->nelem - i1;
00730     }
00731   else if (i2 < src2->nelem)
00732     {
00733       memcpy (dest->elems + id, src2->elems + i2,
00734              (src2->nelem - i2) * sizeof (int));
00735       id += src2->nelem - i2;
00736     }
00737   dest->nelem = id;
00738   return REG_NOERROR;
00739 }

static int re_node_set_insert re_node_set set,
int  elem
[static]
 

Definition at line 816 of file regex_internal.c.

References BE, memcpy, NULL, re_free, re_malloc, re_node_set_init_1(), and REG_NOERROR.

Referenced by calc_eclosure_iter(), calc_inveclosure(), check_arrival_add_next_nodes(), check_arrival_expand_ecl_sub(), duplicate_node_closure(), expand_bkref_cache(), group_nodes_into_DFAstates(), proceed_next_node(), sift_states_backward(), and sift_states_bkref().

00819 {
00820   int idx, right, mid;
00821   /* In case of the set is empty.  */
00822   if (set->elems == NULL || set->alloc == 0)
00823     {
00824       if (BE (re_node_set_init_1 (set, elem) == REG_NOERROR, 1))
00825         return 1;
00826       else
00827         return -1;
00828     }
00829 
00830   /* Binary search the spot we will add the new element.  */
00831   idx = 0;
00832   right = set->nelem;
00833   while (idx < right)
00834     {
00835       mid = (idx + right) / 2;
00836       if (set->elems[mid] < elem)
00837         idx = mid + 1;
00838       else
00839         right = mid;
00840     }
00841 
00842   /* Realloc if we need.  */
00843   if (set->alloc < set->nelem + 1)
00844     {
00845       int *new_array;
00846       set->alloc = set->alloc * 2;
00847       new_array = re_malloc (int, set->alloc);
00848       if (BE (new_array == NULL, 0))
00849         return -1;
00850       /* Copy the elements they are followed by the new element.  */
00851       if (idx > 0)
00852         memcpy (new_array, set->elems, sizeof (int) * (idx));
00853       /* Copy the elements which follows the new element.  */
00854       if (set->nelem - idx > 0)
00855         memcpy (new_array + idx + 1, set->elems + idx,
00856                 sizeof (int) * (set->nelem - idx));
00857       re_free (set->elems);
00858       set->elems = new_array;
00859     }
00860   else
00861     {
00862       /* Move the elements which follows the new element.  */
00863       if (set->nelem - idx > 0)
00864         memmove (set->elems + idx + 1, set->elems + idx,
00865                  sizeof (int) * (set->nelem - idx));
00866     }
00867   /* Insert the new element.  */
00868   set->elems[idx] = elem;
00869   ++set->nelem;
00870   return 1;
00871 }

static reg_errcode_t re_node_set_merge re_node_set dest,
const re_node_set src
[static]
 

Definition at line 745 of file regex_internal.c.

References BE, re_node_set::elems, memcpy, re_node_set::nelem, NULL, re_realloc, REG_ESPACE, and REG_NOERROR.

Referenced by build_trtable(), calc_eclosure_iter(), check_arrival(), check_arrival_add_next_nodes(), check_arrival_expand_ecl(), create_initial_state(), expand_bkref_cache(), and transit_state_sb().

00748 {
00749   int si, di;
00750   if (src == NULL || src->nelem == 0)
00751     return REG_NOERROR;
00752   if (dest->alloc < src->nelem + dest->nelem)
00753     {
00754       int *new_buffer;
00755       dest->alloc = 2 * (src->nelem + dest->alloc);
00756       new_buffer = re_realloc (dest->elems, int, dest->alloc);
00757       if (BE (new_buffer == NULL, 0))
00758         return REG_ESPACE;
00759       dest->elems = new_buffer;
00760     }
00761 
00762   for (si = 0, di = 0 ; si < src->nelem && di < dest->nelem ;)
00763     {
00764       int cp_from, ncp, mid, right, src_elem = src->elems[si];
00765       /* Binary search the spot we will add the new element.  */
00766       right = dest->nelem;
00767       while (di < right)
00768         {
00769           mid = (di + right) / 2;
00770           if (dest->elems[mid] < src_elem)
00771             di = mid + 1;
00772           else
00773             right = mid;
00774         }
00775       if (di >= dest->nelem)
00776         break;
00777 
00778       if (dest->elems[di] == src_elem)
00779         {
00780           /* Skip since, DEST already has the element.  */
00781           ++di;
00782           ++si;
00783           continue;
00784         }
00785 
00786       /* Skip the src elements which are less than dest->elems[di].  */
00787       cp_from = si;
00788       while (si < src->nelem && src->elems[si] < dest->elems[di])
00789         ++si;
00790       /* Copy these src elements.  */
00791       ncp = si - cp_from;
00792       memmove (dest->elems + di + ncp, dest->elems + di,
00793                sizeof (int) * (dest->nelem - di));
00794       memcpy (dest->elems + di, src->elems + cp_from,
00795               sizeof (int) * ncp);
00796       /* Update counters.  */
00797       di += ncp;
00798       dest->nelem += ncp;
00799     }
00800 
00801   /* Copy remaining src elements.  */
00802   if (si < src->nelem)
00803     {
00804       memcpy (dest->elems + di, src->elems + si,
00805               sizeof (int) * (src->nelem - si));
00806       dest->nelem += src->nelem - si;
00807     }
00808   return REG_NOERROR;
00809 }

static void re_node_set_remove_at re_node_set set,
int  idx
[static]
 

Definition at line 915 of file regex_internal.c.

Referenced by create_cd_newstate(), and sub_epsilon_src_nodes().

00918 {
00919   if (idx < 0 || idx >= set->nelem)
00920     return;
00921   if (idx < set->nelem - 1)
00922     memmove (set->elems + idx, set->elems + idx + 1,
00923              sizeof (int) * (set->nelem - idx - 1));
00924   --set->nelem;
00925 }