]> mj.ucw.cz Git - libucw.git/blob - lib/regex/regexec.c
Oops, a nasty bug has crept in.
[libucw.git] / lib / regex / regexec.c
1 /* Extended regular expression matching and search library.
2    Copyright (C) 2002, 2003 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4    Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
20
21 static reg_errcode_t match_ctx_init (re_match_context_t *cache, int eflags,
22                                      re_string_t *input, int n);
23 static void match_ctx_clean (re_match_context_t *mctx);
24 static void match_ctx_free (re_match_context_t *cache);
25 static void match_ctx_free_subtops (re_match_context_t *mctx);
26 static reg_errcode_t match_ctx_add_entry (re_match_context_t *cache, int node,
27                                           int str_idx, int from, int to);
28 static int search_cur_bkref_entry (re_match_context_t *mctx, int str_idx);
29 static void match_ctx_clear_flag (re_match_context_t *mctx);
30 static reg_errcode_t match_ctx_add_subtop (re_match_context_t *mctx, int node,
31                                            int str_idx);
32 static re_sub_match_last_t * match_ctx_add_sublast (re_sub_match_top_t *subtop,
33                                                    int node, int str_idx);
34 static void sift_ctx_init (re_sift_context_t *sctx, re_dfastate_t **sifted_sts,
35                            re_dfastate_t **limited_sts, int last_node,
36                            int last_str_idx, int check_subexp);
37 static reg_errcode_t re_search_internal (const regex_t *preg,
38                                          const char *string, int length,
39                                          int start, int range, int stop,
40                                          size_t nmatch, regmatch_t pmatch[],
41                                          int eflags);
42 static int re_search_2_stub (struct re_pattern_buffer *bufp,
43                              const char *string1, int length1,
44                              const char *string2, int length2,
45                              int start, int range, struct re_registers *regs,
46                              int stop, int ret_len);
47 static int re_search_stub (struct re_pattern_buffer *bufp,
48                            const char *string, int length, int start,
49                            int range, int stop, struct re_registers *regs,
50                            int ret_len);
51 static unsigned re_copy_regs (struct re_registers *regs, regmatch_t *pmatch,
52                               int nregs, int regs_allocated);
53 static inline re_dfastate_t *acquire_init_state_context (reg_errcode_t *err,
54                                                          const regex_t *preg,
55                                                          const re_match_context_t *mctx,
56                                                          int idx);
57 static reg_errcode_t prune_impossible_nodes (const regex_t *preg,
58                                              re_match_context_t *mctx);
59 static int check_matching (const regex_t *preg, re_match_context_t *mctx,
60                            int fl_search, int fl_longest_match);
61 static int check_halt_node_context (const re_dfa_t *dfa, int node,
62                                     unsigned int context);
63 static int check_halt_state_context (const regex_t *preg,
64                                      const re_dfastate_t *state,
65                                      const re_match_context_t *mctx, int idx);
66 static void update_regs (re_dfa_t *dfa, regmatch_t *pmatch, int cur_node,
67                          int cur_idx, int nmatch);
68 static int proceed_next_node (const regex_t *preg, int nregs, regmatch_t *regs,
69                               const re_match_context_t *mctx,
70                               int *pidx, int node, re_node_set *eps_via_nodes,
71                               struct re_fail_stack_t *fs);
72 static reg_errcode_t push_fail_stack (struct re_fail_stack_t *fs,
73                                       int str_idx, int *dests, int nregs,
74                                       regmatch_t *regs,
75                                       re_node_set *eps_via_nodes);
76 static int pop_fail_stack (struct re_fail_stack_t *fs, int *pidx, int nregs,
77                            regmatch_t *regs, re_node_set *eps_via_nodes);
78 static reg_errcode_t set_regs (const regex_t *preg,
79                                const re_match_context_t *mctx,
80                                size_t nmatch, regmatch_t *pmatch,
81                                int fl_backtrack);
82 static reg_errcode_t free_fail_stack_return (struct re_fail_stack_t *fs);
83
84 #ifdef RE_ENABLE_I18N
85 static int sift_states_iter_mb (const regex_t *preg,
86                                 const re_match_context_t *mctx,
87                                 re_sift_context_t *sctx,
88                                 int node_idx, int str_idx, int max_str_idx);
89 #endif /* RE_ENABLE_I18N */
90 static reg_errcode_t sift_states_backward (const regex_t *preg,
91                                            re_match_context_t *mctx,
92                                            re_sift_context_t *sctx);
93 static reg_errcode_t update_cur_sifted_state (const regex_t *preg,
94                                               re_match_context_t *mctx,
95                                               re_sift_context_t *sctx,
96                                               int str_idx,
97                                               re_node_set *dest_nodes);
98 static reg_errcode_t add_epsilon_src_nodes (re_dfa_t *dfa,
99                                             re_node_set *dest_nodes,
100                                             const re_node_set *candidates);
101 static reg_errcode_t sub_epsilon_src_nodes (re_dfa_t *dfa, int node,
102                                             re_node_set *dest_nodes,
103                                             const re_node_set *and_nodes);
104 static int check_dst_limits (re_dfa_t *dfa, re_node_set *limits,
105                              re_match_context_t *mctx, int dst_node,
106                              int dst_idx, int src_node, int src_idx);
107 static int check_dst_limits_calc_pos (re_dfa_t *dfa, re_match_context_t *mctx,
108                                       int limit, re_node_set *eclosures,
109                                       int subexp_idx, int node, int str_idx);
110 static reg_errcode_t check_subexp_limits (re_dfa_t *dfa,
111                                           re_node_set *dest_nodes,
112                                           const re_node_set *candidates,
113                                           re_node_set *limits,
114                                           struct re_backref_cache_entry *bkref_ents,
115                                           int str_idx);
116 static reg_errcode_t sift_states_bkref (const regex_t *preg,
117                                         re_match_context_t *mctx,
118                                         re_sift_context_t *sctx,
119                                         int str_idx, re_node_set *dest_nodes);
120 static reg_errcode_t clean_state_log_if_need (re_match_context_t *mctx,
121                                               int next_state_log_idx);
122 static reg_errcode_t merge_state_array (re_dfa_t *dfa, re_dfastate_t **dst,
123                                         re_dfastate_t **src, int num);
124 static re_dfastate_t *transit_state (reg_errcode_t *err, const regex_t *preg,
125                                      re_match_context_t *mctx,
126                                      re_dfastate_t *state, int fl_search);
127 static reg_errcode_t check_subexp_matching_top (re_dfa_t *dfa,
128                                                 re_match_context_t *mctx,
129                                                 re_node_set *cur_nodes,
130                                                 int str_idx);
131 static re_dfastate_t *transit_state_sb (reg_errcode_t *err, const regex_t *preg,
132                                         re_dfastate_t *pstate,
133                                         int fl_search,
134                                         re_match_context_t *mctx);
135 #ifdef RE_ENABLE_I18N
136 static reg_errcode_t transit_state_mb (const regex_t *preg,
137                                        re_dfastate_t *pstate,
138                                        re_match_context_t *mctx);
139 #endif /* RE_ENABLE_I18N */
140 static reg_errcode_t transit_state_bkref (const regex_t *preg,
141                                           re_node_set *nodes,
142                                           re_match_context_t *mctx);
143 static reg_errcode_t get_subexp (const regex_t *preg, re_match_context_t *mctx,
144                                  int bkref_node, int bkref_str_idx);
145 static reg_errcode_t get_subexp_sub (const regex_t *preg,
146                                      re_match_context_t *mctx,
147                                      re_sub_match_top_t *sub_top,
148                                      re_sub_match_last_t *sub_last,
149                                      int bkref_node, int bkref_str);
150 static int find_subexp_node (re_dfa_t *dfa, re_node_set *nodes,
151                              int subexp_idx, int fl_open);
152 static reg_errcode_t check_arrival (const regex_t *preg,
153                                     re_match_context_t *mctx,
154                                     state_array_t *path, int top_node,
155                                     int top_str, int last_node, int last_str,
156                                     int fl_open);
157 static reg_errcode_t check_arrival_add_next_nodes (const regex_t *preg,
158                                                    re_dfa_t *dfa,
159                                                    re_match_context_t *mctx,
160                                                    int str_idx,
161                                                    re_node_set *cur_nodes,
162                                                    re_node_set *next_nodes);
163 static reg_errcode_t check_arrival_expand_ecl (re_dfa_t *dfa,
164                                                re_node_set *cur_nodes,
165                                                int ex_subexp, int fl_open);
166 static reg_errcode_t check_arrival_expand_ecl_sub (re_dfa_t *dfa,
167                                                    re_node_set *dst_nodes,
168                                                    int target, int ex_subexp,
169                                                    int fl_open);
170 static reg_errcode_t expand_bkref_cache (const regex_t *preg,
171                                          re_match_context_t *mctx,
172                                          re_node_set *cur_nodes, int cur_str,
173                                          int last_str, int subexp_num,
174                                          int fl_open);
175 static re_dfastate_t **build_trtable (const regex_t *dfa,
176                                       const re_dfastate_t *state,
177                                       int fl_search);
178 #ifdef RE_ENABLE_I18N
179 static int check_node_accept_bytes (const regex_t *preg, int node_idx,
180                                     const re_string_t *input, int idx);
181 # ifdef _LIBC
182 static unsigned int find_collation_sequence_value (const unsigned char *mbs,
183                                                    size_t name_len);
184 # endif /* _LIBC */
185 #endif /* RE_ENABLE_I18N */
186 static int group_nodes_into_DFAstates (const regex_t *dfa,
187                                        const re_dfastate_t *state,
188                                        re_node_set *states_node,
189                                        bitset *states_ch);
190 static int check_node_accept (const regex_t *preg, const re_token_t *node,
191                               const re_match_context_t *mctx, int idx);
192 static reg_errcode_t extend_buffers (re_match_context_t *mctx);
193 \f
194 /* Entry point for POSIX code.  */
195
196 /* regexec searches for a given pattern, specified by PREG, in the
197    string STRING.
198
199    If NMATCH is zero or REG_NOSUB was set in the cflags argument to
200    `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
201    least NMATCH elements, and we set them to the offsets of the
202    corresponding matched substrings.
203
204    EFLAGS specifies `execution flags' which affect matching: if
205    REG_NOTBOL is set, then ^ does not match at the beginning of the
206    string; if REG_NOTEOL is set, then $ does not match at the end.
207
208    We return 0 if we find a match and REG_NOMATCH if not.  */
209
210 int
211 regexec (preg, string, nmatch, pmatch, eflags)
212     const regex_t *__restrict preg;
213     const char *__restrict string;
214     size_t nmatch;
215     regmatch_t pmatch[];
216     int eflags;
217 {
218   reg_errcode_t err;
219   int length = strlen (string);
220   if (preg->no_sub)
221     err = re_search_internal (preg, string, length, 0, length, length, 0,
222                               NULL, eflags);
223   else
224     err = re_search_internal (preg, string, length, 0, length, length, nmatch,
225                               pmatch, eflags);
226   return err != REG_NOERROR;
227 }
228 #ifdef _LIBC
229 weak_alias (__regexec, regexec)
230 #endif
231
232 /* Entry points for GNU code.  */
233
234 /* re_match, re_search, re_match_2, re_search_2
235
236    The former two functions operate on STRING with length LENGTH,
237    while the later two operate on concatenation of STRING1 and STRING2
238    with lengths LENGTH1 and LENGTH2, respectively.
239
240    re_match() matches the compiled pattern in BUFP against the string,
241    starting at index START.
242
243    re_search() first tries matching at index START, then it tries to match
244    starting from index START + 1, and so on.  The last start position tried
245    is START + RANGE.  (Thus RANGE = 0 forces re_search to operate the same
246    way as re_match().)
247
248    The parameter STOP of re_{match,search}_2 specifies that no match exceeding
249    the first STOP characters of the concatenation of the strings should be
250    concerned.
251
252    If REGS is not NULL, and BUFP->no_sub is not set, the offsets of the match
253    and all groups is stroed in REGS.  (For the "_2" variants, the offsets are
254    computed relative to the concatenation, not relative to the individual
255    strings.)
256
257    On success, re_match* functions return the length of the match, re_search*
258    return the position of the start of the match.  Return value -1 means no
259    match was found and -2 indicates an internal error.  */
260
261 int
262 re_match (bufp, string, length, start, regs)
263     struct re_pattern_buffer *bufp;
264     const char *string;
265     int length, start;
266     struct re_registers *regs;
267 {
268   return re_search_stub (bufp, string, length, start, 0, length, regs, 1);
269 }
270 #ifdef _LIBC
271 weak_alias (__re_match, re_match)
272 #endif
273
274 int
275 re_search (bufp, string, length, start, range, regs)
276     struct re_pattern_buffer *bufp;
277     const char *string;
278     int length, start, range;
279     struct re_registers *regs;
280 {
281   return re_search_stub (bufp, string, length, start, range, length, regs, 0);
282 }
283 #ifdef _LIBC
284 weak_alias (__re_search, re_search)
285 #endif
286
287 int
288 re_match_2 (bufp, string1, length1, string2, length2, start, regs, stop)
289     struct re_pattern_buffer *bufp;
290     const char *string1, *string2;
291     int length1, length2, start, stop;
292     struct re_registers *regs;
293 {
294   return re_search_2_stub (bufp, string1, length1, string2, length2,
295                            start, 0, regs, stop, 1);
296 }
297 #ifdef _LIBC
298 weak_alias (__re_match_2, re_match_2)
299 #endif
300
301 int
302 re_search_2 (bufp, string1, length1, string2, length2, start, range, regs, stop)
303     struct re_pattern_buffer *bufp;
304     const char *string1, *string2;
305     int length1, length2, start, range, stop;
306     struct re_registers *regs;
307 {
308   return re_search_2_stub (bufp, string1, length1, string2, length2,
309                            start, range, regs, stop, 0);
310 }
311 #ifdef _LIBC
312 weak_alias (__re_search_2, re_search_2)
313 #endif
314
315 static int
316 re_search_2_stub (bufp, string1, length1, string2, length2, start, range, regs,
317                   stop, ret_len)
318     struct re_pattern_buffer *bufp;
319     const char *string1, *string2;
320     int length1, length2, start, range, stop, ret_len;
321     struct re_registers *regs;
322 {
323   const char *str;
324   int rval;
325   int len = length1 + length2;
326   int free_str = 0;
327
328   if (BE (length1 < 0 || length2 < 0 || stop < 0, 0))
329     return -2;
330
331   /* Concatenate the strings.  */
332   if (length2 > 0)
333     if (length1 > 0)
334       {
335         char *s = re_malloc (char, len);
336
337         if (BE (s == NULL, 0))
338           return -2;
339         memcpy (s, string1, length1);
340         memcpy (s + length1, string2, length2);
341         str = s;
342         free_str = 1;
343       }
344     else
345       str = string2;
346   else
347     str = string1;
348
349   rval = re_search_stub (bufp, str, len, start, range, stop, regs,
350                          ret_len);
351   if (free_str)
352     re_free ((char *) str);
353   return rval;
354 }
355
356 /* The parameters have the same meaning as those of re_search.
357    Additional parameters:
358    If RET_LEN is nonzero the length of the match is returned (re_match style);
359    otherwise the position of the match is returned.  */
360
361 static int
362 re_search_stub (bufp, string, length, start, range, stop, regs, ret_len)
363     struct re_pattern_buffer *bufp;
364     const char *string;
365     int length, start, range, stop, ret_len;
366     struct re_registers *regs;
367 {
368   reg_errcode_t result;
369   regmatch_t *pmatch;
370   int nregs, rval;
371   int eflags = 0;
372
373   /* Check for out-of-range.  */
374   if (BE (start < 0 || start > length, 0))
375     return -1;
376   if (BE (start + range > length, 0))
377     range = length - start;
378   else if (BE (start + range < 0, 0))
379     range = -start;
380
381   eflags |= (bufp->not_bol) ? REG_NOTBOL : 0;
382   eflags |= (bufp->not_eol) ? REG_NOTEOL : 0;
383
384   /* Compile fastmap if we haven't yet.  */
385   if (range > 0 && bufp->fastmap != NULL && !bufp->fastmap_accurate)
386     re_compile_fastmap (bufp);
387
388   if (BE (bufp->no_sub, 0))
389     regs = NULL;
390
391   /* We need at least 1 register.  */
392   if (regs == NULL)
393     nregs = 1;
394   else if (BE (bufp->regs_allocated == REGS_FIXED &&
395                regs->num_regs < bufp->re_nsub + 1, 0))
396     {
397       nregs = regs->num_regs;
398       if (BE (nregs < 1, 0))
399         {
400           /* Nothing can be copied to regs.  */
401           regs = NULL;
402           nregs = 1;
403         }
404     }
405   else
406     nregs = bufp->re_nsub + 1;
407   pmatch = re_malloc (regmatch_t, nregs);
408   if (BE (pmatch == NULL, 0))
409     return -2;
410
411   result = re_search_internal (bufp, string, length, start, range, stop,
412                                nregs, pmatch, eflags);
413
414   rval = 0;
415
416   /* I hope we needn't fill ther regs with -1's when no match was found.  */
417   if (result != REG_NOERROR)
418     rval = -1;
419   else if (regs != NULL)
420     {
421       /* If caller wants register contents data back, copy them.  */
422       bufp->regs_allocated = re_copy_regs (regs, pmatch, nregs,
423                                            bufp->regs_allocated);
424       if (BE (bufp->regs_allocated == REGS_UNALLOCATED, 0))
425         rval = -2;
426     }
427
428   if (BE (rval == 0, 1))
429     {
430       if (ret_len)
431         {
432           assert (pmatch[0].rm_so == start);
433           rval = pmatch[0].rm_eo - start;
434         }
435       else
436         rval = pmatch[0].rm_so;
437     }
438   re_free (pmatch);
439   return rval;
440 }
441
442 static unsigned
443 re_copy_regs (regs, pmatch, nregs, regs_allocated)
444     struct re_registers *regs;
445     regmatch_t *pmatch;
446     int nregs, regs_allocated;
447 {
448   int rval = REGS_REALLOCATE;
449   int i;
450   int need_regs = nregs + 1;
451   /* We need one extra element beyond `num_regs' for the `-1' marker GNU code
452      uses.  */
453
454   /* Have the register data arrays been allocated?  */
455   if (regs_allocated == REGS_UNALLOCATED)
456     { /* No.  So allocate them with malloc.  */
457       regs->start = re_malloc (regoff_t, need_regs);
458       if (BE (regs->start == NULL, 0))
459         return REGS_UNALLOCATED;
460       regs->end = re_malloc (regoff_t, need_regs);
461       if (BE (regs->end == NULL, 0))
462         {
463           re_free (regs->start);
464           return REGS_UNALLOCATED;
465         }
466       regs->num_regs = need_regs;
467     }
468   else if (regs_allocated == REGS_REALLOCATE)
469     { /* Yes.  If we need more elements than were already
470          allocated, reallocate them.  If we need fewer, just
471          leave it alone.  */
472       if (need_regs > regs->num_regs)
473         {
474           regs->start = re_realloc (regs->start, regoff_t, need_regs);
475           if (BE (regs->start == NULL, 0))
476             {
477               if (regs->end != NULL)
478                 re_free (regs->end);
479               return REGS_UNALLOCATED;
480             }
481           regs->end = re_realloc (regs->end, regoff_t, need_regs);
482           if (BE (regs->end == NULL, 0))
483             {
484               re_free (regs->start);
485               return REGS_UNALLOCATED;
486             }
487           regs->num_regs = need_regs;
488         }
489     }
490   else
491     {
492       assert (regs_allocated == REGS_FIXED);
493       /* This function may not be called with REGS_FIXED and nregs too big.  */
494       assert (regs->num_regs >= nregs);
495       rval = REGS_FIXED;
496     }
497
498   /* Copy the regs.  */
499   for (i = 0; i < nregs; ++i)
500     {
501       regs->start[i] = pmatch[i].rm_so;
502       regs->end[i] = pmatch[i].rm_eo;
503     }
504   for ( ; i < regs->num_regs; ++i)
505     regs->start[i] = regs->end[i] = -1;
506
507   return rval;
508 }
509
510 /* Set REGS to hold NUM_REGS registers, storing them in STARTS and
511    ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
512    this memory for recording register information.  STARTS and ENDS
513    must be allocated using the malloc library routine, and must each
514    be at least NUM_REGS * sizeof (regoff_t) bytes long.
515
516    If NUM_REGS == 0, then subsequent matches should allocate their own
517    register data.
518
519    Unless this function is called, the first search or match using
520    PATTERN_BUFFER will allocate its own register data, without
521    freeing the old data.  */
522
523 void
524 re_set_registers (bufp, regs, num_regs, starts, ends)
525     struct re_pattern_buffer *bufp;
526     struct re_registers *regs;
527     unsigned num_regs;
528     regoff_t *starts, *ends;
529 {
530   if (num_regs)
531     {
532       bufp->regs_allocated = REGS_REALLOCATE;
533       regs->num_regs = num_regs;
534       regs->start = starts;
535       regs->end = ends;
536     }
537   else
538     {
539       bufp->regs_allocated = REGS_UNALLOCATED;
540       regs->num_regs = 0;
541       regs->start = regs->end = (regoff_t *) 0;
542     }
543 }
544 #ifdef _LIBC
545 weak_alias (__re_set_registers, re_set_registers)
546 #endif
547 \f
548 /* Entry points compatible with 4.2 BSD regex library.  We don't define
549    them unless specifically requested.  */
550
551 #if defined _REGEX_RE_COMP || defined _LIBC
552 int
553 # ifdef _LIBC
554 weak_function
555 # endif
556 re_exec (s)
557      const char *s;
558 {
559   return 0 == regexec (&re_comp_buf, s, 0, NULL, 0);
560 }
561 #endif /* _REGEX_RE_COMP */
562 \f
563 static re_node_set empty_set;
564
565 /* Internal entry point.  */
566
567 /* Searches for a compiled pattern PREG in the string STRING, whose
568    length is LENGTH.  NMATCH, PMATCH, and EFLAGS have the same
569    mingings with regexec.  START, and RANGE have the same meanings
570    with re_search.
571    Return REG_NOERROR if we find a match, and REG_NOMATCH if not,
572    otherwise return the error code.
573    Note: We assume front end functions already check ranges.
574    (START + RANGE >= 0 && START + RANGE <= LENGTH)  */
575
576 static reg_errcode_t
577 re_search_internal (preg, string, length, start, range, stop, nmatch, pmatch,
578                     eflags)
579     const regex_t *preg;
580     const char *string;
581     int length, start, range, stop, eflags;
582     size_t nmatch;
583     regmatch_t pmatch[];
584 {
585   reg_errcode_t err;
586   re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
587   re_string_t input;
588   int left_lim, right_lim, incr;
589   int fl_longest_match, match_first, match_last = -1;
590   int fast_translate, sb;
591   re_match_context_t mctx;
592   char *fastmap = ((preg->fastmap != NULL && preg->fastmap_accurate
593                     && range && !preg->can_be_null) ? preg->fastmap : NULL);
594
595   /* Check if the DFA haven't been compiled.  */
596   if (BE (preg->used == 0 || dfa->init_state == NULL
597           || dfa->init_state_word == NULL || dfa->init_state_nl == NULL
598           || dfa->init_state_begbuf == NULL, 0))
599     return REG_NOMATCH;
600
601   re_node_set_init_empty (&empty_set);
602   memset (&mctx, '\0', sizeof (re_match_context_t));
603
604   /* We must check the longest matching, if nmatch > 0.  */
605   fl_longest_match = (nmatch != 0 || dfa->nbackref);
606
607   err = re_string_allocate (&input, string, length, dfa->nodes_len + 1,
608                             preg->translate, preg->syntax & RE_ICASE);
609   if (BE (err != REG_NOERROR, 0))
610     goto free_return;
611   input.stop = stop;
612
613   err = match_ctx_init (&mctx, eflags, &input, dfa->nbackref * 2);
614   if (BE (err != REG_NOERROR, 0))
615     goto free_return;
616
617   /* We will log all the DFA states through which the dfa pass,
618      if nmatch > 1, or this dfa has "multibyte node", which is a
619      back-reference or a node which can accept multibyte character or
620      multi character collating element.  */
621   if (nmatch > 1 || dfa->has_mb_node)
622     {
623       mctx.state_log = re_malloc (re_dfastate_t *, dfa->nodes_len + 1);
624       if (BE (mctx.state_log == NULL, 0))
625         {
626           err = REG_ESPACE;
627           goto free_return;
628         }
629     }
630   else
631     mctx.state_log = NULL;
632
633 #ifdef DEBUG
634   /* We assume front-end functions already check them.  */
635   assert (start + range >= 0 && start + range <= length);
636 #endif
637
638   match_first = start;
639   input.tip_context = ((eflags & REG_NOTBOL) ? CONTEXT_BEGBUF
640                        : CONTEXT_NEWLINE | CONTEXT_BEGBUF);
641
642   /* Check incrementally whether of not the input string match.  */
643   incr = (range < 0) ? -1 : 1;
644   left_lim = (range < 0) ? start + range : start;
645   right_lim = (range < 0) ? start : start + range;
646   sb = MB_CUR_MAX == 1;
647   fast_translate = sb || !(preg->syntax & RE_ICASE || preg->translate);
648
649   for (;;)
650     {
651       /* At first get the current byte from input string.  */
652       if (fastmap)
653         {
654           if (BE (fast_translate, 1))
655             {
656               unsigned RE_TRANSLATE_TYPE t
657                 = (unsigned RE_TRANSLATE_TYPE) preg->translate;
658               if (BE (range >= 0, 1))
659                 {
660                   if (BE (t != NULL, 0))
661                     {
662                       while (BE (match_first < right_lim, 1)
663                              && !fastmap[t[(unsigned char) string[match_first]]])
664                         ++match_first;
665                     }
666                   else
667                     {
668                       while (BE (match_first < right_lim, 1)
669                              && !fastmap[(unsigned char) string[match_first]])
670                         ++match_first;
671                     }
672                   if (BE (match_first == right_lim, 0))
673                     {
674                       int ch = match_first >= length
675                                ? 0 : (unsigned char) string[match_first];
676                       if (!fastmap[t ? t[ch] : ch])
677                         break;
678                     }
679                 }
680               else
681                 {
682                   while (match_first >= left_lim)
683                     {
684                       int ch = match_first >= length
685                                ? 0 : (unsigned char) string[match_first];
686                       if (fastmap[t ? t[ch] : ch])
687                         break;
688                       --match_first;
689                     }
690                   if (match_first < left_lim)
691                     break;
692                 }
693             }
694           else
695             {
696               int ch;
697
698               do
699                 {
700                   /* In this case, we can't determine easily the current byte,
701                      since it might be a component byte of a multibyte
702                      character.  Then we use the constructed buffer
703                      instead.  */
704                   /* If MATCH_FIRST is out of the valid range, reconstruct the
705                      buffers.  */
706                   if (input.raw_mbs_idx + input.valid_len <= match_first
707                       || match_first < input.raw_mbs_idx)
708                     {
709                       err = re_string_reconstruct (&input, match_first, eflags,
710                                                    preg->newline_anchor);
711                       if (BE (err != REG_NOERROR, 0))
712                         goto free_return;
713                     }
714                   /* If MATCH_FIRST is out of the buffer, leave it as '\0'.
715                      Note that MATCH_FIRST must not be smaller than 0.  */
716                   ch = ((match_first >= length) ? 0
717                        : re_string_byte_at (&input,
718                                             match_first - input.raw_mbs_idx));
719                   if (fastmap[ch])
720                     break;
721                   match_first += incr;
722                 }
723               while (match_first >= left_lim && match_first <= right_lim);
724               if (! fastmap[ch])
725                 break;
726             }
727         }
728
729       /* Reconstruct the buffers so that the matcher can assume that
730          the matching starts from the begining of the buffer.  */
731       err = re_string_reconstruct (&input, match_first, eflags,
732                                    preg->newline_anchor);
733       if (BE (err != REG_NOERROR, 0))
734         goto free_return;
735 #ifdef RE_ENABLE_I18N
736      /* Eliminate it when it is a component of a multibyte character
737          and isn't the head of a multibyte character.  */
738       if (sb || re_string_first_byte (&input, 0))
739 #endif
740         {
741           /* It seems to be appropriate one, then use the matcher.  */
742           /* We assume that the matching starts from 0.  */
743           mctx.state_log_top = mctx.nbkref_ents = mctx.max_mb_elem_len = 0;
744           match_last = check_matching (preg, &mctx, 0, fl_longest_match);
745           if (match_last != -1)
746             {
747               if (BE (match_last == -2, 0))
748                 {
749                   err = REG_ESPACE;
750                   goto free_return;
751                 }
752               else
753                 {
754                   mctx.match_last = match_last;
755                   if ((!preg->no_sub && nmatch > 1) || dfa->nbackref)
756                     {
757                       re_dfastate_t *pstate = mctx.state_log[match_last];
758                       mctx.last_node = check_halt_state_context (preg, pstate,
759                                                                  &mctx, match_last);
760                     }
761                   if ((!preg->no_sub && nmatch > 1 && dfa->has_plural_match)
762                       || dfa->nbackref)
763                     {
764                       err = prune_impossible_nodes (preg, &mctx);
765                       if (err == REG_NOERROR)
766                         break;
767                       if (BE (err != REG_NOMATCH, 0))
768                         goto free_return;
769                     }
770                   else
771                     break; /* We found a matching.  */
772                 }
773             }
774           match_ctx_clean (&mctx);
775         }
776       /* Update counter.  */
777       match_first += incr;
778       if (match_first < left_lim || right_lim < match_first)
779         break;
780     }
781
782   /* Set pmatch[] if we need.  */
783   if (match_last != -1 && nmatch > 0)
784     {
785       int reg_idx;
786
787       /* Initialize registers.  */
788       for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
789         pmatch[reg_idx].rm_so = pmatch[reg_idx].rm_eo = -1;
790
791       /* Set the points where matching start/end.  */
792       pmatch[0].rm_so = 0;
793       pmatch[0].rm_eo = mctx.match_last;
794
795       if (!preg->no_sub && nmatch > 1)
796         {
797           err = set_regs (preg, &mctx, nmatch, pmatch,
798                           dfa->has_plural_match && dfa->nbackref > 0);
799           if (BE (err != REG_NOERROR, 0))
800             goto free_return;
801         }
802
803       /* At last, add the offset to the each registers, since we slided
804          the buffers so that We can assume that the matching starts from 0.  */
805       for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
806         if (pmatch[reg_idx].rm_so != -1)
807           {
808             pmatch[reg_idx].rm_so += match_first;
809             pmatch[reg_idx].rm_eo += match_first;
810           }
811     }
812   err = (match_last == -1) ? REG_NOMATCH : REG_NOERROR;
813  free_return:
814   re_free (mctx.state_log);
815   if (dfa->nbackref)
816     match_ctx_free (&mctx);
817   re_string_destruct (&input);
818   return err;
819 }
820
821 static reg_errcode_t
822 prune_impossible_nodes (preg, mctx)
823      const regex_t *preg;
824      re_match_context_t *mctx;
825 {
826   int halt_node, match_last;
827   reg_errcode_t ret;
828   re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
829   re_dfastate_t **sifted_states;
830   re_dfastate_t **lim_states = NULL;
831   re_sift_context_t sctx;
832 #ifdef DEBUG
833   assert (mctx->state_log != NULL);
834 #endif
835   match_last = mctx->match_last;
836   halt_node = mctx->last_node;
837   sifted_states = re_malloc (re_dfastate_t *, match_last + 1);
838   if (BE (sifted_states == NULL, 0))
839     {
840       ret = REG_ESPACE;
841       goto free_return;
842     }
843   if (dfa->nbackref)
844     {
845       lim_states = re_malloc (re_dfastate_t *, match_last + 1);
846       if (BE (lim_states == NULL, 0))
847         {
848           ret = REG_ESPACE;
849           goto free_return;
850         }
851       while (1)
852         {
853           memset (lim_states, '\0',
854                   sizeof (re_dfastate_t *) * (match_last + 1));
855           match_ctx_clear_flag (mctx);
856           sift_ctx_init (&sctx, sifted_states, lim_states, halt_node,
857                          match_last, 0);
858           ret = sift_states_backward (preg, mctx, &sctx);
859           re_node_set_free (&sctx.limits);
860           if (BE (ret != REG_NOERROR, 0))
861               goto free_return;
862           if (sifted_states[0] != NULL || lim_states[0] != NULL)
863             break;
864           do
865             {
866               --match_last;
867               if (match_last < 0)
868                 {
869                   ret = REG_NOMATCH;
870                   goto free_return;
871                 }
872             } while (!mctx->state_log[match_last]->halt);
873           halt_node = check_halt_state_context (preg,
874                                                 mctx->state_log[match_last],
875                                                 mctx, match_last);
876         }
877       ret = merge_state_array (dfa, sifted_states, lim_states,
878                                match_last + 1);
879       re_free (lim_states);
880       lim_states = NULL;
881       if (BE (ret != REG_NOERROR, 0))
882         goto free_return;
883     }
884   else
885     {
886       sift_ctx_init (&sctx, sifted_states, lim_states, halt_node,
887                      match_last, 0);
888       ret = sift_states_backward (preg, mctx, &sctx);
889       re_node_set_free (&sctx.limits);
890       if (BE (ret != REG_NOERROR, 0))
891         goto free_return;
892     }
893   re_free (mctx->state_log);
894   mctx->state_log = sifted_states;
895   sifted_states = NULL;
896   mctx->last_node = halt_node;
897   mctx->match_last = match_last;
898   ret = REG_NOERROR;
899  free_return:
900   re_free (sifted_states);
901   re_free (lim_states);
902   return ret;
903 }
904
905 /* Acquire an initial state and return it.
906    We must select appropriate initial state depending on the context,
907    since initial states may have constraints like "\<", "^", etc..  */
908
909 static inline re_dfastate_t *
910 acquire_init_state_context (err, preg, mctx, idx)
911      reg_errcode_t *err;
912      const regex_t *preg;
913      const re_match_context_t *mctx;
914      int idx;
915 {
916   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
917
918   *err = REG_NOERROR;
919   if (dfa->init_state->has_constraint)
920     {
921       unsigned int context;
922       context =  re_string_context_at (mctx->input, idx - 1, mctx->eflags,
923                                        preg->newline_anchor);
924       if (IS_WORD_CONTEXT (context))
925         return dfa->init_state_word;
926       else if (IS_ORDINARY_CONTEXT (context))
927         return dfa->init_state;
928       else if (IS_BEGBUF_CONTEXT (context) && IS_NEWLINE_CONTEXT (context))
929         return dfa->init_state_begbuf;
930       else if (IS_NEWLINE_CONTEXT (context))
931         return dfa->init_state_nl;
932       else if (IS_BEGBUF_CONTEXT (context))
933         {
934           /* It is relatively rare case, then calculate on demand.  */
935           return  re_acquire_state_context (err, dfa,
936                                             dfa->init_state->entrance_nodes,
937                                             context);
938         }
939       else
940         /* Must not happen?  */
941         return dfa->init_state;
942     }
943   else
944     return dfa->init_state;
945 }
946
947 /* Check whether the regular expression match input string INPUT or not,
948    and return the index where the matching end, return -1 if not match,
949    or return -2 in case of an error.
950    FL_SEARCH means we must search where the matching starts,
951    FL_LONGEST_MATCH means we want the POSIX longest matching.
952    Note that the matcher assume that the maching starts from the current
953    index of the buffer.  */
954
955 static int
956 check_matching (preg, mctx, fl_search, fl_longest_match)
957     const regex_t *preg;
958     re_match_context_t *mctx;
959     int fl_search, fl_longest_match;
960 {
961   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
962   reg_errcode_t err;
963   int match = 0;
964   int match_last = -1;
965   int cur_str_idx = re_string_cur_idx (mctx->input);
966   re_dfastate_t *cur_state;
967
968   cur_state = acquire_init_state_context (&err, preg, mctx, cur_str_idx);
969   /* An initial state must not be NULL(invalid state).  */
970   if (BE (cur_state == NULL, 0))
971     return -2;
972   if (mctx->state_log != NULL)
973     mctx->state_log[cur_str_idx] = cur_state;
974
975   /* Check OP_OPEN_SUBEXP in the initial state in case that we use them
976      later.  E.g. Processing back references.  */
977   if (dfa->nbackref)
978     {
979       err = check_subexp_matching_top (dfa, mctx, &cur_state->nodes, 0);
980       if (BE (err != REG_NOERROR, 0))
981         return err;
982     }
983
984   if (cur_state->has_backref)
985     {
986       err = transit_state_bkref (preg, &cur_state->nodes, mctx);
987       if (BE (err != REG_NOERROR, 0))
988         return err;
989     }
990
991   /* If the RE accepts NULL string.  */
992   if (cur_state->halt)
993     {
994       if (!cur_state->has_constraint
995           || check_halt_state_context (preg, cur_state, mctx, cur_str_idx))
996         {
997           if (!fl_longest_match)
998             return cur_str_idx;
999           else
1000             {
1001               match_last = cur_str_idx;
1002               match = 1;
1003             }
1004         }
1005     }
1006
1007   while (!re_string_eoi (mctx->input))
1008     {
1009       cur_state = transit_state (&err, preg, mctx, cur_state,
1010                                  fl_search && !match);
1011       if (cur_state == NULL) /* Reached at the invalid state or an error.  */
1012         {
1013           cur_str_idx = re_string_cur_idx (mctx->input);
1014           if (BE (err != REG_NOERROR, 0))
1015             return -2;
1016           if (fl_search && !match)
1017             {
1018               /* Restart from initial state, since we are searching
1019                  the point from where matching start.  */
1020 #ifdef RE_ENABLE_I18N
1021               if (MB_CUR_MAX == 1
1022                   || re_string_first_byte (mctx->input, cur_str_idx))
1023 #endif /* RE_ENABLE_I18N */
1024                 cur_state = acquire_init_state_context (&err, preg, mctx,
1025                                                         cur_str_idx);
1026               if (BE (cur_state == NULL && err != REG_NOERROR, 0))
1027                 return -2;
1028               if (mctx->state_log != NULL)
1029                 mctx->state_log[cur_str_idx] = cur_state;
1030             }
1031           else if (!fl_longest_match && match)
1032             break;
1033           else /* (fl_longest_match && match) || (!fl_search && !match)  */
1034             {
1035               if (mctx->state_log == NULL)
1036                 break;
1037               else
1038                 {
1039                   int max = mctx->state_log_top;
1040                   for (; cur_str_idx <= max; ++cur_str_idx)
1041                     if (mctx->state_log[cur_str_idx] != NULL)
1042                       break;
1043                   if (cur_str_idx > max)
1044                     break;
1045                 }
1046             }
1047         }
1048
1049       if (cur_state != NULL && cur_state->halt)
1050         {
1051           /* Reached at a halt state.
1052              Check the halt state can satisfy the current context.  */
1053           if (!cur_state->has_constraint
1054               || check_halt_state_context (preg, cur_state, mctx,
1055                                            re_string_cur_idx (mctx->input)))
1056             {
1057               /* We found an appropriate halt state.  */
1058               match_last = re_string_cur_idx (mctx->input);
1059               match = 1;
1060               if (!fl_longest_match)
1061                 break;
1062             }
1063         }
1064    }
1065   return match_last;
1066 }
1067
1068 /* Check NODE match the current context.  */
1069
1070 static int check_halt_node_context (dfa, node, context)
1071     const re_dfa_t *dfa;
1072     int node;
1073     unsigned int context;
1074 {
1075   re_token_type_t type = dfa->nodes[node].type;
1076   unsigned int constraint = dfa->nodes[node].constraint;
1077   if (type != END_OF_RE)
1078     return 0;
1079   if (!constraint)
1080     return 1;
1081   if (NOT_SATISFY_NEXT_CONSTRAINT (constraint, context))
1082     return 0;
1083   return 1;
1084 }
1085
1086 /* Check the halt state STATE match the current context.
1087    Return 0 if not match, if the node, STATE has, is a halt node and
1088    match the context, return the node.  */
1089
1090 static int
1091 check_halt_state_context (preg, state, mctx, idx)
1092     const regex_t *preg;
1093     const re_dfastate_t *state;
1094     const re_match_context_t *mctx;
1095     int idx;
1096 {
1097   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
1098   int i;
1099   unsigned int context;
1100 #ifdef DEBUG
1101   assert (state->halt);
1102 #endif
1103   context = re_string_context_at (mctx->input, idx, mctx->eflags,
1104                                   preg->newline_anchor);
1105   for (i = 0; i < state->nodes.nelem; ++i)
1106     if (check_halt_node_context (dfa, state->nodes.elems[i], context))
1107       return state->nodes.elems[i];
1108   return 0;
1109 }
1110
1111 /* Compute the next node to which "NFA" transit from NODE("NFA" is a NFA
1112    corresponding to the DFA).
1113    Return the destination node, and update EPS_VIA_NODES, return -1 in case
1114    of errors.  */
1115
1116 static int
1117 proceed_next_node (preg, nregs, regs, mctx, pidx, node, eps_via_nodes, fs)
1118     const regex_t *preg;
1119     regmatch_t *regs;
1120     const re_match_context_t *mctx;
1121     int nregs, *pidx, node;
1122     re_node_set *eps_via_nodes;
1123     struct re_fail_stack_t *fs;
1124 {
1125   re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
1126   int i, err, dest_node;
1127   dest_node = -1;
1128   if (IS_EPSILON_NODE (dfa->nodes[node].type))
1129     {
1130       re_node_set *cur_nodes = &mctx->state_log[*pidx]->nodes;
1131       int ndest, dest_nodes[2];
1132       err = re_node_set_insert (eps_via_nodes, node);
1133       if (BE (err < 0, 0))
1134         return -1;
1135       /* Pick up valid destinations.  */
1136       for (ndest = 0, i = 0; i < dfa->edests[node].nelem; ++i)
1137         {
1138           int candidate = dfa->edests[node].elems[i];
1139           if (!re_node_set_contains (cur_nodes, candidate))
1140             continue;
1141           dest_nodes[0] = (ndest == 0) ? candidate : dest_nodes[0];
1142           dest_nodes[1] = (ndest == 1) ? candidate : dest_nodes[1];
1143           ++ndest;
1144         }
1145       if (ndest <= 1)
1146         return ndest == 0 ? -1 : (ndest == 1 ? dest_nodes[0] : 0);
1147       /* In order to avoid infinite loop like "(a*)*".  */
1148       if (re_node_set_contains (eps_via_nodes, dest_nodes[0]))
1149         return dest_nodes[1];
1150       if (fs != NULL)
1151         push_fail_stack (fs, *pidx, dest_nodes, nregs, regs, eps_via_nodes);
1152       return dest_nodes[0];
1153     }
1154   else
1155     {
1156       int naccepted = 0;
1157       re_token_type_t type = dfa->nodes[node].type;
1158
1159 #ifdef RE_ENABLE_I18N
1160       if (ACCEPT_MB_NODE (type))
1161         naccepted = check_node_accept_bytes (preg, node, mctx->input, *pidx);
1162       else
1163 #endif /* RE_ENABLE_I18N */
1164       if (type == OP_BACK_REF)
1165         {
1166           int subexp_idx = dfa->nodes[node].opr.idx;
1167           naccepted = regs[subexp_idx].rm_eo - regs[subexp_idx].rm_so;
1168           if (fs != NULL)
1169             {
1170               if (regs[subexp_idx].rm_so == -1 || regs[subexp_idx].rm_eo == -1)
1171                 return -1;
1172               else if (naccepted)
1173                 {
1174                   char *buf = (char *) re_string_get_buffer (mctx->input);
1175                   if (memcmp (buf + regs[subexp_idx].rm_so, buf + *pidx,
1176                               naccepted) != 0)
1177                     return -1;
1178                 }
1179             }
1180
1181           if (naccepted == 0)
1182             {
1183               err = re_node_set_insert (eps_via_nodes, node);
1184               if (BE (err < 0, 0))
1185                 return -2;
1186               dest_node = dfa->edests[node].elems[0];
1187               if (re_node_set_contains (&mctx->state_log[*pidx]->nodes,
1188                                         dest_node))
1189                 return dest_node;
1190             }
1191         }
1192
1193       if (naccepted != 0
1194           || check_node_accept (preg, dfa->nodes + node, mctx, *pidx))
1195         {
1196           dest_node = dfa->nexts[node];
1197           *pidx = (naccepted == 0) ? *pidx + 1 : *pidx + naccepted;
1198           if (fs && (*pidx > mctx->match_last || mctx->state_log[*pidx] == NULL
1199                      || !re_node_set_contains (&mctx->state_log[*pidx]->nodes,
1200                                                dest_node)))
1201             return -1;
1202           re_node_set_empty (eps_via_nodes);
1203           return dest_node;
1204         }
1205     }
1206   return -1;
1207 }
1208
1209 static reg_errcode_t
1210 push_fail_stack (fs, str_idx, dests, nregs, regs, eps_via_nodes)
1211      struct re_fail_stack_t *fs;
1212      int str_idx, *dests, nregs;
1213      regmatch_t *regs;
1214      re_node_set *eps_via_nodes;
1215 {
1216   reg_errcode_t err;
1217   int num = fs->num++;
1218   if (fs->num == fs->alloc)
1219     {
1220       struct re_fail_stack_ent_t *new_array;
1221       fs->alloc *= 2;
1222       new_array = realloc (fs->stack, (sizeof (struct re_fail_stack_ent_t)
1223                                        * fs->alloc));
1224       if (new_array == NULL)
1225         return REG_ESPACE;
1226       fs->stack = new_array;
1227     }
1228   fs->stack[num].idx = str_idx;
1229   fs->stack[num].node = dests[1];
1230   fs->stack[num].regs = re_malloc (regmatch_t, nregs);
1231   memcpy (fs->stack[num].regs, regs, sizeof (regmatch_t) * nregs);
1232   err = re_node_set_init_copy (&fs->stack[num].eps_via_nodes, eps_via_nodes);
1233   return err;
1234 }
1235
1236 static int
1237 pop_fail_stack (fs, pidx, nregs, regs, eps_via_nodes)
1238      struct re_fail_stack_t *fs;
1239      int *pidx, nregs;
1240      regmatch_t *regs;
1241      re_node_set *eps_via_nodes;
1242 {
1243   int num = --fs->num;
1244   assert (num >= 0);
1245  *pidx = fs->stack[num].idx;
1246   memcpy (regs, fs->stack[num].regs, sizeof (regmatch_t) * nregs);
1247   re_node_set_free (eps_via_nodes);
1248   re_free (fs->stack[num].regs);
1249   *eps_via_nodes = fs->stack[num].eps_via_nodes;
1250   return fs->stack[num].node;
1251 }
1252
1253 /* Set the positions where the subexpressions are starts/ends to registers
1254    PMATCH.
1255    Note: We assume that pmatch[0] is already set, and
1256    pmatch[i].rm_so == pmatch[i].rm_eo == -1 (i > 1).  */
1257
1258 static reg_errcode_t
1259 set_regs (preg, mctx, nmatch, pmatch, fl_backtrack)
1260      const regex_t *preg;
1261      const re_match_context_t *mctx;
1262      size_t nmatch;
1263      regmatch_t *pmatch;
1264      int fl_backtrack;
1265 {
1266   re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
1267   int idx, cur_node, real_nmatch;
1268   re_node_set eps_via_nodes;
1269   struct re_fail_stack_t *fs;
1270   struct re_fail_stack_t fs_body = {0, 2, NULL};
1271 #ifdef DEBUG
1272   assert (nmatch > 1);
1273   assert (mctx->state_log != NULL);
1274 #endif
1275   if (fl_backtrack)
1276     {
1277       fs = &fs_body;
1278       fs->stack = re_malloc (struct re_fail_stack_ent_t, fs->alloc);
1279     }
1280   else
1281     fs = NULL;
1282   cur_node = dfa->init_node;
1283   real_nmatch = (nmatch <= preg->re_nsub) ? nmatch : preg->re_nsub + 1;
1284   re_node_set_init_empty (&eps_via_nodes);
1285   for (idx = pmatch[0].rm_so; idx <= pmatch[0].rm_eo ;)
1286     {
1287       update_regs (dfa, pmatch, cur_node, idx, real_nmatch);
1288       if (idx == pmatch[0].rm_eo && cur_node == mctx->last_node)
1289         {
1290           int reg_idx;
1291           if (fs)
1292             {
1293               for (reg_idx = 0; reg_idx < nmatch; ++reg_idx)
1294                 if (pmatch[reg_idx].rm_so > -1 && pmatch[reg_idx].rm_eo == -1)
1295                   break;
1296               if (reg_idx == nmatch)
1297                 {
1298                   re_node_set_free (&eps_via_nodes);
1299                   return free_fail_stack_return (fs);
1300                 }
1301               cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
1302                                          &eps_via_nodes);
1303             }
1304           else
1305             {
1306               re_node_set_free (&eps_via_nodes);
1307               return REG_NOERROR;
1308             }
1309         }
1310
1311       /* Proceed to next node.  */
1312       cur_node = proceed_next_node (preg, nmatch, pmatch, mctx, &idx, cur_node,
1313                                     &eps_via_nodes, fs);
1314
1315       if (BE (cur_node < 0, 0))
1316         {
1317           if (cur_node == -2)
1318             return REG_ESPACE;
1319           if (fs)
1320             cur_node = pop_fail_stack (fs, &idx, nmatch, pmatch,
1321                                        &eps_via_nodes);
1322           else
1323             {
1324               re_node_set_free (&eps_via_nodes);
1325               return REG_NOMATCH;
1326             }
1327         }
1328     }
1329   re_node_set_free (&eps_via_nodes);
1330   return free_fail_stack_return (fs);
1331 }
1332
1333 static reg_errcode_t
1334 free_fail_stack_return (fs)
1335      struct re_fail_stack_t *fs;
1336 {
1337   if (fs)
1338     {
1339       int fs_idx;
1340       for (fs_idx = 0; fs_idx < fs->num; ++fs_idx)
1341         {
1342           re_node_set_free (&fs->stack[fs_idx].eps_via_nodes);
1343           re_free (fs->stack[fs_idx].regs);
1344         }
1345       re_free (fs->stack);
1346     }
1347   return REG_NOERROR;
1348 }
1349
1350 static void
1351 update_regs (dfa, pmatch, cur_node, cur_idx, nmatch)
1352      re_dfa_t *dfa;
1353      regmatch_t *pmatch;
1354      int cur_node, cur_idx, nmatch;
1355 {
1356   int type = dfa->nodes[cur_node].type;
1357   int reg_num;
1358   if (type != OP_OPEN_SUBEXP && type != OP_CLOSE_SUBEXP)
1359     return;
1360   reg_num = dfa->nodes[cur_node].opr.idx + 1;
1361   if (reg_num >= nmatch)
1362     return;
1363   if (type == OP_OPEN_SUBEXP)
1364     {
1365       /* We are at the first node of this sub expression.  */
1366       pmatch[reg_num].rm_so = cur_idx;
1367       pmatch[reg_num].rm_eo = -1;
1368     }
1369   else if (type == OP_CLOSE_SUBEXP)
1370     /* We are at the first node of this sub expression.  */
1371     pmatch[reg_num].rm_eo = cur_idx;
1372 }
1373
1374 #define NUMBER_OF_STATE 1
1375
1376 /* This function checks the STATE_LOG from the SCTX->last_str_idx to 0
1377    and sift the nodes in each states according to the following rules.
1378    Updated state_log will be wrote to STATE_LOG.
1379
1380    Rules: We throw away the Node `a' in the STATE_LOG[STR_IDX] if...
1381      1. When STR_IDX == MATCH_LAST(the last index in the state_log):
1382         If `a' isn't the LAST_NODE and `a' can't epsilon transit to
1383         the LAST_NODE, we throw away the node `a'.
1384      2. When 0 <= STR_IDX < MATCH_LAST and `a' accepts
1385         string `s' and transit to `b':
1386         i. If 'b' isn't in the STATE_LOG[STR_IDX+strlen('s')], we throw
1387            away the node `a'.
1388         ii. If 'b' is in the STATE_LOG[STR_IDX+strlen('s')] but 'b' is
1389             throwed away, we throw away the node `a'.
1390      3. When 0 <= STR_IDX < n and 'a' epsilon transit to 'b':
1391         i. If 'b' isn't in the STATE_LOG[STR_IDX], we throw away the
1392            node `a'.
1393         ii. If 'b' is in the STATE_LOG[STR_IDX] but 'b' is throwed away,
1394             we throw away the node `a'.  */
1395
1396 #define STATE_NODE_CONTAINS(state,node) \
1397   ((state) != NULL && re_node_set_contains (&(state)->nodes, node))
1398
1399 static reg_errcode_t
1400 sift_states_backward (preg, mctx, sctx)
1401      const regex_t *preg;
1402      re_match_context_t *mctx;
1403      re_sift_context_t *sctx;
1404 {
1405   reg_errcode_t err;
1406   re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
1407   int null_cnt = 0;
1408   int str_idx = sctx->last_str_idx;
1409   re_node_set cur_dest;
1410   re_node_set *cur_src; /* Points the state_log[str_idx]->nodes  */
1411
1412 #ifdef DEBUG
1413   assert (mctx->state_log != NULL && mctx->state_log[str_idx] != NULL);
1414 #endif
1415   cur_src = &mctx->state_log[str_idx]->nodes;
1416
1417   /* Build sifted state_log[str_idx].  It has the nodes which can epsilon
1418      transit to the last_node and the last_node itself.  */
1419   err = re_node_set_init_1 (&cur_dest, sctx->last_node);
1420   if (BE (err != REG_NOERROR, 0))
1421     return err;
1422   err = update_cur_sifted_state (preg, mctx, sctx, str_idx, &cur_dest);
1423   if (BE (err != REG_NOERROR, 0))
1424     goto free_return;
1425
1426   /* Then check each states in the state_log.  */
1427   while (str_idx > 0)
1428     {
1429       int i, ret;
1430       /* Update counters.  */
1431       null_cnt = (sctx->sifted_states[str_idx] == NULL) ? null_cnt + 1 : 0;
1432       if (null_cnt > mctx->max_mb_elem_len)
1433         {
1434           memset (sctx->sifted_states, '\0',
1435                   sizeof (re_dfastate_t *) * str_idx);
1436           re_node_set_free (&cur_dest);
1437           return REG_NOERROR;
1438         }
1439       re_node_set_empty (&cur_dest);
1440       --str_idx;
1441       cur_src = ((mctx->state_log[str_idx] == NULL) ? &empty_set
1442                  : &mctx->state_log[str_idx]->nodes);
1443
1444       /* Then build the next sifted state.
1445          We build the next sifted state on `cur_dest', and update
1446          `sifted_states[str_idx]' with `cur_dest'.
1447          Note:
1448          `cur_dest' is the sifted state from `state_log[str_idx + 1]'.
1449          `cur_src' points the node_set of the old `state_log[str_idx]'.  */
1450       for (i = 0; i < cur_src->nelem; i++)
1451         {
1452           int prev_node = cur_src->elems[i];
1453           int naccepted = 0;
1454           re_token_type_t type = dfa->nodes[prev_node].type;
1455
1456           if (IS_EPSILON_NODE(type))
1457             continue;
1458 #ifdef RE_ENABLE_I18N
1459           /* If the node may accept `multi byte'.  */
1460           if (ACCEPT_MB_NODE (type))
1461             naccepted = sift_states_iter_mb (preg, mctx, sctx, prev_node,
1462                                              str_idx, sctx->last_str_idx);
1463
1464 #endif /* RE_ENABLE_I18N */
1465           /* We don't check backreferences here.
1466              See update_cur_sifted_state().  */
1467
1468           if (!naccepted
1469               && check_node_accept (preg, dfa->nodes + prev_node, mctx,
1470                                     str_idx)
1471               && STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + 1],
1472                                       dfa->nexts[prev_node]))
1473             naccepted = 1;
1474
1475           if (naccepted == 0)
1476             continue;
1477
1478           if (sctx->limits.nelem)
1479             {
1480               int to_idx = str_idx + naccepted;
1481               if (check_dst_limits (dfa, &sctx->limits, mctx,
1482                                     dfa->nexts[prev_node], to_idx,
1483                                     prev_node, str_idx))
1484                 continue;
1485             }
1486           ret = re_node_set_insert (&cur_dest, prev_node);
1487           if (BE (ret == -1, 0))
1488             {
1489               err = REG_ESPACE;
1490               goto free_return;
1491             }
1492         }
1493
1494       /* Add all the nodes which satisfy the following conditions:
1495          - It can epsilon transit to a node in CUR_DEST.
1496          - It is in CUR_SRC.
1497          And update state_log.  */
1498       err = update_cur_sifted_state (preg, mctx, sctx, str_idx, &cur_dest);
1499       if (BE (err != REG_NOERROR, 0))
1500         goto free_return;
1501     }
1502   err = REG_NOERROR;
1503  free_return:
1504   re_node_set_free (&cur_dest);
1505   return err;
1506 }
1507
1508 /* Helper functions.  */
1509
1510 static inline reg_errcode_t
1511 clean_state_log_if_need (mctx, next_state_log_idx)
1512     re_match_context_t *mctx;
1513     int next_state_log_idx;
1514 {
1515   int top = mctx->state_log_top;
1516
1517   if (next_state_log_idx >= mctx->input->bufs_len
1518       || (next_state_log_idx >= mctx->input->valid_len
1519           && mctx->input->valid_len < mctx->input->len))
1520     {
1521       reg_errcode_t err;
1522       err = extend_buffers (mctx);
1523       if (BE (err != REG_NOERROR, 0))
1524         return err;
1525     }
1526
1527   if (top < next_state_log_idx)
1528     {
1529       memset (mctx->state_log + top + 1, '\0',
1530               sizeof (re_dfastate_t *) * (next_state_log_idx - top));
1531       mctx->state_log_top = next_state_log_idx;
1532     }
1533   return REG_NOERROR;
1534 }
1535
1536 static reg_errcode_t
1537 merge_state_array (dfa, dst, src, num)
1538      re_dfa_t *dfa;
1539      re_dfastate_t **dst;
1540      re_dfastate_t **src;
1541      int num;
1542 {
1543   int st_idx;
1544   reg_errcode_t err;
1545   for (st_idx = 0; st_idx < num; ++st_idx)
1546     {
1547       if (dst[st_idx] == NULL)
1548         dst[st_idx] = src[st_idx];
1549       else if (src[st_idx] != NULL)
1550         {
1551           re_node_set merged_set;
1552           err = re_node_set_init_union (&merged_set, &dst[st_idx]->nodes,
1553                                         &src[st_idx]->nodes);
1554           if (BE (err != REG_NOERROR, 0))
1555             return err;
1556           dst[st_idx] = re_acquire_state (&err, dfa, &merged_set);
1557           re_node_set_free (&merged_set);
1558           if (BE (err != REG_NOERROR, 0))
1559             return err;
1560         }
1561     }
1562   return REG_NOERROR;
1563 }
1564
1565 static reg_errcode_t
1566 update_cur_sifted_state (preg, mctx, sctx, str_idx, dest_nodes)
1567      const regex_t *preg;
1568      re_match_context_t *mctx;
1569      re_sift_context_t *sctx;
1570      int str_idx;
1571      re_node_set *dest_nodes;
1572 {
1573   reg_errcode_t err;
1574   re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
1575   const re_node_set *candidates;
1576   candidates = ((mctx->state_log[str_idx] == NULL) ? &empty_set
1577                 : &mctx->state_log[str_idx]->nodes);
1578
1579   /* At first, add the nodes which can epsilon transit to a node in
1580      DEST_NODE.  */
1581   if (dest_nodes->nelem)
1582     {
1583       err = add_epsilon_src_nodes (dfa, dest_nodes, candidates);
1584       if (BE (err != REG_NOERROR, 0))
1585         return err;
1586     }
1587
1588   /* Then, check the limitations in the current sift_context.  */
1589   if (dest_nodes->nelem && sctx->limits.nelem)
1590     {
1591       err = check_subexp_limits (dfa, dest_nodes, candidates, &sctx->limits,
1592                                  mctx->bkref_ents, str_idx);
1593       if (BE (err != REG_NOERROR, 0))
1594         return err;
1595     }
1596
1597   /* Update state_log.  */
1598   sctx->sifted_states[str_idx] = re_acquire_state (&err, dfa, dest_nodes);
1599   if (BE (sctx->sifted_states[str_idx] == NULL && err != REG_NOERROR, 0))
1600     return err;
1601
1602   if ((mctx->state_log[str_idx] != NULL
1603        && mctx->state_log[str_idx]->has_backref))
1604     {
1605       err = sift_states_bkref (preg, mctx, sctx, str_idx, dest_nodes);
1606       if (BE (err != REG_NOERROR, 0))
1607         return err;
1608     }
1609   return REG_NOERROR;
1610 }
1611
1612 static reg_errcode_t
1613 add_epsilon_src_nodes (dfa, dest_nodes, candidates)
1614      re_dfa_t *dfa;
1615      re_node_set *dest_nodes;
1616      const re_node_set *candidates;
1617 {
1618   reg_errcode_t err;
1619   int src_idx;
1620   re_node_set src_copy;
1621
1622   err = re_node_set_init_copy (&src_copy, dest_nodes);
1623   if (BE (err != REG_NOERROR, 0))
1624     return err;
1625   for (src_idx = 0; src_idx < src_copy.nelem; ++src_idx)
1626     {
1627       err = re_node_set_add_intersect (dest_nodes, candidates,
1628                                        dfa->inveclosures
1629                                        + src_copy.elems[src_idx]);
1630       if (BE (err != REG_NOERROR, 0))
1631         {
1632           re_node_set_free (&src_copy);
1633           return err;
1634         }
1635     }
1636   re_node_set_free (&src_copy);
1637   return REG_NOERROR;
1638 }
1639
1640 static reg_errcode_t
1641 sub_epsilon_src_nodes (dfa, node, dest_nodes, candidates)
1642      re_dfa_t *dfa;
1643      int node;
1644      re_node_set *dest_nodes;
1645      const re_node_set *candidates;
1646 {
1647     int ecl_idx;
1648     reg_errcode_t err;
1649     re_node_set *inv_eclosure = dfa->inveclosures + node;
1650     re_node_set except_nodes;
1651     re_node_set_init_empty (&except_nodes);
1652     for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
1653       {
1654         int cur_node = inv_eclosure->elems[ecl_idx];
1655         if (cur_node == node)
1656           continue;
1657         if (IS_EPSILON_NODE (dfa->nodes[cur_node].type))
1658           {
1659             int edst1 = dfa->edests[cur_node].elems[0];
1660             int edst2 = ((dfa->edests[cur_node].nelem > 1)
1661                          ? dfa->edests[cur_node].elems[1] : -1);
1662             if ((!re_node_set_contains (inv_eclosure, edst1)
1663                  && re_node_set_contains (dest_nodes, edst1))
1664                 || (edst2 > 0
1665                     && !re_node_set_contains (inv_eclosure, edst2)
1666                     && re_node_set_contains (dest_nodes, edst2)))
1667               {
1668                 err = re_node_set_add_intersect (&except_nodes, candidates,
1669                                                  dfa->inveclosures + cur_node);
1670                 if (BE (err != REG_NOERROR, 0))
1671                   {
1672                     re_node_set_free (&except_nodes);
1673                     return err;
1674                   }
1675               }
1676           }
1677       }
1678     for (ecl_idx = 0; ecl_idx < inv_eclosure->nelem; ++ecl_idx)
1679       {
1680         int cur_node = inv_eclosure->elems[ecl_idx];
1681         if (!re_node_set_contains (&except_nodes, cur_node))
1682           {
1683             int idx = re_node_set_contains (dest_nodes, cur_node) - 1;
1684             re_node_set_remove_at (dest_nodes, idx);
1685           }
1686       }
1687     re_node_set_free (&except_nodes);
1688     return REG_NOERROR;
1689 }
1690
1691 static int
1692 check_dst_limits (dfa, limits, mctx, dst_node, dst_idx, src_node, src_idx)
1693      re_dfa_t *dfa;
1694      re_node_set *limits;
1695      re_match_context_t *mctx;
1696      int dst_node, dst_idx, src_node, src_idx;
1697 {
1698   int lim_idx, src_pos, dst_pos;
1699
1700   for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
1701     {
1702       int subexp_idx;
1703       struct re_backref_cache_entry *ent;
1704       ent = mctx->bkref_ents + limits->elems[lim_idx];
1705       subexp_idx = dfa->nodes[ent->node].opr.idx - 1;
1706
1707       dst_pos = check_dst_limits_calc_pos (dfa, mctx, limits->elems[lim_idx],
1708                                            dfa->eclosures + dst_node,
1709                                            subexp_idx, dst_node, dst_idx);
1710       src_pos = check_dst_limits_calc_pos (dfa, mctx, limits->elems[lim_idx],
1711                                            dfa->eclosures + src_node,
1712                                            subexp_idx, src_node, src_idx);
1713
1714       /* In case of:
1715          <src> <dst> ( <subexp> )
1716          ( <subexp> ) <src> <dst>
1717          ( <subexp1> <src> <subexp2> <dst> <subexp3> )  */
1718       if (src_pos == dst_pos)
1719         continue; /* This is unrelated limitation.  */
1720       else
1721         return 1;
1722     }
1723   return 0;
1724 }
1725
1726 static int
1727 check_dst_limits_calc_pos (dfa, mctx, limit, eclosures, subexp_idx, node,
1728                            str_idx)
1729      re_dfa_t *dfa;
1730      re_match_context_t *mctx;
1731      re_node_set *eclosures;
1732      int limit, subexp_idx, node, str_idx;
1733 {
1734   struct re_backref_cache_entry *lim = mctx->bkref_ents + limit;
1735   int pos = (str_idx < lim->subexp_from ? -1
1736              : (lim->subexp_to < str_idx ? 1 : 0));
1737   if (pos == 0
1738       && (str_idx == lim->subexp_from || str_idx == lim->subexp_to))
1739     {
1740       int node_idx;
1741       for (node_idx = 0; node_idx < eclosures->nelem; ++node_idx)
1742         {
1743           int node = eclosures->elems[node_idx];
1744           re_token_type_t type= dfa->nodes[node].type;
1745           if (type == OP_BACK_REF)
1746             {
1747               int bi = search_cur_bkref_entry (mctx, str_idx);
1748               for (; bi < mctx->nbkref_ents; ++bi)
1749                 {
1750                   struct re_backref_cache_entry *ent = mctx->bkref_ents + bi;
1751                   if (ent->str_idx > str_idx)
1752                     break;
1753                   if (ent->node == node && ent->subexp_from == ent->subexp_to)
1754                     {
1755                       int cpos, dst;
1756                       dst = dfa->edests[node].elems[0];
1757                       cpos = check_dst_limits_calc_pos (dfa, mctx, limit,
1758                                                         dfa->eclosures + dst,
1759                                                         subexp_idx, dst,
1760                                                         str_idx);
1761                       if ((str_idx == lim->subexp_from && cpos == -1)
1762                           || (str_idx == lim->subexp_to && cpos == 0))
1763                         return cpos;
1764                     }
1765                 }
1766             }
1767           if (type == OP_OPEN_SUBEXP && subexp_idx == dfa->nodes[node].opr.idx
1768               && str_idx == lim->subexp_from)
1769             {
1770               pos = -1;
1771               break;
1772             }
1773           if (type == OP_CLOSE_SUBEXP && subexp_idx == dfa->nodes[node].opr.idx
1774               && str_idx == lim->subexp_to)
1775             break;
1776         }
1777       if (node_idx == eclosures->nelem && str_idx == lim->subexp_to)
1778         pos = 1;
1779     }
1780   return pos;
1781 }
1782
1783 /* Check the limitations of sub expressions LIMITS, and remove the nodes
1784    which are against limitations from DEST_NODES. */
1785
1786 static reg_errcode_t
1787 check_subexp_limits (dfa, dest_nodes, candidates, limits, bkref_ents, str_idx)
1788      re_dfa_t *dfa;
1789      re_node_set *dest_nodes;
1790      const re_node_set *candidates;
1791      re_node_set *limits;
1792      struct re_backref_cache_entry *bkref_ents;
1793      int str_idx;
1794 {
1795   reg_errcode_t err;
1796   int node_idx, lim_idx;
1797
1798   for (lim_idx = 0; lim_idx < limits->nelem; ++lim_idx)
1799     {
1800       int subexp_idx;
1801       struct re_backref_cache_entry *ent;
1802       ent = bkref_ents + limits->elems[lim_idx];
1803
1804       if (str_idx <= ent->subexp_from || ent->str_idx < str_idx)
1805         continue; /* This is unrelated limitation.  */
1806
1807       subexp_idx = dfa->nodes[ent->node].opr.idx - 1;
1808       if (ent->subexp_to == str_idx)
1809         {
1810           int ops_node = -1;
1811           int cls_node = -1;
1812           for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
1813             {
1814               int node = dest_nodes->elems[node_idx];
1815               re_token_type_t type= dfa->nodes[node].type;
1816               if (type == OP_OPEN_SUBEXP
1817                   && subexp_idx == dfa->nodes[node].opr.idx)
1818                 ops_node = node;
1819               else if (type == OP_CLOSE_SUBEXP
1820                        && subexp_idx == dfa->nodes[node].opr.idx)
1821                 cls_node = node;
1822             }
1823
1824           /* Check the limitation of the open subexpression.  */
1825           /* Note that (ent->subexp_to = str_idx != ent->subexp_from).  */
1826           if (ops_node >= 0)
1827             {
1828               err = sub_epsilon_src_nodes(dfa, ops_node, dest_nodes,
1829                                           candidates);
1830               if (BE (err != REG_NOERROR, 0))
1831                 return err;
1832             }
1833           /* Check the limitation of the close subexpression.  */
1834           for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
1835             {
1836               int node = dest_nodes->elems[node_idx];
1837               if (!re_node_set_contains (dfa->inveclosures + node, cls_node)
1838                   && !re_node_set_contains (dfa->eclosures + node, cls_node))
1839                 {
1840                   /* It is against this limitation.
1841                      Remove it form the current sifted state.  */
1842                   err = sub_epsilon_src_nodes(dfa, node, dest_nodes,
1843                                               candidates);
1844                   if (BE (err != REG_NOERROR, 0))
1845                     return err;
1846                   --node_idx;
1847                 }
1848             }
1849         }
1850       else /* (ent->subexp_to != str_idx)  */
1851         {
1852           for (node_idx = 0; node_idx < dest_nodes->nelem; ++node_idx)
1853             {
1854               int node = dest_nodes->elems[node_idx];
1855               re_token_type_t type= dfa->nodes[node].type;
1856               if (type == OP_CLOSE_SUBEXP || type == OP_OPEN_SUBEXP)
1857                 {
1858                   if (subexp_idx != dfa->nodes[node].opr.idx)
1859                     continue;
1860                   if ((type == OP_CLOSE_SUBEXP && ent->subexp_to != str_idx)
1861                       || (type == OP_OPEN_SUBEXP))
1862                     {
1863                       /* It is against this limitation.
1864                          Remove it form the current sifted state.  */
1865                       err = sub_epsilon_src_nodes(dfa, node, dest_nodes,
1866                                                   candidates);
1867                       if (BE (err != REG_NOERROR, 0))
1868                         return err;
1869                     }
1870                 }
1871             }
1872         }
1873     }
1874   return REG_NOERROR;
1875 }
1876
1877 static reg_errcode_t
1878 sift_states_bkref (preg, mctx, sctx, str_idx, dest_nodes)
1879      const regex_t *preg;
1880      re_match_context_t *mctx;
1881      re_sift_context_t *sctx;
1882      int str_idx;
1883      re_node_set *dest_nodes;
1884 {
1885   reg_errcode_t err;
1886   re_dfa_t *dfa = (re_dfa_t *)preg->buffer;
1887   int node_idx, node;
1888   re_sift_context_t local_sctx;
1889   const re_node_set *candidates;
1890   candidates = ((mctx->state_log[str_idx] == NULL) ? &empty_set
1891                 : &mctx->state_log[str_idx]->nodes);
1892   local_sctx.sifted_states = NULL; /* Mark that it hasn't been initialized.  */
1893
1894   for (node_idx = 0; node_idx < candidates->nelem; ++node_idx)
1895     {
1896       int cur_bkref_idx = re_string_cur_idx (mctx->input);
1897       re_token_type_t type;
1898       node = candidates->elems[node_idx];
1899       type = dfa->nodes[node].type;
1900       if (node == sctx->cur_bkref && str_idx == cur_bkref_idx)
1901         continue;
1902       /* Avoid infinite loop for the REs like "()\1+".  */
1903       if (node == sctx->last_node && str_idx == sctx->last_str_idx)
1904         continue;
1905       if (type == OP_BACK_REF)
1906         {
1907           int enabled_idx = search_cur_bkref_entry (mctx, str_idx);
1908           for (; enabled_idx < mctx->nbkref_ents; ++enabled_idx)
1909             {
1910               int disabled_idx, subexp_len, to_idx, dst_node;
1911               struct re_backref_cache_entry *entry;
1912               entry = mctx->bkref_ents + enabled_idx;
1913               if (entry->str_idx > str_idx)
1914                 break;
1915               if (entry->node != node)
1916                   continue;
1917               subexp_len = entry->subexp_to - entry->subexp_from;
1918               to_idx = str_idx + subexp_len;
1919               dst_node = (subexp_len ? dfa->nexts[node]
1920                           : dfa->edests[node].elems[0]);
1921
1922               if (to_idx > sctx->last_str_idx
1923                   || sctx->sifted_states[to_idx] == NULL
1924                   || !STATE_NODE_CONTAINS (sctx->sifted_states[to_idx],
1925                                            dst_node)
1926                   || check_dst_limits (dfa, &sctx->limits, mctx, node,
1927                                        str_idx, dst_node, to_idx))
1928                 continue;
1929                 {
1930                   re_dfastate_t *cur_state;
1931                   entry->flag = 0;
1932                   for (disabled_idx = enabled_idx + 1;
1933                        disabled_idx < mctx->nbkref_ents; ++disabled_idx)
1934                     {
1935                       struct re_backref_cache_entry *entry2;
1936                       entry2 = mctx->bkref_ents + disabled_idx;
1937                       if (entry2->str_idx > str_idx)
1938                         break;
1939                       entry2->flag = (entry2->node == node) ? 1 : entry2->flag;
1940                     }
1941
1942                   if (local_sctx.sifted_states == NULL)
1943                     {
1944                       local_sctx = *sctx;
1945                       err = re_node_set_init_copy (&local_sctx.limits,
1946                                                    &sctx->limits);
1947                       if (BE (err != REG_NOERROR, 0))
1948                         goto free_return;
1949                     }
1950                   local_sctx.last_node = node;
1951                   local_sctx.last_str_idx = str_idx;
1952                   err = re_node_set_insert (&local_sctx.limits, enabled_idx);
1953                   if (BE (err < 0, 0))
1954                     {
1955                       err = REG_ESPACE;
1956                       goto free_return;
1957                     }
1958                   cur_state = local_sctx.sifted_states[str_idx];
1959                   err = sift_states_backward (preg, mctx, &local_sctx);
1960                   if (BE (err != REG_NOERROR, 0))
1961                     goto free_return;
1962                   if (sctx->limited_states != NULL)
1963                     {
1964                       err = merge_state_array (dfa, sctx->limited_states,
1965                                                local_sctx.sifted_states,
1966                                                str_idx + 1);
1967                       if (BE (err != REG_NOERROR, 0))
1968                         goto free_return;
1969                     }
1970                   local_sctx.sifted_states[str_idx] = cur_state;
1971                   re_node_set_remove (&local_sctx.limits, enabled_idx);
1972                   /* We must not use the variable entry here, since
1973                      mctx->bkref_ents might be realloced.  */
1974                   mctx->bkref_ents[enabled_idx].flag = 1;
1975                 }
1976             }
1977           enabled_idx = search_cur_bkref_entry (mctx, str_idx);
1978           for (; enabled_idx < mctx->nbkref_ents; ++enabled_idx)
1979             {
1980               struct re_backref_cache_entry *entry;
1981               entry = mctx->bkref_ents + enabled_idx;
1982               if (entry->str_idx > str_idx)
1983                 break;
1984               if (entry->node == node)
1985                 entry->flag = 0;
1986             }
1987         }
1988     }
1989   err = REG_NOERROR;
1990  free_return:
1991   if (local_sctx.sifted_states != NULL)
1992     {
1993       re_node_set_free (&local_sctx.limits);
1994     }
1995
1996   return err;
1997 }
1998
1999
2000 #ifdef RE_ENABLE_I18N
2001 static int
2002 sift_states_iter_mb (preg, mctx, sctx, node_idx, str_idx, max_str_idx)
2003     const regex_t *preg;
2004     const re_match_context_t *mctx;
2005     re_sift_context_t *sctx;
2006     int node_idx, str_idx, max_str_idx;
2007 {
2008   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
2009   int naccepted;
2010   /* Check the node can accept `multi byte'.  */
2011   naccepted = check_node_accept_bytes (preg, node_idx, mctx->input, str_idx);
2012   if (naccepted > 0 && str_idx + naccepted <= max_str_idx &&
2013       !STATE_NODE_CONTAINS (sctx->sifted_states[str_idx + naccepted],
2014                             dfa->nexts[node_idx]))
2015     /* The node can't accept the `multi byte', or the
2016        destination was already throwed away, then the node
2017        could't accept the current input `multi byte'.   */
2018     naccepted = 0;
2019   /* Otherwise, it is sure that the node could accept
2020      `naccepted' bytes input.  */
2021   return naccepted;
2022 }
2023 #endif /* RE_ENABLE_I18N */
2024
2025 \f
2026 /* Functions for state transition.  */
2027
2028 /* Return the next state to which the current state STATE will transit by
2029    accepting the current input byte, and update STATE_LOG if necessary.
2030    If STATE can accept a multibyte char/collating element/back reference
2031    update the destination of STATE_LOG.  */
2032
2033 static re_dfastate_t *
2034 transit_state (err, preg, mctx, state, fl_search)
2035      reg_errcode_t *err;
2036      const regex_t *preg;
2037      re_match_context_t *mctx;
2038      re_dfastate_t *state;
2039      int fl_search;
2040 {
2041   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
2042   re_dfastate_t **trtable, *next_state;
2043   unsigned char ch;
2044   int cur_idx;
2045
2046   if (re_string_cur_idx (mctx->input) + 1 >= mctx->input->bufs_len
2047       || (re_string_cur_idx (mctx->input) + 1 >= mctx->input->valid_len
2048           && mctx->input->valid_len < mctx->input->len))
2049     {
2050       *err = extend_buffers (mctx);
2051       if (BE (*err != REG_NOERROR, 0))
2052         return NULL;
2053     }
2054
2055   *err = REG_NOERROR;
2056   if (state == NULL)
2057     {
2058       next_state = state;
2059       re_string_skip_bytes (mctx->input, 1);
2060     }
2061   else
2062     {
2063 #ifdef RE_ENABLE_I18N
2064       /* If the current state can accept multibyte.  */
2065       if (state->accept_mb)
2066         {
2067           *err = transit_state_mb (preg, state, mctx);
2068           if (BE (*err != REG_NOERROR, 0))
2069             return NULL;
2070         }
2071 #endif /* RE_ENABLE_I18N */
2072
2073       /* Then decide the next state with the single byte.  */
2074       if (1)
2075         {
2076           /* Use transition table  */
2077           ch = re_string_fetch_byte (mctx->input);
2078           trtable = fl_search ? state->trtable_search : state->trtable;
2079           if (trtable == NULL)
2080             {
2081               trtable = build_trtable (preg, state, fl_search);
2082               if (fl_search)
2083                 state->trtable_search = trtable;
2084               else
2085                 state->trtable = trtable;
2086             }
2087           next_state = trtable[ch];
2088         }
2089       else
2090         {
2091           /* don't use transition table  */
2092           next_state = transit_state_sb (err, preg, state, fl_search, mctx);
2093           if (BE (next_state == NULL && err != REG_NOERROR, 0))
2094             return NULL;
2095         }
2096     }
2097
2098   cur_idx = re_string_cur_idx (mctx->input);
2099   /* Update the state_log if we need.  */
2100   if (mctx->state_log != NULL)
2101     {
2102       if (cur_idx > mctx->state_log_top)
2103         {
2104           mctx->state_log[cur_idx] = next_state;
2105           mctx->state_log_top = cur_idx;
2106         }
2107       else if (mctx->state_log[cur_idx] == 0)
2108         {
2109           mctx->state_log[cur_idx] = next_state;
2110         }
2111       else
2112         {
2113           re_dfastate_t *pstate;
2114           unsigned int context;
2115           re_node_set next_nodes, *log_nodes, *table_nodes = NULL;
2116           /* If (state_log[cur_idx] != 0), it implies that cur_idx is
2117              the destination of a multibyte char/collating element/
2118              back reference.  Then the next state is the union set of
2119              these destinations and the results of the transition table.  */
2120           pstate = mctx->state_log[cur_idx];
2121           log_nodes = pstate->entrance_nodes;
2122           if (next_state != NULL)
2123             {
2124               table_nodes = next_state->entrance_nodes;
2125               *err = re_node_set_init_union (&next_nodes, table_nodes,
2126                                              log_nodes);
2127               if (BE (*err != REG_NOERROR, 0))
2128                 return NULL;
2129             }
2130           else
2131             next_nodes = *log_nodes;
2132           /* Note: We already add the nodes of the initial state,
2133                    then we don't need to add them here.  */
2134
2135           context = re_string_context_at (mctx->input,
2136                                           re_string_cur_idx (mctx->input) - 1,
2137                                           mctx->eflags, preg->newline_anchor);
2138           next_state = mctx->state_log[cur_idx]
2139             = re_acquire_state_context (err, dfa, &next_nodes, context);
2140           /* We don't need to check errors here, since the return value of
2141              this function is next_state and ERR is already set.  */
2142
2143           if (table_nodes != NULL)
2144             re_node_set_free (&next_nodes);
2145         }
2146     }
2147
2148   /* Check OP_OPEN_SUBEXP in the current state in case that we use them
2149      later.  We must check them here, since the back references in the
2150      next state might use them.  */
2151   if (dfa->nbackref && next_state/* && fl_process_bkref */)
2152     {
2153       *err = check_subexp_matching_top (dfa, mctx, &next_state->nodes,
2154                                         cur_idx);
2155       if (BE (*err != REG_NOERROR, 0))
2156         return NULL;
2157     }
2158
2159   /* If the next state has back references.  */
2160   if (next_state != NULL && next_state->has_backref)
2161     {
2162       *err = transit_state_bkref (preg, &next_state->nodes, mctx);
2163       if (BE (*err != REG_NOERROR, 0))
2164         return NULL;
2165       next_state = mctx->state_log[cur_idx];
2166     }
2167   return next_state;
2168 }
2169
2170 /* Helper functions for transit_state.  */
2171
2172 /* From the node set CUR_NODES, pick up the nodes whose types are
2173    OP_OPEN_SUBEXP and which have corresponding back references in the regular
2174    expression. And register them to use them later for evaluating the
2175    correspoding back references.  */
2176
2177 static reg_errcode_t
2178 check_subexp_matching_top (dfa, mctx, cur_nodes, str_idx)
2179      re_dfa_t *dfa;
2180      re_match_context_t *mctx;
2181      re_node_set *cur_nodes;
2182      int str_idx;
2183 {
2184   int node_idx;
2185   reg_errcode_t err;
2186
2187   /* TODO: This isn't efficient.
2188            Because there might be more than one nodes whose types are
2189            OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
2190            nodes.
2191            E.g. RE: (a){2}  */
2192   for (node_idx = 0; node_idx < cur_nodes->nelem; ++node_idx)
2193     {
2194       int node = cur_nodes->elems[node_idx];
2195       if (dfa->nodes[node].type == OP_OPEN_SUBEXP
2196           && dfa->used_bkref_map & (1 << dfa->nodes[node].opr.idx))
2197         {
2198           err = match_ctx_add_subtop (mctx, node, str_idx);
2199           if (BE (err != REG_NOERROR, 0))
2200             return err;
2201         }
2202     }
2203   return REG_NOERROR;
2204 }
2205
2206 /* Return the next state to which the current state STATE will transit by
2207    accepting the current input byte.  */
2208
2209 static re_dfastate_t *
2210 transit_state_sb (err, preg, state, fl_search, mctx)
2211      reg_errcode_t *err;
2212      const regex_t *preg;
2213      re_dfastate_t *state;
2214      int fl_search;
2215      re_match_context_t *mctx;
2216 {
2217   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
2218   re_node_set next_nodes;
2219   re_dfastate_t *next_state;
2220   int node_cnt, cur_str_idx = re_string_cur_idx (mctx->input);
2221   unsigned int context;
2222
2223   *err = re_node_set_alloc (&next_nodes, state->nodes.nelem + 1);
2224   if (BE (*err != REG_NOERROR, 0))
2225     return NULL;
2226   for (node_cnt = 0; node_cnt < state->nodes.nelem; ++node_cnt)
2227     {
2228       int cur_node = state->nodes.elems[node_cnt];
2229       if (check_node_accept (preg, dfa->nodes + cur_node, mctx, cur_str_idx))
2230         {
2231           *err = re_node_set_merge (&next_nodes,
2232                                     dfa->eclosures + dfa->nexts[cur_node]);
2233           if (BE (*err != REG_NOERROR, 0))
2234             {
2235               re_node_set_free (&next_nodes);
2236               return NULL;
2237             }
2238         }
2239     }
2240   if (fl_search)
2241     {
2242 #ifdef RE_ENABLE_I18N
2243       int not_initial = 0;
2244       if (MB_CUR_MAX > 1)
2245         for (node_cnt = 0; node_cnt < next_nodes.nelem; ++node_cnt)
2246           if (dfa->nodes[next_nodes.elems[node_cnt]].type == CHARACTER)
2247             {
2248               not_initial = dfa->nodes[next_nodes.elems[node_cnt]].mb_partial;
2249               break;
2250             }
2251       if (!not_initial)
2252 #endif
2253         {
2254           *err = re_node_set_merge (&next_nodes,
2255                                     dfa->init_state->entrance_nodes);
2256           if (BE (*err != REG_NOERROR, 0))
2257             {
2258               re_node_set_free (&next_nodes);
2259               return NULL;
2260             }
2261         }
2262     }
2263   context = re_string_context_at (mctx->input, cur_str_idx, mctx->eflags,
2264                                   preg->newline_anchor);
2265   next_state = re_acquire_state_context (err, dfa, &next_nodes, context);
2266   /* We don't need to check errors here, since the return value of
2267      this function is next_state and ERR is already set.  */
2268
2269   re_node_set_free (&next_nodes);
2270   re_string_skip_bytes (mctx->input, 1);
2271   return next_state;
2272 }
2273
2274 #ifdef RE_ENABLE_I18N
2275 static reg_errcode_t
2276 transit_state_mb (preg, pstate, mctx)
2277     const regex_t *preg;
2278     re_dfastate_t *pstate;
2279     re_match_context_t *mctx;
2280 {
2281   reg_errcode_t err;
2282   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
2283   int i;
2284
2285   for (i = 0; i < pstate->nodes.nelem; ++i)
2286     {
2287       re_node_set dest_nodes, *new_nodes;
2288       int cur_node_idx = pstate->nodes.elems[i];
2289       int naccepted = 0, dest_idx;
2290       unsigned int context;
2291       re_dfastate_t *dest_state;
2292
2293       if (dfa->nodes[cur_node_idx].constraint)
2294         {
2295           context = re_string_context_at (mctx->input,
2296                                           re_string_cur_idx (mctx->input),
2297                                           mctx->eflags, preg->newline_anchor);
2298           if (NOT_SATISFY_NEXT_CONSTRAINT (dfa->nodes[cur_node_idx].constraint,
2299                                            context))
2300             continue;
2301         }
2302
2303       /* How many bytes the node can accepts?  */
2304       if (ACCEPT_MB_NODE (dfa->nodes[cur_node_idx].type))
2305         naccepted = check_node_accept_bytes (preg, cur_node_idx, mctx->input,
2306                                              re_string_cur_idx (mctx->input));
2307       if (naccepted == 0)
2308         continue;
2309
2310       /* The node can accepts `naccepted' bytes.  */
2311       dest_idx = re_string_cur_idx (mctx->input) + naccepted;
2312       mctx->max_mb_elem_len = ((mctx->max_mb_elem_len < naccepted) ? naccepted
2313                                : mctx->max_mb_elem_len);
2314       err = clean_state_log_if_need (mctx, dest_idx);
2315       if (BE (err != REG_NOERROR, 0))
2316         return err;
2317 #ifdef DEBUG
2318       assert (dfa->nexts[cur_node_idx] != -1);
2319 #endif
2320       /* `cur_node_idx' may point the entity of the OP_CONTEXT_NODE,
2321          then we use pstate->nodes.elems[i] instead.  */
2322       new_nodes = dfa->eclosures + dfa->nexts[pstate->nodes.elems[i]];
2323
2324       dest_state = mctx->state_log[dest_idx];
2325       if (dest_state == NULL)
2326         dest_nodes = *new_nodes;
2327       else
2328         {
2329           err = re_node_set_init_union (&dest_nodes,
2330                                         dest_state->entrance_nodes, new_nodes);
2331           if (BE (err != REG_NOERROR, 0))
2332             return err;
2333         }
2334       context = re_string_context_at (mctx->input, dest_idx - 1, mctx->eflags,
2335                                       preg->newline_anchor);
2336       mctx->state_log[dest_idx]
2337         = re_acquire_state_context (&err, dfa, &dest_nodes, context);
2338       if (dest_state != NULL)
2339         re_node_set_free (&dest_nodes);
2340       if (BE (mctx->state_log[dest_idx] == NULL && err != REG_NOERROR, 0))
2341         return err;
2342     }
2343   return REG_NOERROR;
2344 }
2345 #endif /* RE_ENABLE_I18N */
2346
2347 static reg_errcode_t
2348 transit_state_bkref (preg, nodes, mctx)
2349     const regex_t *preg;
2350     re_node_set *nodes;
2351     re_match_context_t *mctx;
2352 {
2353   reg_errcode_t err;
2354   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
2355   int i;
2356   int cur_str_idx = re_string_cur_idx (mctx->input);
2357
2358   for (i = 0; i < nodes->nelem; ++i)
2359     {
2360       int dest_str_idx, prev_nelem, bkc_idx;
2361       int node_idx = nodes->elems[i];
2362       unsigned int context;
2363       re_token_t *node = dfa->nodes + node_idx;
2364       re_node_set *new_dest_nodes;
2365
2366       /* Check whether `node' is a backreference or not.  */
2367       if (node->type != OP_BACK_REF)
2368         continue;
2369
2370       if (node->constraint)
2371         {
2372           context = re_string_context_at (mctx->input, cur_str_idx,
2373                                           mctx->eflags, preg->newline_anchor);
2374           if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
2375             continue;
2376         }
2377
2378       /* `node' is a backreference.
2379          Check the substring which the substring matched.  */
2380       bkc_idx = mctx->nbkref_ents;
2381       err = get_subexp (preg, mctx, node_idx, cur_str_idx);
2382       if (BE (err != REG_NOERROR, 0))
2383         goto free_return;
2384
2385       /* And add the epsilon closures (which is `new_dest_nodes') of
2386          the backreference to appropriate state_log.  */
2387 #ifdef DEBUG
2388       assert (dfa->nexts[node_idx] != -1);
2389 #endif
2390       for (; bkc_idx < mctx->nbkref_ents; ++bkc_idx)
2391         {
2392           int subexp_len;
2393           re_dfastate_t *dest_state;
2394           struct re_backref_cache_entry *bkref_ent;
2395           bkref_ent = mctx->bkref_ents + bkc_idx;
2396           if (bkref_ent->node != node_idx || bkref_ent->str_idx != cur_str_idx)
2397             continue;
2398           subexp_len = bkref_ent->subexp_to - bkref_ent->subexp_from;
2399           new_dest_nodes = (subexp_len == 0
2400                             ? dfa->eclosures + dfa->edests[node_idx].elems[0]
2401                             : dfa->eclosures + dfa->nexts[node_idx]);
2402           dest_str_idx = (cur_str_idx + bkref_ent->subexp_to
2403                           - bkref_ent->subexp_from);
2404           context = re_string_context_at (mctx->input, dest_str_idx - 1,
2405                                           mctx->eflags, preg->newline_anchor);
2406           dest_state = mctx->state_log[dest_str_idx];
2407           prev_nelem = ((mctx->state_log[cur_str_idx] == NULL) ? 0
2408                         : mctx->state_log[cur_str_idx]->nodes.nelem);
2409           /* Add `new_dest_node' to state_log.  */
2410           if (dest_state == NULL)
2411             {
2412               mctx->state_log[dest_str_idx]
2413                 = re_acquire_state_context (&err, dfa, new_dest_nodes,
2414                                             context);
2415               if (BE (mctx->state_log[dest_str_idx] == NULL
2416                       && err != REG_NOERROR, 0))
2417                 goto free_return;
2418             }
2419           else
2420             {
2421               re_node_set dest_nodes;
2422               err = re_node_set_init_union (&dest_nodes,
2423                                             dest_state->entrance_nodes,
2424                                             new_dest_nodes);
2425               if (BE (err != REG_NOERROR, 0))
2426                 {
2427                   re_node_set_free (&dest_nodes);
2428                   goto free_return;
2429                 }
2430               mctx->state_log[dest_str_idx]
2431                 = re_acquire_state_context (&err, dfa, &dest_nodes, context);
2432               re_node_set_free (&dest_nodes);
2433               if (BE (mctx->state_log[dest_str_idx] == NULL
2434                       && err != REG_NOERROR, 0))
2435                 goto free_return;
2436             }
2437           /* We need to check recursively if the backreference can epsilon
2438              transit.  */
2439           if (subexp_len == 0
2440               && mctx->state_log[cur_str_idx]->nodes.nelem > prev_nelem)
2441             {
2442               err = check_subexp_matching_top (dfa, mctx, new_dest_nodes,
2443                                                cur_str_idx);
2444               if (BE (err != REG_NOERROR, 0))
2445                 goto free_return;
2446               err = transit_state_bkref (preg, new_dest_nodes, mctx);
2447               if (BE (err != REG_NOERROR, 0))
2448                 goto free_return;
2449             }
2450         }
2451     }
2452   err = REG_NOERROR;
2453  free_return:
2454   return err;
2455 }
2456
2457 /* Enumerate all the candidates which the backreference BKREF_NODE can match
2458    at BKREF_STR_IDX, and register them by match_ctx_add_entry().
2459    Note that we might collect inappropriate candidates here.
2460    However, the cost of checking them strictly here is too high, then we
2461    delay these checking for prune_impossible_nodes().  */
2462
2463 static reg_errcode_t
2464 get_subexp (preg, mctx, bkref_node, bkref_str_idx)
2465      const regex_t *preg;
2466      re_match_context_t *mctx;
2467      int bkref_node, bkref_str_idx;
2468 {
2469   int subexp_num, sub_top_idx;
2470   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
2471   char *buf = (char *) re_string_get_buffer (mctx->input);
2472   /* Return if we have already checked BKREF_NODE at BKREF_STR_IDX.  */
2473   int cache_idx = search_cur_bkref_entry (mctx, bkref_str_idx);
2474   for (; cache_idx < mctx->nbkref_ents; ++cache_idx)
2475     {
2476       struct re_backref_cache_entry *entry = mctx->bkref_ents + cache_idx;
2477       if (entry->str_idx > bkref_str_idx)
2478         break;
2479       if (entry->node == bkref_node)
2480         return REG_NOERROR; /* We already checked it.  */
2481     }
2482   subexp_num = dfa->nodes[bkref_node].opr.idx - 1;
2483
2484   /* For each sub expression  */
2485   for (sub_top_idx = 0; sub_top_idx < mctx->nsub_tops; ++sub_top_idx)
2486     {
2487       reg_errcode_t err;
2488       re_sub_match_top_t *sub_top = mctx->sub_tops[sub_top_idx];
2489       re_sub_match_last_t *sub_last;
2490       int sub_last_idx, sl_str;
2491       char *bkref_str;
2492
2493       if (dfa->nodes[sub_top->node].opr.idx != subexp_num)
2494         continue; /* It isn't related.  */
2495
2496       sl_str = sub_top->str_idx;
2497       bkref_str = buf + bkref_str_idx;
2498       /* At first, check the last node of sub expressions we already
2499          evaluated.  */
2500       for (sub_last_idx = 0; sub_last_idx < sub_top->nlasts; ++sub_last_idx)
2501         {
2502           int sl_str_diff;
2503           sub_last = sub_top->lasts[sub_last_idx];
2504           sl_str_diff = sub_last->str_idx - sl_str;
2505           /* The matched string by the sub expression match with the substring
2506              at the back reference?  */
2507           if (sl_str_diff > 0
2508               && memcmp (bkref_str, buf + sl_str, sl_str_diff) != 0)
2509             break; /* We don't need to search this sub expression any more.  */
2510           bkref_str += sl_str_diff;
2511           sl_str += sl_str_diff;
2512           err = get_subexp_sub (preg, mctx, sub_top, sub_last, bkref_node,
2513                                 bkref_str_idx);
2514           if (err == REG_NOMATCH)
2515             continue;
2516           if (BE (err != REG_NOERROR, 0))
2517             return err;
2518         }
2519       if (sub_last_idx < sub_top->nlasts)
2520         continue;
2521       if (sub_last_idx > 0)
2522         ++sl_str;
2523       /* Then, search for the other last nodes of the sub expression.  */
2524       for (; sl_str <= bkref_str_idx; ++sl_str)
2525         {
2526           int cls_node, sl_str_off;
2527           re_node_set *nodes;
2528           sl_str_off = sl_str - sub_top->str_idx;
2529           /* The matched string by the sub expression match with the substring
2530              at the back reference?  */
2531           if (sl_str_off > 0
2532               && memcmp (bkref_str++, buf + sl_str - 1, 1) != 0)
2533             break; /* We don't need to search this sub expression any more.  */
2534           if (mctx->state_log[sl_str] == NULL)
2535             continue;
2536           /* Does this state have a ')' of the sub expression?  */
2537           nodes = &mctx->state_log[sl_str]->nodes;
2538           cls_node = find_subexp_node (dfa, nodes, subexp_num, 0);
2539           if (cls_node == -1)
2540             continue; /* No.  */
2541           if (sub_top->path == NULL)
2542             {
2543               sub_top->path = calloc (sizeof (state_array_t),
2544                                       sl_str - sub_top->str_idx + 1);
2545               if (sub_top->path == NULL)
2546                 return REG_ESPACE;
2547             }
2548           /* Can the OP_OPEN_SUBEXP node arrive the OP_CLOSE_SUBEXP node
2549              in the current context?  */
2550           err = check_arrival (preg, mctx, sub_top->path, sub_top->node,
2551                                sub_top->str_idx, cls_node, sl_str, 0);
2552           if (err == REG_NOMATCH)
2553               continue;
2554           if (BE (err != REG_NOERROR, 0))
2555               return err;
2556           sub_last = match_ctx_add_sublast (sub_top, cls_node, sl_str);
2557           if (BE (sub_last == NULL, 0))
2558             return REG_ESPACE;
2559           err = get_subexp_sub (preg, mctx, sub_top, sub_last, bkref_node,
2560                                 bkref_str_idx);
2561           if (err == REG_NOMATCH)
2562             continue;
2563         }
2564     }
2565   return REG_NOERROR;
2566 }
2567
2568 /* Helper functions for get_subexp().  */
2569
2570 /* Check SUB_LAST can arrive to the back reference BKREF_NODE at BKREF_STR.
2571    If it can arrive, register the sub expression expressed with SUB_TOP
2572    and SUB_LAST.  */
2573
2574 static reg_errcode_t
2575 get_subexp_sub (preg, mctx, sub_top, sub_last, bkref_node, bkref_str)
2576      const regex_t *preg;
2577      re_match_context_t *mctx;
2578      re_sub_match_top_t *sub_top;
2579      re_sub_match_last_t *sub_last;
2580      int bkref_node, bkref_str;
2581 {
2582   reg_errcode_t err;
2583   int to_idx;
2584   /* Can the subexpression arrive the back reference?  */
2585   err = check_arrival (preg, mctx, &sub_last->path, sub_last->node,
2586                        sub_last->str_idx, bkref_node, bkref_str, 1);
2587   if (err != REG_NOERROR)
2588     return err;
2589   err = match_ctx_add_entry (mctx, bkref_node, bkref_str, sub_top->str_idx,
2590                              sub_last->str_idx);
2591   if (BE (err != REG_NOERROR, 0))
2592     return err;
2593   to_idx = bkref_str + sub_last->str_idx - sub_top->str_idx;
2594   clean_state_log_if_need (mctx, to_idx);
2595   return REG_NOERROR;
2596 }
2597
2598 /* Find the first node which is '(' or ')' and whose index is SUBEXP_IDX.
2599    Search '(' if FL_OPEN, or search ')' otherwise.
2600    TODO: This function isn't efficient...
2601          Because there might be more than one nodes whose types are
2602          OP_OPEN_SUBEXP and whose index is SUBEXP_IDX, we must check all
2603          nodes.
2604          E.g. RE: (a){2}  */
2605
2606 static int
2607 find_subexp_node (dfa, nodes, subexp_idx, fl_open)
2608      re_dfa_t *dfa;
2609      re_node_set *nodes;
2610      int subexp_idx, fl_open;
2611 {
2612   int cls_idx;
2613   for (cls_idx = 0; cls_idx < nodes->nelem; ++cls_idx)
2614     {
2615       int cls_node = nodes->elems[cls_idx];
2616       re_token_t *node = dfa->nodes + cls_node;
2617       if (((fl_open && node->type == OP_OPEN_SUBEXP)
2618           || (!fl_open && node->type == OP_CLOSE_SUBEXP))
2619           && node->opr.idx == subexp_idx)
2620         return cls_node;
2621     }
2622   return -1;
2623 }
2624
2625 /* Check whether the node TOP_NODE at TOP_STR can arrive to the node
2626    LAST_NODE at LAST_STR.  We record the path onto PATH since it will be
2627    heavily reused.
2628    Return REG_NOERROR if it can arrive, or REG_NOMATCH otherwise.  */
2629
2630 static reg_errcode_t
2631 check_arrival (preg, mctx, path, top_node, top_str, last_node, last_str,
2632                fl_open)
2633      const regex_t *preg;
2634      re_match_context_t *mctx;
2635      state_array_t *path;
2636      int top_node, top_str, last_node, last_str, fl_open;
2637 {
2638   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
2639   reg_errcode_t err;
2640   int subexp_num, backup_cur_idx, str_idx, null_cnt;
2641   re_dfastate_t *cur_state = NULL;
2642   re_node_set *cur_nodes, next_nodes;
2643   re_dfastate_t **backup_state_log;
2644   unsigned int context;
2645
2646   subexp_num = dfa->nodes[top_node].opr.idx;
2647   /* Extend the buffer if we need.  */
2648   if (path->alloc < last_str + mctx->max_mb_elem_len + 1)
2649     {
2650       re_dfastate_t **new_array;
2651       int old_alloc = path->alloc;
2652       path->alloc += last_str + mctx->max_mb_elem_len + 1;
2653       new_array = re_realloc (path->array, re_dfastate_t *, path->alloc);
2654       if (new_array == NULL)
2655         return REG_ESPACE;
2656       path->array = new_array;
2657       memset (new_array + old_alloc, '\0',
2658               sizeof (re_dfastate_t *) * (path->alloc - old_alloc));
2659     }
2660
2661   str_idx = path->next_idx == 0 ? top_str : path->next_idx;
2662
2663   /* Temporary modify MCTX.  */
2664   backup_state_log = mctx->state_log;
2665   backup_cur_idx = mctx->input->cur_idx;
2666   mctx->state_log = path->array;
2667   mctx->input->cur_idx = str_idx;
2668
2669   /* Setup initial node set.  */
2670   context = re_string_context_at (mctx->input, str_idx - 1, mctx->eflags,
2671                                   preg->newline_anchor);
2672   if (str_idx == top_str)
2673     {
2674       err = re_node_set_init_1 (&next_nodes, top_node);
2675       if (BE (err != REG_NOERROR, 0))
2676         return err;
2677       err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num, fl_open);
2678       if (BE (err != REG_NOERROR, 0))
2679         {
2680           re_node_set_free (&next_nodes);
2681           return err;
2682         }
2683     }
2684   else
2685     {
2686       cur_state = mctx->state_log[str_idx];
2687       if (cur_state && cur_state->has_backref)
2688         {
2689           err = re_node_set_init_copy (&next_nodes, &cur_state->nodes);
2690           if (BE ( err != REG_NOERROR, 0))
2691             return err;
2692         }
2693       else
2694         re_node_set_init_empty (&next_nodes);
2695     }
2696   if (str_idx == top_str || (cur_state && cur_state->has_backref))
2697     {
2698       if (next_nodes.nelem)
2699         {
2700           err = expand_bkref_cache (preg, mctx, &next_nodes, str_idx, last_str,
2701                                     subexp_num, fl_open);
2702           if (BE ( err != REG_NOERROR, 0))
2703             {
2704               re_node_set_free (&next_nodes);
2705               return err;
2706             }
2707         }
2708       cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
2709       if (BE (cur_state == NULL && err != REG_NOERROR, 0))
2710         {
2711           re_node_set_free (&next_nodes);
2712           return err;
2713         }
2714       mctx->state_log[str_idx] = cur_state;
2715     }
2716
2717   for (null_cnt = 0; str_idx < last_str && null_cnt <= mctx->max_mb_elem_len;)
2718     {
2719       re_node_set_empty (&next_nodes);
2720       if (mctx->state_log[str_idx + 1])
2721         {
2722           err = re_node_set_merge (&next_nodes,
2723                                    &mctx->state_log[str_idx + 1]->nodes);
2724           if (BE (err != REG_NOERROR, 0))
2725             {
2726               re_node_set_free (&next_nodes);
2727               return err;
2728             }
2729         }
2730       if (cur_state)
2731         {
2732           err = check_arrival_add_next_nodes(preg, dfa, mctx, str_idx,
2733                                              &cur_state->nodes, &next_nodes);
2734           if (BE (err != REG_NOERROR, 0))
2735             {
2736               re_node_set_free (&next_nodes);
2737               return err;
2738             }
2739         }
2740       ++str_idx;
2741       if (next_nodes.nelem)
2742         {
2743           err = check_arrival_expand_ecl (dfa, &next_nodes, subexp_num,
2744                                           fl_open);
2745           if (BE (err != REG_NOERROR, 0))
2746             {
2747               re_node_set_free (&next_nodes);
2748               return err;
2749             }
2750           err = expand_bkref_cache (preg, mctx, &next_nodes, str_idx, last_str,
2751                                     subexp_num, fl_open);
2752           if (BE ( err != REG_NOERROR, 0))
2753             {
2754               re_node_set_free (&next_nodes);
2755               return err;
2756             }
2757         }
2758       context = re_string_context_at (mctx->input, str_idx - 1, mctx->eflags,
2759                                       preg->newline_anchor);
2760       cur_state = re_acquire_state_context (&err, dfa, &next_nodes, context);
2761       if (BE (cur_state == NULL && err != REG_NOERROR, 0))
2762         {
2763           re_node_set_free (&next_nodes);
2764           return err;
2765         }
2766       mctx->state_log[str_idx] = cur_state;
2767       null_cnt = cur_state == NULL ? null_cnt + 1 : 0;
2768     }
2769   re_node_set_free (&next_nodes);
2770   cur_nodes = (mctx->state_log[last_str] == NULL ? NULL
2771                : &mctx->state_log[last_str]->nodes);
2772   path->next_idx = str_idx;
2773
2774   /* Fix MCTX.  */
2775   mctx->state_log = backup_state_log;
2776   mctx->input->cur_idx = backup_cur_idx;
2777
2778   if (cur_nodes == NULL)
2779     return REG_NOMATCH;
2780   /* Then check the current node set has the node LAST_NODE.  */
2781   return (re_node_set_contains (cur_nodes, last_node)
2782           || re_node_set_contains (cur_nodes, last_node) ? REG_NOERROR
2783           : REG_NOMATCH);
2784 }
2785
2786 /* Helper functions for check_arrival.  */
2787
2788 /* Calculate the destination nodes of CUR_NODES at STR_IDX, and append them
2789    to NEXT_NODES.
2790    TODO: This function is similar to the functions transit_state*(),
2791          however this function has many additional works.
2792          Can't we unify them?  */
2793
2794 static reg_errcode_t
2795 check_arrival_add_next_nodes (preg, dfa, mctx, str_idx, cur_nodes, next_nodes)
2796      const regex_t *preg;
2797      re_dfa_t *dfa;
2798      re_match_context_t *mctx;
2799      int str_idx;
2800      re_node_set *cur_nodes, *next_nodes;
2801 {
2802   int cur_idx;
2803   reg_errcode_t err;
2804   re_node_set union_set;
2805   re_node_set_init_empty (&union_set);
2806   for (cur_idx = 0; cur_idx < cur_nodes->nelem; ++cur_idx)
2807     {
2808       int naccepted = 0;
2809       int cur_node = cur_nodes->elems[cur_idx];
2810       re_token_type_t type = dfa->nodes[cur_node].type;
2811       if (IS_EPSILON_NODE(type))
2812         continue;
2813 #ifdef RE_ENABLE_I18N
2814       /* If the node may accept `multi byte'.  */
2815       if (ACCEPT_MB_NODE (type))
2816         {
2817           naccepted = check_node_accept_bytes (preg, cur_node, mctx->input,
2818                                                str_idx);
2819           if (naccepted > 1)
2820             {
2821               re_dfastate_t *dest_state;
2822               int next_node = dfa->nexts[cur_node];
2823               int next_idx = str_idx + naccepted;
2824               dest_state = mctx->state_log[next_idx];
2825               re_node_set_empty (&union_set);
2826               if (dest_state)
2827                 {
2828                   err = re_node_set_merge (&union_set, &dest_state->nodes);
2829                   if (BE (err != REG_NOERROR, 0))
2830                     {
2831                       re_node_set_free (&union_set);
2832                       return err;
2833                     }
2834                   err = re_node_set_insert (&union_set, next_node);
2835                   if (BE (err < 0, 0))
2836                     {
2837                       re_node_set_free (&union_set);
2838                       return REG_ESPACE;
2839                     }
2840                 }
2841               else
2842                 {
2843                   err = re_node_set_insert (&union_set, next_node);
2844                   if (BE (err < 0, 0))
2845                     {
2846                       re_node_set_free (&union_set);
2847                       return REG_ESPACE;
2848                     }
2849                 }
2850               mctx->state_log[next_idx] = re_acquire_state (&err, dfa,
2851                                                             &union_set);
2852               if (BE (mctx->state_log[next_idx] == NULL
2853                       && err != REG_NOERROR, 0))
2854                 {
2855                   re_node_set_free (&union_set);
2856                   return err;
2857                 }
2858             }
2859         }
2860 #endif /* RE_ENABLE_I18N */
2861       if (naccepted
2862           || check_node_accept (preg, dfa->nodes + cur_node, mctx,
2863                                 str_idx))
2864         {
2865           err = re_node_set_insert (next_nodes, dfa->nexts[cur_node]);
2866           if (BE (err < 0, 0))
2867             {
2868               re_node_set_free (&union_set);
2869               return REG_ESPACE;
2870             }
2871         }
2872     }
2873   re_node_set_free (&union_set);
2874   return REG_NOERROR;
2875 }
2876
2877 /* For all the nodes in CUR_NODES, add the epsilon closures of them to
2878    CUR_NODES, however exclude the nodes which are:
2879     - inside the sub expression whose number is EX_SUBEXP, if FL_OPEN.
2880     - out of the sub expression whose number is EX_SUBEXP, if !FL_OPEN.
2881 */
2882
2883 static reg_errcode_t
2884 check_arrival_expand_ecl (dfa, cur_nodes, ex_subexp, fl_open)
2885      re_dfa_t *dfa;
2886      re_node_set *cur_nodes;
2887      int ex_subexp, fl_open;
2888 {
2889   reg_errcode_t err;
2890   int idx, outside_node;
2891   re_node_set new_nodes;
2892 #ifdef DEBUG
2893   assert (cur_nodes->nelem);
2894 #endif
2895   err = re_node_set_alloc (&new_nodes, cur_nodes->nelem);
2896   if (BE (err != REG_NOERROR, 0))
2897     return err;
2898   /* Create a new node set NEW_NODES with the nodes which are epsilon
2899      closures of the node in CUR_NODES.  */
2900
2901   for (idx = 0; idx < cur_nodes->nelem; ++idx)
2902     {
2903       int cur_node = cur_nodes->elems[idx];
2904       re_node_set *eclosure = dfa->eclosures + cur_node;
2905       outside_node = find_subexp_node (dfa, eclosure, ex_subexp, fl_open);
2906       if (outside_node == -1)
2907         {
2908           /* There are no problematic nodes, just merge them.  */
2909           err = re_node_set_merge (&new_nodes, eclosure);
2910           if (BE (err != REG_NOERROR, 0))
2911             {
2912               re_node_set_free (&new_nodes);
2913               return err;
2914             }
2915         }
2916       else
2917         {
2918           /* There are problematic nodes, re-calculate incrementally.  */
2919           err = check_arrival_expand_ecl_sub (dfa, &new_nodes, cur_node,
2920                                               ex_subexp, fl_open);
2921           if (BE (err != REG_NOERROR, 0))
2922             {
2923               re_node_set_free (&new_nodes);
2924               return err;
2925             }
2926         }
2927     }
2928   re_node_set_free (cur_nodes);
2929   *cur_nodes = new_nodes;
2930   return REG_NOERROR;
2931 }
2932
2933 /* Helper function for check_arrival_expand_ecl.
2934    Check incrementally the epsilon closure of TARGET, and if it isn't
2935    problematic append it to DST_NODES.  */
2936
2937 static reg_errcode_t
2938 check_arrival_expand_ecl_sub (dfa, dst_nodes, target, ex_subexp, fl_open)
2939      re_dfa_t *dfa;
2940      int target, ex_subexp, fl_open;
2941      re_node_set *dst_nodes;
2942 {
2943   int cur_node, type;
2944   for (cur_node = target; !re_node_set_contains (dst_nodes, cur_node);)
2945     {
2946       int err;
2947       type = dfa->nodes[cur_node].type;
2948
2949       if (((type == OP_OPEN_SUBEXP && fl_open)
2950            || (type == OP_CLOSE_SUBEXP && !fl_open))
2951           && dfa->nodes[cur_node].opr.idx == ex_subexp)
2952         {
2953           if (!fl_open)
2954             {
2955               err = re_node_set_insert (dst_nodes, cur_node);
2956               if (BE (err == -1, 0))
2957                 return REG_ESPACE;
2958             }
2959           break;
2960         }
2961       err = re_node_set_insert (dst_nodes, cur_node);
2962       if (BE (err == -1, 0))
2963         return REG_ESPACE;
2964       if (dfa->edests[cur_node].nelem == 0)
2965         break;
2966       if (dfa->edests[cur_node].nelem == 2)
2967         {
2968           err = check_arrival_expand_ecl_sub (dfa, dst_nodes,
2969                                               dfa->edests[cur_node].elems[1],
2970                                               ex_subexp, fl_open);
2971           if (BE (err != REG_NOERROR, 0))
2972             return err;
2973         }
2974       cur_node = dfa->edests[cur_node].elems[0];
2975     }
2976   return REG_NOERROR;
2977 }
2978
2979
2980 /* For all the back references in the current state, calculate the
2981    destination of the back references by the appropriate entry
2982    in MCTX->BKREF_ENTS.  */
2983
2984 static reg_errcode_t
2985 expand_bkref_cache (preg, mctx, cur_nodes, cur_str, last_str, subexp_num,
2986                     fl_open)
2987      const regex_t *preg;
2988      re_match_context_t *mctx;
2989      int cur_str, last_str, subexp_num, fl_open;
2990      re_node_set *cur_nodes;
2991 {
2992   reg_errcode_t err;
2993   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
2994   int cache_idx, cache_idx_start;
2995   /* The current state.  */
2996
2997   cache_idx_start = search_cur_bkref_entry (mctx, cur_str);
2998   for (cache_idx = cache_idx_start; cache_idx < mctx->nbkref_ents; ++cache_idx)
2999     {
3000       int to_idx, next_node;
3001       struct re_backref_cache_entry *ent = mctx->bkref_ents + cache_idx;
3002       if (ent->str_idx > cur_str)
3003         break;
3004       /* Is this entry ENT is appropriate?  */
3005       if (!re_node_set_contains (cur_nodes, ent->node))
3006         continue; /* No.  */
3007
3008       to_idx = cur_str + ent->subexp_to - ent->subexp_from;
3009       /* Calculate the destination of the back reference, and append it
3010          to MCTX->STATE_LOG.  */
3011       if (to_idx == cur_str)
3012         {
3013           /* The backreference did epsilon transit, we must re-check all the
3014              node in the current state.  */
3015           re_node_set new_dests;
3016           reg_errcode_t err2, err3;
3017           next_node = dfa->edests[ent->node].elems[0];
3018           if (re_node_set_contains (cur_nodes, next_node))
3019             continue;
3020           err = re_node_set_init_1 (&new_dests, next_node);
3021           err2 = check_arrival_expand_ecl (dfa, &new_dests, subexp_num,
3022                                            fl_open);
3023           err3 = re_node_set_merge (cur_nodes, &new_dests);
3024           re_node_set_free (&new_dests);
3025           if (BE (err != REG_NOERROR || err2 != REG_NOERROR
3026                   || err3 != REG_NOERROR, 0))
3027             {
3028               err = (err != REG_NOERROR ? err
3029                      : (err2 != REG_NOERROR ? err2 : err3));
3030               return err;
3031             }
3032           /* TODO: It is still inefficient...  */
3033           cache_idx = cache_idx_start - 1;
3034           continue;
3035         }
3036       else
3037         {
3038           re_node_set union_set;
3039           next_node = dfa->nexts[ent->node];
3040           if (mctx->state_log[to_idx])
3041             {
3042               int ret;
3043               if (re_node_set_contains (&mctx->state_log[to_idx]->nodes,
3044                                         next_node))
3045                 continue;
3046               err = re_node_set_init_copy (&union_set,
3047                                            &mctx->state_log[to_idx]->nodes);
3048               ret = re_node_set_insert (&union_set, next_node);
3049               if (BE (err != REG_NOERROR || ret < 0, 0))
3050                 {
3051                   re_node_set_free (&union_set);
3052                   err = err != REG_NOERROR ? err : REG_ESPACE;
3053                   return err;
3054                 }
3055             }
3056           else
3057             {
3058               err = re_node_set_init_1 (&union_set, next_node);
3059               if (BE (err != REG_NOERROR, 0))
3060                 return err;
3061             }
3062           mctx->state_log[to_idx] = re_acquire_state (&err, dfa, &union_set);
3063           re_node_set_free (&union_set);
3064           if (BE (mctx->state_log[to_idx] == NULL
3065                   && err != REG_NOERROR, 0))
3066             return err;
3067         }
3068     }
3069   return REG_NOERROR;
3070 }
3071
3072 /* Build transition table for the state.
3073    Return the new table if succeeded, otherwise return NULL.  */
3074
3075 static re_dfastate_t **
3076 build_trtable (preg, state, fl_search)
3077     const regex_t *preg;
3078     const re_dfastate_t *state;
3079     int fl_search;
3080 {
3081   reg_errcode_t err;
3082   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
3083   int i, j, k, ch;
3084   int dests_node_malloced = 0, dest_states_malloced = 0;
3085   int ndests; /* Number of the destination states from `state'.  */
3086   re_dfastate_t **trtable;
3087   re_dfastate_t **dest_states = NULL, **dest_states_word, **dest_states_nl;
3088   re_node_set follows, *dests_node;
3089   bitset *dests_ch;
3090   bitset acceptable;
3091
3092   /* We build DFA states which corresponds to the destination nodes
3093      from `state'.  `dests_node[i]' represents the nodes which i-th
3094      destination state contains, and `dests_ch[i]' represents the
3095      characters which i-th destination state accepts.  */
3096 #ifdef _LIBC
3097   if (__libc_use_alloca ((sizeof (re_node_set) + sizeof (bitset)) * SBC_MAX))
3098     dests_node = (re_node_set *)
3099                  alloca ((sizeof (re_node_set) + sizeof (bitset)) * SBC_MAX);
3100   else
3101 #endif
3102     {
3103       dests_node = (re_node_set *)
3104                    malloc ((sizeof (re_node_set) + sizeof (bitset)) * SBC_MAX);
3105       if (BE (dests_node == NULL, 0))
3106         return NULL;
3107       dests_node_malloced = 1;
3108     }
3109   dests_ch = (bitset *) (dests_node + SBC_MAX);
3110
3111   /* Initialize transiton table.  */
3112   trtable = (re_dfastate_t **) calloc (sizeof (re_dfastate_t *), SBC_MAX);
3113   if (BE (trtable == NULL, 0))
3114     {
3115       if (dests_node_malloced)
3116         free (dests_node);
3117       return NULL;
3118     }
3119
3120   /* At first, group all nodes belonging to `state' into several
3121      destinations.  */
3122   ndests = group_nodes_into_DFAstates (preg, state, dests_node, dests_ch);
3123   if (BE (ndests <= 0, 0))
3124     {
3125       if (dests_node_malloced)
3126         free (dests_node);
3127       /* Return NULL in case of an error, trtable otherwise.  */
3128       if (ndests == 0)
3129         return trtable;
3130       free (trtable);
3131       return NULL;
3132     }
3133
3134   err = re_node_set_alloc (&follows, ndests + 1);
3135   if (BE (err != REG_NOERROR, 0))
3136     goto out_free;
3137
3138 #ifdef _LIBC
3139   if (__libc_use_alloca ((sizeof (re_node_set) + sizeof (bitset)) * SBC_MAX
3140                          + ndests * 3 * sizeof (re_dfastate_t *)))
3141     dest_states = (re_dfastate_t **)
3142                   alloca (ndests * 3 * sizeof (re_dfastate_t *));
3143   else
3144 #endif
3145     {
3146       dest_states = (re_dfastate_t **)
3147                     malloc (ndests * 3 * sizeof (re_dfastate_t *));
3148       if (BE (dest_states == NULL, 0))
3149         {
3150 out_free:
3151           if (dest_states_malloced)
3152             free (dest_states);
3153           re_node_set_free (&follows);
3154           for (i = 0; i < ndests; ++i)
3155             re_node_set_free (dests_node + i);
3156           free (trtable);
3157           if (dests_node_malloced)
3158             free (dests_node);
3159           return NULL;
3160         }
3161       dest_states_malloced = 1;
3162     }
3163   dest_states_word = dest_states + ndests;
3164   dest_states_nl = dest_states_word + ndests;
3165   bitset_empty (acceptable);
3166
3167   /* Then build the states for all destinations.  */
3168   for (i = 0; i < ndests; ++i)
3169     {
3170       int next_node;
3171       re_node_set_empty (&follows);
3172       /* Merge the follows of this destination states.  */
3173       for (j = 0; j < dests_node[i].nelem; ++j)
3174         {
3175           next_node = dfa->nexts[dests_node[i].elems[j]];
3176           if (next_node != -1)
3177             {
3178               err = re_node_set_merge (&follows, dfa->eclosures + next_node);
3179               if (BE (err != REG_NOERROR, 0))
3180                 goto out_free;
3181             }
3182         }
3183       /* If search flag is set, merge the initial state.  */
3184       if (fl_search)
3185         {
3186 #ifdef RE_ENABLE_I18N
3187           int not_initial = 0;
3188           for (j = 0; j < follows.nelem; ++j)
3189             if (dfa->nodes[follows.elems[j]].type == CHARACTER)
3190               {
3191                 not_initial = dfa->nodes[follows.elems[j]].mb_partial;
3192                 break;
3193               }
3194           if (!not_initial)
3195 #endif
3196             {
3197               err = re_node_set_merge (&follows,
3198                                        dfa->init_state->entrance_nodes);
3199               if (BE (err != REG_NOERROR, 0))
3200                 goto out_free;
3201             }
3202         }
3203       dest_states[i] = re_acquire_state_context (&err, dfa, &follows, 0);
3204       if (BE (dest_states[i] == NULL && err != REG_NOERROR, 0))
3205         goto out_free;
3206       /* If the new state has context constraint,
3207          build appropriate states for these contexts.  */
3208       if (dest_states[i]->has_constraint)
3209         {
3210           dest_states_word[i] = re_acquire_state_context (&err, dfa, &follows,
3211                                                           CONTEXT_WORD);
3212           if (BE (dest_states_word[i] == NULL && err != REG_NOERROR, 0))
3213             goto out_free;
3214           dest_states_nl[i] = re_acquire_state_context (&err, dfa, &follows,
3215                                                         CONTEXT_NEWLINE);
3216           if (BE (dest_states_nl[i] == NULL && err != REG_NOERROR, 0))
3217             goto out_free;
3218         }
3219       else
3220         {
3221           dest_states_word[i] = dest_states[i];
3222           dest_states_nl[i] = dest_states[i];
3223         }
3224       bitset_merge (acceptable, dests_ch[i]);
3225     }
3226
3227   /* Update the transition table.  */
3228   /* For all characters ch...:  */
3229   for (i = 0, ch = 0; i < BITSET_UINTS; ++i)
3230     for (j = 0; j < UINT_BITS; ++j, ++ch)
3231       if ((acceptable[i] >> j) & 1)
3232         {
3233           /* The current state accepts the character ch.  */
3234           if (IS_WORD_CHAR (ch))
3235             {
3236               for (k = 0; k < ndests; ++k)
3237                 if ((dests_ch[k][i] >> j) & 1)
3238                   {
3239                     /* k-th destination accepts the word character ch.  */
3240                     trtable[ch] = dest_states_word[k];
3241                     /* There must be only one destination which accepts
3242                        character ch.  See group_nodes_into_DFAstates.  */
3243                     break;
3244                   }
3245             }
3246           else /* not WORD_CHAR */
3247             {
3248               for (k = 0; k < ndests; ++k)
3249                 if ((dests_ch[k][i] >> j) & 1)
3250                   {
3251                     /* k-th destination accepts the non-word character ch.  */
3252                     trtable[ch] = dest_states[k];
3253                     /* There must be only one destination which accepts
3254                        character ch.  See group_nodes_into_DFAstates.  */
3255                     break;
3256                   }
3257             }
3258         }
3259   /* new line */
3260   if (bitset_contain (acceptable, NEWLINE_CHAR))
3261     {
3262       /* The current state accepts newline character.  */
3263       for (k = 0; k < ndests; ++k)
3264         if (bitset_contain (dests_ch[k], NEWLINE_CHAR))
3265           {
3266             /* k-th destination accepts newline character.  */
3267             trtable[NEWLINE_CHAR] = dest_states_nl[k];
3268             /* There must be only one destination which accepts
3269                newline.  See group_nodes_into_DFAstates.  */
3270             break;
3271           }
3272     }
3273
3274   if (dest_states_malloced)
3275     free (dest_states);
3276
3277   re_node_set_free (&follows);
3278   for (i = 0; i < ndests; ++i)
3279     re_node_set_free (dests_node + i);
3280
3281   if (dests_node_malloced)
3282     free (dests_node);
3283
3284   return trtable;
3285 }
3286
3287 /* Group all nodes belonging to STATE into several destinations.
3288    Then for all destinations, set the nodes belonging to the destination
3289    to DESTS_NODE[i] and set the characters accepted by the destination
3290    to DEST_CH[i].  This function return the number of destinations.  */
3291
3292 static int
3293 group_nodes_into_DFAstates (preg, state, dests_node, dests_ch)
3294     const regex_t *preg;
3295     const re_dfastate_t *state;
3296     re_node_set *dests_node;
3297     bitset *dests_ch;
3298 {
3299   reg_errcode_t err;
3300   const re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
3301   int i, j, k;
3302   int ndests; /* Number of the destinations from `state'.  */
3303   bitset accepts; /* Characters a node can accept.  */
3304   const re_node_set *cur_nodes = &state->nodes;
3305   bitset_empty (accepts);
3306   ndests = 0;
3307
3308   /* For all the nodes belonging to `state',  */
3309   for (i = 0; i < cur_nodes->nelem; ++i)
3310     {
3311       re_token_t *node = &dfa->nodes[cur_nodes->elems[i]];
3312       re_token_type_t type = node->type;
3313       unsigned int constraint = node->constraint;
3314
3315       /* Enumerate all single byte character this node can accept.  */
3316       if (type == CHARACTER)
3317         bitset_set (accepts, node->opr.c);
3318       else if (type == SIMPLE_BRACKET)
3319         {
3320           bitset_merge (accepts, node->opr.sbcset);
3321         }
3322       else if (type == OP_PERIOD)
3323         {
3324           bitset_set_all (accepts);
3325           if (!(preg->syntax & RE_DOT_NEWLINE))
3326             bitset_clear (accepts, '\n');
3327           if (preg->syntax & RE_DOT_NOT_NULL)
3328             bitset_clear (accepts, '\0');
3329         }
3330       else
3331         continue;
3332
3333       /* Check the `accepts' and sift the characters which are not
3334          match it the context.  */
3335       if (constraint)
3336         {
3337           if (constraint & NEXT_WORD_CONSTRAINT)
3338             for (j = 0; j < BITSET_UINTS; ++j)
3339               accepts[j] &= dfa->word_char[j];
3340           if (constraint & NEXT_NOTWORD_CONSTRAINT)
3341             for (j = 0; j < BITSET_UINTS; ++j)
3342               accepts[j] &= ~dfa->word_char[j];
3343           if (constraint & NEXT_NEWLINE_CONSTRAINT)
3344             {
3345               int accepts_newline = bitset_contain (accepts, NEWLINE_CHAR);
3346               bitset_empty (accepts);
3347               if (accepts_newline)
3348                 bitset_set (accepts, NEWLINE_CHAR);
3349               else
3350                 continue;
3351             }
3352         }
3353
3354       /* Then divide `accepts' into DFA states, or create a new
3355          state.  */
3356       for (j = 0; j < ndests; ++j)
3357         {
3358           bitset intersec; /* Intersection sets, see below.  */
3359           bitset remains;
3360           /* Flags, see below.  */
3361           int has_intersec, not_subset, not_consumed;
3362
3363           /* Optimization, skip if this state doesn't accept the character.  */
3364           if (type == CHARACTER && !bitset_contain (dests_ch[j], node->opr.c))
3365             continue;
3366
3367           /* Enumerate the intersection set of this state and `accepts'.  */
3368           has_intersec = 0;
3369           for (k = 0; k < BITSET_UINTS; ++k)
3370             has_intersec |= intersec[k] = accepts[k] & dests_ch[j][k];
3371           /* And skip if the intersection set is empty.  */
3372           if (!has_intersec)
3373             continue;
3374
3375           /* Then check if this state is a subset of `accepts'.  */
3376           not_subset = not_consumed = 0;
3377           for (k = 0; k < BITSET_UINTS; ++k)
3378             {
3379               not_subset |= remains[k] = ~accepts[k] & dests_ch[j][k];
3380               not_consumed |= accepts[k] = accepts[k] & ~dests_ch[j][k];
3381             }
3382
3383           /* If this state isn't a subset of `accepts', create a
3384              new group state, which has the `remains'. */
3385           if (not_subset)
3386             {
3387               bitset_copy (dests_ch[ndests], remains);
3388               bitset_copy (dests_ch[j], intersec);
3389               err = re_node_set_init_copy (dests_node + ndests, &dests_node[j]);
3390               if (BE (err != REG_NOERROR, 0))
3391                 goto error_return;
3392               ++ndests;
3393             }
3394
3395           /* Put the position in the current group. */
3396           err = re_node_set_insert (&dests_node[j], cur_nodes->elems[i]);
3397           if (BE (err < 0, 0))
3398             goto error_return;
3399
3400           /* If all characters are consumed, go to next node. */
3401           if (!not_consumed)
3402             break;
3403         }
3404       /* Some characters remain, create a new group. */
3405       if (j == ndests)
3406         {
3407           bitset_copy (dests_ch[ndests], accepts);
3408           err = re_node_set_init_1 (dests_node + ndests, cur_nodes->elems[i]);
3409           if (BE (err != REG_NOERROR, 0))
3410             goto error_return;
3411           ++ndests;
3412           bitset_empty (accepts);
3413         }
3414     }
3415   return ndests;
3416  error_return:
3417   for (j = 0; j < ndests; ++j)
3418     re_node_set_free (dests_node + j);
3419   return -1;
3420 }
3421
3422 #ifdef RE_ENABLE_I18N
3423 /* Check how many bytes the node `dfa->nodes[node_idx]' accepts.
3424    Return the number of the bytes the node accepts.
3425    STR_IDX is the current index of the input string.
3426
3427    This function handles the nodes which can accept one character, or
3428    one collating element like '.', '[a-z]', opposite to the other nodes
3429    can only accept one byte.  */
3430
3431 static int
3432 check_node_accept_bytes (preg, node_idx, input, str_idx)
3433     const regex_t *preg;
3434     int node_idx, str_idx;
3435     const re_string_t *input;
3436 {
3437   const re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
3438   const re_token_t *node = dfa->nodes + node_idx;
3439   int elem_len = re_string_elem_size_at (input, str_idx);
3440   int char_len = re_string_char_size_at (input, str_idx);
3441   int i;
3442 # ifdef _LIBC
3443   int j;
3444   uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
3445 # endif /* _LIBC */
3446   if (elem_len <= 1 && char_len <= 1)
3447     return 0;
3448   if (node->type == OP_PERIOD)
3449     {
3450       /* '.' accepts any one character except the following two cases.  */
3451       if ((!(preg->syntax & RE_DOT_NEWLINE) &&
3452            re_string_byte_at (input, str_idx) == '\n') ||
3453           ((preg->syntax & RE_DOT_NOT_NULL) &&
3454            re_string_byte_at (input, str_idx) == '\0'))
3455         return 0;
3456       return char_len;
3457     }
3458   else if (node->type == COMPLEX_BRACKET)
3459     {
3460       const re_charset_t *cset = node->opr.mbcset;
3461 # ifdef _LIBC
3462       const unsigned char *pin = ((char *) re_string_get_buffer (input)
3463                                   + str_idx);
3464 # endif /* _LIBC */
3465       int match_len = 0;
3466       wchar_t wc = ((cset->nranges || cset->nchar_classes || cset->nmbchars)
3467                     ? re_string_wchar_at (input, str_idx) : 0);
3468
3469       /* match with multibyte character?  */
3470       for (i = 0; i < cset->nmbchars; ++i)
3471         if (wc == cset->mbchars[i])
3472           {
3473             match_len = char_len;
3474             goto check_node_accept_bytes_match;
3475           }
3476       /* match with character_class?  */
3477       for (i = 0; i < cset->nchar_classes; ++i)
3478         {
3479           wctype_t wt = cset->char_classes[i];
3480           if (__iswctype (wc, wt))
3481             {
3482               match_len = char_len;
3483               goto check_node_accept_bytes_match;
3484             }
3485         }
3486
3487 # ifdef _LIBC
3488       if (nrules != 0)
3489         {
3490           unsigned int in_collseq = 0;
3491           const int32_t *table, *indirect;
3492           const unsigned char *weights, *extra;
3493           const char *collseqwc;
3494           int32_t idx;
3495           /* This #include defines a local function!  */
3496 #  include <locale/weight.h>
3497
3498           /* match with collating_symbol?  */
3499           if (cset->ncoll_syms)
3500             extra = (const unsigned char *)
3501               _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
3502           for (i = 0; i < cset->ncoll_syms; ++i)
3503             {
3504               const unsigned char *coll_sym = extra + cset->coll_syms[i];
3505               /* Compare the length of input collating element and
3506                  the length of current collating element.  */
3507               if (*coll_sym != elem_len)
3508                 continue;
3509               /* Compare each bytes.  */
3510               for (j = 0; j < *coll_sym; j++)
3511                 if (pin[j] != coll_sym[1 + j])
3512                   break;
3513               if (j == *coll_sym)
3514                 {
3515                   /* Match if every bytes is equal.  */
3516                   match_len = j;
3517                   goto check_node_accept_bytes_match;
3518                 }
3519             }
3520
3521           if (cset->nranges)
3522             {
3523               if (elem_len <= char_len)
3524                 {
3525                   collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
3526                   in_collseq = collseq_table_lookup (collseqwc, wc);
3527                 }
3528               else
3529                 in_collseq = find_collation_sequence_value (pin, elem_len);
3530             }
3531           /* match with range expression?  */
3532           for (i = 0; i < cset->nranges; ++i)
3533             if (cset->range_starts[i] <= in_collseq
3534                 && in_collseq <= cset->range_ends[i])
3535               {
3536                 match_len = elem_len;
3537                 goto check_node_accept_bytes_match;
3538               }
3539
3540           /* match with equivalence_class?  */
3541           if (cset->nequiv_classes)
3542             {
3543               const unsigned char *cp = pin;
3544               table = (const int32_t *)
3545                 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
3546               weights = (const unsigned char *)
3547                 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
3548               extra = (const unsigned char *)
3549                 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
3550               indirect = (const int32_t *)
3551                 _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
3552               idx = findidx (&cp);
3553               if (idx > 0)
3554                 for (i = 0; i < cset->nequiv_classes; ++i)
3555                   {
3556                     int32_t equiv_class_idx = cset->equiv_classes[i];
3557                     size_t weight_len = weights[idx];
3558                     if (weight_len == weights[equiv_class_idx])
3559                       {
3560                         int cnt = 0;
3561                         while (cnt <= weight_len
3562                                && (weights[equiv_class_idx + 1 + cnt]
3563                                    == weights[idx + 1 + cnt]))
3564                           ++cnt;
3565                         if (cnt > weight_len)
3566                           {
3567                             match_len = elem_len;
3568                             goto check_node_accept_bytes_match;
3569                           }
3570                       }
3571                   }
3572             }
3573         }
3574       else
3575 # endif /* _LIBC */
3576         {
3577           /* match with range expression?  */
3578 #if __GNUC__ >= 2
3579           wchar_t cmp_buf[] = {L'\0', L'\0', wc, L'\0', L'\0', L'\0'};
3580 #else
3581           wchar_t cmp_buf[] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
3582           cmp_buf[2] = wc;
3583 #endif
3584           for (i = 0; i < cset->nranges; ++i)
3585             {
3586               cmp_buf[0] = cset->range_starts[i];
3587               cmp_buf[4] = cset->range_ends[i];
3588               if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
3589                   && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
3590                 {
3591                   match_len = char_len;
3592                   goto check_node_accept_bytes_match;
3593                 }
3594             }
3595         }
3596     check_node_accept_bytes_match:
3597       if (!cset->non_match)
3598         return match_len;
3599       else
3600         {
3601           if (match_len > 0)
3602             return 0;
3603           else
3604             return (elem_len > char_len) ? elem_len : char_len;
3605         }
3606     }
3607   return 0;
3608 }
3609
3610 # ifdef _LIBC
3611 static unsigned int
3612 find_collation_sequence_value (mbs, mbs_len)
3613     const unsigned char *mbs;
3614     size_t mbs_len;
3615 {
3616   uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
3617   if (nrules == 0)
3618     {
3619       if (mbs_len == 1)
3620         {
3621           /* No valid character.  Match it as a single byte character.  */
3622           const unsigned char *collseq = (const unsigned char *)
3623             _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
3624           return collseq[mbs[0]];
3625         }
3626       return UINT_MAX;
3627     }
3628   else
3629     {
3630       int32_t idx;
3631       const unsigned char *extra = (const unsigned char *)
3632         _NL_CURRENT (LC_COLLATE, _NL_COLLATE_SYMB_EXTRAMB);
3633
3634       for (idx = 0; ;)
3635         {
3636           int mbs_cnt, found = 0;
3637           int32_t elem_mbs_len;
3638           /* Skip the name of collating element name.  */
3639           idx = idx + extra[idx] + 1;
3640           elem_mbs_len = extra[idx++];
3641           if (mbs_len == elem_mbs_len)
3642             {
3643               for (mbs_cnt = 0; mbs_cnt < elem_mbs_len; ++mbs_cnt)
3644                 if (extra[idx + mbs_cnt] != mbs[mbs_cnt])
3645                   break;
3646               if (mbs_cnt == elem_mbs_len)
3647                 /* Found the entry.  */
3648                 found = 1;
3649             }
3650           /* Skip the byte sequence of the collating element.  */
3651           idx += elem_mbs_len;
3652           /* Adjust for the alignment.  */
3653           idx = (idx + 3) & ~3;
3654           /* Skip the collation sequence value.  */
3655           idx += sizeof (uint32_t);
3656           /* Skip the wide char sequence of the collating element.  */
3657           idx = idx + sizeof (uint32_t) * (extra[idx] + 1);
3658           /* If we found the entry, return the sequence value.  */
3659           if (found)
3660             return *(uint32_t *) (extra + idx);
3661           /* Skip the collation sequence value.  */
3662           idx += sizeof (uint32_t);
3663         }
3664     }
3665 }
3666 # endif /* _LIBC */
3667 #endif /* RE_ENABLE_I18N */
3668
3669 /* Check whether the node accepts the byte which is IDX-th
3670    byte of the INPUT.  */
3671
3672 static int
3673 check_node_accept (preg, node, mctx, idx)
3674     const regex_t *preg;
3675     const re_token_t *node;
3676     const re_match_context_t *mctx;
3677     int idx;
3678 {
3679   unsigned char ch;
3680   if (node->constraint)
3681     {
3682       /* The node has constraints.  Check whether the current context
3683          satisfies the constraints.  */
3684       unsigned int context = re_string_context_at (mctx->input, idx,
3685                                                    mctx->eflags,
3686                                                    preg->newline_anchor);
3687       if (NOT_SATISFY_NEXT_CONSTRAINT (node->constraint, context))
3688         return 0;
3689     }
3690   ch = re_string_byte_at (mctx->input, idx);
3691   if (node->type == CHARACTER)
3692     return node->opr.c == ch;
3693   else if (node->type == SIMPLE_BRACKET)
3694     return bitset_contain (node->opr.sbcset, ch);
3695   else if (node->type == OP_PERIOD)
3696     return !((ch == '\n' && !(preg->syntax & RE_DOT_NEWLINE))
3697              || (ch == '\0' && (preg->syntax & RE_DOT_NOT_NULL)));
3698   else
3699     return 0;
3700 }
3701
3702 /* Extend the buffers, if the buffers have run out.  */
3703
3704 static reg_errcode_t
3705 extend_buffers (mctx)
3706      re_match_context_t *mctx;
3707 {
3708   reg_errcode_t ret;
3709   re_string_t *pstr = mctx->input;
3710
3711   /* Double the lengthes of the buffers.  */
3712   ret = re_string_realloc_buffers (pstr, pstr->bufs_len * 2);
3713   if (BE (ret != REG_NOERROR, 0))
3714     return ret;
3715
3716   if (mctx->state_log != NULL)
3717     {
3718       /* And double the length of state_log.  */
3719       re_dfastate_t **new_array;
3720       new_array = re_realloc (mctx->state_log, re_dfastate_t *,
3721                               pstr->bufs_len * 2);
3722       if (BE (new_array == NULL, 0))
3723         return REG_ESPACE;
3724       mctx->state_log = new_array;
3725     }
3726
3727   /* Then reconstruct the buffers.  */
3728   if (pstr->icase)
3729     {
3730 #ifdef RE_ENABLE_I18N
3731       if (MB_CUR_MAX > 1)
3732         build_wcs_upper_buffer (pstr);
3733       else
3734 #endif /* RE_ENABLE_I18N  */
3735         build_upper_buffer (pstr);
3736     }
3737   else
3738     {
3739 #ifdef RE_ENABLE_I18N
3740       if (MB_CUR_MAX > 1)
3741         build_wcs_buffer (pstr);
3742       else
3743 #endif /* RE_ENABLE_I18N  */
3744         {
3745           if (pstr->trans != NULL)
3746             re_string_translate_buffer (pstr);
3747           else
3748             pstr->valid_len = pstr->bufs_len;
3749         }
3750     }
3751   return REG_NOERROR;
3752 }
3753
3754 \f
3755 /* Functions for matching context.  */
3756
3757 /* Initialize MCTX.  */
3758
3759 static reg_errcode_t
3760 match_ctx_init (mctx, eflags, input, n)
3761     re_match_context_t *mctx;
3762     int eflags, n;
3763     re_string_t *input;
3764 {
3765   mctx->eflags = eflags;
3766   mctx->input = input;
3767   mctx->match_last = -1;
3768   if (n > 0)
3769     {
3770       mctx->bkref_ents = re_malloc (struct re_backref_cache_entry, n);
3771       mctx->sub_tops = re_malloc (re_sub_match_top_t *, n);
3772       if (BE (mctx->bkref_ents == NULL || mctx->sub_tops == NULL, 0))
3773         return REG_ESPACE;
3774     }
3775   else
3776     mctx->bkref_ents = NULL;
3777   mctx->nbkref_ents = 0;
3778   mctx->abkref_ents = n;
3779   mctx->max_mb_elem_len = 1;
3780   mctx->nsub_tops = 0;
3781   mctx->asub_tops = n;
3782   return REG_NOERROR;
3783 }
3784
3785 /* Clean the entries which depend on the current input in MCTX.
3786    This function must be invoked when the matcher changes the start index
3787    of the input, or changes the input string.  */
3788
3789 static void
3790 match_ctx_clean (mctx)
3791     re_match_context_t *mctx;
3792 {
3793   match_ctx_free_subtops (mctx);
3794   mctx->nsub_tops = 0;
3795   mctx->nbkref_ents = 0;
3796 }
3797
3798 /* Free all the memory associated with MCTX.  */
3799
3800 static void
3801 match_ctx_free (mctx)
3802     re_match_context_t *mctx;
3803 {
3804   match_ctx_free_subtops (mctx);
3805   re_free (mctx->sub_tops);
3806   re_free (mctx->bkref_ents);
3807 }
3808
3809 /* Free all the memory associated with MCTX->SUB_TOPS.  */
3810
3811 static void
3812 match_ctx_free_subtops (mctx)
3813      re_match_context_t *mctx;
3814 {
3815   int st_idx;
3816   for (st_idx = 0; st_idx < mctx->nsub_tops; ++st_idx)
3817     {
3818       int sl_idx;
3819       re_sub_match_top_t *top = mctx->sub_tops[st_idx];
3820       for (sl_idx = 0; sl_idx < top->nlasts; ++sl_idx)
3821         {
3822           re_sub_match_last_t *last = top->lasts[sl_idx];
3823           re_free (last->path.array);
3824           re_free (last);
3825         }
3826       re_free (top->lasts);
3827       if (top->path)
3828         {
3829           re_free (top->path->array);
3830           re_free (top->path);
3831         }
3832       free (top);
3833     }
3834 }
3835
3836 /* Add a new backreference entry to MCTX.
3837    Note that we assume that caller never call this function with duplicate
3838    entry, and call with STR_IDX which isn't smaller than any existing entry.
3839 */
3840
3841 static reg_errcode_t
3842 match_ctx_add_entry (mctx, node, str_idx, from, to)
3843      re_match_context_t *mctx;
3844      int node, str_idx, from, to;
3845 {
3846   if (mctx->nbkref_ents >= mctx->abkref_ents)
3847     {
3848       struct re_backref_cache_entry* new_entry;
3849       new_entry = re_realloc (mctx->bkref_ents, struct re_backref_cache_entry,
3850                               mctx->abkref_ents * 2);
3851       if (BE (new_entry == NULL, 0))
3852         {
3853           re_free (mctx->bkref_ents);
3854           return REG_ESPACE;
3855         }
3856       mctx->bkref_ents = new_entry;
3857       memset (mctx->bkref_ents + mctx->nbkref_ents, '\0',
3858               sizeof (struct re_backref_cache_entry) * mctx->abkref_ents);
3859       mctx->abkref_ents *= 2;
3860     }
3861   mctx->bkref_ents[mctx->nbkref_ents].node = node;
3862   mctx->bkref_ents[mctx->nbkref_ents].str_idx = str_idx;
3863   mctx->bkref_ents[mctx->nbkref_ents].subexp_from = from;
3864   mctx->bkref_ents[mctx->nbkref_ents].subexp_to = to;
3865   mctx->bkref_ents[mctx->nbkref_ents++].flag = 0;
3866   if (mctx->max_mb_elem_len < to - from)
3867     mctx->max_mb_elem_len = to - from;
3868   return REG_NOERROR;
3869 }
3870
3871 /* Search for the first entry which has the same str_idx.
3872    Note that MCTX->BKREF_ENTS is already sorted by MCTX->STR_IDX.  */
3873
3874 static int
3875 search_cur_bkref_entry (mctx, str_idx)
3876      re_match_context_t *mctx;
3877      int str_idx;
3878 {
3879   int left, right, mid;
3880   right = mctx->nbkref_ents;
3881   for (left = 0; left < right;)
3882     {
3883       mid = (left + right) / 2;
3884       if (mctx->bkref_ents[mid].str_idx < str_idx)
3885         left = mid + 1;
3886       else
3887         right = mid;
3888     }
3889   return left;
3890 }
3891
3892 static void
3893 match_ctx_clear_flag (mctx)
3894      re_match_context_t *mctx;
3895 {
3896   int i;
3897   for (i = 0; i < mctx->nbkref_ents; ++i)
3898     {
3899       mctx->bkref_ents[i].flag = 0;
3900     }
3901 }
3902
3903 /* Register the node NODE, whose type is OP_OPEN_SUBEXP, and which matches
3904    at STR_IDX.  */
3905
3906 static reg_errcode_t
3907 match_ctx_add_subtop (mctx, node, str_idx)
3908      re_match_context_t *mctx;
3909      int node, str_idx;
3910 {
3911 #ifdef DEBUG
3912   assert (mctx->sub_tops != NULL);
3913   assert (mctx->asub_tops > 0);
3914 #endif
3915   if (mctx->nsub_tops == mctx->asub_tops)
3916     {
3917       re_sub_match_top_t **new_array;
3918       mctx->asub_tops *= 2;
3919       new_array = re_realloc (mctx->sub_tops, re_sub_match_top_t *,
3920                               mctx->asub_tops);
3921       if (BE (new_array == NULL, 0))
3922         return REG_ESPACE;
3923       mctx->sub_tops = new_array;
3924     }
3925   mctx->sub_tops[mctx->nsub_tops] = calloc (1, sizeof (re_sub_match_top_t));
3926   if (mctx->sub_tops[mctx->nsub_tops] == NULL)
3927     return REG_ESPACE;
3928   mctx->sub_tops[mctx->nsub_tops]->node = node;
3929   mctx->sub_tops[mctx->nsub_tops++]->str_idx = str_idx;
3930   return REG_NOERROR;
3931 }
3932
3933 /* Register the node NODE, whose type is OP_CLOSE_SUBEXP, and which matches
3934    at STR_IDX, whose corresponding OP_OPEN_SUBEXP is SUB_TOP.  */
3935
3936 static re_sub_match_last_t *
3937 match_ctx_add_sublast (subtop, node, str_idx)
3938      re_sub_match_top_t *subtop;
3939      int node, str_idx;
3940 {
3941   re_sub_match_last_t *new_entry;
3942   if (subtop->nlasts == subtop->alasts)
3943     {
3944       re_sub_match_last_t **new_array;
3945       subtop->alasts = 2 * subtop->alasts + 1;
3946       new_array = re_realloc (subtop->lasts, re_sub_match_last_t *,
3947                               subtop->alasts);
3948       if (BE (new_array == NULL, 0))
3949         return NULL;
3950       subtop->lasts = new_array;
3951     }
3952   new_entry = calloc (1, sizeof (re_sub_match_last_t));
3953   if (BE (new_entry == NULL, 0))
3954     return NULL;
3955   subtop->lasts[subtop->nlasts] = new_entry;
3956   new_entry->node = node;
3957   new_entry->str_idx = str_idx;
3958   ++subtop->nlasts;
3959   return new_entry;
3960 }
3961
3962 static void
3963 sift_ctx_init (sctx, sifted_sts, limited_sts, last_node, last_str_idx,
3964                check_subexp)
3965     re_sift_context_t *sctx;
3966     re_dfastate_t **sifted_sts, **limited_sts;
3967     int last_node, last_str_idx, check_subexp;
3968 {
3969   sctx->sifted_states = sifted_sts;
3970   sctx->limited_states = limited_sts;
3971   sctx->last_node = last_node;
3972   sctx->last_str_idx = last_str_idx;
3973   sctx->check_subexp = check_subexp;
3974   sctx->cur_bkref = -1;
3975   sctx->cls_subexp_idx = -1;
3976   re_node_set_init_empty (&sctx->limits);
3977 }