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_t * | re_acquire_state (reg_errcode_t *err, re_dfa_t *dfa, const re_node_set *nodes) |
| 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 re_dfastate_t * | create_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_t * | create_ci_newstate (re_dfa_t *dfa, const re_node_set *nodes, unsigned int hash) |
| static re_dfastate_t * | create_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) |
|
|
|
|
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||
|
Definition at line 877 of file regex_internal.c. 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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
||||||||||||
|
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 }
|
|
|