1 /* Extended regular expression matching and search library.
 
   2    Copyright (C) 2002-2007,2009,2010 Free Software Foundation, Inc.
 
   3    This file is part of the GNU C Library.
 
   4    Contributed by Isamu Hasegawa <isamu@yamato.ibm.com>.
 
   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.
 
  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.
 
  16    You should have received a copy of the GNU Lesser General Public
 
  17    License along with the GNU C Library; if not, see
 
  18    <http://www.gnu.org/licenses/>.  */
 
  21  /* This is currently duplicated from git-compat-utils.h */
 
  23  typedef long intptr_t;
 
  24  typedef unsigned long uintptr_t;
 
  28 static reg_errcode_t re_compile_internal (regex_t *preg, const char * pattern,
 
  29                                           size_t length, reg_syntax_t syntax);
 
  30 static void re_compile_fastmap_iter (regex_t *bufp,
 
  31                                      const re_dfastate_t *init_state,
 
  33 static reg_errcode_t init_dfa (re_dfa_t *dfa, size_t pat_len);
 
  35 static void free_charset (re_charset_t *cset);
 
  36 #endif /* RE_ENABLE_I18N */
 
  37 static void free_workarea_compile (regex_t *preg);
 
  38 static reg_errcode_t create_initial_state (re_dfa_t *dfa);
 
  40 static void optimize_utf8 (re_dfa_t *dfa);
 
  42 static reg_errcode_t analyze (regex_t *preg);
 
  43 static reg_errcode_t preorder (bin_tree_t *root,
 
  44                                reg_errcode_t (fn (void *, bin_tree_t *)),
 
  46 static reg_errcode_t postorder (bin_tree_t *root,
 
  47                                 reg_errcode_t (fn (void *, bin_tree_t *)),
 
  49 static reg_errcode_t optimize_subexps (void *extra, bin_tree_t *node);
 
  50 static reg_errcode_t lower_subexps (void *extra, bin_tree_t *node);
 
  51 static bin_tree_t *lower_subexp (reg_errcode_t *err, regex_t *preg,
 
  53 static reg_errcode_t calc_first (void *extra, bin_tree_t *node);
 
  54 static reg_errcode_t calc_next (void *extra, bin_tree_t *node);
 
  55 static reg_errcode_t link_nfa_nodes (void *extra, bin_tree_t *node);
 
  56 static int duplicate_node (re_dfa_t *dfa, int org_idx, unsigned int constraint);
 
  57 static int search_duplicated_node (const re_dfa_t *dfa, int org_node,
 
  58                                    unsigned int constraint);
 
  59 static reg_errcode_t calc_eclosure (re_dfa_t *dfa);
 
  60 static reg_errcode_t calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa,
 
  62 static reg_errcode_t calc_inveclosure (re_dfa_t *dfa);
 
  63 static int fetch_number (re_string_t *input, re_token_t *token,
 
  65 static int peek_token (re_token_t *token, re_string_t *input,
 
  66                         reg_syntax_t syntax) internal_function;
 
  67 static bin_tree_t *parse (re_string_t *regexp, regex_t *preg,
 
  68                           reg_syntax_t syntax, reg_errcode_t *err);
 
  69 static bin_tree_t *parse_reg_exp (re_string_t *regexp, regex_t *preg,
 
  70                                   re_token_t *token, reg_syntax_t syntax,
 
  71                                   int nest, reg_errcode_t *err);
 
  72 static bin_tree_t *parse_branch (re_string_t *regexp, regex_t *preg,
 
  73                                  re_token_t *token, reg_syntax_t syntax,
 
  74                                  int nest, reg_errcode_t *err);
 
  75 static bin_tree_t *parse_expression (re_string_t *regexp, regex_t *preg,
 
  76                                      re_token_t *token, reg_syntax_t syntax,
 
  77                                      int nest, reg_errcode_t *err);
 
  78 static bin_tree_t *parse_sub_exp (re_string_t *regexp, regex_t *preg,
 
  79                                   re_token_t *token, reg_syntax_t syntax,
 
  80                                   int nest, reg_errcode_t *err);
 
  81 static bin_tree_t *parse_dup_op (bin_tree_t *dup_elem, re_string_t *regexp,
 
  82                                  re_dfa_t *dfa, re_token_t *token,
 
  83                                  reg_syntax_t syntax, reg_errcode_t *err);
 
  84 static bin_tree_t *parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa,
 
  85                                       re_token_t *token, reg_syntax_t syntax,
 
  87 static reg_errcode_t parse_bracket_element (bracket_elem_t *elem,
 
  89                                             re_token_t *token, int token_len,
 
  93 static reg_errcode_t parse_bracket_symbol (bracket_elem_t *elem,
 
  97 static reg_errcode_t build_equiv_class (bitset_t sbcset,
 
  99                                         int *equiv_class_alloc,
 
 100                                         const unsigned char *name);
 
 101 static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
 
 103                                       re_charset_t *mbcset,
 
 104                                       int *char_class_alloc,
 
 105                                       const char *class_name,
 
 106                                       reg_syntax_t syntax);
 
 107 #else  /* not RE_ENABLE_I18N */
 
 108 static reg_errcode_t build_equiv_class (bitset_t sbcset,
 
 109                                         const unsigned char *name);
 
 110 static reg_errcode_t build_charclass (RE_TRANSLATE_TYPE trans,
 
 112                                       const char *class_name,
 
 113                                       reg_syntax_t syntax);
 
 114 #endif /* not RE_ENABLE_I18N */
 
 115 static bin_tree_t *build_charclass_op (re_dfa_t *dfa,
 
 116                                        RE_TRANSLATE_TYPE trans,
 
 117                                        const char *class_name,
 
 119                                        int non_match, reg_errcode_t *err);
 
 120 static bin_tree_t *create_tree (re_dfa_t *dfa,
 
 121                                 bin_tree_t *left, bin_tree_t *right,
 
 122                                 re_token_type_t type);
 
 123 static bin_tree_t *create_token_tree (re_dfa_t *dfa,
 
 124                                       bin_tree_t *left, bin_tree_t *right,
 
 125                                       const re_token_t *token);
 
 126 static bin_tree_t *duplicate_tree (const bin_tree_t *src, re_dfa_t *dfa);
 
 127 static void free_token (re_token_t *node);
 
 128 static reg_errcode_t free_tree (void *extra, bin_tree_t *node);
 
 129 static reg_errcode_t mark_opt_subexp (void *extra, bin_tree_t *node);
 
 131 /* This table gives an error message for each of the error codes listed
 
 132    in regex.h.  Obviously the order here has to be same as there.
 
 133    POSIX doesn't require that we do anything for REG_NOERROR,
 
 134    but why not be nice?  */
 
 136 const char __re_error_msgid[] attribute_hidden =
 
 138 #define REG_NOERROR_IDX 0
 
 139     gettext_noop ("Success")    /* REG_NOERROR */
 
 141 #define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success")
 
 142     gettext_noop ("No match")   /* REG_NOMATCH */
 
 144 #define REG_BADPAT_IDX  (REG_NOMATCH_IDX + sizeof "No match")
 
 145     gettext_noop ("Invalid regular expression") /* REG_BADPAT */
 
 147 #define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression")
 
 148     gettext_noop ("Invalid collation character") /* REG_ECOLLATE */
 
 150 #define REG_ECTYPE_IDX  (REG_ECOLLATE_IDX + sizeof "Invalid collation character")
 
 151     gettext_noop ("Invalid character class name") /* REG_ECTYPE */
 
 153 #define REG_EESCAPE_IDX (REG_ECTYPE_IDX + sizeof "Invalid character class name")
 
 154     gettext_noop ("Trailing backslash") /* REG_EESCAPE */
 
 156 #define REG_ESUBREG_IDX (REG_EESCAPE_IDX + sizeof "Trailing backslash")
 
 157     gettext_noop ("Invalid back reference") /* REG_ESUBREG */
 
 159 #define REG_EBRACK_IDX  (REG_ESUBREG_IDX + sizeof "Invalid back reference")
 
 160     gettext_noop ("Unmatched [ or [^")  /* REG_EBRACK */
 
 162 #define REG_EPAREN_IDX  (REG_EBRACK_IDX + sizeof "Unmatched [ or [^")
 
 163     gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */
 
 165 #define REG_EBRACE_IDX  (REG_EPAREN_IDX + sizeof "Unmatched ( or \\(")
 
 166     gettext_noop ("Unmatched \\{") /* REG_EBRACE */
 
 168 #define REG_BADBR_IDX   (REG_EBRACE_IDX + sizeof "Unmatched \\{")
 
 169     gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */
 
 171 #define REG_ERANGE_IDX  (REG_BADBR_IDX + sizeof "Invalid content of \\{\\}")
 
 172     gettext_noop ("Invalid range end")  /* REG_ERANGE */
 
 174 #define REG_ESPACE_IDX  (REG_ERANGE_IDX + sizeof "Invalid range end")
 
 175     gettext_noop ("Memory exhausted") /* REG_ESPACE */
 
 177 #define REG_BADRPT_IDX  (REG_ESPACE_IDX + sizeof "Memory exhausted")
 
 178     gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */
 
 180 #define REG_EEND_IDX    (REG_BADRPT_IDX + sizeof "Invalid preceding regular expression")
 
 181     gettext_noop ("Premature end of regular expression") /* REG_EEND */
 
 183 #define REG_ESIZE_IDX   (REG_EEND_IDX + sizeof "Premature end of regular expression")
 
 184     gettext_noop ("Regular expression too big") /* REG_ESIZE */
 
 186 #define REG_ERPAREN_IDX (REG_ESIZE_IDX + sizeof "Regular expression too big")
 
 187     gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */
 
 190 const size_t __re_error_msgid_idx[] attribute_hidden =
 
 211 /* Entry points for GNU code.  */
 
 216 /* For ZOS USS we must define btowc */
 
 227    mbtowc (wtmp, tmp, 1);
 
 232 /* re_compile_pattern is the GNU regular expression compiler: it
 
 233    compiles PATTERN (of length LENGTH) and puts the result in BUFP.
 
 234    Returns 0 if the pattern was valid, otherwise an error string.
 
 236    Assumes the `allocated' (and perhaps `buffer') and `translate' fields
 
 237    are set in BUFP on entry.  */
 
 240 re_compile_pattern (const char *pattern,
 
 242                     struct re_pattern_buffer *bufp)
 
 246   /* And GNU code determines whether or not to get register information
 
 247      by passing null for the REGS argument to re_match, etc., not by
 
 248      setting no_sub, unless RE_NO_SUB is set.  */
 
 249   bufp->no_sub = !!(re_syntax_options & RE_NO_SUB);
 
 251   /* Match anchors at newline.  */
 
 252   bufp->newline_anchor = 1;
 
 254   ret = re_compile_internal (bufp, pattern, length, re_syntax_options);
 
 258   return gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
 
 261 weak_alias (__re_compile_pattern, re_compile_pattern)
 
 264 /* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
 
 265    also be assigned to arbitrarily: each pattern buffer stores its own
 
 266    syntax, so it can be changed between regex compilations.  */
 
 267 /* This has no initializer because initialized variables in Emacs
 
 268    become read-only after dumping.  */
 
 269 reg_syntax_t re_syntax_options;
 
 272 /* Specify the precise syntax of regexps for compilation.  This provides
 
 273    for compatibility for various utilities which historically have
 
 274    different, incompatible syntaxes.
 
 276    The argument SYNTAX is a bit mask comprised of the various bits
 
 277    defined in regex.h.  We return the old syntax.  */
 
 280 re_set_syntax (reg_syntax_t syntax)
 
 282   reg_syntax_t ret = re_syntax_options;
 
 284   re_syntax_options = syntax;
 
 288 weak_alias (__re_set_syntax, re_set_syntax)
 
 292 re_compile_fastmap (struct re_pattern_buffer *bufp)
 
 294   re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
 
 295   char *fastmap = bufp->fastmap;
 
 297   memset (fastmap, '\0', sizeof (char) * SBC_MAX);
 
 298   re_compile_fastmap_iter (bufp, dfa->init_state, fastmap);
 
 299   if (dfa->init_state != dfa->init_state_word)
 
 300     re_compile_fastmap_iter (bufp, dfa->init_state_word, fastmap);
 
 301   if (dfa->init_state != dfa->init_state_nl)
 
 302     re_compile_fastmap_iter (bufp, dfa->init_state_nl, fastmap);
 
 303   if (dfa->init_state != dfa->init_state_begbuf)
 
 304     re_compile_fastmap_iter (bufp, dfa->init_state_begbuf, fastmap);
 
 305   bufp->fastmap_accurate = 1;
 
 309 weak_alias (__re_compile_fastmap, re_compile_fastmap)
 
 313 __attribute ((always_inline))
 
 314 re_set_fastmap (char *fastmap, int icase, int ch)
 
 318     fastmap[tolower (ch)] = 1;
 
 321 /* Helper function for re_compile_fastmap.
 
 322    Compile fastmap for the initial_state INIT_STATE.  */
 
 325 re_compile_fastmap_iter (regex_t *bufp, const re_dfastate_t *init_state,
 
 328   volatile re_dfa_t *dfa = (re_dfa_t *) bufp->buffer;
 
 330   int icase = (dfa->mb_cur_max == 1 && (bufp->syntax & RE_ICASE));
 
 331   for (node_cnt = 0; node_cnt < init_state->nodes.nelem; ++node_cnt)
 
 333       int node = init_state->nodes.elems[node_cnt];
 
 334       re_token_type_t type = dfa->nodes[node].type;
 
 336       if (type == CHARACTER)
 
 338           re_set_fastmap (fastmap, icase, dfa->nodes[node].opr.c);
 
 339 #ifdef RE_ENABLE_I18N
 
 340           if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
 
 342               unsigned char *buf = re_malloc (unsigned char, dfa->mb_cur_max), *p;
 
 347               *p++ = dfa->nodes[node].opr.c;
 
 348               while (++node < dfa->nodes_len
 
 349                      && dfa->nodes[node].type == CHARACTER
 
 350                      && dfa->nodes[node].mb_partial)
 
 351                 *p++ = dfa->nodes[node].opr.c;
 
 352               memset (&state, '\0', sizeof (state));
 
 353               if (__mbrtowc (&wc, (const char *) buf, p - buf,
 
 355                   && (__wcrtomb ((char *) buf, towlower (wc), &state)
 
 357                 re_set_fastmap (fastmap, 0, buf[0]);
 
 362       else if (type == SIMPLE_BRACKET)
 
 365           for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
 
 368               bitset_word_t w = dfa->nodes[node].opr.sbcset[i];
 
 369               for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
 
 370                 if (w & ((bitset_word_t) 1 << j))
 
 371                   re_set_fastmap (fastmap, icase, ch);
 
 374 #ifdef RE_ENABLE_I18N
 
 375       else if (type == COMPLEX_BRACKET)
 
 377           re_charset_t *cset = dfa->nodes[node].opr.mbcset;
 
 381           /* See if we have to try all bytes which start multiple collation
 
 383              e.g. In da_DK, we want to catch 'a' since "aa" is a valid
 
 384                   collation element, and don't catch 'b' since 'b' is
 
 385                   the only collation element which starts from 'b' (and
 
 386                   it is caught by SIMPLE_BRACKET).  */
 
 387               if (_NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES) != 0
 
 388                   && (cset->ncoll_syms || cset->nranges))
 
 390                   const int32_t *table = (const int32_t *)
 
 391                     _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
 
 392                   for (i = 0; i < SBC_MAX; ++i)
 
 394                       re_set_fastmap (fastmap, icase, i);
 
 398           /* See if we have to start the match at all multibyte characters,
 
 399              i.e. where we would not find an invalid sequence.  This only
 
 400              applies to multibyte character sets; for single byte character
 
 401              sets, the SIMPLE_BRACKET again suffices.  */
 
 402           if (dfa->mb_cur_max > 1
 
 403               && (cset->nchar_classes || cset->non_match || cset->nranges
 
 405                   || cset->nequiv_classes
 
 413                   memset (&mbs, 0, sizeof (mbs));
 
 414                   if (__mbrtowc (NULL, (char *) &c, 1, &mbs) == (size_t) -2)
 
 415                     re_set_fastmap (fastmap, false, (int) c);
 
 422               /* ... Else catch all bytes which can start the mbchars.  */
 
 423               for (i = 0; i < cset->nmbchars; ++i)
 
 427                   memset (&state, '\0', sizeof (state));
 
 428                   if (__wcrtomb (buf, cset->mbchars[i], &state) != (size_t) -1)
 
 429                     re_set_fastmap (fastmap, icase, *(unsigned char *) buf);
 
 430                   if ((bufp->syntax & RE_ICASE) && dfa->mb_cur_max > 1)
 
 432                       if (__wcrtomb (buf, towlower (cset->mbchars[i]), &state)
 
 434                         re_set_fastmap (fastmap, false, *(unsigned char *) buf);
 
 439 #endif /* RE_ENABLE_I18N */
 
 440       else if (type == OP_PERIOD
 
 441 #ifdef RE_ENABLE_I18N
 
 442                || type == OP_UTF8_PERIOD
 
 443 #endif /* RE_ENABLE_I18N */
 
 444                || type == END_OF_RE)
 
 446           memset (fastmap, '\1', sizeof (char) * SBC_MAX);
 
 447           if (type == END_OF_RE)
 
 448             bufp->can_be_null = 1;
 
 454 /* Entry point for POSIX code.  */
 
 455 /* regcomp takes a regular expression as a string and compiles it.
 
 457    PREG is a regex_t *.  We do not expect any fields to be initialized,
 
 458    since POSIX says we shouldn't.  Thus, we set
 
 460      `buffer' to the compiled pattern;
 
 461      `used' to the length of the compiled pattern;
 
 462      `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
 
 463        REG_EXTENDED bit in CFLAGS is set; otherwise, to
 
 464        RE_SYNTAX_POSIX_BASIC;
 
 465      `newline_anchor' to REG_NEWLINE being set in CFLAGS;
 
 466      `fastmap' to an allocated space for the fastmap;
 
 467      `fastmap_accurate' to zero;
 
 468      `re_nsub' to the number of subexpressions in PATTERN.
 
 470    PATTERN is the address of the pattern string.
 
 472    CFLAGS is a series of bits which affect compilation.
 
 474      If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
 
 475      use POSIX basic syntax.
 
 477      If REG_NEWLINE is set, then . and [^...] don't match newline.
 
 478      Also, regexec will try a match beginning after every newline.
 
 480      If REG_ICASE is set, then we considers upper- and lowercase
 
 481      versions of letters to be equivalent when matching.
 
 483      If REG_NOSUB is set, then when PREG is passed to regexec, that
 
 484      routine will report only success or failure, and nothing about the
 
 487    It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
 
 488    the return codes and their meanings.)  */
 
 491 regcomp (regex_t *__restrict preg,
 
 492          const char *__restrict pattern,
 
 496   reg_syntax_t syntax = ((cflags & REG_EXTENDED) ? RE_SYNTAX_POSIX_EXTENDED
 
 497                          : RE_SYNTAX_POSIX_BASIC);
 
 503   /* Try to allocate space for the fastmap.  */
 
 504   preg->fastmap = re_malloc (char, SBC_MAX);
 
 505   if (BE (preg->fastmap == NULL, 0))
 
 508   syntax |= (cflags & REG_ICASE) ? RE_ICASE : 0;
 
 510   /* If REG_NEWLINE is set, newlines are treated differently.  */
 
 511   if (cflags & REG_NEWLINE)
 
 512     { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
 
 513       syntax &= ~RE_DOT_NEWLINE;
 
 514       syntax |= RE_HAT_LISTS_NOT_NEWLINE;
 
 515       /* It also changes the matching behavior.  */
 
 516       preg->newline_anchor = 1;
 
 519     preg->newline_anchor = 0;
 
 520   preg->no_sub = !!(cflags & REG_NOSUB);
 
 521   preg->translate = NULL;
 
 523   ret = re_compile_internal (preg, pattern, strlen (pattern), syntax);
 
 525   /* POSIX doesn't distinguish between an unmatched open-group and an
 
 526      unmatched close-group: both are REG_EPAREN.  */
 
 527   if (ret == REG_ERPAREN)
 
 530   /* We have already checked preg->fastmap != NULL.  */
 
 531   if (BE (ret == REG_NOERROR, 1))
 
 532     /* Compute the fastmap now, since regexec cannot modify the pattern
 
 533        buffer.  This function never fails in this implementation.  */
 
 534     (void) re_compile_fastmap (preg);
 
 537       /* Some error occurred while compiling the expression.  */
 
 538       re_free (preg->fastmap);
 
 539       preg->fastmap = NULL;
 
 545 weak_alias (__regcomp, regcomp)
 
 548 /* Returns a message corresponding to an error code, ERRCODE, returned
 
 549    from either regcomp or regexec.   We don't use PREG here.  */
 
 552 regerror(int errcode, const regex_t *__restrict preg,
 
 553          char *__restrict errbuf, size_t errbuf_size)
 
 559           || errcode >= (int) (sizeof (__re_error_msgid_idx)
 
 560                                / sizeof (__re_error_msgid_idx[0])), 0))
 
 561     /* Only error codes returned by the rest of the code should be passed
 
 562        to this routine.  If we are given anything else, or if other regex
 
 563        code generates an invalid error code, then the program has a bug.
 
 564        Dump core so we can fix it.  */
 
 567   msg = gettext (__re_error_msgid + __re_error_msgid_idx[errcode]);
 
 569   msg_size = strlen (msg) + 1; /* Includes the null.  */
 
 571   if (BE (errbuf_size != 0, 1))
 
 573       if (BE (msg_size > errbuf_size, 0))
 
 575           memcpy (errbuf, msg, errbuf_size - 1);
 
 576           errbuf[errbuf_size - 1] = 0;
 
 579         memcpy (errbuf, msg, msg_size);
 
 585 weak_alias (__regerror, regerror)
 
 589 #ifdef RE_ENABLE_I18N
 
 590 /* This static array is used for the map to single-byte characters when
 
 591    UTF-8 is used.  Otherwise we would allocate memory just to initialize
 
 592    it the same all the time.  UTF-8 is the preferred encoding so this is
 
 593    a worthwhile optimization.  */
 
 595 static const bitset_t utf8_sb_map = {
 
 596   /* Set the first 128 bits.  */
 
 597   [0 ... 0x80 / BITSET_WORD_BITS - 1] = BITSET_WORD_MAX
 
 599 #else /* ! (__GNUC__ >= 3) */
 
 600 static bitset_t utf8_sb_map;
 
 601 #endif /* __GNUC__ >= 3 */
 
 602 #endif /* RE_ENABLE_I18N */
 
 606 free_dfa_content (re_dfa_t *dfa)
 
 611     for (i = 0; i < dfa->nodes_len; ++i)
 
 612       free_token (dfa->nodes + i);
 
 613   re_free (dfa->nexts);
 
 614   for (i = 0; i < dfa->nodes_len; ++i)
 
 616       if (dfa->eclosures != NULL)
 
 617         re_node_set_free (dfa->eclosures + i);
 
 618       if (dfa->inveclosures != NULL)
 
 619         re_node_set_free (dfa->inveclosures + i);
 
 620       if (dfa->edests != NULL)
 
 621         re_node_set_free (dfa->edests + i);
 
 623   re_free (dfa->edests);
 
 624   re_free (dfa->eclosures);
 
 625   re_free (dfa->inveclosures);
 
 626   re_free (dfa->nodes);
 
 628   if (dfa->state_table)
 
 629     for (i = 0; i <= dfa->state_hash_mask; ++i)
 
 631         struct re_state_table_entry *entry = dfa->state_table + i;
 
 632         for (j = 0; j < entry->num; ++j)
 
 634             re_dfastate_t *state = entry->array[j];
 
 637         re_free (entry->array);
 
 639   re_free (dfa->state_table);
 
 640 #ifdef RE_ENABLE_I18N
 
 641   if (dfa->sb_char != utf8_sb_map)
 
 642     re_free (dfa->sb_char);
 
 644   re_free (dfa->subexp_map);
 
 646   re_free (dfa->re_str);
 
 653 /* Free dynamically allocated space used by PREG.  */
 
 656 regfree (regex_t *preg)
 
 658   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
 
 659   if (BE (dfa != NULL, 1))
 
 660     free_dfa_content (dfa);
 
 664   re_free (preg->fastmap);
 
 665   preg->fastmap = NULL;
 
 667   re_free (preg->translate);
 
 668   preg->translate = NULL;
 
 671 weak_alias (__regfree, regfree)
 
 674 /* Entry points compatible with 4.2 BSD regex library.  We don't define
 
 675    them unless specifically requested.  */
 
 677 #if defined _REGEX_RE_COMP || defined _LIBC
 
 679 /* BSD has one and only one pattern buffer.  */
 
 680 static struct re_pattern_buffer re_comp_buf;
 
 684 /* Make these definitions weak in libc, so POSIX programs can redefine
 
 685    these names if they don't use our functions, and still use
 
 686    regcomp/regexec above without link errors.  */
 
 697       if (!re_comp_buf.buffer)
 
 698         return gettext ("No previous regular expression");
 
 702   if (re_comp_buf.buffer)
 
 704       fastmap = re_comp_buf.fastmap;
 
 705       re_comp_buf.fastmap = NULL;
 
 706       __regfree (&re_comp_buf);
 
 707       memset (&re_comp_buf, '\0', sizeof (re_comp_buf));
 
 708       re_comp_buf.fastmap = fastmap;
 
 711   if (re_comp_buf.fastmap == NULL)
 
 713       re_comp_buf.fastmap = (char *) malloc (SBC_MAX);
 
 714       if (re_comp_buf.fastmap == NULL)
 
 715         return (char *) gettext (__re_error_msgid
 
 716                                  + __re_error_msgid_idx[(int) REG_ESPACE]);
 
 719   /* Since `re_exec' always passes NULL for the `regs' argument, we
 
 720      don't need to initialize the pattern buffer fields which affect it.  */
 
 722   /* Match anchors at newlines.  */
 
 723   re_comp_buf.newline_anchor = 1;
 
 725   ret = re_compile_internal (&re_comp_buf, s, strlen (s), re_syntax_options);
 
 730   /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
 
 731   return (char *) gettext (__re_error_msgid + __re_error_msgid_idx[(int) ret]);
 
 735 libc_freeres_fn (free_mem)
 
 737   __regfree (&re_comp_buf);
 
 741 #endif /* _REGEX_RE_COMP */
 
 743 /* Internal entry point.
 
 744    Compile the regular expression PATTERN, whose length is LENGTH.
 
 745    SYNTAX indicate regular expression's syntax.  */
 
 748 re_compile_internal (regex_t *preg, const char * pattern, size_t length,
 
 751   reg_errcode_t err = REG_NOERROR;
 
 755   /* Initialize the pattern buffer.  */
 
 756   preg->fastmap_accurate = 0;
 
 757   preg->syntax = syntax;
 
 758   preg->not_bol = preg->not_eol = 0;
 
 761   preg->can_be_null = 0;
 
 762   preg->regs_allocated = REGS_UNALLOCATED;
 
 764   /* Initialize the dfa.  */
 
 765   dfa = (re_dfa_t *) preg->buffer;
 
 766   if (BE (preg->allocated < sizeof (re_dfa_t), 0))
 
 768       /* If zero allocated, but buffer is non-null, try to realloc
 
 769          enough space.  This loses if buffer's address is bogus, but
 
 770          that is the user's responsibility.  If ->buffer is NULL this
 
 771          is a simple allocation.  */
 
 772       dfa = re_realloc (preg->buffer, re_dfa_t, 1);
 
 775       preg->allocated = sizeof (re_dfa_t);
 
 776       preg->buffer = (unsigned char *) dfa;
 
 778   preg->used = sizeof (re_dfa_t);
 
 780   err = init_dfa (dfa, length);
 
 781   if (BE (err != REG_NOERROR, 0))
 
 783       free_dfa_content (dfa);
 
 789   /* Note: length+1 will not overflow since it is checked in init_dfa.  */
 
 790   dfa->re_str = re_malloc (char, length + 1);
 
 791   strncpy (dfa->re_str, pattern, length + 1);
 
 794   __libc_lock_init (dfa->lock);
 
 796   err = re_string_construct (®exp, pattern, length, preg->translate,
 
 797                              syntax & RE_ICASE, dfa);
 
 798   if (BE (err != REG_NOERROR, 0))
 
 800     re_compile_internal_free_return:
 
 801       free_workarea_compile (preg);
 
 802       re_string_destruct (®exp);
 
 803       free_dfa_content (dfa);
 
 809   /* Parse the regular expression, and build a structure tree.  */
 
 811   dfa->str_tree = parse (®exp, preg, syntax, &err);
 
 812   if (BE (dfa->str_tree == NULL, 0))
 
 813     goto re_compile_internal_free_return;
 
 815   /* Analyze the tree and create the nfa.  */
 
 816   err = analyze (preg);
 
 817   if (BE (err != REG_NOERROR, 0))
 
 818     goto re_compile_internal_free_return;
 
 820 #ifdef RE_ENABLE_I18N
 
 821   /* If possible, do searching in single byte encoding to speed things up.  */
 
 822   if (dfa->is_utf8 && !(syntax & RE_ICASE) && preg->translate == NULL)
 
 826   /* Then create the initial state of the dfa.  */
 
 827   err = create_initial_state (dfa);
 
 829   /* Release work areas.  */
 
 830   free_workarea_compile (preg);
 
 831   re_string_destruct (®exp);
 
 833   if (BE (err != REG_NOERROR, 0))
 
 835       free_dfa_content (dfa);
 
 843 /* Initialize DFA.  We use the length of the regular expression PAT_LEN
 
 844    as the initial length of some arrays.  */
 
 847 init_dfa (re_dfa_t *dfa, size_t pat_len)
 
 849   unsigned int table_size;
 
 854   memset (dfa, '\0', sizeof (re_dfa_t));
 
 856   /* Force allocation of str_tree_storage the first time.  */
 
 857   dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
 
 859   /* Avoid overflows.  */
 
 860   if (pat_len == SIZE_MAX)
 
 863   dfa->nodes_alloc = pat_len + 1;
 
 864   dfa->nodes = re_malloc (re_token_t, dfa->nodes_alloc);
 
 866   /*  table_size = 2 ^ ceil(log pat_len) */
 
 867   for (table_size = 1; ; table_size <<= 1)
 
 868     if (table_size > pat_len)
 
 871   dfa->state_table = calloc (sizeof (struct re_state_table_entry), table_size);
 
 872   dfa->state_hash_mask = table_size - 1;
 
 874   dfa->mb_cur_max = MB_CUR_MAX;
 
 876   if (dfa->mb_cur_max == 6
 
 877       && strcmp (_NL_CURRENT (LC_CTYPE, _NL_CTYPE_CODESET_NAME), "UTF-8") == 0)
 
 879   dfa->map_notascii = (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_TO_NONASCII)
 
 882 # ifdef HAVE_LANGINFO_CODESET
 
 883   codeset_name = nl_langinfo (CODESET);
 
 885   codeset_name = getenv ("LC_ALL");
 
 886   if (codeset_name == NULL || codeset_name[0] == '\0')
 
 887     codeset_name = getenv ("LC_CTYPE");
 
 888   if (codeset_name == NULL || codeset_name[0] == '\0')
 
 889     codeset_name = getenv ("LANG");
 
 890   if (codeset_name == NULL)
 
 892   else if (strchr (codeset_name, '.') !=  NULL)
 
 893     codeset_name = strchr (codeset_name, '.') + 1;
 
 896   /* strcasecmp isn't a standard interface. brute force check */
 
 898   if (strcasecmp (codeset_name, "UTF-8") == 0
 
 899       || strcasecmp (codeset_name, "UTF8") == 0)
 
 902   if (   (codeset_name[0] == 'U' || codeset_name[0] == 'u')
 
 903       && (codeset_name[1] == 'T' || codeset_name[1] == 't')
 
 904       && (codeset_name[2] == 'F' || codeset_name[2] == 'f')
 
 905       && (codeset_name[3] == '-'
 
 906           ? codeset_name[4] == '8' && codeset_name[5] == '\0'
 
 907           : codeset_name[3] == '8' && codeset_name[4] == '\0'))
 
 911   /* We check exhaustively in the loop below if this charset is a
 
 912      superset of ASCII.  */
 
 913   dfa->map_notascii = 0;
 
 916 #ifdef RE_ENABLE_I18N
 
 917   if (dfa->mb_cur_max > 1)
 
 921 #if !defined(__GNUC__) || __GNUC__ < 3
 
 922           static short utf8_sb_map_inited = 0;
 
 924           if (! utf8_sb_map_inited)
 
 928                 utf8_sb_map_inited = 0;
 
 929                 for (i = 0; i <= 0x80 / BITSET_WORD_BITS - 1; i++)
 
 930                   utf8_sb_map[i] = BITSET_WORD_MAX;
 
 933           dfa->sb_char = (re_bitset_ptr_t) utf8_sb_map;
 
 939           dfa->sb_char = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
 
 940           if (BE (dfa->sb_char == NULL, 0))
 
 943           /* Set the bits corresponding to single byte chars.  */
 
 944           for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
 
 945             for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
 
 947                 wint_t wch = __btowc (ch);
 
 949                   dfa->sb_char[i] |= (bitset_word_t) 1 << j;
 
 951                 if (isascii (ch) && wch != ch)
 
 952                   dfa->map_notascii = 1;
 
 959   if (BE (dfa->nodes == NULL || dfa->state_table == NULL, 0))
 
 964 /* Initialize WORD_CHAR table, which indicate which character is
 
 965    "word".  In this case "word" means that it is the word construction
 
 966    character used by some operators like "\<", "\>", etc.  */
 
 970 init_word_char (re_dfa_t *dfa)
 
 973   dfa->word_ops_used = 1;
 
 974   for (i = 0, ch = 0; i < BITSET_WORDS; ++i)
 
 975     for (j = 0; j < BITSET_WORD_BITS; ++j, ++ch)
 
 976       if (isalnum (ch) || ch == '_')
 
 977         dfa->word_char[i] |= (bitset_word_t) 1 << j;
 
 980 /* Free the work area which are only used while compiling.  */
 
 983 free_workarea_compile (regex_t *preg)
 
 985   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
 
 986   bin_tree_storage_t *storage, *next;
 
 987   for (storage = dfa->str_tree_storage; storage; storage = next)
 
 989       next = storage->next;
 
 992   dfa->str_tree_storage = NULL;
 
 993   dfa->str_tree_storage_idx = BIN_TREE_STORAGE_SIZE;
 
 994   dfa->str_tree = NULL;
 
 995   re_free (dfa->org_indices);
 
 996   dfa->org_indices = NULL;
 
 999 /* Create initial states for all contexts.  */
 
1001 static reg_errcode_t
 
1002 create_initial_state (re_dfa_t *dfa)
 
1006   re_node_set init_nodes;
 
1008   /* Initial states have the epsilon closure of the node which is
 
1009      the first node of the regular expression.  */
 
1010   first = dfa->str_tree->first->node_idx;
 
1011   dfa->init_node = first;
 
1012   err = re_node_set_init_copy (&init_nodes, dfa->eclosures + first);
 
1013   if (BE (err != REG_NOERROR, 0))
 
1016   /* The back-references which are in initial states can epsilon transit,
 
1017      since in this case all of the subexpressions can be null.
 
1018      Then we add epsilon closures of the nodes which are the next nodes of
 
1019      the back-references.  */
 
1020   if (dfa->nbackref > 0)
 
1021     for (i = 0; i < init_nodes.nelem; ++i)
 
1023         int node_idx = init_nodes.elems[i];
 
1024         re_token_type_t type = dfa->nodes[node_idx].type;
 
1027         if (type != OP_BACK_REF)
 
1029         for (clexp_idx = 0; clexp_idx < init_nodes.nelem; ++clexp_idx)
 
1031             re_token_t *clexp_node;
 
1032             clexp_node = dfa->nodes + init_nodes.elems[clexp_idx];
 
1033             if (clexp_node->type == OP_CLOSE_SUBEXP
 
1034                 && clexp_node->opr.idx == dfa->nodes[node_idx].opr.idx)
 
1037         if (clexp_idx == init_nodes.nelem)
 
1040         if (type == OP_BACK_REF)
 
1042             int dest_idx = dfa->edests[node_idx].elems[0];
 
1043             if (!re_node_set_contains (&init_nodes, dest_idx))
 
1045                 reg_errcode_t err = re_node_set_merge (&init_nodes,
 
1048                 if (err != REG_NOERROR)
 
1055   /* It must be the first time to invoke acquire_state.  */
 
1056   dfa->init_state = re_acquire_state_context (&err, dfa, &init_nodes, 0);
 
1057   /* We don't check ERR here, since the initial state must not be NULL.  */
 
1058   if (BE (dfa->init_state == NULL, 0))
 
1060   if (dfa->init_state->has_constraint)
 
1062       dfa->init_state_word = re_acquire_state_context (&err, dfa, &init_nodes,
 
1064       dfa->init_state_nl = re_acquire_state_context (&err, dfa, &init_nodes,
 
1066       dfa->init_state_begbuf = re_acquire_state_context (&err, dfa,
 
1070       if (BE (dfa->init_state_word == NULL || dfa->init_state_nl == NULL
 
1071               || dfa->init_state_begbuf == NULL, 0))
 
1075     dfa->init_state_word = dfa->init_state_nl
 
1076       = dfa->init_state_begbuf = dfa->init_state;
 
1078   re_node_set_free (&init_nodes);
 
1082 #ifdef RE_ENABLE_I18N
 
1083 /* If it is possible to do searching in single byte encoding instead of UTF-8
 
1084    to speed things up, set dfa->mb_cur_max to 1, clear is_utf8 and change
 
1085    DFA nodes where needed.  */
 
1088 optimize_utf8 (re_dfa_t *dfa)
 
1090   int node, i, mb_chars = 0, has_period = 0;
 
1092   for (node = 0; node < dfa->nodes_len; ++node)
 
1093     switch (dfa->nodes[node].type)
 
1096         if (dfa->nodes[node].opr.c >= 0x80)
 
1100         switch (dfa->nodes[node].opr.ctx_type)
 
1108             /* Word anchors etc. cannot be handled.  It's okay to test
 
1109                opr.ctx_type since constraints (for all DFA nodes) are
 
1110                created by ORing one or more opr.ctx_type values.  */
 
1120       case OP_DUP_ASTERISK:
 
1121       case OP_OPEN_SUBEXP:
 
1122       case OP_CLOSE_SUBEXP:
 
1124       case COMPLEX_BRACKET:
 
1126       case SIMPLE_BRACKET:
 
1127         /* Just double check.  The non-ASCII range starts at 0x80.  */
 
1128         assert (0x80 % BITSET_WORD_BITS == 0);
 
1129         for (i = 0x80 / BITSET_WORD_BITS; i < BITSET_WORDS; ++i)
 
1130           if (dfa->nodes[node].opr.sbcset[i])
 
1137   if (mb_chars || has_period)
 
1138     for (node = 0; node < dfa->nodes_len; ++node)
 
1140         if (dfa->nodes[node].type == CHARACTER
 
1141             && dfa->nodes[node].opr.c >= 0x80)
 
1142           dfa->nodes[node].mb_partial = 0;
 
1143         else if (dfa->nodes[node].type == OP_PERIOD)
 
1144           dfa->nodes[node].type = OP_UTF8_PERIOD;
 
1147   /* The search can be in single byte locale.  */
 
1148   dfa->mb_cur_max = 1;
 
1150   dfa->has_mb_node = dfa->nbackref > 0 || has_period;
 
1154 /* Analyze the structure tree, and calculate "first", "next", "edest",
 
1155    "eclosure", and "inveclosure".  */
 
1157 static reg_errcode_t
 
1158 analyze (regex_t *preg)
 
1160   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
 
1163   /* Allocate arrays.  */
 
1164   dfa->nexts = re_malloc (int, dfa->nodes_alloc);
 
1165   dfa->org_indices = re_malloc (int, dfa->nodes_alloc);
 
1166   dfa->edests = re_malloc (re_node_set, dfa->nodes_alloc);
 
1167   dfa->eclosures = re_malloc (re_node_set, dfa->nodes_alloc);
 
1168   if (BE (dfa->nexts == NULL || dfa->org_indices == NULL || dfa->edests == NULL
 
1169           || dfa->eclosures == NULL, 0))
 
1172   dfa->subexp_map = re_malloc (int, preg->re_nsub);
 
1173   if (dfa->subexp_map != NULL)
 
1176       for (i = 0; i < preg->re_nsub; i++)
 
1177         dfa->subexp_map[i] = i;
 
1178       preorder (dfa->str_tree, optimize_subexps, dfa);
 
1179       for (i = 0; i < preg->re_nsub; i++)
 
1180         if (dfa->subexp_map[i] != i)
 
1182       if (i == preg->re_nsub)
 
1184           free (dfa->subexp_map);
 
1185           dfa->subexp_map = NULL;
 
1189   ret = postorder (dfa->str_tree, lower_subexps, preg);
 
1190   if (BE (ret != REG_NOERROR, 0))
 
1192   ret = postorder (dfa->str_tree, calc_first, dfa);
 
1193   if (BE (ret != REG_NOERROR, 0))
 
1195   preorder (dfa->str_tree, calc_next, dfa);
 
1196   ret = preorder (dfa->str_tree, link_nfa_nodes, dfa);
 
1197   if (BE (ret != REG_NOERROR, 0))
 
1199   ret = calc_eclosure (dfa);
 
1200   if (BE (ret != REG_NOERROR, 0))
 
1203   /* We only need this during the prune_impossible_nodes pass in regexec.c;
 
1204      skip it if p_i_n will not run, as calc_inveclosure can be quadratic.  */
 
1205   if ((!preg->no_sub && preg->re_nsub > 0 && dfa->has_plural_match)
 
1208       dfa->inveclosures = re_malloc (re_node_set, dfa->nodes_len);
 
1209       if (BE (dfa->inveclosures == NULL, 0))
 
1211       ret = calc_inveclosure (dfa);
 
1217 /* Our parse trees are very unbalanced, so we cannot use a stack to
 
1218    implement parse tree visits.  Instead, we use parent pointers and
 
1219    some hairy code in these two functions.  */
 
1220 static reg_errcode_t
 
1221 postorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
 
1224   bin_tree_t *node, *prev;
 
1226   for (node = root; ; )
 
1228       /* Descend down the tree, preferably to the left (or to the right
 
1229          if that's the only child).  */
 
1230       while (node->left || node->right)
 
1238           reg_errcode_t err = fn (extra, node);
 
1239           if (BE (err != REG_NOERROR, 0))
 
1241           if (node->parent == NULL)
 
1244           node = node->parent;
 
1246       /* Go up while we have a node that is reached from the right.  */
 
1247       while (node->right == prev || node->right == NULL);
 
1252 static reg_errcode_t
 
1253 preorder (bin_tree_t *root, reg_errcode_t (fn (void *, bin_tree_t *)),
 
1258   for (node = root; ; )
 
1260       reg_errcode_t err = fn (extra, node);
 
1261       if (BE (err != REG_NOERROR, 0))
 
1264       /* Go to the left node, or up and to the right.  */
 
1269           bin_tree_t *prev = NULL;
 
1270           while (node->right == prev || node->right == NULL)
 
1273               node = node->parent;
 
1282 /* Optimization pass: if a SUBEXP is entirely contained, strip it and tell
 
1283    re_search_internal to map the inner one's opr.idx to this one's.  Adjust
 
1284    backreferences as well.  Requires a preorder visit.  */
 
1285 static reg_errcode_t
 
1286 optimize_subexps (void *extra, bin_tree_t *node)
 
1288   re_dfa_t *dfa = (re_dfa_t *) extra;
 
1290   if (node->token.type == OP_BACK_REF && dfa->subexp_map)
 
1292       int idx = node->token.opr.idx;
 
1293       node->token.opr.idx = dfa->subexp_map[idx];
 
1294       dfa->used_bkref_map |= 1 << node->token.opr.idx;
 
1297   else if (node->token.type == SUBEXP
 
1298            && node->left && node->left->token.type == SUBEXP)
 
1300       int other_idx = node->left->token.opr.idx;
 
1302       node->left = node->left->left;
 
1304         node->left->parent = node;
 
1306       dfa->subexp_map[other_idx] = dfa->subexp_map[node->token.opr.idx];
 
1307       if (other_idx < BITSET_WORD_BITS)
 
1308           dfa->used_bkref_map &= ~((bitset_word_t) 1 << other_idx);
 
1314 /* Lowering pass: Turn each SUBEXP node into the appropriate concatenation
 
1315    of OP_OPEN_SUBEXP, the body of the SUBEXP (if any) and OP_CLOSE_SUBEXP.  */
 
1316 static reg_errcode_t
 
1317 lower_subexps (void *extra, bin_tree_t *node)
 
1319   regex_t *preg = (regex_t *) extra;
 
1320   reg_errcode_t err = REG_NOERROR;
 
1322   if (node->left && node->left->token.type == SUBEXP)
 
1324       node->left = lower_subexp (&err, preg, node->left);
 
1326         node->left->parent = node;
 
1328   if (node->right && node->right->token.type == SUBEXP)
 
1330       node->right = lower_subexp (&err, preg, node->right);
 
1332         node->right->parent = node;
 
1339 lower_subexp (reg_errcode_t *err, regex_t *preg, bin_tree_t *node)
 
1341   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
 
1342   bin_tree_t *body = node->left;
 
1343   bin_tree_t *op, *cls, *tree1, *tree;
 
1346       /* We do not optimize empty subexpressions, because otherwise we may
 
1347          have bad CONCAT nodes with NULL children.  This is obviously not
 
1348          very common, so we do not lose much.  An example that triggers
 
1349          this case is the sed "script" /\(\)/x.  */
 
1350       && node->left != NULL
 
1351       && (node->token.opr.idx >= BITSET_WORD_BITS
 
1352           || !(dfa->used_bkref_map
 
1353                & ((bitset_word_t) 1 << node->token.opr.idx))))
 
1356   /* Convert the SUBEXP node to the concatenation of an
 
1357      OP_OPEN_SUBEXP, the contents, and an OP_CLOSE_SUBEXP.  */
 
1358   op = create_tree (dfa, NULL, NULL, OP_OPEN_SUBEXP);
 
1359   cls = create_tree (dfa, NULL, NULL, OP_CLOSE_SUBEXP);
 
1360   tree1 = body ? create_tree (dfa, body, cls, CONCAT) : cls;
 
1361   tree = create_tree (dfa, op, tree1, CONCAT);
 
1362   if (BE (tree == NULL || tree1 == NULL || op == NULL || cls == NULL, 0))
 
1368   op->token.opr.idx = cls->token.opr.idx = node->token.opr.idx;
 
1369   op->token.opt_subexp = cls->token.opt_subexp = node->token.opt_subexp;
 
1373 /* Pass 1 in building the NFA: compute FIRST and create unlinked automaton
 
1374    nodes.  Requires a postorder visit.  */
 
1375 static reg_errcode_t
 
1376 calc_first (void *extra, bin_tree_t *node)
 
1378   re_dfa_t *dfa = (re_dfa_t *) extra;
 
1379   if (node->token.type == CONCAT)
 
1381       node->first = node->left->first;
 
1382       node->node_idx = node->left->node_idx;
 
1387       node->node_idx = re_dfa_add_node (dfa, node->token);
 
1388       if (BE (node->node_idx == -1, 0))
 
1390       if (node->token.type == ANCHOR)
 
1391         dfa->nodes[node->node_idx].constraint = node->token.opr.ctx_type;
 
1396 /* Pass 2: compute NEXT on the tree.  Preorder visit.  */
 
1397 static reg_errcode_t
 
1398 calc_next (void *extra, bin_tree_t *node)
 
1400   switch (node->token.type)
 
1402     case OP_DUP_ASTERISK:
 
1403       node->left->next = node;
 
1406       node->left->next = node->right->first;
 
1407       node->right->next = node->next;
 
1411         node->left->next = node->next;
 
1413         node->right->next = node->next;
 
1419 /* Pass 3: link all DFA nodes to their NEXT node (any order will do).  */
 
1420 static reg_errcode_t
 
1421 link_nfa_nodes (void *extra, bin_tree_t *node)
 
1423   re_dfa_t *dfa = (re_dfa_t *) extra;
 
1424   int idx = node->node_idx;
 
1425   reg_errcode_t err = REG_NOERROR;
 
1427   switch (node->token.type)
 
1433       assert (node->next == NULL);
 
1436     case OP_DUP_ASTERISK:
 
1440         dfa->has_plural_match = 1;
 
1441         if (node->left != NULL)
 
1442           left = node->left->first->node_idx;
 
1444           left = node->next->node_idx;
 
1445         if (node->right != NULL)
 
1446           right = node->right->first->node_idx;
 
1448           right = node->next->node_idx;
 
1450         assert (right > -1);
 
1451         err = re_node_set_init_2 (dfa->edests + idx, left, right);
 
1456     case OP_OPEN_SUBEXP:
 
1457     case OP_CLOSE_SUBEXP:
 
1458       err = re_node_set_init_1 (dfa->edests + idx, node->next->node_idx);
 
1462       dfa->nexts[idx] = node->next->node_idx;
 
1463       if (node->token.type == OP_BACK_REF)
 
1464         err = re_node_set_init_1 (dfa->edests + idx, dfa->nexts[idx]);
 
1468       assert (!IS_EPSILON_NODE (node->token.type));
 
1469       dfa->nexts[idx] = node->next->node_idx;
 
1476 /* Duplicate the epsilon closure of the node ROOT_NODE.
 
1477    Note that duplicated nodes have constraint INIT_CONSTRAINT in addition
 
1478    to their own constraint.  */
 
1480 static reg_errcode_t
 
1482 duplicate_node_closure (re_dfa_t *dfa, int top_org_node, int top_clone_node,
 
1483                         int root_node, unsigned int init_constraint)
 
1485   int org_node, clone_node, ret;
 
1486   unsigned int constraint = init_constraint;
 
1487   for (org_node = top_org_node, clone_node = top_clone_node;;)
 
1489       int org_dest, clone_dest;
 
1490       if (dfa->nodes[org_node].type == OP_BACK_REF)
 
1492           /* If the back reference epsilon-transit, its destination must
 
1493              also have the constraint.  Then duplicate the epsilon closure
 
1494              of the destination of the back reference, and store it in
 
1495              edests of the back reference.  */
 
1496           org_dest = dfa->nexts[org_node];
 
1497           re_node_set_empty (dfa->edests + clone_node);
 
1498           clone_dest = duplicate_node (dfa, org_dest, constraint);
 
1499           if (BE (clone_dest == -1, 0))
 
1501           dfa->nexts[clone_node] = dfa->nexts[org_node];
 
1502           ret = re_node_set_insert (dfa->edests + clone_node, clone_dest);
 
1503           if (BE (ret < 0, 0))
 
1506       else if (dfa->edests[org_node].nelem == 0)
 
1508           /* In case of the node can't epsilon-transit, don't duplicate the
 
1509              destination and store the original destination as the
 
1510              destination of the node.  */
 
1511           dfa->nexts[clone_node] = dfa->nexts[org_node];
 
1514       else if (dfa->edests[org_node].nelem == 1)
 
1516           /* In case of the node can epsilon-transit, and it has only one
 
1518           org_dest = dfa->edests[org_node].elems[0];
 
1519           re_node_set_empty (dfa->edests + clone_node);
 
1520           /* If the node is root_node itself, it means the epsilon clsoure
 
1521              has a loop.   Then tie it to the destination of the root_node.  */
 
1522           if (org_node == root_node && clone_node != org_node)
 
1524               ret = re_node_set_insert (dfa->edests + clone_node, org_dest);
 
1525               if (BE (ret < 0, 0))
 
1529           /* In case of the node has another constraint, add it.  */
 
1530           constraint |= dfa->nodes[org_node].constraint;
 
1531           clone_dest = duplicate_node (dfa, org_dest, constraint);
 
1532           if (BE (clone_dest == -1, 0))
 
1534           ret = re_node_set_insert (dfa->edests + clone_node, clone_dest);
 
1535           if (BE (ret < 0, 0))
 
1538       else /* dfa->edests[org_node].nelem == 2 */
 
1540           /* In case of the node can epsilon-transit, and it has two
 
1541              destinations. In the bin_tree_t and DFA, that's '|' and '*'.   */
 
1542           org_dest = dfa->edests[org_node].elems[0];
 
1543           re_node_set_empty (dfa->edests + clone_node);
 
1544           /* Search for a duplicated node which satisfies the constraint.  */
 
1545           clone_dest = search_duplicated_node (dfa, org_dest, constraint);
 
1546           if (clone_dest == -1)
 
1548               /* There is no such duplicated node, create a new one.  */
 
1550               clone_dest = duplicate_node (dfa, org_dest, constraint);
 
1551               if (BE (clone_dest == -1, 0))
 
1553               ret = re_node_set_insert (dfa->edests + clone_node, clone_dest);
 
1554               if (BE (ret < 0, 0))
 
1556               err = duplicate_node_closure (dfa, org_dest, clone_dest,
 
1557                                             root_node, constraint);
 
1558               if (BE (err != REG_NOERROR, 0))
 
1563               /* There is a duplicated node which satisfies the constraint,
 
1564                  use it to avoid infinite loop.  */
 
1565               ret = re_node_set_insert (dfa->edests + clone_node, clone_dest);
 
1566               if (BE (ret < 0, 0))
 
1570           org_dest = dfa->edests[org_node].elems[1];
 
1571           clone_dest = duplicate_node (dfa, org_dest, constraint);
 
1572           if (BE (clone_dest == -1, 0))
 
1574           ret = re_node_set_insert (dfa->edests + clone_node, clone_dest);
 
1575           if (BE (ret < 0, 0))
 
1578       org_node = org_dest;
 
1579       clone_node = clone_dest;
 
1584 /* Search for a node which is duplicated from the node ORG_NODE, and
 
1585    satisfies the constraint CONSTRAINT.  */
 
1588 search_duplicated_node (const re_dfa_t *dfa, int org_node,
 
1589                         unsigned int constraint)
 
1592   for (idx = dfa->nodes_len - 1; dfa->nodes[idx].duplicated && idx > 0; --idx)
 
1594       if (org_node == dfa->org_indices[idx]
 
1595           && constraint == dfa->nodes[idx].constraint)
 
1596         return idx; /* Found.  */
 
1598   return -1; /* Not found.  */
 
1601 /* Duplicate the node whose index is ORG_IDX and set the constraint CONSTRAINT.
 
1602    Return the index of the new node, or -1 if insufficient storage is
 
1606 duplicate_node (re_dfa_t *dfa, int org_idx, unsigned int constraint)
 
1608   int dup_idx = re_dfa_add_node (dfa, dfa->nodes[org_idx]);
 
1609   if (BE (dup_idx != -1, 1))
 
1611       dfa->nodes[dup_idx].constraint = constraint;
 
1612       dfa->nodes[dup_idx].constraint |= dfa->nodes[org_idx].constraint;
 
1613       dfa->nodes[dup_idx].duplicated = 1;
 
1615       /* Store the index of the original node.  */
 
1616       dfa->org_indices[dup_idx] = org_idx;
 
1621 static reg_errcode_t
 
1622 calc_inveclosure (re_dfa_t *dfa)
 
1625   for (idx = 0; idx < dfa->nodes_len; ++idx)
 
1626     re_node_set_init_empty (dfa->inveclosures + idx);
 
1628   for (src = 0; src < dfa->nodes_len; ++src)
 
1630       int *elems = dfa->eclosures[src].elems;
 
1631       for (idx = 0; idx < dfa->eclosures[src].nelem; ++idx)
 
1633           ret = re_node_set_insert_last (dfa->inveclosures + elems[idx], src);
 
1634           if (BE (ret == -1, 0))
 
1642 /* Calculate "eclosure" for all the node in DFA.  */
 
1644 static reg_errcode_t
 
1645 calc_eclosure (re_dfa_t *dfa)
 
1647   int node_idx, incomplete;
 
1649   assert (dfa->nodes_len > 0);
 
1652   /* For each nodes, calculate epsilon closure.  */
 
1653   for (node_idx = 0; ; ++node_idx)
 
1656       re_node_set eclosure_elem;
 
1657       if (node_idx == dfa->nodes_len)
 
1666       assert (dfa->eclosures[node_idx].nelem != -1);
 
1669       /* If we have already calculated, skip it.  */
 
1670       if (dfa->eclosures[node_idx].nelem != 0)
 
1672       /* Calculate epsilon closure of `node_idx'.  */
 
1673       err = calc_eclosure_iter (&eclosure_elem, dfa, node_idx, 1);
 
1674       if (BE (err != REG_NOERROR, 0))
 
1677       if (dfa->eclosures[node_idx].nelem == 0)
 
1680           re_node_set_free (&eclosure_elem);
 
1686 /* Calculate epsilon closure of NODE.  */
 
1688 static reg_errcode_t
 
1689 calc_eclosure_iter (re_node_set *new_set, re_dfa_t *dfa, int node, int root)
 
1693   re_node_set eclosure;
 
1696   err = re_node_set_alloc (&eclosure, dfa->edests[node].nelem + 1);
 
1697   if (BE (err != REG_NOERROR, 0))
 
1700   /* This indicates that we are calculating this node now.
 
1701      We reference this value to avoid infinite loop.  */
 
1702   dfa->eclosures[node].nelem = -1;
 
1704   /* If the current node has constraints, duplicate all nodes
 
1705      since they must inherit the constraints.  */
 
1706   if (dfa->nodes[node].constraint
 
1707       && dfa->edests[node].nelem
 
1708       && !dfa->nodes[dfa->edests[node].elems[0]].duplicated)
 
1710       err = duplicate_node_closure (dfa, node, node, node,
 
1711                                     dfa->nodes[node].constraint);
 
1712       if (BE (err != REG_NOERROR, 0))
 
1716   /* Expand each epsilon destination nodes.  */
 
1717   if (IS_EPSILON_NODE(dfa->nodes[node].type))
 
1718     for (i = 0; i < dfa->edests[node].nelem; ++i)
 
1720         re_node_set eclosure_elem;
 
1721         int edest = dfa->edests[node].elems[i];
 
1722         /* If calculating the epsilon closure of `edest' is in progress,
 
1723            return intermediate result.  */
 
1724         if (dfa->eclosures[edest].nelem == -1)
 
1729         /* If we haven't calculated the epsilon closure of `edest' yet,
 
1730            calculate now. Otherwise use calculated epsilon closure.  */
 
1731         if (dfa->eclosures[edest].nelem == 0)
 
1733             err = calc_eclosure_iter (&eclosure_elem, dfa, edest, 0);
 
1734             if (BE (err != REG_NOERROR, 0))
 
1738           eclosure_elem = dfa->eclosures[edest];
 
1739         /* Merge the epsilon closure of `edest'.  */
 
1740         err = re_node_set_merge (&eclosure, &eclosure_elem);
 
1741         if (BE (err != REG_NOERROR, 0))
 
1743         /* If the epsilon closure of `edest' is incomplete,
 
1744            the epsilon closure of this node is also incomplete.  */
 
1745         if (dfa->eclosures[edest].nelem == 0)
 
1748             re_node_set_free (&eclosure_elem);
 
1752   /* An epsilon closure includes itself.  */
 
1753   ret = re_node_set_insert (&eclosure, node);
 
1754   if (BE (ret < 0, 0))
 
1756   if (incomplete && !root)
 
1757     dfa->eclosures[node].nelem = 0;
 
1759     dfa->eclosures[node] = eclosure;
 
1760   *new_set = eclosure;
 
1764 /* Functions for token which are used in the parser.  */
 
1766 /* Fetch a token from INPUT.
 
1767    We must not use this function inside bracket expressions.  */
 
1771 fetch_token (re_token_t *result, re_string_t *input, reg_syntax_t syntax)
 
1773   re_string_skip_bytes (input, peek_token (result, input, syntax));
 
1776 /* Peek a token from INPUT, and return the length of the token.
 
1777    We must not use this function inside bracket expressions.  */
 
1781 peek_token (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
 
1785   if (re_string_eoi (input))
 
1787       token->type = END_OF_RE;
 
1791   c = re_string_peek_byte (input, 0);
 
1794   token->word_char = 0;
 
1795 #ifdef RE_ENABLE_I18N
 
1796   token->mb_partial = 0;
 
1797   if (input->mb_cur_max > 1 &&
 
1798       !re_string_first_byte (input, re_string_cur_idx (input)))
 
1800       token->type = CHARACTER;
 
1801       token->mb_partial = 1;
 
1808       if (re_string_cur_idx (input) + 1 >= re_string_length (input))
 
1810           token->type = BACK_SLASH;
 
1814       c2 = re_string_peek_byte_case (input, 1);
 
1816       token->type = CHARACTER;
 
1817 #ifdef RE_ENABLE_I18N
 
1818       if (input->mb_cur_max > 1)
 
1820           wint_t wc = re_string_wchar_at (input,
 
1821                                           re_string_cur_idx (input) + 1);
 
1822           token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
 
1826         token->word_char = IS_WORD_CHAR (c2) != 0;
 
1831           if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_NO_BK_VBAR))
 
1832             token->type = OP_ALT;
 
1834         case '1': case '2': case '3': case '4': case '5':
 
1835         case '6': case '7': case '8': case '9':
 
1836           if (!(syntax & RE_NO_BK_REFS))
 
1838               token->type = OP_BACK_REF;
 
1839               token->opr.idx = c2 - '1';
 
1843           if (!(syntax & RE_NO_GNU_OPS))
 
1845               token->type = ANCHOR;
 
1846               token->opr.ctx_type = WORD_FIRST;
 
1850           if (!(syntax & RE_NO_GNU_OPS))
 
1852               token->type = ANCHOR;
 
1853               token->opr.ctx_type = WORD_LAST;
 
1857           if (!(syntax & RE_NO_GNU_OPS))
 
1859               token->type = ANCHOR;
 
1860               token->opr.ctx_type = WORD_DELIM;
 
1864           if (!(syntax & RE_NO_GNU_OPS))
 
1866               token->type = ANCHOR;
 
1867               token->opr.ctx_type = NOT_WORD_DELIM;
 
1871           if (!(syntax & RE_NO_GNU_OPS))
 
1872             token->type = OP_WORD;
 
1875           if (!(syntax & RE_NO_GNU_OPS))
 
1876             token->type = OP_NOTWORD;
 
1879           if (!(syntax & RE_NO_GNU_OPS))
 
1880             token->type = OP_SPACE;
 
1883           if (!(syntax & RE_NO_GNU_OPS))
 
1884             token->type = OP_NOTSPACE;
 
1887           if (!(syntax & RE_NO_GNU_OPS))
 
1889               token->type = ANCHOR;
 
1890               token->opr.ctx_type = BUF_FIRST;
 
1894           if (!(syntax & RE_NO_GNU_OPS))
 
1896               token->type = ANCHOR;
 
1897               token->opr.ctx_type = BUF_LAST;
 
1901           if (!(syntax & RE_NO_BK_PARENS))
 
1902             token->type = OP_OPEN_SUBEXP;
 
1905           if (!(syntax & RE_NO_BK_PARENS))
 
1906             token->type = OP_CLOSE_SUBEXP;
 
1909           if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
 
1910             token->type = OP_DUP_PLUS;
 
1913           if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_BK_PLUS_QM))
 
1914             token->type = OP_DUP_QUESTION;
 
1917           if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
 
1918             token->type = OP_OPEN_DUP_NUM;
 
1921           if ((syntax & RE_INTERVALS) && (!(syntax & RE_NO_BK_BRACES)))
 
1922             token->type = OP_CLOSE_DUP_NUM;
 
1930   token->type = CHARACTER;
 
1931 #ifdef RE_ENABLE_I18N
 
1932   if (input->mb_cur_max > 1)
 
1934       wint_t wc = re_string_wchar_at (input, re_string_cur_idx (input));
 
1935       token->word_char = IS_WIDE_WORD_CHAR (wc) != 0;
 
1939     token->word_char = IS_WORD_CHAR (token->opr.c);
 
1944       if (syntax & RE_NEWLINE_ALT)
 
1945         token->type = OP_ALT;
 
1948       if (!(syntax & RE_LIMITED_OPS) && (syntax & RE_NO_BK_VBAR))
 
1949         token->type = OP_ALT;
 
1952       token->type = OP_DUP_ASTERISK;
 
1955       if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
 
1956         token->type = OP_DUP_PLUS;
 
1959       if (!(syntax & RE_LIMITED_OPS) && !(syntax & RE_BK_PLUS_QM))
 
1960         token->type = OP_DUP_QUESTION;
 
1963       if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
 
1964         token->type = OP_OPEN_DUP_NUM;
 
1967       if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
 
1968         token->type = OP_CLOSE_DUP_NUM;
 
1971       if (syntax & RE_NO_BK_PARENS)
 
1972         token->type = OP_OPEN_SUBEXP;
 
1975       if (syntax & RE_NO_BK_PARENS)
 
1976         token->type = OP_CLOSE_SUBEXP;
 
1979       token->type = OP_OPEN_BRACKET;
 
1982       token->type = OP_PERIOD;
 
1985       if (!(syntax & (RE_CONTEXT_INDEP_ANCHORS | RE_CARET_ANCHORS_HERE)) &&
 
1986           re_string_cur_idx (input) != 0)
 
1988           char prev = re_string_peek_byte (input, -1);
 
1989           if (!(syntax & RE_NEWLINE_ALT) || prev != '\n')
 
1992       token->type = ANCHOR;
 
1993       token->opr.ctx_type = LINE_FIRST;
 
1996       if (!(syntax & RE_CONTEXT_INDEP_ANCHORS) &&
 
1997           re_string_cur_idx (input) + 1 != re_string_length (input))
 
2000           re_string_skip_bytes (input, 1);
 
2001           peek_token (&next, input, syntax);
 
2002           re_string_skip_bytes (input, -1);
 
2003           if (next.type != OP_ALT && next.type != OP_CLOSE_SUBEXP)
 
2006       token->type = ANCHOR;
 
2007       token->opr.ctx_type = LINE_LAST;
 
2015 /* Peek a token from INPUT, and return the length of the token.
 
2016    We must not use this function out of bracket expressions.  */
 
2020 peek_token_bracket (re_token_t *token, re_string_t *input, reg_syntax_t syntax)
 
2023   if (re_string_eoi (input))
 
2025       token->type = END_OF_RE;
 
2028   c = re_string_peek_byte (input, 0);
 
2031 #ifdef RE_ENABLE_I18N
 
2032   if (input->mb_cur_max > 1 &&
 
2033       !re_string_first_byte (input, re_string_cur_idx (input)))
 
2035       token->type = CHARACTER;
 
2038 #endif /* RE_ENABLE_I18N */
 
2040   if (c == '\\' && (syntax & RE_BACKSLASH_ESCAPE_IN_LISTS)
 
2041       && re_string_cur_idx (input) + 1 < re_string_length (input))
 
2043       /* In this case, '\' escape a character.  */
 
2045       re_string_skip_bytes (input, 1);
 
2046       c2 = re_string_peek_byte (input, 0);
 
2048       token->type = CHARACTER;
 
2051   if (c == '[') /* '[' is a special char in a bracket exps.  */
 
2055       if (re_string_cur_idx (input) + 1 < re_string_length (input))
 
2056         c2 = re_string_peek_byte (input, 1);
 
2064           token->type = OP_OPEN_COLL_ELEM;
 
2067           token->type = OP_OPEN_EQUIV_CLASS;
 
2070           if (syntax & RE_CHAR_CLASSES)
 
2072               token->type = OP_OPEN_CHAR_CLASS;
 
2075           /* else fall through.  */
 
2077           token->type = CHARACTER;
 
2087       token->type = OP_CHARSET_RANGE;
 
2090       token->type = OP_CLOSE_BRACKET;
 
2093       token->type = OP_NON_MATCH_LIST;
 
2096       token->type = CHARACTER;
 
2101 /* Functions for parser.  */
 
2103 /* Entry point of the parser.
 
2104    Parse the regular expression REGEXP and return the structure tree.
 
2105    If an error has occurred, ERR is set by error code, and return NULL.
 
2106    This function build the following tree, from regular expression <reg_exp>:
 
2112    CAT means concatenation.
 
2113    EOR means end of regular expression.  */
 
2116 parse (re_string_t *regexp, regex_t *preg, reg_syntax_t syntax,
 
2119   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
 
2120   bin_tree_t *tree, *eor, *root;
 
2121   re_token_t current_token;
 
2122   dfa->syntax = syntax;
 
2123   fetch_token (¤t_token, regexp, syntax | RE_CARET_ANCHORS_HERE);
 
2124   tree = parse_reg_exp (regexp, preg, ¤t_token, syntax, 0, err);
 
2125   if (BE (*err != REG_NOERROR && tree == NULL, 0))
 
2127   eor = create_tree (dfa, NULL, NULL, END_OF_RE);
 
2129     root = create_tree (dfa, tree, eor, CONCAT);
 
2132   if (BE (eor == NULL || root == NULL, 0))
 
2140 /* This function build the following tree, from regular expression
 
2141    <branch1>|<branch2>:
 
2147    ALT means alternative, which represents the operator `|'.  */
 
2150 parse_reg_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
 
2151                reg_syntax_t syntax, int nest, reg_errcode_t *err)
 
2153   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
 
2154   bin_tree_t *tree, *branch = NULL;
 
2155   tree = parse_branch (regexp, preg, token, syntax, nest, err);
 
2156   if (BE (*err != REG_NOERROR && tree == NULL, 0))
 
2159   while (token->type == OP_ALT)
 
2161       fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
 
2162       if (token->type != OP_ALT && token->type != END_OF_RE
 
2163           && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
 
2165           branch = parse_branch (regexp, preg, token, syntax, nest, err);
 
2166           if (BE (*err != REG_NOERROR && branch == NULL, 0))
 
2171       tree = create_tree (dfa, tree, branch, OP_ALT);
 
2172       if (BE (tree == NULL, 0))
 
2181 /* This function build the following tree, from regular expression
 
2188    CAT means concatenation.  */
 
2191 parse_branch (re_string_t *regexp, regex_t *preg, re_token_t *token,
 
2192               reg_syntax_t syntax, int nest, reg_errcode_t *err)
 
2194   bin_tree_t *tree, *exp;
 
2195   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
 
2196   tree = parse_expression (regexp, preg, token, syntax, nest, err);
 
2197   if (BE (*err != REG_NOERROR && tree == NULL, 0))
 
2200   while (token->type != OP_ALT && token->type != END_OF_RE
 
2201          && (nest == 0 || token->type != OP_CLOSE_SUBEXP))
 
2203       exp = parse_expression (regexp, preg, token, syntax, nest, err);
 
2204       if (BE (*err != REG_NOERROR && exp == NULL, 0))
 
2208       if (tree != NULL && exp != NULL)
 
2210           tree = create_tree (dfa, tree, exp, CONCAT);
 
2217       else if (tree == NULL)
 
2219       /* Otherwise exp == NULL, we don't need to create new tree.  */
 
2224 /* This function build the following tree, from regular expression a*:
 
2231 parse_expression (re_string_t *regexp, regex_t *preg, re_token_t *token,
 
2232                   reg_syntax_t syntax, int nest, reg_errcode_t *err)
 
2234   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
 
2236   switch (token->type)
 
2239       tree = create_token_tree (dfa, NULL, NULL, token);
 
2240       if (BE (tree == NULL, 0))
 
2245 #ifdef RE_ENABLE_I18N
 
2246       if (dfa->mb_cur_max > 1)
 
2248           while (!re_string_eoi (regexp)
 
2249                  && !re_string_first_byte (regexp, re_string_cur_idx (regexp)))
 
2251               bin_tree_t *mbc_remain;
 
2252               fetch_token (token, regexp, syntax);
 
2253               mbc_remain = create_token_tree (dfa, NULL, NULL, token);
 
2254               tree = create_tree (dfa, tree, mbc_remain, CONCAT);
 
2255               if (BE (mbc_remain == NULL || tree == NULL, 0))
 
2264     case OP_OPEN_SUBEXP:
 
2265       tree = parse_sub_exp (regexp, preg, token, syntax, nest + 1, err);
 
2266       if (BE (*err != REG_NOERROR && tree == NULL, 0))
 
2269     case OP_OPEN_BRACKET:
 
2270       tree = parse_bracket_exp (regexp, dfa, token, syntax, err);
 
2271       if (BE (*err != REG_NOERROR && tree == NULL, 0))
 
2275       if (!BE (dfa->completed_bkref_map & (1 << token->opr.idx), 1))
 
2280       dfa->used_bkref_map |= 1 << token->opr.idx;
 
2281       tree = create_token_tree (dfa, NULL, NULL, token);
 
2282       if (BE (tree == NULL, 0))
 
2288       dfa->has_mb_node = 1;
 
2290     case OP_OPEN_DUP_NUM:
 
2291       if (syntax & RE_CONTEXT_INVALID_DUP)
 
2297     case OP_DUP_ASTERISK:
 
2299     case OP_DUP_QUESTION:
 
2300       if (syntax & RE_CONTEXT_INVALID_OPS)
 
2305       else if (syntax & RE_CONTEXT_INDEP_OPS)
 
2307           fetch_token (token, regexp, syntax);
 
2308           return parse_expression (regexp, preg, token, syntax, nest, err);
 
2310       /* else fall through  */
 
2311     case OP_CLOSE_SUBEXP:
 
2312       if ((token->type == OP_CLOSE_SUBEXP) &&
 
2313           !(syntax & RE_UNMATCHED_RIGHT_PAREN_ORD))
 
2318       /* else fall through  */
 
2319     case OP_CLOSE_DUP_NUM:
 
2320       /* We treat it as a normal character.  */
 
2322       /* Then we can these characters as normal characters.  */
 
2323       token->type = CHARACTER;
 
2324       /* mb_partial and word_char bits should be initialized already
 
2326       tree = create_token_tree (dfa, NULL, NULL, token);
 
2327       if (BE (tree == NULL, 0))
 
2334       if ((token->opr.ctx_type
 
2335            & (WORD_DELIM | NOT_WORD_DELIM | WORD_FIRST | WORD_LAST))
 
2336           && dfa->word_ops_used == 0)
 
2337         init_word_char (dfa);
 
2338       if (token->opr.ctx_type == WORD_DELIM
 
2339           || token->opr.ctx_type == NOT_WORD_DELIM)
 
2341           bin_tree_t *tree_first, *tree_last;
 
2342           if (token->opr.ctx_type == WORD_DELIM)
 
2344               token->opr.ctx_type = WORD_FIRST;
 
2345               tree_first = create_token_tree (dfa, NULL, NULL, token);
 
2346               token->opr.ctx_type = WORD_LAST;
 
2350               token->opr.ctx_type = INSIDE_WORD;
 
2351               tree_first = create_token_tree (dfa, NULL, NULL, token);
 
2352               token->opr.ctx_type = INSIDE_NOTWORD;
 
2354           tree_last = create_token_tree (dfa, NULL, NULL, token);
 
2355           tree = create_tree (dfa, tree_first, tree_last, OP_ALT);
 
2356           if (BE (tree_first == NULL || tree_last == NULL || tree == NULL, 0))
 
2364           tree = create_token_tree (dfa, NULL, NULL, token);
 
2365           if (BE (tree == NULL, 0))
 
2371       /* We must return here, since ANCHORs can't be followed
 
2372          by repetition operators.
 
2373          eg. RE"^*" is invalid or "<ANCHOR(^)><CHAR(*)>",
 
2374              it must not be "<ANCHOR(^)><REPEAT(*)>".  */
 
2375       fetch_token (token, regexp, syntax);
 
2378       tree = create_token_tree (dfa, NULL, NULL, token);
 
2379       if (BE (tree == NULL, 0))
 
2384       if (dfa->mb_cur_max > 1)
 
2385         dfa->has_mb_node = 1;
 
2389       tree = build_charclass_op (dfa, regexp->trans,
 
2392                                  token->type == OP_NOTWORD, err);
 
2393       if (BE (*err != REG_NOERROR && tree == NULL, 0))
 
2398       tree = build_charclass_op (dfa, regexp->trans,
 
2401                                  token->type == OP_NOTSPACE, err);
 
2402       if (BE (*err != REG_NOERROR && tree == NULL, 0))
 
2412       /* Must not happen?  */
 
2418   fetch_token (token, regexp, syntax);
 
2420   while (token->type == OP_DUP_ASTERISK || token->type == OP_DUP_PLUS
 
2421          || token->type == OP_DUP_QUESTION || token->type == OP_OPEN_DUP_NUM)
 
2423       tree = parse_dup_op (tree, regexp, dfa, token, syntax, err);
 
2424       if (BE (*err != REG_NOERROR && tree == NULL, 0))
 
2426       /* In BRE consecutive duplications are not allowed.  */
 
2427       if ((syntax & RE_CONTEXT_INVALID_DUP)
 
2428           && (token->type == OP_DUP_ASTERISK
 
2429               || token->type == OP_OPEN_DUP_NUM))
 
2439 /* This function build the following tree, from regular expression
 
2447 parse_sub_exp (re_string_t *regexp, regex_t *preg, re_token_t *token,
 
2448                reg_syntax_t syntax, int nest, reg_errcode_t *err)
 
2450   re_dfa_t *dfa = (re_dfa_t *) preg->buffer;
 
2453   cur_nsub = preg->re_nsub++;
 
2455   fetch_token (token, regexp, syntax | RE_CARET_ANCHORS_HERE);
 
2457   /* The subexpression may be a null string.  */
 
2458   if (token->type == OP_CLOSE_SUBEXP)
 
2462       tree = parse_reg_exp (regexp, preg, token, syntax, nest, err);
 
2463       if (BE (*err == REG_NOERROR && token->type != OP_CLOSE_SUBEXP, 0))
 
2465       if (BE (*err != REG_NOERROR, 0))
 
2469   if (cur_nsub <= '9' - '1')
 
2470     dfa->completed_bkref_map |= 1 << cur_nsub;
 
2472   tree = create_tree (dfa, tree, NULL, SUBEXP);
 
2473   if (BE (tree == NULL, 0))
 
2478   tree->token.opr.idx = cur_nsub;
 
2482 /* This function parse repetition operators like "*", "+", "{1,3}" etc.  */
 
2485 parse_dup_op (bin_tree_t *elem, re_string_t *regexp, re_dfa_t *dfa,
 
2486               re_token_t *token, reg_syntax_t syntax, reg_errcode_t *err)
 
2488   bin_tree_t *tree = NULL, *old_tree = NULL;
 
2489   int i, start, end, start_idx = re_string_cur_idx (regexp);
 
2490 #ifndef RE_TOKEN_INIT_BUG
 
2491   re_token_t start_token = *token;
 
2493   re_token_t start_token;
 
2495   memcpy ((void *) &start_token, (void *) token, sizeof start_token);
 
2498   if (token->type == OP_OPEN_DUP_NUM)
 
2501       start = fetch_number (regexp, token, syntax);
 
2504           if (token->type == CHARACTER && token->opr.c == ',')
 
2505             start = 0; /* We treat "{,m}" as "{0,m}".  */
 
2508               *err = REG_BADBR; /* <re>{} is invalid.  */
 
2512       if (BE (start != -2, 1))
 
2514           /* We treat "{n}" as "{n,n}".  */
 
2515           end = ((token->type == OP_CLOSE_DUP_NUM) ? start
 
2516                  : ((token->type == CHARACTER && token->opr.c == ',')
 
2517                     ? fetch_number (regexp, token, syntax) : -2));
 
2519       if (BE (start == -2 || end == -2, 0))
 
2521           /* Invalid sequence.  */
 
2522           if (BE (!(syntax & RE_INVALID_INTERVAL_ORD), 0))
 
2524               if (token->type == END_OF_RE)
 
2532           /* If the syntax bit is set, rollback.  */
 
2533           re_string_set_index (regexp, start_idx);
 
2534           *token = start_token;
 
2535           token->type = CHARACTER;
 
2536           /* mb_partial and word_char bits should be already initialized by
 
2541       if (BE ((end != -1 && start > end) || token->type != OP_CLOSE_DUP_NUM, 0))
 
2543           /* First number greater than second.  */
 
2550       start = (token->type == OP_DUP_PLUS) ? 1 : 0;
 
2551       end = (token->type == OP_DUP_QUESTION) ? 1 : -1;
 
2554   fetch_token (token, regexp, syntax);
 
2556   if (BE (elem == NULL, 0))
 
2558   if (BE (start == 0 && end == 0, 0))
 
2560       postorder (elem, free_tree, NULL);
 
2564   /* Extract "<re>{n,m}" to "<re><re>...<re><re>{0,<m-n>}".  */
 
2565   if (BE (start > 0, 0))
 
2568       for (i = 2; i <= start; ++i)
 
2570           elem = duplicate_tree (elem, dfa);
 
2571           tree = create_tree (dfa, tree, elem, CONCAT);
 
2572           if (BE (elem == NULL || tree == NULL, 0))
 
2573             goto parse_dup_op_espace;
 
2579       /* Duplicate ELEM before it is marked optional.  */
 
2580       elem = duplicate_tree (elem, dfa);
 
2586   if (elem->token.type == SUBEXP)
 
2587     postorder (elem, mark_opt_subexp, (void *) (intptr_t) elem->token.opr.idx);
 
2589   tree = create_tree (dfa, elem, NULL, (end == -1 ? OP_DUP_ASTERISK : OP_ALT));
 
2590   if (BE (tree == NULL, 0))
 
2591     goto parse_dup_op_espace;
 
2593   /* This loop is actually executed only when end != -1,
 
2594      to rewrite <re>{0,n} as (<re>(<re>...<re>?)?)?...  We have
 
2595      already created the start+1-th copy.  */
 
2596   for (i = start + 2; i <= end; ++i)
 
2598       elem = duplicate_tree (elem, dfa);
 
2599       tree = create_tree (dfa, tree, elem, CONCAT);
 
2600       if (BE (elem == NULL || tree == NULL, 0))
 
2601         goto parse_dup_op_espace;
 
2603       tree = create_tree (dfa, tree, NULL, OP_ALT);
 
2604       if (BE (tree == NULL, 0))
 
2605         goto parse_dup_op_espace;
 
2609     tree = create_tree (dfa, old_tree, tree, CONCAT);
 
2613  parse_dup_op_espace:
 
2618 /* Size of the names for collating symbol/equivalence_class/character_class.
 
2619    I'm not sure, but maybe enough.  */
 
2620 #define BRACKET_NAME_BUF_SIZE 32
 
2623   /* Local function for parse_bracket_exp only used in case of NOT _LIBC.
 
2624      Build the range expression which starts from START_ELEM, and ends
 
2625      at END_ELEM.  The result are written to MBCSET and SBCSET.
 
2626      RANGE_ALLOC is the allocated size of mbcset->range_starts, and
 
2627      mbcset->range_ends, is a pointer argument since we may
 
2630 static reg_errcode_t
 
2632 # ifdef RE_ENABLE_I18N
 
2633 build_range_exp (bitset_t sbcset, re_charset_t *mbcset, int *range_alloc,
 
2634                  bracket_elem_t *start_elem, bracket_elem_t *end_elem)
 
2635 # else /* not RE_ENABLE_I18N */
 
2636 build_range_exp (bitset_t sbcset, bracket_elem_t *start_elem,
 
2637                  bracket_elem_t *end_elem)
 
2638 # endif /* not RE_ENABLE_I18N */
 
2640   unsigned int start_ch, end_ch;
 
2641   /* Equivalence Classes and Character Classes can't be a range start/end.  */
 
2642   if (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS
 
2643           || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS,
 
2647   /* We can handle no multi character collating elements without libc
 
2649   if (BE ((start_elem->type == COLL_SYM
 
2650            && strlen ((char *) start_elem->opr.name) > 1)
 
2651           || (end_elem->type == COLL_SYM
 
2652               && strlen ((char *) end_elem->opr.name) > 1), 0))
 
2653     return REG_ECOLLATE;
 
2655 # ifdef RE_ENABLE_I18N
 
2660     wchar_t cmp_buf[6] = {L'\0', L'\0', L'\0', L'\0', L'\0', L'\0'};
 
2662     start_ch = ((start_elem->type == SB_CHAR) ? start_elem->opr.ch
 
2663                 : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
 
2665     end_ch = ((end_elem->type == SB_CHAR) ? end_elem->opr.ch
 
2666               : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
 
2670      * Fedora Core 2, maybe others, have broken `btowc' that returns -1
 
2671      * for any value > 127. Sigh. Note that `start_ch' and `end_ch' are
 
2672      * unsigned, so we don't have sign extension problems.
 
2674     start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM)
 
2675                 ? start_ch : start_elem->opr.wch);
 
2676     end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM)
 
2677               ? end_ch : end_elem->opr.wch);
 
2679     start_wc = ((start_elem->type == SB_CHAR || start_elem->type == COLL_SYM)
 
2680                 ? __btowc (start_ch) : start_elem->opr.wch);
 
2681     end_wc = ((end_elem->type == SB_CHAR || end_elem->type == COLL_SYM)
 
2682               ? __btowc (end_ch) : end_elem->opr.wch);
 
2684     if (start_wc == WEOF || end_wc == WEOF)
 
2685       return REG_ECOLLATE;
 
2686     cmp_buf[0] = start_wc;
 
2687     cmp_buf[4] = end_wc;
 
2688     if (wcscoll (cmp_buf, cmp_buf + 4) > 0)
 
2691     /* Got valid collation sequence values, add them as a new entry.
 
2692        However, for !_LIBC we have no collation elements: if the
 
2693        character set is single byte, the single byte character set
 
2694        that we build below suffices.  parse_bracket_exp passes
 
2695        no MBCSET if dfa->mb_cur_max == 1.  */
 
2698         /* Check the space of the arrays.  */
 
2699         if (BE (*range_alloc == mbcset->nranges, 0))
 
2701             /* There is not enough space, need realloc.  */
 
2702             wchar_t *new_array_start, *new_array_end;
 
2705             /* +1 in case of mbcset->nranges is 0.  */
 
2706             new_nranges = 2 * mbcset->nranges + 1;
 
2707             /* Use realloc since mbcset->range_starts and mbcset->range_ends
 
2708                are NULL if *range_alloc == 0.  */
 
2709             new_array_start = re_realloc (mbcset->range_starts, wchar_t,
 
2711             new_array_end = re_realloc (mbcset->range_ends, wchar_t,
 
2714             if (BE (new_array_start == NULL || new_array_end == NULL, 0))
 
2717             mbcset->range_starts = new_array_start;
 
2718             mbcset->range_ends = new_array_end;
 
2719             *range_alloc = new_nranges;
 
2722         mbcset->range_starts[mbcset->nranges] = start_wc;
 
2723         mbcset->range_ends[mbcset->nranges++] = end_wc;
 
2726     /* Build the table for single byte characters.  */
 
2727     for (wc = 0; wc < SBC_MAX; ++wc)
 
2730         if (wcscoll (cmp_buf, cmp_buf + 2) <= 0
 
2731             && wcscoll (cmp_buf + 2, cmp_buf + 4) <= 0)
 
2732           bitset_set (sbcset, wc);
 
2735 # else /* not RE_ENABLE_I18N */
 
2738     start_ch = ((start_elem->type == SB_CHAR ) ? start_elem->opr.ch
 
2739                 : ((start_elem->type == COLL_SYM) ? start_elem->opr.name[0]
 
2741     end_ch = ((end_elem->type == SB_CHAR ) ? end_elem->opr.ch
 
2742               : ((end_elem->type == COLL_SYM) ? end_elem->opr.name[0]
 
2744     if (start_ch > end_ch)
 
2746     /* Build the table for single byte characters.  */
 
2747     for (ch = 0; ch < SBC_MAX; ++ch)
 
2748       if (start_ch <= ch  && ch <= end_ch)
 
2749         bitset_set (sbcset, ch);
 
2751 # endif /* not RE_ENABLE_I18N */
 
2754 #endif /* not _LIBC */
 
2757 /* Helper function for parse_bracket_exp only used in case of NOT _LIBC..
 
2758    Build the collating element which is represented by NAME.
 
2759    The result are written to MBCSET and SBCSET.
 
2760    COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
 
2761    pointer argument since we may update it.  */
 
2763 static reg_errcode_t
 
2765 # ifdef RE_ENABLE_I18N
 
2766 build_collating_symbol (bitset_t sbcset, re_charset_t *mbcset,
 
2767                         int *coll_sym_alloc, const unsigned char *name)
 
2768 # else /* not RE_ENABLE_I18N */
 
2769 build_collating_symbol (bitset_t sbcset, const unsigned char *name)
 
2770 # endif /* not RE_ENABLE_I18N */
 
2772   size_t name_len = strlen ((const char *) name);
 
2773   if (BE (name_len != 1, 0))
 
2774     return REG_ECOLLATE;
 
2777       bitset_set (sbcset, name[0]);
 
2781 #endif /* not _LIBC */
 
2783 /* This function parse bracket expression like "[abc]", "[a-c]",
 
2787 parse_bracket_exp (re_string_t *regexp, re_dfa_t *dfa, re_token_t *token,
 
2788                    reg_syntax_t syntax, reg_errcode_t *err)
 
2791   const unsigned char *collseqmb;
 
2792   const char *collseqwc;
 
2795   const int32_t *symb_table;
 
2796   const unsigned char *extra;
 
2798   /* Local function for parse_bracket_exp used in _LIBC environment.
 
2799      Seek the collating symbol entry correspondings to NAME.
 
2800      Return the index of the symbol in the SYMB_TABLE.  */
 
2803   __attribute ((always_inline))
 
2804   seek_collating_symbol_entry (name, name_len)
 
2805          const unsigned char *name;
 
2808       int32_t hash = elem_hash ((const char *) name, name_len);
 
2809       int32_t elem = hash % table_size;
 
2810       if (symb_table[2 * elem] != 0)
 
2812           int32_t second = hash % (table_size - 2) + 1;
 
2816               /* First compare the hashing value.  */
 
2817               if (symb_table[2 * elem] == hash
 
2818                   /* Compare the length of the name.  */
 
2819                   && name_len == extra[symb_table[2 * elem + 1]]
 
2820                   /* Compare the name.  */
 
2821                   && memcmp (name, &extra[symb_table[2 * elem + 1] + 1],
 
2824                   /* Yep, this is the entry.  */
 
2831           while (symb_table[2 * elem] != 0);
 
2836   /* Local function for parse_bracket_exp used in _LIBC environment.
 
2837      Look up the collation sequence value of BR_ELEM.
 
2838      Return the value if succeeded, UINT_MAX otherwise.  */
 
2840   auto inline unsigned int
 
2841   __attribute ((always_inline))
 
2842   lookup_collation_sequence_value (br_elem)
 
2843          bracket_elem_t *br_elem;
 
2845       if (br_elem->type == SB_CHAR)
 
2848           if (MB_CUR_MAX == 1)
 
2851             return collseqmb[br_elem->opr.ch];
 
2854               wint_t wc = __btowc (br_elem->opr.ch);
 
2855               return __collseq_table_lookup (collseqwc, wc);
 
2858       else if (br_elem->type == MB_CHAR)
 
2861             return __collseq_table_lookup (collseqwc, br_elem->opr.wch);
 
2863       else if (br_elem->type == COLL_SYM)
 
2865           size_t sym_name_len = strlen ((char *) br_elem->opr.name);
 
2869               elem = seek_collating_symbol_entry (br_elem->opr.name,
 
2871               if (symb_table[2 * elem] != 0)
 
2873                   /* We found the entry.  */
 
2874                   idx = symb_table[2 * elem + 1];
 
2875                   /* Skip the name of collating element name.  */
 
2876                   idx += 1 + extra[idx];
 
2877                   /* Skip the byte sequence of the collating element.  */
 
2878                   idx += 1 + extra[idx];
 
2879                   /* Adjust for the alignment.  */
 
2880                   idx = (idx + 3) & ~3;
 
2881                   /* Skip the multibyte collation sequence value.  */
 
2882                   idx += sizeof (unsigned int);
 
2883                   /* Skip the wide char sequence of the collating element.  */
 
2884                   idx += sizeof (unsigned int) *
 
2885                     (1 + *(unsigned int *) (extra + idx));
 
2886                   /* Return the collation sequence value.  */
 
2887                   return *(unsigned int *) (extra + idx);
 
2889               else if (symb_table[2 * elem] == 0 && sym_name_len == 1)
 
2891                   /* No valid character.  Match it as a single byte
 
2893                   return collseqmb[br_elem->opr.name[0]];
 
2896           else if (sym_name_len == 1)
 
2897             return collseqmb[br_elem->opr.name[0]];
 
2902   /* Local function for parse_bracket_exp used in _LIBC environment.
 
2903      Build the range expression which starts from START_ELEM, and ends
 
2904      at END_ELEM.  The result are written to MBCSET and SBCSET.
 
2905      RANGE_ALLOC is the allocated size of mbcset->range_starts, and
 
2906      mbcset->range_ends, is a pointer argument since we may
 
2909   auto inline reg_errcode_t
 
2910   __attribute ((always_inline))
 
2911   build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem)
 
2912          re_charset_t *mbcset;
 
2915          bracket_elem_t *start_elem, *end_elem;
 
2918       uint32_t start_collseq;
 
2919       uint32_t end_collseq;
 
2921       /* Equivalence Classes and Character Classes can't be a range
 
2923       if (BE (start_elem->type == EQUIV_CLASS || start_elem->type == CHAR_CLASS
 
2924               || end_elem->type == EQUIV_CLASS || end_elem->type == CHAR_CLASS,
 
2928       start_collseq = lookup_collation_sequence_value (start_elem);
 
2929       end_collseq = lookup_collation_sequence_value (end_elem);
 
2930       /* Check start/end collation sequence values.  */
 
2931       if (BE (start_collseq == UINT_MAX || end_collseq == UINT_MAX, 0))
 
2932         return REG_ECOLLATE;
 
2933       if (BE ((syntax & RE_NO_EMPTY_RANGES) && start_collseq > end_collseq, 0))
 
2936       /* Got valid collation sequence values, add them as a new entry.
 
2937          However, if we have no collation elements, and the character set
 
2938          is single byte, the single byte character set that we
 
2939          build below suffices. */
 
2940       if (nrules > 0 || dfa->mb_cur_max > 1)
 
2942           /* Check the space of the arrays.  */
 
2943           if (BE (*range_alloc == mbcset->nranges, 0))
 
2945               /* There is not enough space, need realloc.  */
 
2946               uint32_t *new_array_start;
 
2947               uint32_t *new_array_end;
 
2950               /* +1 in case of mbcset->nranges is 0.  */
 
2951               new_nranges = 2 * mbcset->nranges + 1;
 
2952               new_array_start = re_realloc (mbcset->range_starts, uint32_t,
 
2954               new_array_end = re_realloc (mbcset->range_ends, uint32_t,
 
2957               if (BE (new_array_start == NULL || new_array_end == NULL, 0))
 
2960               mbcset->range_starts = new_array_start;
 
2961               mbcset->range_ends = new_array_end;
 
2962               *range_alloc = new_nranges;
 
2965           mbcset->range_starts[mbcset->nranges] = start_collseq;
 
2966           mbcset->range_ends[mbcset->nranges++] = end_collseq;
 
2969       /* Build the table for single byte characters.  */
 
2970       for (ch = 0; ch < SBC_MAX; ch++)
 
2972           uint32_t ch_collseq;
 
2974           if (MB_CUR_MAX == 1)
 
2977             ch_collseq = collseqmb[ch];
 
2979             ch_collseq = __collseq_table_lookup (collseqwc, __btowc (ch));
 
2980           if (start_collseq <= ch_collseq && ch_collseq <= end_collseq)
 
2981             bitset_set (sbcset, ch);
 
2986   /* Local function for parse_bracket_exp used in _LIBC environment.
 
2987      Build the collating element which is represented by NAME.
 
2988      The result are written to MBCSET and SBCSET.
 
2989      COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a
 
2990      pointer argument since we may update it.  */
 
2992   auto inline reg_errcode_t
 
2993   __attribute ((always_inline))
 
2994   build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name)
 
2995          re_charset_t *mbcset;
 
2996          int *coll_sym_alloc;
 
2998          const unsigned char *name;
 
3001       size_t name_len = strlen ((const char *) name);
 
3004           elem = seek_collating_symbol_entry (name, name_len);
 
3005           if (symb_table[2 * elem] != 0)
 
3007               /* We found the entry.  */
 
3008               idx = symb_table[2 * elem + 1];
 
3009               /* Skip the name of collating element name.  */
 
3010               idx += 1 + extra[idx];
 
3012           else if (symb_table[2 * elem] == 0 && name_len == 1)
 
3014               /* No valid character, treat it as a normal
 
3016               bitset_set (sbcset, name[0]);
 
3020             return REG_ECOLLATE;
 
3022           /* Got valid collation sequence, add it as a new entry.  */
 
3023           /* Check the space of the arrays.  */
 
3024           if (BE (*coll_sym_alloc == mbcset->ncoll_syms, 0))
 
3026               /* Not enough, realloc it.  */
 
3027               /* +1 in case of mbcset->ncoll_syms is 0.  */
 
3028               int new_coll_sym_alloc = 2 * mbcset->ncoll_syms + 1;
 
3029               /* Use realloc since mbcset->coll_syms is NULL
 
3031               int32_t *new_coll_syms = re_realloc (mbcset->coll_syms, int32_t,
 
3032                                                    new_coll_sym_alloc);
 
3033               if (BE (new_coll_syms == NULL, 0))
 
3035               mbcset->coll_syms = new_coll_syms;
 
3036               *coll_sym_alloc = new_coll_sym_alloc;
 
3038           mbcset->coll_syms[mbcset->ncoll_syms++] = idx;
 
3043           if (BE (name_len != 1, 0))
 
3044             return REG_ECOLLATE;
 
3047               bitset_set (sbcset, name[0]);
 
3054   re_token_t br_token;
 
3055   re_bitset_ptr_t sbcset;
 
3056 #ifdef RE_ENABLE_I18N
 
3057   re_charset_t *mbcset;
 
3058   int coll_sym_alloc = 0, range_alloc = 0, mbchar_alloc = 0;
 
3059   int equiv_class_alloc = 0, char_class_alloc = 0;
 
3060 #endif /* not RE_ENABLE_I18N */
 
3062   bin_tree_t *work_tree;
 
3064   int first_round = 1;
 
3066   collseqmb = (const unsigned char *)
 
3067     _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQMB);
 
3068   nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
 
3074       collseqwc = _NL_CURRENT (LC_COLLATE, _NL_COLLATE_COLLSEQWC);
 
3075       table_size = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_SYMB_HASH_SIZEMB);
 
3076       symb_table = (const int32_t *) _NL_CURRENT (LC_COLLATE,
 
3077                                                   _NL_COLLATE_SYMB_TABLEMB);
 
3078       extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
 
3079                                                    _NL_COLLATE_SYMB_EXTRAMB);
 
3082   sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
 
3083 #ifdef RE_ENABLE_I18N
 
3084   mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
 
3085 #endif /* RE_ENABLE_I18N */
 
3086 #ifdef RE_ENABLE_I18N
 
3087   if (BE (sbcset == NULL || mbcset == NULL, 0))
 
3089   if (BE (sbcset == NULL, 0))
 
3090 #endif /* RE_ENABLE_I18N */
 
3096   token_len = peek_token_bracket (token, regexp, syntax);
 
3097   if (BE (token->type == END_OF_RE, 0))
 
3100       goto parse_bracket_exp_free_return;
 
3102   if (token->type == OP_NON_MATCH_LIST)
 
3104 #ifdef RE_ENABLE_I18N
 
3105       mbcset->non_match = 1;
 
3106 #endif /* not RE_ENABLE_I18N */
 
3108       if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
 
3109         bitset_set (sbcset, '\n');
 
3110       re_string_skip_bytes (regexp, token_len); /* Skip a token.  */
 
3111       token_len = peek_token_bracket (token, regexp, syntax);
 
3112       if (BE (token->type == END_OF_RE, 0))
 
3115           goto parse_bracket_exp_free_return;
 
3119   /* We treat the first ']' as a normal character.  */
 
3120   if (token->type == OP_CLOSE_BRACKET)
 
3121     token->type = CHARACTER;
 
3125       bracket_elem_t start_elem, end_elem;
 
3126       unsigned char start_name_buf[BRACKET_NAME_BUF_SIZE];
 
3127       unsigned char end_name_buf[BRACKET_NAME_BUF_SIZE];
 
3129       int token_len2 = 0, is_range_exp = 0;
 
3132       start_elem.opr.name = start_name_buf;
 
3133       ret = parse_bracket_element (&start_elem, regexp, token, token_len, dfa,
 
3134                                    syntax, first_round);
 
3135       if (BE (ret != REG_NOERROR, 0))
 
3138           goto parse_bracket_exp_free_return;
 
3142       /* Get information about the next token.  We need it in any case.  */
 
3143       token_len = peek_token_bracket (token, regexp, syntax);
 
3145       /* Do not check for ranges if we know they are not allowed.  */
 
3146       if (start_elem.type != CHAR_CLASS && start_elem.type != EQUIV_CLASS)
 
3148           if (BE (token->type == END_OF_RE, 0))
 
3151               goto parse_bracket_exp_free_return;
 
3153           if (token->type == OP_CHARSET_RANGE)
 
3155               re_string_skip_bytes (regexp, token_len); /* Skip '-'.  */
 
3156               token_len2 = peek_token_bracket (&token2, regexp, syntax);
 
3157               if (BE (token2.type == END_OF_RE, 0))
 
3160                   goto parse_bracket_exp_free_return;
 
3162               if (token2.type == OP_CLOSE_BRACKET)
 
3164                   /* We treat the last '-' as a normal character.  */
 
3165                   re_string_skip_bytes (regexp, -token_len);
 
3166                   token->type = CHARACTER;
 
3173       if (is_range_exp == 1)
 
3175           end_elem.opr.name = end_name_buf;
 
3176           ret = parse_bracket_element (&end_elem, regexp, &token2, token_len2,
 
3178           if (BE (ret != REG_NOERROR, 0))
 
3181               goto parse_bracket_exp_free_return;
 
3184           token_len = peek_token_bracket (token, regexp, syntax);
 
3187           *err = build_range_exp (sbcset, mbcset, &range_alloc,
 
3188                                   &start_elem, &end_elem);
 
3190 # ifdef RE_ENABLE_I18N
 
3191           *err = build_range_exp (sbcset,
 
3192                                   dfa->mb_cur_max > 1 ? mbcset : NULL,
 
3193                                   &range_alloc, &start_elem, &end_elem);
 
3195           *err = build_range_exp (sbcset, &start_elem, &end_elem);
 
3197 #endif /* RE_ENABLE_I18N */
 
3198           if (BE (*err != REG_NOERROR, 0))
 
3199             goto parse_bracket_exp_free_return;
 
3203           switch (start_elem.type)
 
3206               bitset_set (sbcset, start_elem.opr.ch);
 
3208 #ifdef RE_ENABLE_I18N
 
3210               /* Check whether the array has enough space.  */
 
3211               if (BE (mbchar_alloc == mbcset->nmbchars, 0))
 
3213                   wchar_t *new_mbchars;
 
3214                   /* Not enough, realloc it.  */
 
3215                   /* +1 in case of mbcset->nmbchars is 0.  */
 
3216                   mbchar_alloc = 2 * mbcset->nmbchars + 1;
 
3217                   /* Use realloc since array is NULL if *alloc == 0.  */
 
3218                   new_mbchars = re_realloc (mbcset->mbchars, wchar_t,
 
3220                   if (BE (new_mbchars == NULL, 0))
 
3221                     goto parse_bracket_exp_espace;
 
3222                   mbcset->mbchars = new_mbchars;
 
3224               mbcset->mbchars[mbcset->nmbchars++] = start_elem.opr.wch;
 
3226 #endif /* RE_ENABLE_I18N */
 
3228               *err = build_equiv_class (sbcset,
 
3229 #ifdef RE_ENABLE_I18N
 
3230                                         mbcset, &equiv_class_alloc,
 
3231 #endif /* RE_ENABLE_I18N */
 
3232                                         start_elem.opr.name);
 
3233               if (BE (*err != REG_NOERROR, 0))
 
3234                 goto parse_bracket_exp_free_return;
 
3237               *err = build_collating_symbol (sbcset,
 
3238 #ifdef RE_ENABLE_I18N
 
3239                                              mbcset, &coll_sym_alloc,
 
3240 #endif /* RE_ENABLE_I18N */
 
3241                                              start_elem.opr.name);
 
3242               if (BE (*err != REG_NOERROR, 0))
 
3243                 goto parse_bracket_exp_free_return;
 
3246               *err = build_charclass (regexp->trans, sbcset,
 
3247 #ifdef RE_ENABLE_I18N
 
3248                                       mbcset, &char_class_alloc,
 
3249 #endif /* RE_ENABLE_I18N */
 
3250                                       (const char *) start_elem.opr.name, syntax);
 
3251               if (BE (*err != REG_NOERROR, 0))
 
3252                goto parse_bracket_exp_free_return;
 
3259       if (BE (token->type == END_OF_RE, 0))
 
3262           goto parse_bracket_exp_free_return;
 
3264       if (token->type == OP_CLOSE_BRACKET)
 
3268   re_string_skip_bytes (regexp, token_len); /* Skip a token.  */
 
3270   /* If it is non-matching list.  */
 
3272     bitset_not (sbcset);
 
3274 #ifdef RE_ENABLE_I18N
 
3275   /* Ensure only single byte characters are set.  */
 
3276   if (dfa->mb_cur_max > 1)
 
3277     bitset_mask (sbcset, dfa->sb_char);
 
3279   if (mbcset->nmbchars || mbcset->ncoll_syms || mbcset->nequiv_classes
 
3280       || mbcset->nranges || (dfa->mb_cur_max > 1 && (mbcset->nchar_classes
 
3281                                                      || mbcset->non_match)))
 
3283       bin_tree_t *mbc_tree;
 
3285       /* Build a tree for complex bracket.  */
 
3286       dfa->has_mb_node = 1;
 
3287       br_token.type = COMPLEX_BRACKET;
 
3288       br_token.opr.mbcset = mbcset;
 
3289       mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
 
3290       if (BE (mbc_tree == NULL, 0))
 
3291         goto parse_bracket_exp_espace;
 
3292       for (sbc_idx = 0; sbc_idx < BITSET_WORDS; ++sbc_idx)
 
3293         if (sbcset[sbc_idx])
 
3295       /* If there are no bits set in sbcset, there is no point
 
3296          of having both SIMPLE_BRACKET and COMPLEX_BRACKET.  */
 
3297       if (sbc_idx < BITSET_WORDS)
 
3299           /* Build a tree for simple bracket.  */
 
3300           br_token.type = SIMPLE_BRACKET;
 
3301           br_token.opr.sbcset = sbcset;
 
3302           work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
 
3303           if (BE (work_tree == NULL, 0))
 
3304             goto parse_bracket_exp_espace;
 
3306           /* Then join them by ALT node.  */
 
3307           work_tree = create_tree (dfa, work_tree, mbc_tree, OP_ALT);
 
3308           if (BE (work_tree == NULL, 0))
 
3309             goto parse_bracket_exp_espace;
 
3314           work_tree = mbc_tree;
 
3318 #endif /* not RE_ENABLE_I18N */
 
3320 #ifdef RE_ENABLE_I18N
 
3321       free_charset (mbcset);
 
3323       /* Build a tree for simple bracket.  */
 
3324       br_token.type = SIMPLE_BRACKET;
 
3325       br_token.opr.sbcset = sbcset;
 
3326       work_tree = create_token_tree (dfa, NULL, NULL, &br_token);
 
3327       if (BE (work_tree == NULL, 0))
 
3328         goto parse_bracket_exp_espace;
 
3332  parse_bracket_exp_espace:
 
3334  parse_bracket_exp_free_return:
 
3336 #ifdef RE_ENABLE_I18N
 
3337   free_charset (mbcset);
 
3338 #endif /* RE_ENABLE_I18N */
 
3342 /* Parse an element in the bracket expression.  */
 
3344 static reg_errcode_t
 
3345 parse_bracket_element (bracket_elem_t *elem, re_string_t *regexp,
 
3346                        re_token_t *token, int token_len, re_dfa_t *dfa,
 
3347                        reg_syntax_t syntax, int accept_hyphen)
 
3349 #ifdef RE_ENABLE_I18N
 
3351   cur_char_size = re_string_char_size_at (regexp, re_string_cur_idx (regexp));
 
3352   if (cur_char_size > 1)
 
3354       elem->type = MB_CHAR;
 
3355       elem->opr.wch = re_string_wchar_at (regexp, re_string_cur_idx (regexp));
 
3356       re_string_skip_bytes (regexp, cur_char_size);
 
3359 #endif /* RE_ENABLE_I18N */
 
3360   re_string_skip_bytes (regexp, token_len); /* Skip a token.  */
 
3361   if (token->type == OP_OPEN_COLL_ELEM || token->type == OP_OPEN_CHAR_CLASS
 
3362       || token->type == OP_OPEN_EQUIV_CLASS)
 
3363     return parse_bracket_symbol (elem, regexp, token);
 
3364   if (BE (token->type == OP_CHARSET_RANGE, 0) && !accept_hyphen)
 
3366       /* A '-' must only appear as anything but a range indicator before
 
3367          the closing bracket.  Everything else is an error.  */
 
3369       (void) peek_token_bracket (&token2, regexp, syntax);
 
3370       if (token2.type != OP_CLOSE_BRACKET)
 
3371         /* The actual error value is not standardized since this whole
 
3372            case is undefined.  But ERANGE makes good sense.  */
 
3375   elem->type = SB_CHAR;
 
3376   elem->opr.ch = token->opr.c;
 
3380 /* Parse a bracket symbol in the bracket expression.  Bracket symbols are
 
3381    such as [:<character_class>:], [.<collating_element>.], and
 
3382    [=<equivalent_class>=].  */
 
3384 static reg_errcode_t
 
3385 parse_bracket_symbol (bracket_elem_t *elem, re_string_t *regexp,
 
3388   unsigned char ch, delim = token->opr.c;
 
3390   if (re_string_eoi(regexp))
 
3394       if (i >= BRACKET_NAME_BUF_SIZE)
 
3396       if (token->type == OP_OPEN_CHAR_CLASS)
 
3397         ch = re_string_fetch_byte_case (regexp);
 
3399         ch = re_string_fetch_byte (regexp);
 
3400       if (re_string_eoi(regexp))
 
3402       if (ch == delim && re_string_peek_byte (regexp, 0) == ']')
 
3404       elem->opr.name[i] = ch;
 
3406   re_string_skip_bytes (regexp, 1);
 
3407   elem->opr.name[i] = '\0';
 
3408   switch (token->type)
 
3410     case OP_OPEN_COLL_ELEM:
 
3411       elem->type = COLL_SYM;
 
3413     case OP_OPEN_EQUIV_CLASS:
 
3414       elem->type = EQUIV_CLASS;
 
3416     case OP_OPEN_CHAR_CLASS:
 
3417       elem->type = CHAR_CLASS;
 
3425   /* Helper function for parse_bracket_exp.
 
3426      Build the equivalence class which is represented by NAME.
 
3427      The result are written to MBCSET and SBCSET.
 
3428      EQUIV_CLASS_ALLOC is the allocated size of mbcset->equiv_classes,
 
3429      is a pointer argument since we may update it.  */
 
3431 static reg_errcode_t
 
3432 #ifdef RE_ENABLE_I18N
 
3433 build_equiv_class (bitset_t sbcset, re_charset_t *mbcset,
 
3434                    int *equiv_class_alloc, const unsigned char *name)
 
3435 #else /* not RE_ENABLE_I18N */
 
3436 build_equiv_class (bitset_t sbcset, const unsigned char *name)
 
3437 #endif /* not RE_ENABLE_I18N */
 
3440   uint32_t nrules = _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
 
3443       const int32_t *table, *indirect;
 
3444       const unsigned char *weights, *extra, *cp;
 
3445       unsigned char char_buf[2];
 
3449       /* This #include defines a local function!  */
 
3450 # include <locale/weight.h>
 
3451       /* Calculate the index for equivalence class.  */
 
3453       table = (const int32_t *) _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
 
3454       weights = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
 
3455                                                _NL_COLLATE_WEIGHTMB);
 
3456       extra = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
 
3457                                                    _NL_COLLATE_EXTRAMB);
 
3458       indirect = (const int32_t *) _NL_CURRENT (LC_COLLATE,
 
3459                                                 _NL_COLLATE_INDIRECTMB);
 
3460       idx1 = findidx (&cp);
 
3461       if (BE (idx1 == 0 || cp < name + strlen ((const char *) name), 0))
 
3462         /* This isn't a valid character.  */
 
3463         return REG_ECOLLATE;
 
3465       /* Build single byte matcing table for this equivalence class.  */
 
3466       char_buf[1] = (unsigned char) '\0';
 
3467       len = weights[idx1 & 0xffffff];
 
3468       for (ch = 0; ch < SBC_MAX; ++ch)
 
3472           idx2 = findidx (&cp);
 
3477             /* This isn't a valid character.  */
 
3479           /* Compare only if the length matches and the collation rule
 
3480              index is the same.  */
 
3481           if (len == weights[idx2 & 0xffffff] && (idx1 >> 24) == (idx2 >> 24))
 
3485               while (cnt <= len &&
 
3486                      weights[(idx1 & 0xffffff) + 1 + cnt]
 
3487                      == weights[(idx2 & 0xffffff) + 1 + cnt])
 
3491                 bitset_set (sbcset, ch);
 
3494       /* Check whether the array has enough space.  */
 
3495       if (BE (*equiv_class_alloc == mbcset->nequiv_classes, 0))
 
3497           /* Not enough, realloc it.  */
 
3498           /* +1 in case of mbcset->nequiv_classes is 0.  */
 
3499           int new_equiv_class_alloc = 2 * mbcset->nequiv_classes + 1;
 
3500           /* Use realloc since the array is NULL if *alloc == 0.  */
 
3501           int32_t *new_equiv_classes = re_realloc (mbcset->equiv_classes,
 
3503                                                    new_equiv_class_alloc);
 
3504           if (BE (new_equiv_classes == NULL, 0))
 
3506           mbcset->equiv_classes = new_equiv_classes;
 
3507           *equiv_class_alloc = new_equiv_class_alloc;
 
3509       mbcset->equiv_classes[mbcset->nequiv_classes++] = idx1;
 
3514       if (BE (strlen ((const char *) name) != 1, 0))
 
3515         return REG_ECOLLATE;
 
3516       bitset_set (sbcset, *name);
 
3521   /* Helper function for parse_bracket_exp.
 
3522      Build the character class which is represented by NAME.
 
3523      The result are written to MBCSET and SBCSET.
 
3524      CHAR_CLASS_ALLOC is the allocated size of mbcset->char_classes,
 
3525      is a pointer argument since we may update it.  */
 
3527 static reg_errcode_t
 
3528 #ifdef RE_ENABLE_I18N
 
3529 build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
 
3530                  re_charset_t *mbcset, int *char_class_alloc,
 
3531                  const char *class_name, reg_syntax_t syntax)
 
3532 #else /* not RE_ENABLE_I18N */
 
3533 build_charclass (RE_TRANSLATE_TYPE trans, bitset_t sbcset,
 
3534                  const char *class_name, reg_syntax_t syntax)
 
3535 #endif /* not RE_ENABLE_I18N */
 
3539   /* In case of REG_ICASE "upper" and "lower" match the both of
 
3540      upper and lower cases.  */
 
3541   if ((syntax & RE_ICASE)
 
3542       && (strcmp (class_name, "upper") == 0 || strcmp (class_name, "lower") == 0))
 
3543     class_name = "alpha";
 
3545 #ifdef RE_ENABLE_I18N
 
3546   /* Check the space of the arrays.  */
 
3547   if (BE (*char_class_alloc == mbcset->nchar_classes, 0))
 
3549       /* Not enough, realloc it.  */
 
3550       /* +1 in case of mbcset->nchar_classes is 0.  */
 
3551       int new_char_class_alloc = 2 * mbcset->nchar_classes + 1;
 
3552       /* Use realloc since array is NULL if *alloc == 0.  */
 
3553       wctype_t *new_char_classes = re_realloc (mbcset->char_classes, wctype_t,
 
3554                                                new_char_class_alloc);
 
3555       if (BE (new_char_classes == NULL, 0))
 
3557       mbcset->char_classes = new_char_classes;
 
3558       *char_class_alloc = new_char_class_alloc;
 
3560   mbcset->char_classes[mbcset->nchar_classes++] = __wctype (class_name);
 
3561 #endif /* RE_ENABLE_I18N */
 
3563 #define BUILD_CHARCLASS_LOOP(ctype_func)        \
 
3565     if (BE (trans != NULL, 0))                  \
 
3567         for (i = 0; i < SBC_MAX; ++i)           \
 
3568           if (ctype_func (i))                   \
 
3569             bitset_set (sbcset, trans[i]);      \
 
3573         for (i = 0; i < SBC_MAX; ++i)           \
 
3574           if (ctype_func (i))                   \
 
3575             bitset_set (sbcset, i);             \
 
3579   if (strcmp (class_name, "alnum") == 0)
 
3580     BUILD_CHARCLASS_LOOP (isalnum);
 
3581   else if (strcmp (class_name, "cntrl") == 0)
 
3582     BUILD_CHARCLASS_LOOP (iscntrl);
 
3583   else if (strcmp (class_name, "lower") == 0)
 
3584     BUILD_CHARCLASS_LOOP (islower);
 
3585   else if (strcmp (class_name, "space") == 0)
 
3586     BUILD_CHARCLASS_LOOP (isspace);
 
3587   else if (strcmp (class_name, "alpha") == 0)
 
3588     BUILD_CHARCLASS_LOOP (isalpha);
 
3589   else if (strcmp (class_name, "digit") == 0)
 
3590     BUILD_CHARCLASS_LOOP (isdigit);
 
3591   else if (strcmp (class_name, "print") == 0)
 
3592     BUILD_CHARCLASS_LOOP (isprint);
 
3593   else if (strcmp (class_name, "upper") == 0)
 
3594     BUILD_CHARCLASS_LOOP (isupper);
 
3595   else if (strcmp (class_name, "blank") == 0)
 
3597     BUILD_CHARCLASS_LOOP (isblank);
 
3599     /* see comments above */
 
3600     BUILD_CHARCLASS_LOOP (is_blank);
 
3602   else if (strcmp (class_name, "graph") == 0)
 
3603     BUILD_CHARCLASS_LOOP (isgraph);
 
3604   else if (strcmp (class_name, "punct") == 0)
 
3605     BUILD_CHARCLASS_LOOP (ispunct);
 
3606   else if (strcmp (class_name, "xdigit") == 0)
 
3607     BUILD_CHARCLASS_LOOP (isxdigit);
 
3615 build_charclass_op (re_dfa_t *dfa, RE_TRANSLATE_TYPE trans,
 
3616                     const char *class_name,
 
3617                     const char *extra, int non_match,
 
3620   re_bitset_ptr_t sbcset;
 
3621 #ifdef RE_ENABLE_I18N
 
3622   re_charset_t *mbcset;
 
3624 #endif /* not RE_ENABLE_I18N */
 
3626   re_token_t br_token;
 
3629   sbcset = (re_bitset_ptr_t) calloc (sizeof (bitset_t), 1);
 
3630 #ifdef RE_ENABLE_I18N
 
3631   mbcset = (re_charset_t *) calloc (sizeof (re_charset_t), 1);
 
3632 #endif /* RE_ENABLE_I18N */
 
3634 #ifdef RE_ENABLE_I18N
 
3635   if (BE (sbcset == NULL || mbcset == NULL, 0))
 
3636 #else /* not RE_ENABLE_I18N */
 
3637   if (BE (sbcset == NULL, 0))
 
3638 #endif /* not RE_ENABLE_I18N */
 
3646 #ifdef RE_ENABLE_I18N
 
3647       mbcset->non_match = 1;
 
3648 #endif /* not RE_ENABLE_I18N */
 
3651   /* We don't care the syntax in this case.  */
 
3652   ret = build_charclass (trans, sbcset,
 
3653 #ifdef RE_ENABLE_I18N
 
3655 #endif /* RE_ENABLE_I18N */
 
3658   if (BE (ret != REG_NOERROR, 0))
 
3661 #ifdef RE_ENABLE_I18N
 
3662       free_charset (mbcset);
 
3663 #endif /* RE_ENABLE_I18N */
 
3667   /* \w match '_' also.  */
 
3668   for (; *extra; extra++)
 
3669     bitset_set (sbcset, *extra);
 
3671   /* If it is non-matching list.  */
 
3673     bitset_not (sbcset);
 
3675 #ifdef RE_ENABLE_I18N
 
3676   /* Ensure only single byte characters are set.  */
 
3677   if (dfa->mb_cur_max > 1)
 
3678     bitset_mask (sbcset, dfa->sb_char);
 
3681   /* Build a tree for simple bracket.  */
 
3682   br_token.type = SIMPLE_BRACKET;
 
3683   br_token.opr.sbcset = sbcset;
 
3684   tree = create_token_tree (dfa, NULL, NULL, &br_token);
 
3685   if (BE (tree == NULL, 0))
 
3686     goto build_word_op_espace;
 
3688 #ifdef RE_ENABLE_I18N
 
3689   if (dfa->mb_cur_max > 1)
 
3691       bin_tree_t *mbc_tree;
 
3692       /* Build a tree for complex bracket.  */
 
3693       br_token.type = COMPLEX_BRACKET;
 
3694       br_token.opr.mbcset = mbcset;
 
3695       dfa->has_mb_node = 1;
 
3696       mbc_tree = create_token_tree (dfa, NULL, NULL, &br_token);
 
3697       if (BE (mbc_tree == NULL, 0))
 
3698         goto build_word_op_espace;
 
3699       /* Then join them by ALT node.  */
 
3700       tree = create_tree (dfa, tree, mbc_tree, OP_ALT);
 
3701       if (BE (mbc_tree != NULL, 1))
 
3706       free_charset (mbcset);
 
3709 #else /* not RE_ENABLE_I18N */
 
3711 #endif /* not RE_ENABLE_I18N */
 
3713  build_word_op_espace:
 
3715 #ifdef RE_ENABLE_I18N
 
3716   free_charset (mbcset);
 
3717 #endif /* RE_ENABLE_I18N */
 
3722 /* This is intended for the expressions like "a{1,3}".
 
3723    Fetch a number from `input', and return the number.
 
3724    Return -1, if the number field is empty like "{,1}".
 
3725    Return -2, if an error has occurred.  */
 
3728 fetch_number (re_string_t *input, re_token_t *token, reg_syntax_t syntax)
 
3734       fetch_token (token, input, syntax);
 
3736       if (BE (token->type == END_OF_RE, 0))
 
3738       if (token->type == OP_CLOSE_DUP_NUM || c == ',')
 
3740       num = ((token->type != CHARACTER || c < '0' || '9' < c || num == -2)
 
3741              ? -2 : ((num == -1) ? c - '0' : num * 10 + c - '0'));
 
3742       num = (num > RE_DUP_MAX) ? -2 : num;
 
3747 #ifdef RE_ENABLE_I18N
 
3749 free_charset (re_charset_t *cset)
 
3751   re_free (cset->mbchars);
 
3753   re_free (cset->coll_syms);
 
3754   re_free (cset->equiv_classes);
 
3755   re_free (cset->range_starts);
 
3756   re_free (cset->range_ends);
 
3758   re_free (cset->char_classes);
 
3761 #endif /* RE_ENABLE_I18N */
 
3763 /* Functions for binary tree operation.  */
 
3765 /* Create a tree node.  */
 
3768 create_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
 
3769              re_token_type_t type)
 
3773   return create_token_tree (dfa, left, right, &t);
 
3777 create_token_tree (re_dfa_t *dfa, bin_tree_t *left, bin_tree_t *right,
 
3778                    const re_token_t *token)
 
3781   if (BE (dfa->str_tree_storage_idx == BIN_TREE_STORAGE_SIZE, 0))
 
3783       bin_tree_storage_t *storage = re_malloc (bin_tree_storage_t, 1);
 
3785       if (storage == NULL)
 
3787       storage->next = dfa->str_tree_storage;
 
3788       dfa->str_tree_storage = storage;
 
3789       dfa->str_tree_storage_idx = 0;
 
3791   tree = &dfa->str_tree_storage->data[dfa->str_tree_storage_idx++];
 
3793   tree->parent = NULL;
 
3795   tree->right = right;
 
3796   tree->token = *token;
 
3797   tree->token.duplicated = 0;
 
3798   tree->token.opt_subexp = 0;
 
3801   tree->node_idx = -1;
 
3804     left->parent = tree;
 
3806     right->parent = tree;
 
3810 /* Mark the tree SRC as an optional subexpression.
 
3811    To be called from preorder or postorder.  */
 
3813 static reg_errcode_t
 
3814 mark_opt_subexp (void *extra, bin_tree_t *node)
 
3816   int idx = (int) (intptr_t) extra;
 
3817   if (node->token.type == SUBEXP && node->token.opr.idx == idx)
 
3818     node->token.opt_subexp = 1;
 
3823 /* Free the allocated memory inside NODE. */
 
3826 free_token (re_token_t *node)
 
3828 #ifdef RE_ENABLE_I18N
 
3829   if (node->type == COMPLEX_BRACKET && node->duplicated == 0)
 
3830     free_charset (node->opr.mbcset);
 
3832 #endif /* RE_ENABLE_I18N */
 
3833     if (node->type == SIMPLE_BRACKET && node->duplicated == 0)
 
3834       re_free (node->opr.sbcset);
 
3837 /* Worker function for tree walking.  Free the allocated memory inside NODE
 
3838    and its children. */
 
3840 static reg_errcode_t
 
3841 free_tree (void *extra, bin_tree_t *node)
 
3843   free_token (&node->token);
 
3848 /* Duplicate the node SRC, and return new node.  This is a preorder
 
3849    visit similar to the one implemented by the generic visitor, but
 
3850    we need more infrastructure to maintain two parallel trees --- so,
 
3851    it's easier to duplicate.  */
 
3854 duplicate_tree (const bin_tree_t *root, re_dfa_t *dfa)
 
3856   const bin_tree_t *node;
 
3857   bin_tree_t *dup_root;
 
3858   bin_tree_t **p_new = &dup_root, *dup_node = root->parent;
 
3860   for (node = root; ; )
 
3862       /* Create a new tree and link it back to the current parent.  */
 
3863       *p_new = create_token_tree (dfa, NULL, NULL, &node->token);
 
3866       (*p_new)->parent = dup_node;
 
3867       (*p_new)->token.duplicated = 1;
 
3870       /* Go to the left node, or up and to the right.  */
 
3874           p_new = &dup_node->left;
 
3878           const bin_tree_t *prev = NULL;
 
3879           while (node->right == prev || node->right == NULL)
 
3882               node = node->parent;
 
3883               dup_node = dup_node->parent;
 
3888           p_new = &dup_node->right;