Lines Matching refs:mctx

22 static void match_ctx_clean (re_match_context_t *mctx);
26 static Idx search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx);
27 static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, Idx node,
52 static reg_errcode_t prune_impossible_nodes (re_match_context_t *mctx);
53 static Idx check_matching (re_match_context_t *mctx, bool fl_longest_match,
55 static Idx check_halt_state_context (const re_match_context_t *mctx,
65 const re_match_context_t *mctx,
71 static int sift_states_iter_mb (const re_match_context_t *mctx,
75 static reg_errcode_t sift_states_backward (const re_match_context_t *mctx,
77 static reg_errcode_t build_sifted_states (const re_match_context_t *mctx,
80 static reg_errcode_t update_cur_sifted_state (const re_match_context_t *mctx,
87 static bool check_dst_limits (const re_match_context_t *mctx,
91 static int check_dst_limits_calc_pos_1 (const re_match_context_t *mctx,
94 static int check_dst_limits_calc_pos (const re_match_context_t *mctx,
104 static reg_errcode_t sift_states_bkref (const re_match_context_t *mctx,
111 re_match_context_t *mctx);
113 re_match_context_t *mctx,
116 re_match_context_t *mctx,
118 static reg_errcode_t check_subexp_matching_top (re_match_context_t *mctx,
123 re_match_context_t *mctx,
127 static reg_errcode_t transit_state_mb (re_match_context_t *mctx,
130 static reg_errcode_t transit_state_bkref (re_match_context_t *mctx,
132 static reg_errcode_t get_subexp (re_match_context_t *mctx,
134 static reg_errcode_t get_subexp_sub (re_match_context_t *mctx,
140 static reg_errcode_t check_arrival (re_match_context_t *mctx,
144 static reg_errcode_t check_arrival_add_next_nodes (re_match_context_t *mctx,
155 static reg_errcode_t expand_bkref_cache (re_match_context_t *mctx,
171 static bool check_node_accept (const re_match_context_t *mctx,
173 static reg_errcode_t extend_buffers (re_match_context_t *mctx, int min_len);
600 re_match_context_t mctx = { .dfa = dfa }; in re_search_internal() local
602 re_match_context_t mctx; in re_search_internal() local
610 memset (&mctx, '\0', sizeof (re_match_context_t)); in re_search_internal()
611 mctx.dfa = dfa; in re_search_internal()
644 err = re_string_allocate (&mctx.input, string, length, dfa->nodes_len + 1, in re_search_internal()
649 mctx.input.stop = stop; in re_search_internal()
650 mctx.input.raw_stop = stop; in re_search_internal()
651 mctx.input.newline_anchor = preg->newline_anchor; in re_search_internal()
653 err = match_ctx_init (&mctx, eflags, dfa->nbackref * 2); in re_search_internal()
665 <= mctx.input.bufs_len), 0)) in re_search_internal()
671 mctx.state_log = re_malloc (re_dfastate_t *, mctx.input.bufs_len + 1); in re_search_internal()
672 if (BE (mctx.state_log == NULL, 0)) in re_search_internal()
679 mctx.state_log = NULL; in re_search_internal()
682 mctx.input.tip_context = (eflags & REG_NOTBOL) ? CONTEXT_BEGBUF in re_search_internal()
760 __re_size_t offset = match_first - mctx.input.raw_mbs_idx; in re_search_internal()
761 if (BE (offset >= (__re_size_t) mctx.input.valid_raw_len, 0)) in re_search_internal()
763 err = re_string_reconstruct (&mctx.input, match_first, in re_search_internal()
768 offset = match_first - mctx.input.raw_mbs_idx; in re_search_internal()
773 ? 0 : re_string_byte_at (&mctx.input, offset)); in re_search_internal()
788 err = re_string_reconstruct (&mctx.input, match_first, eflags); in re_search_internal()
795 if (!sb && !re_string_first_byte (&mctx.input, 0)) in re_search_internal()
801 mctx.state_log_top = mctx.nbkref_ents = mctx.max_mb_elem_len = 0; in re_search_internal()
802 match_last = check_matching (&mctx, fl_longest_match, in re_search_internal()
813 mctx.match_last = match_last; in re_search_internal()
816 re_dfastate_t *pstate = mctx.state_log[match_last]; in re_search_internal()
817 mctx.last_node = check_halt_state_context (&mctx, pstate, in re_search_internal()
823 err = prune_impossible_nodes (&mctx); in re_search_internal()
835 match_ctx_clean (&mctx); in re_search_internal()
854 pmatch[0].rm_eo = mctx.match_last; in re_search_internal()
861 err = set_regs (preg, &mctx, nmatch, pmatch, in re_search_internal()
874 if (BE (mctx.input.offsets_needed != 0, 0)) in re_search_internal()
877 (pmatch[reg_idx].rm_so == mctx.input.valid_len in re_search_internal()
878 ? mctx.input.valid_raw_len in re_search_internal()
879 : mctx.input.offsets[pmatch[reg_idx].rm_so]); in re_search_internal()
881 (pmatch[reg_idx].rm_eo == mctx.input.valid_len in re_search_internal()
882 ? mctx.input.valid_raw_len in re_search_internal()
883 : mctx.input.offsets[pmatch[reg_idx].rm_eo]); in re_search_internal()
886 assert (mctx.input.offsets_needed == 0); in re_search_internal()
909 re_free (mctx.state_log); in re_search_internal()
911 match_ctx_free (&mctx); in re_search_internal()
912 re_string_destruct (&mctx.input); in re_search_internal()
918 prune_impossible_nodes (re_match_context_t *mctx) in prune_impossible_nodes() argument
920 const re_dfa_t *const dfa = mctx->dfa; in prune_impossible_nodes()
927 assert (mctx->state_log != NULL); in prune_impossible_nodes()
929 match_last = mctx->match_last; in prune_impossible_nodes()
930 halt_node = mctx->last_node; in prune_impossible_nodes()
956 ret = sift_states_backward (mctx, &sctx); in prune_impossible_nodes()
970 } while (mctx->state_log[match_last] == NULL in prune_impossible_nodes()
971 || !mctx->state_log[match_last]->halt); in prune_impossible_nodes()
972 halt_node = check_halt_state_context (mctx, in prune_impossible_nodes()
973 mctx->state_log[match_last], in prune_impossible_nodes()
986 ret = sift_states_backward (mctx, &sctx); in prune_impossible_nodes()
996 re_free (mctx->state_log); in prune_impossible_nodes()
997 mctx->state_log = sifted_states; in prune_impossible_nodes()
999 mctx->last_node = halt_node; in prune_impossible_nodes()
1000 mctx->match_last = match_last; in prune_impossible_nodes()
1014 acquire_init_state_context (reg_errcode_t *err, const re_match_context_t *mctx, in acquire_init_state_context() argument
1017 const re_dfa_t *const dfa = mctx->dfa; in acquire_init_state_context()
1021 context = re_string_context_at (&mctx->input, idx - 1, mctx->eflags); in acquire_init_state_context()
1056 check_matching (re_match_context_t *mctx, bool fl_longest_match, in check_matching() argument
1059 const re_dfa_t *const dfa = mctx->dfa; in check_matching()
1063 Idx cur_str_idx = re_string_cur_idx (&mctx->input); in check_matching()
1069 cur_state = acquire_init_state_context (&err, mctx, cur_str_idx); in check_matching()
1077 if (mctx->state_log != NULL) in check_matching()
1079 mctx->state_log[cur_str_idx] = cur_state; in check_matching()
1086 err = check_subexp_matching_top (mctx, &cur_state->nodes, 0); in check_matching()
1092 err = transit_state_bkref (mctx, &cur_state->nodes); in check_matching()
1103 || check_halt_state_context (mctx, cur_state, cur_str_idx)) in check_matching()
1115 while (!re_string_eoi (&mctx->input)) in check_matching()
1118 Idx next_char_idx = re_string_cur_idx (&mctx->input) + 1; in check_matching()
1120 if ((BE (next_char_idx >= mctx->input.bufs_len, 0) in check_matching()
1121 && mctx->input.bufs_len < mctx->input.len) in check_matching()
1122 || (BE (next_char_idx >= mctx->input.valid_len, 0) in check_matching()
1123 && mctx->input.valid_len < mctx->input.len)) in check_matching()
1125 err = extend_buffers (mctx, next_char_idx + 1); in check_matching()
1133 cur_state = transit_state (&err, mctx, cur_state); in check_matching()
1134 if (mctx->state_log != NULL) in check_matching()
1135 cur_state = merge_state_with_log (&err, mctx, cur_state); in check_matching()
1145 if (mctx->state_log == NULL in check_matching()
1147 || (cur_state = find_recover_state (&err, mctx)) == NULL) in check_matching()
1164 || check_halt_state_context (mctx, cur_state, in check_matching()
1165 re_string_cur_idx (&mctx->input))) in check_matching()
1168 match_last = re_string_cur_idx (&mctx->input); in check_matching()
1206 check_halt_state_context (const re_match_context_t *mctx, in check_halt_state_context() argument
1214 context = re_string_context_at (&mctx->input, idx, mctx->eflags); in check_halt_state_context()
1216 if (check_halt_node_context (mctx->dfa, state->nodes.elems[i], context)) in check_halt_state_context()
1227 proceed_next_node (const re_match_context_t *mctx, Idx nregs, regmatch_t *regs, in proceed_next_node() argument
1231 const re_dfa_t *const dfa = mctx->dfa; in proceed_next_node()
1236 re_node_set *cur_nodes = &mctx->state_log[*pidx]->nodes; in proceed_next_node()
1278 naccepted = check_node_accept_bytes (dfa, node, &mctx->input, *pidx); in proceed_next_node()
1291 char *buf = (char *) re_string_get_buffer (&mctx->input); in proceed_next_node()
1292 if (mctx->input.valid_len - *pidx < naccepted in proceed_next_node()
1307 if (re_node_set_contains (&mctx->state_log[*pidx]->nodes, in proceed_next_node()
1314 || check_node_accept (mctx, dfa->nodes + node, *pidx)) in proceed_next_node()
1318 if (fs && (*pidx > mctx->match_last || mctx->state_log[*pidx] == NULL in proceed_next_node()
1319 || !re_node_set_contains (&mctx->state_log[*pidx]->nodes, in proceed_next_node()
1377 set_regs (const regex_t *preg, const re_match_context_t *mctx, size_t nmatch, in set_regs() argument
1390 assert (mctx->state_log != NULL); in set_regs()
1423 if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node) in set_regs()
1451 cur_node = proceed_next_node (mctx, nmatch, pmatch, &idx, cur_node, in set_regs()
1570 sift_states_backward (const re_match_context_t *mctx, re_sift_context_t *sctx) in sift_states_backward() argument
1578 assert (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL); in sift_states_backward()
1586 err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest); in sift_states_backward()
1595 if (null_cnt > mctx->max_mb_elem_len) in sift_states_backward()
1605 if (mctx->state_log[str_idx]) in sift_states_backward()
1607 err = build_sifted_states (mctx, sctx, str_idx, &cur_dest); in sift_states_backward()
1616 err = update_cur_sifted_state (mctx, sctx, str_idx, &cur_dest); in sift_states_backward()
1628 build_sifted_states (const re_match_context_t *mctx, re_sift_context_t *sctx, in build_sifted_states() argument
1631 const re_dfa_t *const dfa = mctx->dfa; in build_sifted_states()
1632 const re_node_set *cur_src = &mctx->state_log[str_idx]->non_eps_nodes; in build_sifted_states()
1655 naccepted = sift_states_iter_mb (mctx, sctx, prev_node, in build_sifted_states()
1662 && check_node_accept (mctx, dfa->nodes + prev_node, str_idx) in build_sifted_states()
1673 if (check_dst_limits (mctx, &sctx->limits, in build_sifted_states()
1689 clean_state_log_if_needed (re_match_context_t *mctx, Idx next_state_log_idx) in clean_state_log_if_needed() argument
1691 Idx top = mctx->state_log_top; in clean_state_log_if_needed()
1693 if ((next_state_log_idx >= mctx->input.bufs_len in clean_state_log_if_needed()
1694 && mctx->input.bufs_len < mctx->input.len) in clean_state_log_if_needed()
1695 || (next_state_log_idx >= mctx->input.valid_len in clean_state_log_if_needed()
1696 && mctx->input.valid_len < mctx->input.len)) in clean_state_log_if_needed()
1699 err = extend_buffers (mctx, next_state_log_idx + 1); in clean_state_log_if_needed()
1706 memset (mctx->state_log + top + 1, '\0', in clean_state_log_if_needed()
1708 mctx->state_log_top = next_state_log_idx; in clean_state_log_if_needed()
1740 update_cur_sifted_state (const re_match_context_t *mctx, in update_cur_sifted_state() argument
1744 const re_dfa_t *const dfa = mctx->dfa; in update_cur_sifted_state()
1747 candidates = ((mctx->state_log[str_idx] == NULL) ? NULL in update_cur_sifted_state()
1748 : &mctx->state_log[str_idx]->nodes); in update_cur_sifted_state()
1766 mctx->bkref_ents, str_idx); in update_cur_sifted_state()
1777 if (candidates && mctx->state_log[str_idx]->has_backref) in update_cur_sifted_state()
1779 err = sift_states_bkref (mctx, sctx, str_idx, candidates); in update_cur_sifted_state()
1864 check_dst_limits (const re_match_context_t *mctx, const re_node_set *limits, in check_dst_limits() argument
1867 const re_dfa_t *const dfa = mctx->dfa; in check_dst_limits()
1870 Idx dst_bkref_idx = search_cur_bkref_entry (mctx, dst_idx); in check_dst_limits()
1871 Idx src_bkref_idx = search_cur_bkref_entry (mctx, src_idx); in check_dst_limits()
1876 ent = mctx->bkref_ents + limits->elems[lim_idx]; in check_dst_limits()
1879 dst_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx], in check_dst_limits()
1882 src_pos = check_dst_limits_calc_pos (mctx, limits->elems[lim_idx], in check_dst_limits()
1899 check_dst_limits_calc_pos_1 (const re_match_context_t *mctx, int boundaries, in check_dst_limits_calc_pos_1() argument
1902 const re_dfa_t *const dfa = mctx->dfa; in check_dst_limits_calc_pos_1()
1916 struct re_backref_cache_entry *ent = mctx->bkref_ents + bkref_idx; in check_dst_limits_calc_pos_1()
1946 check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx, in check_dst_limits_calc_pos_1()
1980 check_dst_limits_calc_pos (const re_match_context_t *mctx, Idx limit, in check_dst_limits_calc_pos() argument
1984 struct re_backref_cache_entry *lim = mctx->bkref_ents + limit; in check_dst_limits_calc_pos()
2001 return check_dst_limits_calc_pos_1 (mctx, boundaries, subexp_idx, in check_dst_limits_calc_pos()
2097 sift_states_bkref (const re_match_context_t *mctx, re_sift_context_t *sctx, in sift_states_bkref() argument
2100 const re_dfa_t *const dfa = mctx->dfa; in sift_states_bkref()
2104 Idx first_idx = search_cur_bkref_entry (mctx, str_idx); in sift_states_bkref()
2124 entry = mctx->bkref_ents + first_idx; in sift_states_bkref()
2144 || check_dst_limits (mctx, &sctx->limits, node, in sift_states_bkref()
2164 err = sift_states_backward (mctx, &local_sctx); in sift_states_bkref()
2179 entry = mctx->bkref_ents + enabled_idx; in sift_states_bkref()
2196 sift_states_iter_mb (const re_match_context_t *mctx, re_sift_context_t *sctx, in sift_states_iter_mb() argument
2199 const re_dfa_t *const dfa = mctx->dfa; in sift_states_iter_mb()
2202 naccepted = check_node_accept_bytes (dfa, node_idx, &mctx->input, str_idx); in sift_states_iter_mb()
2226 transit_state (reg_errcode_t *err, re_match_context_t *mctx, in transit_state() argument
2236 *err = transit_state_mb (mctx, state); in transit_state()
2246 return transit_state_sb (err, mctx, state); in transit_state()
2250 ch = re_string_fetch_byte (&mctx->input); in transit_state()
2262 = re_string_context_at (&mctx->input, in transit_state()
2263 re_string_cur_idx (&mctx->input) - 1, in transit_state()
2264 mctx->eflags); in transit_state()
2271 if (!build_trtable (mctx->dfa, state)) in transit_state()
2283 merge_state_with_log (reg_errcode_t *err, re_match_context_t *mctx, in merge_state_with_log() argument
2286 const re_dfa_t *const dfa = mctx->dfa; in merge_state_with_log()
2287 Idx cur_idx = re_string_cur_idx (&mctx->input); in merge_state_with_log()
2289 if (cur_idx > mctx->state_log_top) in merge_state_with_log()
2291 mctx->state_log[cur_idx] = next_state; in merge_state_with_log()
2292 mctx->state_log_top = cur_idx; in merge_state_with_log()
2294 else if (mctx->state_log[cur_idx] == 0) in merge_state_with_log()
2296 mctx->state_log[cur_idx] = next_state; in merge_state_with_log()
2307 pstate = mctx->state_log[cur_idx]; in merge_state_with_log()
2322 context = re_string_context_at (&mctx->input, in merge_state_with_log()
2323 re_string_cur_idx (&mctx->input) - 1, in merge_state_with_log()
2324 mctx->eflags); in merge_state_with_log()
2325 next_state = mctx->state_log[cur_idx] in merge_state_with_log()
2339 *err = check_subexp_matching_top (mctx, &next_state->nodes, in merge_state_with_log()
2347 *err = transit_state_bkref (mctx, &next_state->nodes); in merge_state_with_log()
2350 next_state = mctx->state_log[cur_idx]; in merge_state_with_log()
2361 find_recover_state (reg_errcode_t *err, re_match_context_t *mctx) in find_recover_state() argument
2366 Idx max = mctx->state_log_top; in find_recover_state()
2367 Idx cur_str_idx = re_string_cur_idx (&mctx->input); in find_recover_state()
2373 re_string_skip_bytes (&mctx->input, 1); in find_recover_state()
2375 while (mctx->state_log[cur_str_idx] == NULL); in find_recover_state()
2377 cur_state = merge_state_with_log (err, mctx, NULL); in find_recover_state()
2391 check_subexp_matching_top (re_match_context_t *mctx, re_node_set *cur_nodes, in check_subexp_matching_top() argument
2394 const re_dfa_t *const dfa = mctx->dfa; in check_subexp_matching_top()
2411 err = match_ctx_add_subtop (mctx, node, str_idx); in check_subexp_matching_top()
2424 transit_state_sb (reg_errcode_t *err, re_match_context_t *mctx,
2427 const re_dfa_t *const dfa = mctx->dfa;
2430 Idx node_cnt, cur_str_idx = re_string_cur_idx (&mctx->input);
2439 if (check_node_accept (mctx, dfa->nodes + cur_node, cur_str_idx))
2450 context = re_string_context_at (&mctx->input, cur_str_idx, mctx->eflags);
2456 re_string_skip_bytes (&mctx->input, 1);
2463 transit_state_mb (re_match_context_t *mctx, re_dfastate_t *pstate) in transit_state_mb() argument
2465 const re_dfa_t *const dfa = mctx->dfa; in transit_state_mb()
2483 context = re_string_context_at (&mctx->input, in transit_state_mb()
2484 re_string_cur_idx (&mctx->input), in transit_state_mb()
2485 mctx->eflags); in transit_state_mb()
2492 naccepted = check_node_accept_bytes (dfa, cur_node_idx, &mctx->input, in transit_state_mb()
2493 re_string_cur_idx (&mctx->input)); in transit_state_mb()
2498 dest_idx = re_string_cur_idx (&mctx->input) + naccepted; in transit_state_mb()
2499 mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted in transit_state_mb()
2500 : mctx->max_mb_elem_len); in transit_state_mb()
2501 err = clean_state_log_if_needed (mctx, dest_idx); in transit_state_mb()
2509 dest_state = mctx->state_log[dest_idx]; in transit_state_mb()
2519 context = re_string_context_at (&mctx->input, dest_idx - 1, in transit_state_mb()
2520 mctx->eflags); in transit_state_mb()
2521 mctx->state_log[dest_idx] in transit_state_mb()
2525 if (BE (mctx->state_log[dest_idx] == NULL && err != REG_NOERROR, 0)) in transit_state_mb()
2533 transit_state_bkref (re_match_context_t *mctx, const re_node_set *nodes) in transit_state_bkref() argument
2535 const re_dfa_t *const dfa = mctx->dfa; in transit_state_bkref()
2538 Idx cur_str_idx = re_string_cur_idx (&mctx->input); in transit_state_bkref()
2554 context = re_string_context_at (&mctx->input, cur_str_idx, in transit_state_bkref()
2555 mctx->eflags); in transit_state_bkref()
2562 bkc_idx = mctx->nbkref_ents; in transit_state_bkref()
2563 err = get_subexp (mctx, node_idx, cur_str_idx); in transit_state_bkref()
2572 for (; bkc_idx < mctx->nbkref_ents; ++bkc_idx) in transit_state_bkref()
2577 bkref_ent = mctx->bkref_ents + bkc_idx; in transit_state_bkref()
2586 context = re_string_context_at (&mctx->input, dest_str_idx - 1, in transit_state_bkref()
2587 mctx->eflags); in transit_state_bkref()
2588 dest_state = mctx->state_log[dest_str_idx]; in transit_state_bkref()
2589 prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0 in transit_state_bkref()
2590 : mctx->state_log[cur_str_idx]->nodes.nelem); in transit_state_bkref()
2594 mctx->state_log[dest_str_idx] in transit_state_bkref()
2597 if (BE (mctx->state_log[dest_str_idx] == NULL in transit_state_bkref()
2612 mctx->state_log[dest_str_idx] in transit_state_bkref()
2615 if (BE (mctx->state_log[dest_str_idx] == NULL in transit_state_bkref()
2622 && mctx->state_log[cur_str_idx]->nodes.nelem > prev_nelem) in transit_state_bkref()
2624 err = check_subexp_matching_top (mctx, new_dest_nodes, in transit_state_bkref()
2628 err = transit_state_bkref (mctx, new_dest_nodes); in transit_state_bkref()
2647 get_subexp (re_match_context_t *mctx, Idx bkref_node, Idx bkref_str_idx) in get_subexp() argument
2649 const re_dfa_t *const dfa = mctx->dfa; in get_subexp()
2651 const char *buf = (const char *) re_string_get_buffer (&mctx->input); in get_subexp()
2653 Idx cache_idx = search_cur_bkref_entry (mctx, bkref_str_idx); in get_subexp()
2657 = mctx->bkref_ents + cache_idx; in get_subexp()
2667 for (sub_top_idx = 0; sub_top_idx < mctx->nsub_tops; ++sub_top_idx) in get_subexp()
2670 re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx]; in get_subexp()
2690 if (BE (bkref_str_off + sl_str_diff > mctx->input.valid_len, 0)) in get_subexp()
2693 if (bkref_str_off + sl_str_diff > mctx->input.len) in get_subexp()
2696 err = clean_state_log_if_needed (mctx, in get_subexp()
2701 buf = (const char *) re_string_get_buffer (&mctx->input); in get_subexp()
2709 err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node, in get_subexp()
2714 buf = (const char *) re_string_get_buffer (&mctx->input); in get_subexp()
2737 if (BE (bkref_str_off >= mctx->input.valid_len, 0)) in get_subexp()
2740 if (bkref_str_off >= mctx->input.len) in get_subexp()
2743 err = extend_buffers (mctx, bkref_str_off + 1); in get_subexp()
2747 buf = (const char *) re_string_get_buffer (&mctx->input); in get_subexp()
2753 if (mctx->state_log[sl_str] == NULL) in get_subexp()
2756 nodes = &mctx->state_log[sl_str]->nodes; in get_subexp()
2770 err = check_arrival (mctx, sub_top->path, sub_top->node, in get_subexp()
2780 err = get_subexp_sub (mctx, sub_top, sub_last, bkref_node, in get_subexp()
2796 get_subexp_sub (re_match_context_t *mctx, const re_sub_match_top_t *sub_top, in get_subexp_sub() argument
2802 err = check_arrival (mctx, &sub_last->path, sub_last->node, in get_subexp_sub()
2807 err = match_ctx_add_entry (mctx, bkref_node, bkref_str, sub_top->str_idx, in get_subexp_sub()
2812 return clean_state_log_if_needed (mctx, to_idx); in get_subexp_sub()
2846 check_arrival (re_match_context_t *mctx, state_array_t *path, Idx top_node, in check_arrival() argument
2849 const re_dfa_t *const dfa = mctx->dfa; in check_arrival()
2859 if (BE (path->alloc < last_str + mctx->max_mb_elem_len + 1, 0)) in check_arrival()
2863 Idx incr_alloc = last_str + mctx->max_mb_elem_len + 1; in check_arrival()
2882 backup_state_log = mctx->state_log; in check_arrival()
2883 backup_cur_idx = mctx->input.cur_idx; in check_arrival()
2884 mctx->state_log = path->array; in check_arrival()
2885 mctx->input.cur_idx = str_idx; in check_arrival()
2888 context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags); in check_arrival()
2903 cur_state = mctx->state_log[str_idx]; in check_arrival()
2917 err = expand_bkref_cache (mctx, &next_nodes, str_idx, in check_arrival()
2931 mctx->state_log[str_idx] = cur_state; in check_arrival()
2934 for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;) in check_arrival()
2937 if (mctx->state_log[str_idx + 1]) in check_arrival()
2940 &mctx->state_log[str_idx + 1]->nodes); in check_arrival()
2949 err = check_arrival_add_next_nodes (mctx, str_idx, in check_arrival()
2967 err = expand_bkref_cache (mctx, &next_nodes, str_idx, in check_arrival()
2975 context = re_string_context_at (&mctx->input, str_idx - 1, mctx->eflags); in check_arrival()
2982 mctx->state_log[str_idx] = cur_state; in check_arrival()
2986 cur_nodes = (mctx->state_log[last_str] == NULL ? NULL in check_arrival()
2987 : &mctx->state_log[last_str]->nodes); in check_arrival()
2991 mctx->state_log = backup_state_log; in check_arrival()
2992 mctx->input.cur_idx = backup_cur_idx; in check_arrival()
3011 check_arrival_add_next_nodes (re_match_context_t *mctx, Idx str_idx, in check_arrival_add_next_nodes() argument
3014 const re_dfa_t *const dfa = mctx->dfa; in check_arrival_add_next_nodes()
3034 naccepted = check_node_accept_bytes (dfa, cur_node, &mctx->input, in check_arrival_add_next_nodes()
3041 dest_state = mctx->state_log[next_idx]; in check_arrival_add_next_nodes()
3058 mctx->state_log[next_idx] = re_acquire_state (&err, dfa, in check_arrival_add_next_nodes()
3060 if (BE (mctx->state_log[next_idx] == NULL in check_arrival_add_next_nodes()
3070 || check_node_accept (mctx, dfa->nodes + cur_node, str_idx)) in check_arrival_add_next_nodes()
3189 expand_bkref_cache (re_match_context_t *mctx, re_node_set *cur_nodes, in expand_bkref_cache() argument
3192 const re_dfa_t *const dfa = mctx->dfa; in expand_bkref_cache()
3194 Idx cache_idx_start = search_cur_bkref_entry (mctx, cur_str); in expand_bkref_cache()
3201 ent = mctx->bkref_ents + cache_idx_start; in expand_bkref_cache()
3240 if (mctx->state_log[to_idx]) in expand_bkref_cache()
3243 if (re_node_set_contains (&mctx->state_log[to_idx]->nodes, in expand_bkref_cache()
3247 &mctx->state_log[to_idx]->nodes); in expand_bkref_cache()
3262 mctx->state_log[to_idx] = re_acquire_state (&err, dfa, &union_set); in expand_bkref_cache()
3264 if (BE (mctx->state_log[to_idx] == NULL in expand_bkref_cache()
3998 check_node_accept (const re_match_context_t *mctx, const re_token_t *node, in check_node_accept() argument
4002 ch = re_string_byte_at (&mctx->input, idx); in check_node_accept()
4022 if ((ch == '\n' && !(mctx->dfa->syntax & RE_DOT_NEWLINE)) in check_node_accept()
4023 || (ch == '\0' && (mctx->dfa->syntax & RE_DOT_NOT_NULL))) in check_node_accept()
4035 unsigned int context = re_string_context_at (&mctx->input, idx, in check_node_accept()
4036 mctx->eflags); in check_node_accept()
4048 extend_buffers (re_match_context_t *mctx, int min_len) in extend_buffers() argument
4051 re_string_t *pstr = &mctx->input; in extend_buffers()
4065 if (mctx->state_log != NULL) in extend_buffers()
4071 re_dfastate_t **new_array = re_realloc (mctx->state_log, re_dfastate_t *, in extend_buffers()
4075 mctx->state_log = new_array; in extend_buffers()
4114 match_ctx_init (re_match_context_t *mctx, int eflags, Idx n) in match_ctx_init() argument
4116 mctx->eflags = eflags; in match_ctx_init()
4117 mctx->match_last = -1; in match_ctx_init()
4127 mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n); in match_ctx_init()
4128 mctx->sub_tops = re_malloc (re_sub_match_top_t *, n); in match_ctx_init()
4129 if (BE (mctx->bkref_ents == NULL || mctx->sub_tops == NULL, 0)) in match_ctx_init()
4137 mctx->abkref_ents = n; in match_ctx_init()
4138 mctx->max_mb_elem_len = 1; in match_ctx_init()
4139 mctx->asub_tops = n; in match_ctx_init()
4148 match_ctx_clean (re_match_context_t *mctx) in match_ctx_clean() argument
4151 for (st_idx = 0; st_idx < mctx->nsub_tops; ++st_idx) in match_ctx_clean()
4154 re_sub_match_top_t *top = mctx->sub_tops[st_idx]; in match_ctx_clean()
4170 mctx->nsub_tops = 0; in match_ctx_clean()
4171 mctx->nbkref_ents = 0; in match_ctx_clean()
4177 match_ctx_free (re_match_context_t *mctx) in match_ctx_free() argument
4180 match_ctx_clean (mctx); in match_ctx_free()
4181 re_free (mctx->sub_tops); in match_ctx_free()
4182 re_free (mctx->bkref_ents); in match_ctx_free()
4192 match_ctx_add_entry (re_match_context_t *mctx, Idx node, Idx str_idx, Idx from, in match_ctx_add_entry() argument
4195 if (mctx->nbkref_ents >= mctx->abkref_ents) in match_ctx_add_entry()
4198 new_entry = re_realloc (mctx->bkref_ents, struct re_backref_cache_entry, in match_ctx_add_entry()
4199 mctx->abkref_ents * 2); in match_ctx_add_entry()
4202 re_free (mctx->bkref_ents); in match_ctx_add_entry()
4205 mctx->bkref_ents = new_entry; in match_ctx_add_entry()
4206 memset (mctx->bkref_ents + mctx->nbkref_ents, '\0', in match_ctx_add_entry()
4207 sizeof (struct re_backref_cache_entry) * mctx->abkref_ents); in match_ctx_add_entry()
4208 mctx->abkref_ents *= 2; in match_ctx_add_entry()
4210 if (mctx->nbkref_ents > 0 in match_ctx_add_entry()
4211 && mctx->bkref_ents[mctx->nbkref_ents - 1].str_idx == str_idx) in match_ctx_add_entry()
4212 mctx->bkref_ents[mctx->nbkref_ents - 1].more = 1; in match_ctx_add_entry()
4214 mctx->bkref_ents[mctx->nbkref_ents].node = node; in match_ctx_add_entry()
4215 mctx->bkref_ents[mctx->nbkref_ents].str_idx = str_idx; in match_ctx_add_entry()
4216 mctx->bkref_ents[mctx->nbkref_ents].subexp_from = from; in match_ctx_add_entry()
4217 mctx->bkref_ents[mctx->nbkref_ents].subexp_to = to; in match_ctx_add_entry()
4227 mctx->bkref_ents[mctx->nbkref_ents].eps_reachable_subexps_map in match_ctx_add_entry()
4230 mctx->bkref_ents[mctx->nbkref_ents++].more = 0; in match_ctx_add_entry()
4231 if (mctx->max_mb_elem_len < to - from) in match_ctx_add_entry()
4232 mctx->max_mb_elem_len = to - from; in match_ctx_add_entry()
4240 search_cur_bkref_entry (const re_match_context_t *mctx, Idx str_idx) in search_cur_bkref_entry() argument
4243 last = right = mctx->nbkref_ents; in search_cur_bkref_entry()
4247 if (mctx->bkref_ents[mid].str_idx < str_idx) in search_cur_bkref_entry()
4252 if (left < last && mctx->bkref_ents[left].str_idx == str_idx) in search_cur_bkref_entry()
4263 match_ctx_add_subtop (re_match_context_t *mctx, Idx node, Idx str_idx) in match_ctx_add_subtop() argument
4266 assert (mctx->sub_tops != NULL); in match_ctx_add_subtop()
4267 assert (mctx->asub_tops > 0); in match_ctx_add_subtop()
4269 if (BE (mctx->nsub_tops == mctx->asub_tops, 0)) in match_ctx_add_subtop()
4271 Idx new_asub_tops = mctx->asub_tops * 2; in match_ctx_add_subtop()
4272 re_sub_match_top_t **new_array = re_realloc (mctx->sub_tops, in match_ctx_add_subtop()
4277 mctx->sub_tops = new_array; in match_ctx_add_subtop()
4278 mctx->asub_tops = new_asub_tops; in match_ctx_add_subtop()
4280 mctx->sub_tops[mctx->nsub_tops] = calloc (1, sizeof (re_sub_match_top_t)); in match_ctx_add_subtop()
4281 if (BE (mctx->sub_tops[mctx->nsub_tops] == NULL, 0)) in match_ctx_add_subtop()
4283 mctx->sub_tops[mctx->nsub_tops]->node = node; in match_ctx_add_subtop()
4284 mctx->sub_tops[mctx->nsub_tops++]->str_idx = str_idx; in match_ctx_add_subtop()