rx.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:173k
源码类别:

DVD

开发平台:

Unix_Linux

  1.       return 1;
  2.     }
  3.   dest = rx_superstate (rx, solution);
  4.   rx_release_superset (rx, solution);
  5.   if (!dest)
  6.     return 0;
  7.   {
  8.     struct rx_distinct_future *dft;
  9.     dft = df;
  10.     df->prev_same_dest->next_same_dest = 0;
  11.     while (dft)
  12.       {
  13. dft->future = dest;
  14. dft->future_frame.inx = rx->instruction_table[rx_next_char];
  15. dft->future_frame.data = (void *) dest->transitions;
  16. dft = dft->next_same_dest;
  17.       }
  18.     df->prev_same_dest->next_same_dest = df;
  19.   }
  20.   if (!dest->transition_refs)
  21.     dest->transition_refs = df;
  22.   else
  23.     {
  24.       struct rx_distinct_future *dft = dest->transition_refs->next_same_dest;
  25.       dest->transition_refs->next_same_dest = df->next_same_dest;
  26.       df->next_same_dest->prev_same_dest = dest->transition_refs;
  27.       df->next_same_dest = dft;
  28.       dft->prev_same_dest = df;
  29.     }
  30.   return 1;
  31. }
  32. /* This takes a superstate and a character, and computes some edges
  33.  * from the superstate NFA.  In particular, this computes all edges
  34.  * that lead from SUPERSTATE given CHR.   This function also 
  35.  * computes the set of characters that share this edge set.
  36.  * This returns 0 on allocation error.
  37.  * The character set and list of edges are returned through 
  38.  * the paramters CSETOUT and DFOUT.
  39. } */
  40. #ifdef __STDC__
  41. static int 
  42. compute_super_edge (struct rx *rx, struct rx_distinct_future **dfout,
  43.   rx_Bitset csetout, struct rx_superstate *superstate,
  44.   unsigned char chr)  
  45. #else
  46. static int 
  47. compute_super_edge (rx, dfout, csetout, superstate, chr)
  48.      struct rx *rx;
  49.      struct rx_distinct_future **dfout;
  50.      rx_Bitset csetout;
  51.      struct rx_superstate *superstate;
  52.      unsigned char chr;
  53. #endif
  54. {
  55.   struct rx_superset *stateset = superstate->contents;
  56.   /* To compute the set of characters that share edges with CHR, 
  57.    * we start with the full character set, and subtract.
  58.    */
  59.   rx_bitset_universe (rx->local_cset_size, csetout);
  60.   *dfout = 0;
  61.   /* Iterate over the NFA states in the superstate state-set. */
  62.   while (stateset->car)
  63.     {
  64.       struct rx_nfa_edge *e;
  65.       for (e = stateset->car->edges; e; e = e->next)
  66. if (RX_bitset_member (e->params.cset, chr))
  67.   {
  68.     /* If we find an NFA edge that applies, we make sure there
  69.      * are corresponding edges in the superstate NFA.
  70.      */
  71.     {
  72.       struct rx_distinct_future * saved;
  73.       saved = *dfout;
  74.       *dfout = include_futures (rx, *dfout, e->dest, superstate);
  75.       if (!*dfout)
  76. {
  77.   struct rx_distinct_future * df;
  78.   df = saved;
  79.   df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
  80.   while (df)
  81.     {
  82.       struct rx_distinct_future *dft;
  83.       dft = df;
  84.       df = df->next_same_super_edge[0];
  85.       if (dft->future && dft->future->transition_refs == dft)
  86. {
  87.   dft->future->transition_refs = dft->next_same_dest;
  88.   if (dft->future->transition_refs == dft)
  89.     dft->future->transition_refs = 0;
  90. }
  91.       dft->next_same_dest->prev_same_dest = dft->prev_same_dest;
  92.       dft->prev_same_dest->next_same_dest = dft->next_same_dest;
  93.       rx_cache_free (rx->cache,
  94.      &rx->cache->free_discernable_futures,
  95.      (char *)dft);
  96.     }
  97.   return 0;
  98. }
  99.     }
  100.     /* We also trim the character set a bit. */
  101.     rx_bitset_intersection (rx->local_cset_size,
  102.     csetout, e->params.cset);
  103.   }
  104. else
  105.   /* An edge that doesn't apply at least tells us some characters
  106.    * that don't share the same edge set as CHR.
  107.    */
  108.   rx_bitset_difference (rx->local_cset_size, csetout, e->params.cset);
  109.       stateset = stateset->cdr;
  110.     }
  111.   return 1;
  112. }
  113. /* This is a constructor for RX_SUPER_EDGE structures.  These are
  114.  * wrappers for lists of superstate NFA edges that share character sets labels.
  115.  * If a transition class contains more than one rx_distinct_future (superstate
  116.  * edge), then it represents a non-determinism in the superstate NFA.
  117.  */
  118. #ifdef __STDC__
  119. static struct rx_super_edge *
  120. rx_super_edge (struct rx *rx,
  121.        struct rx_superstate *super, rx_Bitset cset,
  122.        struct rx_distinct_future *df) 
  123. #else
  124. static struct rx_super_edge *
  125. rx_super_edge (rx, super, cset, df)
  126.      struct rx *rx;
  127.      struct rx_superstate *super;
  128.      rx_Bitset cset;
  129.      struct rx_distinct_future *df;
  130. #endif
  131. {
  132.   struct rx_super_edge *tc =
  133.     (struct rx_super_edge *)rx_cache_malloc_or_get
  134.       (rx->cache, &rx->cache->free_transition_classes,
  135.        sizeof (struct rx_super_edge) + rx_sizeof_bitset (rx->local_cset_size));
  136.   if (!tc)
  137.     return 0;
  138.   tc->next = super->edges;
  139.   super->edges = tc;
  140.   tc->rx_backtrack_frame.inx = rx->instruction_table[rx_backtrack_point];
  141.   tc->rx_backtrack_frame.data = 0;
  142.   tc->rx_backtrack_frame.data_2 = (void *) tc;
  143.   tc->options = df;
  144.   tc->cset = (rx_Bitset) ((char *) tc + sizeof (*tc));
  145.   rx_bitset_assign (rx->local_cset_size, tc->cset, cset);
  146.   if (df)
  147.     {
  148.       struct rx_distinct_future * dfp = df;
  149.       df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
  150.       while (dfp)
  151. {
  152.   dfp->edge = tc;
  153.   dfp = dfp->next_same_super_edge[0];
  154. }
  155.       df->next_same_super_edge[1]->next_same_super_edge[0] = df;
  156.     }
  157.   return tc;
  158. }
  159. /* There are three kinds of cache miss.  The first occurs when a
  160.  * transition is taken that has never been computed during the
  161.  * lifetime of the source superstate.  That cache miss is handled by
  162.  * calling COMPUTE_SUPER_EDGE.  The second kind of cache miss
  163.  * occurs when the destination superstate of a transition doesn't
  164.  * exist.  SOLVE_DESTINATION is used to construct the destination superstate.
  165.  * Finally, the third kind of cache miss occurs when the destination
  166.  * superstate of a transition is in a `semi-free state'.  That case is
  167.  * handled by UNFREE_SUPERSTATE.
  168.  *
  169.  * The function of HANDLE_CACHE_MISS is to figure out which of these
  170.  * cases applies.
  171.  */
  172. #ifdef __STDC__
  173. static void
  174. install_partial_transition  (struct rx_superstate *super,
  175.      struct rx_inx *answer,
  176.      RX_subset set, int offset)
  177. #else
  178. static void
  179. install_partial_transition  (super, answer, set, offset)
  180.      struct rx_superstate *super;
  181.      struct rx_inx *answer;
  182.      RX_subset set;
  183.      int offset;
  184. #endif
  185. {
  186.   int start = offset;
  187.   int end = start + 32;
  188.   RX_subset pos = 1;
  189.   struct rx_inx * transitions = super->transitions;
  190.   
  191.   while (start < end)
  192.     {
  193.       if (set & pos)
  194. transitions[start] = *answer;
  195.       pos <<= 1;
  196.       ++start;
  197.     }
  198. }
  199. #ifdef __STDC__
  200. RX_DECL struct rx_inx *
  201. rx_handle_cache_miss
  202.   (struct rx *rx, struct rx_superstate *super, unsigned char chr, void *data) 
  203. #else
  204. RX_DECL struct rx_inx *
  205. rx_handle_cache_miss (rx, super, chr, data)
  206.      struct rx *rx;
  207.      struct rx_superstate *super;
  208.      unsigned char chr;
  209.      void *data;
  210. #endif
  211. {
  212.   int offset = chr / RX_subset_bits;
  213.   struct rx_distinct_future *df = data;
  214.   if (!df) /* must be the shared_cache_miss_frame */
  215.     {
  216.       /* Perhaps this is just a transition waiting to be filled. */
  217.       struct rx_super_edge *tc;
  218.       RX_subset mask = rx_subset_singletons [chr % RX_subset_bits];
  219.       for (tc = super->edges; tc; tc = tc->next)
  220. if (tc->cset[offset] & mask)
  221.   {
  222.     struct rx_inx * answer;
  223.     df = tc->options;
  224.     answer = ((tc->options->next_same_super_edge[0] != tc->options)
  225.       ? &tc->rx_backtrack_frame
  226.       : (df->effects
  227.  ? &df->side_effects_frame
  228.  : &df->future_frame));
  229.     install_partial_transition (super, answer,
  230. tc->cset [offset], offset * 32);
  231.     return answer;
  232.   }
  233.       /* Otherwise, it's a flushed or  newly encountered edge. */
  234.       {
  235. char cset_space[1024]; /* this limit is far from unreasonable */
  236. rx_Bitset trcset;
  237. struct rx_inx *answer;
  238. if (rx_sizeof_bitset (rx->local_cset_size) > sizeof (cset_space))
  239.   return 0; /* If the arbitrary limit is hit, always fail */
  240. /* cleanly. */
  241. trcset = (rx_Bitset)cset_space;
  242. rx_lock_superstate (rx, super);
  243. if (!compute_super_edge (rx, &df, trcset, super, chr))
  244.   {
  245.     rx_unlock_superstate (rx, super);
  246.     return 0;
  247.   }
  248. if (!df) /* We just computed the fail transition. */
  249.   {
  250.     static struct rx_inx
  251.       shared_fail_frame = { 0, 0, (void *)rx_backtrack, 0 };
  252.     answer = &shared_fail_frame;
  253.   }
  254. else
  255.   {
  256.     tc = rx_super_edge (rx, super, trcset, df);
  257.     if (!tc)
  258.       {
  259. rx_unlock_superstate (rx, super);
  260. return 0;
  261.       }
  262.     answer = ((tc->options->next_same_super_edge[0] != tc->options)
  263.       ? &tc->rx_backtrack_frame
  264.       : (df->effects
  265.  ? &df->side_effects_frame
  266.  : &df->future_frame));
  267.   }
  268. install_partial_transition (super, answer,
  269.     trcset[offset], offset * 32);
  270. rx_unlock_superstate (rx, super);
  271. return answer;
  272.       }
  273.     }
  274.   else if (df->future) /* A cache miss on an edge with a future? Must be
  275. * a semi-free destination. */
  276.     {
  277.       if (df->future->is_semifree)
  278. refresh_semifree_superstate (rx->cache, df->future);
  279.       return &df->future_frame;
  280.     }
  281.   else
  282.     /* no future superstate on an existing edge */
  283.     {
  284.       rx_lock_superstate (rx, super);
  285.       if (!solve_destination (rx, df))
  286. {
  287.   rx_unlock_superstate (rx, super);
  288.   return 0;
  289. }
  290.       if (!df->effects
  291.   && (df->edge->options->next_same_super_edge[0] == df->edge->options))
  292. install_partial_transition (super, &df->future_frame,
  293.     df->edge->cset[offset], offset * 32);
  294.       rx_unlock_superstate (rx, super);
  295.       return &df->future_frame;
  296.     }
  297. }
  298. /* The rest of the code provides a regex.c compatable interface. */
  299. __const__ char *re_error_msg[] =
  300. {
  301.   0, /* REG_NOUT */
  302.   "No match", /* REG_NOMATCH */
  303.   "Invalid regular expression", /* REG_BADPAT */
  304.   "Invalid collation character", /* REG_ECOLLATE */
  305.   "Invalid character class name", /* REG_ECTYPE */
  306.   "Trailing backslash", /* REG_EESCAPE */
  307.   "Invalid back reference", /* REG_ESUBREG */
  308.   "Unmatched [ or [^", /* REG_EBRACK */
  309.   "Unmatched ( or \(", /* REG_EPAREN */
  310.   "Unmatched \{", /* REG_EBRACE */
  311.   "Invalid content of \{\}", /* REG_BADBR */
  312.   "Invalid range end", /* REG_ERANGE */
  313.   "Memory exhausted", /* REG_ESPACE */
  314.   "Invalid preceding regular expression", /* REG_BADRPT */
  315.   "Premature end of regular expression", /* REG_EEND */
  316.   "Regular expression too big", /* REG_ESIZE */
  317.   "Unmatched ) or \)", /* REG_ERPAREN */
  318. };
  319. /* 
  320.  * Macros used while compiling patterns.
  321.  *
  322.  * By convention, PEND points just past the end of the uncompiled pattern,
  323.  * P points to the read position in the pattern.  `translate' is the name
  324.  * of the translation table (`TRANSLATE' is the name of a macro that looks
  325.  * things up in `translate').
  326.  */
  327. /*
  328.  * Fetch the next character in the uncompiled pattern---translating it 
  329.  * if necessary. *Also cast from a signed character in the constant
  330.  * string passed to us by the user to an unsigned char that we can use
  331.  * as an array index (in, e.g., `translate').
  332.  */
  333. #define PATFETCH(c)
  334.  do {if (p == pend) return REG_EEND;
  335.     c = (unsigned char) *p++;
  336.     c = translate[c];  
  337.  } while (0)
  338. /* 
  339.  * Fetch the next character in the uncompiled pattern, with no
  340.  * translation.
  341.  */
  342. #define PATFETCH_RAW(c)
  343.   do {if (p == pend) return REG_EEND;
  344.     c = (unsigned char) *p++; 
  345.   } while (0)
  346. /* Go backwards one character in the pattern.  */
  347. #define PATUNFETCH p--
  348. #define TRANSLATE(d) translate[(unsigned char) (d)]
  349. typedef unsigned regnum_t;
  350. /* Since offsets can go either forwards or backwards, this type needs to
  351.  * be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.
  352.  */
  353. typedef int pattern_offset_t;
  354. typedef struct
  355. {
  356.   struct rexp_node ** top_expression; /* was begalt */
  357.   struct rexp_node ** last_expression; /* was laststart */
  358.   pattern_offset_t inner_group_offset;
  359.   regnum_t regnum;
  360. } compile_stack_elt_t;
  361. typedef struct
  362. {
  363.   compile_stack_elt_t *stack;
  364.   unsigned size;
  365.   unsigned avail; /* Offset of next open position.  */
  366. } compile_stack_type;
  367. #define INIT_COMPILE_STACK_SIZE 32
  368. #define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
  369. #define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
  370. /* The next available element.  */
  371. #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
  372. /* Set the bit for character C in a list.  */
  373. #define SET_LIST_BIT(c)                               
  374.   (b[((unsigned char) (c)) / CHARBITS]               
  375.    |= 1 << (((unsigned char) c) % CHARBITS))
  376. /* Get the next unsigned number in the uncompiled pattern.  */
  377. #define GET_UNSIGNED_NUMBER(num) 
  378.   { if (p != pend)
  379.      {
  380.        PATFETCH (c); 
  381.        while (isdigit (c)) 
  382.          { 
  383.            if (num < 0)
  384.               num = 0;
  385.            num = num * 10 + c - '0'; 
  386.            if (p == pend) 
  387.               break; 
  388.            PATFETCH (c);
  389.          } 
  390.        } 
  391.     }
  392. #define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
  393. #define IS_CHAR_CLASS(string)
  394.    (!strcmp (string, "alpha") || !strcmp (string, "upper")
  395.     || !strcmp (string, "lower") || !strcmp (string, "digit")
  396.     || !strcmp (string, "alnum") || !strcmp (string, "xdigit")
  397.     || !strcmp (string, "space") || !strcmp (string, "print")
  398.     || !strcmp (string, "punct") || !strcmp (string, "graph")
  399.     || !strcmp (string, "cntrl") || !strcmp (string, "blank"))
  400. /* These predicates are used in regex_compile. */
  401. /* P points to just after a ^ in PATTERN.  Return true if that ^ comes
  402.  * after an alternative or a begin-subexpression.  We assume there is at
  403.  * least one character before the ^.  
  404.  */
  405. #ifdef __STDC__
  406. static boolean
  407. at_begline_loc_p (__const__ char *pattern, __const__ char * p, reg_syntax_t syntax)
  408. #else
  409. static boolean
  410. at_begline_loc_p (pattern, p, syntax)
  411.      __const__ char *pattern;
  412.      __const__ char * p;
  413.      reg_syntax_t syntax;
  414. #endif
  415. {
  416.   __const__ char *prev = p - 2;
  417.   boolean prev_prev_backslash = ((prev > pattern) && (prev[-1] == '\'));
  418.   
  419.     return
  420.       
  421.       (/* After a subexpression?  */
  422.        ((*prev == '(') && ((syntax & RE_NO_BK_PARENS) || prev_prev_backslash))
  423.        ||
  424.        /* After an alternative?  */
  425.        ((*prev == '|') && ((syntax & RE_NO_BK_VBAR) || prev_prev_backslash))
  426.        );
  427. }
  428. /* The dual of at_begline_loc_p.  This one is for $.  We assume there is
  429.  * at least one character after the $, i.e., `P < PEND'.
  430.  */
  431. #ifdef __STDC__
  432. static boolean
  433. at_endline_loc_p (__const__ char *p, __const__ char *pend, int syntax)
  434. #else
  435. static boolean
  436. at_endline_loc_p (p, pend, syntax)
  437.      __const__ char *p;
  438.      __const__ char *pend;
  439.      int syntax;
  440. #endif
  441. {
  442.   __const__ char *next = p;
  443.   boolean next_backslash = (*next == '\');
  444.   __const__ char *next_next = (p + 1 < pend) ? (p + 1) : 0;
  445.   
  446.   return
  447.     (
  448.      /* Before a subexpression?  */
  449.      ((syntax & RE_NO_BK_PARENS)
  450.       ? (*next == ')')
  451.       : (next_backslash && next_next && (*next_next == ')')))
  452.     ||
  453.      /* Before an alternative?  */
  454.      ((syntax & RE_NO_BK_VBAR)
  455.       ? (*next == '|')
  456.       : (next_backslash && next_next && (*next_next == '|')))
  457.      );
  458. }
  459. unsigned char rx_id_translation[256] =
  460. {
  461.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
  462.  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  463.  20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
  464.  30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
  465.  40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
  466.  50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  467.  60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
  468.  70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  469.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
  470.  90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
  471.  100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
  472.  110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
  473.  120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
  474.  130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
  475.  140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
  476.  150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
  477.  160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
  478.  170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
  479.  180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
  480.  190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
  481.  200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
  482.  210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
  483.  220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
  484.  230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
  485.  240, 241, 242, 243, 244, 245, 246, 247, 248, 249,
  486.  250, 251, 252, 253, 254, 255
  487. };
  488. /* The compiler keeps an inverted translation table.
  489.  * This looks up/inititalize elements.
  490.  * VALID is an array of booleans that validate CACHE.
  491.  */
  492. #ifdef __STDC__
  493. static rx_Bitset
  494. inverse_translation (struct re_pattern_buffer * rxb,
  495.      char * valid, rx_Bitset cache,
  496.      unsigned char * translate, int c)
  497. #else
  498. static rx_Bitset
  499. inverse_translation (rxb, valid, cache, translate, c)
  500.      struct re_pattern_buffer * rxb;
  501.      char * valid;
  502.      rx_Bitset cache;
  503.      unsigned char * translate;
  504.      int c;
  505. #endif
  506. {
  507.   rx_Bitset cs
  508.     = cache + c * rx_bitset_numb_subsets (rxb->rx.local_cset_size); 
  509.   if (!valid[c])
  510.     {
  511.       int x;
  512.       int c_tr = TRANSLATE(c);
  513.       rx_bitset_null (rxb->rx.local_cset_size, cs);
  514.       for (x = 0; x < 256; ++x) /* &&&& 13.37 */
  515. if (TRANSLATE(x) == c_tr)
  516.   RX_bitset_enjoin (cs, x);
  517.       valid[c] = 1;
  518.     }
  519.   return cs;
  520. }
  521. /* More subroutine declarations and macros for regex_compile.  */
  522. /* Returns true if REGNUM is in one of COMPILE_STACK's elements and 
  523.    false if it's not.  */
  524. #ifdef __STDC__
  525. static boolean
  526. group_in_compile_stack (compile_stack_type compile_stack, regnum_t regnum)
  527. #else
  528. static boolean
  529. group_in_compile_stack (compile_stack, regnum)
  530.     compile_stack_type compile_stack;
  531.     regnum_t regnum;
  532. #endif
  533. {
  534.   int this_element;
  535.   for (this_element = compile_stack.avail - 1;  
  536.        this_element >= 0; 
  537.        this_element--)
  538.     if (compile_stack.stack[this_element].regnum == regnum)
  539.       return true;
  540.   return false;
  541. }
  542. /*
  543.  * Read the ending character of a range (in a bracket expression) from the
  544.  * uncompiled pattern *P_PTR (which ends at PEND).  We assume the
  545.  * starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
  546.  * Then we set the translation of all bits between the starting and
  547.  * ending characters (inclusive) in the compiled pattern B.
  548.  * 
  549.  * Return an error code.
  550.  * 
  551.  * We use these short variable names so we can use the same macros as
  552.  * `regex_compile' itself.  
  553.  */
  554. #ifdef __STDC__
  555. static reg_errcode_t
  556. compile_range (struct re_pattern_buffer * rxb, rx_Bitset cs,
  557.        __const__ char ** p_ptr, __const__ char * pend,
  558.        unsigned char * translate, reg_syntax_t syntax,
  559.        rx_Bitset inv_tr,  char * valid_inv_tr)
  560. #else
  561. static reg_errcode_t
  562. compile_range (rxb, cs, p_ptr, pend, translate, syntax, inv_tr, valid_inv_tr)
  563.      struct re_pattern_buffer * rxb;
  564.      rx_Bitset cs;
  565.      __const__ char ** p_ptr;
  566.      __const__ char * pend;
  567.      unsigned char * translate;
  568.      reg_syntax_t syntax;
  569.      rx_Bitset inv_tr;
  570.      char * valid_inv_tr;
  571. #endif
  572. {
  573.   unsigned this_char;
  574.   __const__ char *p = *p_ptr;
  575.   unsigned char range_end;
  576.   unsigned char range_start = TRANSLATE(p[-2]);
  577.   if (p == pend)
  578.     return REG_ERANGE;
  579.   PATFETCH (range_end);
  580.   (*p_ptr)++;
  581.   if (range_start > range_end)
  582.     return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
  583.   for (this_char = range_start; this_char <= range_end; this_char++)
  584.     {
  585.       rx_Bitset it =
  586. inverse_translation (rxb, valid_inv_tr, inv_tr, translate, this_char);
  587.       rx_bitset_union (rxb->rx.local_cset_size, cs, it);
  588.     }
  589.   
  590.   return REG_NOERROR;
  591. }
  592. /* This searches a regexp for backreference side effects.
  593.  * It fills in the array OUT with 1 at the index of every register pair
  594.  * referenced by a backreference.
  595.  *
  596.  * This is used to help optimize patterns for searching.  The information is
  597.  * useful because, if the caller doesn't want register values, backreferenced
  598.  * registers are the only registers for which we need rx_backtrack.
  599.  */
  600. #ifdef __STDC__
  601. static void
  602. find_backrefs (char * out, struct rexp_node * rexp,
  603.        struct re_se_params * params)
  604. #else
  605. static void
  606. find_backrefs (out, rexp, params)
  607.      char * out;
  608.      struct rexp_node * rexp;
  609.      struct re_se_params * params;
  610. #endif
  611. {
  612.   if (rexp)
  613.     switch (rexp->type)
  614.       {
  615.       case r_cset:
  616.       case r_data:
  617. return;
  618.       case r_alternate:
  619.       case r_concat:
  620.       case r_opt:
  621.       case r_star:
  622.       case r_2phase_star:
  623. find_backrefs (out, rexp->params.pair.left, params);
  624. find_backrefs (out, rexp->params.pair.right, params);
  625. return;
  626.       case r_side_effect:
  627. if (   ((long)rexp->params.side_effect >= 0)
  628.     && (params [(long)rexp->params.side_effect].se == re_se_backref))
  629.   out[ params [(long)rexp->params.side_effect].op1] = 1;
  630. return;
  631.       }
  632. }
  633. /* Returns 0 unless the pattern can match the empty string. */
  634. #ifdef __STDC__
  635. static int
  636. compute_fastset (struct re_pattern_buffer * rxb, struct rexp_node * rexp)
  637. #else
  638. static int
  639. compute_fastset (rxb, rexp)
  640.      struct re_pattern_buffer * rxb;
  641.      struct rexp_node * rexp;
  642. #endif
  643. {
  644.   if (!rexp)
  645.     return 1;
  646.   switch (rexp->type)
  647.     {
  648.     case r_data:
  649.       return 1;
  650.     case r_cset:
  651.       {
  652. rx_bitset_union (rxb->rx.local_cset_size,
  653.  rxb->fastset, rexp->params.cset);
  654.       }
  655.       return 0;
  656.     case r_concat:
  657.       return (compute_fastset (rxb, rexp->params.pair.left)
  658.       && compute_fastset (rxb, rexp->params.pair.right));
  659.     case r_2phase_star:
  660.       compute_fastset (rxb, rexp->params.pair.left);
  661.       /* compute_fastset (rxb, rexp->params.pair.right);  nope... */
  662.       return 1;
  663.     case r_alternate:
  664.       return !!(compute_fastset (rxb, rexp->params.pair.left)
  665. + compute_fastset (rxb, rexp->params.pair.right));
  666.     case r_opt:
  667.     case r_star:
  668.       compute_fastset (rxb, rexp->params.pair.left);
  669.       return 1;
  670.     case r_side_effect:
  671.       return 1;
  672.     }
  673.   /* this should never happen */
  674.   return 0;
  675. }
  676. /* returns
  677.  *  1 -- yes, definately anchored by the given side effect.
  678.  *  2 -- maybe anchored, maybe the empty string.
  679.  *  0 -- definately not anchored
  680.  *  There is simply no other possibility.
  681.  */
  682. #ifdef __STDC__
  683. static int
  684. is_anchored (struct rexp_node * rexp, rx_side_effect se)
  685. #else
  686. static int
  687. is_anchored (rexp, se)
  688.      struct rexp_node * rexp;
  689.      rx_side_effect se;
  690. #endif
  691. {
  692.   if (!rexp)
  693.     return 2;
  694.   switch (rexp->type)
  695.     {
  696.     case r_cset:
  697.     case r_data:
  698.       return 0;
  699.     case r_concat:
  700.     case r_2phase_star:
  701.       {
  702. int l = is_anchored (rexp->params.pair.left, se);
  703. return (l == 2 ? is_anchored (rexp->params.pair.right, se) : l);
  704.       }
  705.     case r_alternate:
  706.       {
  707. int l = is_anchored (rexp->params.pair.left, se);
  708. int r = l ? is_anchored (rexp->params.pair.right, se) : 0;
  709. if (l == r)
  710.   return l;
  711. else if ((l == 0) || (r == 0))
  712.   return 0;
  713. else
  714.   return 2;
  715.       }
  716.     case r_opt:
  717.     case r_star:
  718.       return is_anchored (rexp->params.pair.left, se) ? 2 : 0;
  719.       
  720.     case r_side_effect:
  721.       return ((rexp->params.side_effect == se)
  722.       ? 1 : 2);
  723.     }
  724.   /* this should never happen */
  725.   return 0;
  726. }
  727. /* This removes register assignments that aren't required by backreferencing.
  728.  * This can speed up explore_future, especially if it eliminates
  729.  * non-determinism in the superstate NFA.
  730.  * 
  731.  * NEEDED is an array of characters, presumably filled in by FIND_BACKREFS.
  732.  * The non-zero elements of the array indicate which register assignments
  733.  * can NOT be removed from the expression.
  734.  */
  735. #ifdef __STDC__
  736. static struct rexp_node *
  737. remove_unecessary_side_effects (struct rx * rx, char * needed,
  738. struct rexp_node * rexp,
  739. struct re_se_params * params)
  740. #else
  741. static struct rexp_node *
  742. remove_unecessary_side_effects (rx, needed, rexp, params)
  743.      struct rx * rx;
  744.      char * needed;
  745.      struct rexp_node * rexp;
  746.      struct re_se_params * params;
  747. #endif
  748. {
  749.   struct rexp_node * l;
  750.   struct rexp_node * r;
  751.   if (!rexp)
  752.     return 0;
  753.   else
  754.     switch (rexp->type)
  755.       {
  756.       case r_cset:
  757.       case r_data:
  758. return rexp;
  759.       case r_alternate:
  760.       case r_concat:
  761.       case r_2phase_star:
  762. l = remove_unecessary_side_effects (rx, needed,
  763.     rexp->params.pair.left, params);
  764. r = remove_unecessary_side_effects (rx, needed,
  765.     rexp->params.pair.right, params);
  766. if ((l && r) || (rexp->type != r_concat))
  767.   {
  768.     rexp->params.pair.left = l;
  769.     rexp->params.pair.right = r;
  770.     return rexp;
  771.   }
  772. else
  773.   {
  774.     rexp->params.pair.left = rexp->params.pair.right = 0;
  775.     rx_free_rexp (rx, rexp);
  776.     return l ? l : r;
  777.   }
  778.       case r_opt:
  779.       case r_star:
  780. l = remove_unecessary_side_effects (rx, needed,
  781.     rexp->params.pair.left, params);
  782. if (l)
  783.   {
  784.     rexp->params.pair.left = l;
  785.     return rexp;
  786.   }
  787. else
  788.   {
  789.     rexp->params.pair.left = 0;
  790.     rx_free_rexp (rx, rexp);
  791.     return 0;
  792.   }
  793.       case r_side_effect:
  794. {
  795.   int se = (long)rexp->params.side_effect;
  796.   if (   (se >= 0)
  797.       && (   ((enum re_side_effects)params[se].se == re_se_lparen)
  798.   || ((enum re_side_effects)params[se].se == re_se_rparen))
  799.       && (params [se].op1 > 0)
  800.       && (!needed [params [se].op1]))
  801.     {
  802.       rx_free_rexp (rx, rexp);
  803.       return 0;
  804.     }
  805.   else
  806.     return rexp;
  807. }
  808.       }
  809.   /* this should never happen */
  810.   return 0;
  811. }
  812. #ifdef __STDC__
  813. static int
  814. pointless_if_repeated (struct rexp_node * node, struct re_se_params * params)
  815. #else
  816. static int
  817. pointless_if_repeated (node, params)
  818.      struct rexp_node * node;
  819.      struct re_se_params * params;
  820. #endif
  821. {
  822.   if (!node)
  823.     return 1;
  824.   switch (node->type)
  825.     {
  826.     case r_cset:
  827.       return 0;
  828.     case r_alternate:
  829.     case r_concat:
  830.     case r_2phase_star:
  831.       return (pointless_if_repeated (node->params.pair.left, params)
  832.       && pointless_if_repeated (node->params.pair.right, params));
  833.     case r_opt:
  834.     case r_star:
  835.       return pointless_if_repeated (node->params.pair.left, params);
  836.     case r_side_effect:
  837.       switch (((long)node->params.side_effect < 0)
  838.       ? (enum re_side_effects)node->params.side_effect
  839.       : (enum re_side_effects)params[(long)node->params.side_effect].se)
  840. {
  841. case re_se_try:
  842. case re_se_at_dot:
  843. case re_se_begbuf:
  844. case re_se_hat:
  845. case re_se_wordbeg:
  846. case re_se_wordbound:
  847. case re_se_notwordbound:
  848. case re_se_wordend:
  849. case re_se_endbuf:
  850. case re_se_dollar:
  851. case re_se_fail:
  852. case re_se_win:
  853.   return 1;
  854. case re_se_lparen:
  855. case re_se_rparen:
  856. case re_se_iter:
  857. case re_se_end_iter:
  858. case re_se_syntax:
  859. case re_se_not_syntax:
  860. case re_se_backref:
  861.   return 0;
  862. }
  863.     case r_data:
  864.     default:
  865.       return 0;
  866.     }
  867. }
  868. #ifdef __STDC__
  869. static int
  870. registers_on_stack (struct re_pattern_buffer * rxb,
  871.     struct rexp_node * rexp, int in_danger,
  872.     struct re_se_params * params)
  873. #else
  874. static int
  875. registers_on_stack (rxb, rexp, in_danger, params)
  876.      struct re_pattern_buffer * rxb;
  877.      struct rexp_node * rexp;
  878.      int in_danger;
  879.      struct re_se_params * params;
  880. #endif
  881. {
  882.   if (!rexp)
  883.     return 0;
  884.   else
  885.     switch (rexp->type)
  886.       {
  887.       case r_cset:
  888.       case r_data:
  889. return 0;
  890.       case r_alternate:
  891.       case r_concat:
  892. return (   registers_on_stack (rxb, rexp->params.pair.left,
  893.        in_danger, params)
  894. || (registers_on_stack
  895.     (rxb, rexp->params.pair.right,
  896.      in_danger, params)));
  897.       case r_opt:
  898. return registers_on_stack (rxb, rexp->params.pair.left, 0, params);
  899.       case r_star:
  900. return registers_on_stack (rxb, rexp->params.pair.left, 1, params);
  901.       case r_2phase_star:
  902. return
  903.   (   registers_on_stack (rxb, rexp->params.pair.left, 1, params)
  904.    || registers_on_stack (rxb, rexp->params.pair.right, 1, params));
  905.       case r_side_effect:
  906. {
  907.   int se = (long)rexp->params.side_effect;
  908.   if (   in_danger
  909.       && (se >= 0)
  910.       && (params [se].op1 > 0)
  911.       && (   ((enum re_side_effects)params[se].se == re_se_lparen)
  912.   || ((enum re_side_effects)params[se].se == re_se_rparen)))
  913.     return 1;
  914.   else
  915.     return 0;
  916. }
  917.       }
  918.   /* this should never happen */
  919.   return 0;
  920. }
  921. static char idempotent_complex_se[] =
  922. {
  923. #define RX_WANT_SE_DEFS 1
  924. #undef RX_DEF_SE
  925. #undef RX_DEF_CPLX_SE
  926. #define RX_DEF_SE(IDEM, NAME, VALUE)       
  927. #define RX_DEF_CPLX_SE(IDEM, NAME, VALUE)     IDEM,
  928. #include "rx.h"
  929. #undef RX_DEF_SE
  930. #undef RX_DEF_CPLX_SE
  931. #undef RX_WANT_SE_DEFS
  932.   23
  933. };
  934. static char idempotent_se[] =
  935. {
  936.   13,
  937. #define RX_WANT_SE_DEFS 1
  938. #undef RX_DEF_SE
  939. #undef RX_DEF_CPLX_SE
  940. #define RX_DEF_SE(IDEM, NAME, VALUE)       IDEM,
  941. #define RX_DEF_CPLX_SE(IDEM, NAME, VALUE)     
  942. #include "rx.h"
  943. #undef RX_DEF_SE
  944. #undef RX_DEF_CPLX_SE
  945. #undef RX_WANT_SE_DEFS
  946.   42
  947. };
  948. #ifdef __STDC__
  949. static int
  950. has_any_se (struct rx * rx,
  951.     struct rexp_node * rexp)
  952. #else
  953. static int
  954. has_any_se (rx, rexp)
  955.      struct rx * rx;
  956.      struct rexp_node * rexp;
  957. #endif
  958. {
  959.   if (!rexp)
  960.     return 0;
  961.   switch (rexp->type)
  962.     {
  963.     case r_cset:
  964.     case r_data:
  965.       return 0;
  966.     case r_side_effect:
  967.       return 1;
  968.       
  969.     case r_2phase_star:
  970.     case r_concat:
  971.     case r_alternate:
  972.       return
  973. (   has_any_se (rx, rexp->params.pair.left)
  974.  || has_any_se (rx, rexp->params.pair.right));
  975.     case r_opt:
  976.     case r_star:
  977.       return has_any_se (rx, rexp->params.pair.left);
  978.     }
  979.   /* this should never happen */
  980.   return 0;
  981. }
  982. /* This must be called AFTER `convert_hard_loops' for a given REXP. */
  983. #ifdef __STDC__
  984. static int
  985. has_non_idempotent_epsilon_path (struct rx * rx,
  986.  struct rexp_node * rexp,
  987.  struct re_se_params * params)
  988. #else
  989. static int
  990. has_non_idempotent_epsilon_path (rx, rexp, params)
  991.      struct rx * rx;
  992.      struct rexp_node * rexp;
  993.      struct re_se_params * params;
  994. #endif
  995. {
  996.   if (!rexp)
  997.     return 0;
  998.   switch (rexp->type)
  999.     {
  1000.     case r_cset:
  1001.     case r_data:
  1002.     case r_star:
  1003.       return 0;
  1004.     case r_side_effect:
  1005.       return
  1006. !((long)rexp->params.side_effect > 0
  1007.   ? idempotent_complex_se [ params [(long)rexp->params.side_effect].se ]
  1008.   : idempotent_se [-(long)rexp->params.side_effect]);
  1009.       
  1010.     case r_alternate:
  1011.       return
  1012. (   has_non_idempotent_epsilon_path (rx,
  1013.      rexp->params.pair.left, params)
  1014.  || has_non_idempotent_epsilon_path (rx,
  1015.      rexp->params.pair.right, params));
  1016.     case r_2phase_star:
  1017.     case r_concat:
  1018.       return
  1019. (   has_non_idempotent_epsilon_path (rx,
  1020.      rexp->params.pair.left, params)
  1021.  && has_non_idempotent_epsilon_path (rx,
  1022.      rexp->params.pair.right, params));
  1023.     case r_opt:
  1024.       return has_non_idempotent_epsilon_path (rx,
  1025.       rexp->params.pair.left, params);
  1026.     }
  1027.   /* this should never happen */
  1028.   return 0;
  1029. }
  1030. /* This computes rougly what it's name suggests.   It can (and does) go wrong 
  1031.  * in the direction of returning spurious 0 without causing disasters.
  1032.  */
  1033. #ifdef __STDC__
  1034. static int
  1035. begins_with_complex_se (struct rx * rx, struct rexp_node * rexp)
  1036. #else
  1037. static int
  1038. begins_with_complex_se (rx, rexp)
  1039.      struct rx * rx;
  1040.      struct rexp_node * rexp;
  1041. #endif
  1042. {
  1043.   if (!rexp)
  1044.     return 0;
  1045.   switch (rexp->type)
  1046.     {
  1047.     case r_cset:
  1048.     case r_data:
  1049.       return 0;
  1050.     case r_side_effect:
  1051.       return ((long)rexp->params.side_effect >= 0);
  1052.       
  1053.     case r_alternate:
  1054.       return
  1055. (   begins_with_complex_se (rx, rexp->params.pair.left)
  1056.  && begins_with_complex_se (rx, rexp->params.pair.right));
  1057.     case r_concat:
  1058.       return has_any_se (rx, rexp->params.pair.left);
  1059.     case r_opt:
  1060.     case r_star:
  1061.     case r_2phase_star:
  1062.       return 0;
  1063.     }
  1064.   /* this should never happen */
  1065.   return 0;
  1066. }
  1067. /* This destructively removes some of the re_se_tv side effects from 
  1068.  * a rexp tree.  In particular, during parsing re_se_tv was inserted on the
  1069.  * right half of every | to guarantee that posix path preference could be 
  1070.  * honored.  This function removes some which it can be determined aren't 
  1071.  * needed.  
  1072.  */
  1073. #ifdef __STDC__
  1074. static void
  1075. speed_up_alt (struct rx * rx,
  1076.       struct rexp_node * rexp,
  1077.       int unposix)
  1078. #else
  1079. static void
  1080. speed_up_alt (rx, rexp, unposix)
  1081.      struct rx * rx;
  1082.      struct rexp_node * rexp;
  1083.      int unposix;
  1084. #endif
  1085. {
  1086.   if (!rexp)
  1087.     return;
  1088.   switch (rexp->type)
  1089.     {
  1090.     case r_cset:
  1091.     case r_data:
  1092.     case r_side_effect:
  1093.       return;
  1094.     case r_opt:
  1095.     case r_star:
  1096.       speed_up_alt (rx, rexp->params.pair.left, unposix);
  1097.       return;
  1098.     case r_2phase_star:
  1099.     case r_concat:
  1100.       speed_up_alt (rx, rexp->params.pair.left, unposix);
  1101.       speed_up_alt (rx, rexp->params.pair.right, unposix);
  1102.       return;
  1103.     case r_alternate:
  1104.       /* the right child is guaranteed to be (concat re_se_tv <subexp>) */
  1105.       speed_up_alt (rx, rexp->params.pair.left, unposix);
  1106.       speed_up_alt (rx, rexp->params.pair.right->params.pair.right, unposix);
  1107.       
  1108.       if (   unposix
  1109.   || (begins_with_complex_se
  1110.       (rx, rexp->params.pair.right->params.pair.right))
  1111.   || !(   has_any_se (rx, rexp->params.pair.right->params.pair.right)
  1112.        || has_any_se (rx, rexp->params.pair.left)))
  1113. {
  1114.   struct rexp_node * conc = rexp->params.pair.right;
  1115.   rexp->params.pair.right = conc->params.pair.right;
  1116.   conc->params.pair.right = 0;
  1117.   rx_free_rexp (rx, conc);
  1118. }
  1119.     }
  1120. }
  1121. /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
  1122.    Returns one of error codes defined in `regex.h', or zero for success.
  1123.    Assumes the `allocated' (and perhaps `buffer') and `translate'
  1124.    fields are set in BUFP on entry.
  1125.    If it succeeds, results are put in BUFP (if it returns an error, the
  1126.    contents of BUFP are undefined):
  1127.      `buffer' is the compiled pattern;
  1128.      `syntax' is set to SYNTAX;
  1129.      `used' is set to the length of the compiled pattern;
  1130.      `fastmap_accurate' is set to zero;
  1131.      `re_nsub' is set to the number of groups in PATTERN;
  1132.      `not_bol' and `not_eol' are set to zero.
  1133.    
  1134.    The `fastmap' and `newline_anchor' fields are neither
  1135.    examined nor set.  */
  1136. #ifdef __STDC__
  1137. RX_DECL reg_errcode_t
  1138. rx_compile (__const__ char *pattern, int size,
  1139.     reg_syntax_t syntax,
  1140.     struct re_pattern_buffer * rxb) 
  1141. #else
  1142. RX_DECL reg_errcode_t
  1143. rx_compile (pattern, size, syntax, rxb)
  1144.      __const__ char *pattern;
  1145.      int size;
  1146.      reg_syntax_t syntax;
  1147.      struct re_pattern_buffer * rxb;
  1148. #endif
  1149. {
  1150.   RX_subset
  1151.     inverse_translate [CHAR_SET_SIZE * rx_bitset_numb_subsets(CHAR_SET_SIZE)];
  1152.   char
  1153.     validate_inv_tr [CHAR_SET_SIZE * rx_bitset_numb_subsets(CHAR_SET_SIZE)];
  1154.   /* We fetch characters from PATTERN here.  Even though PATTERN is
  1155.      `char *' (i.e., signed), we declare these variables as unsigned, so
  1156.      they can be reliably used as array indices.  */
  1157.   register unsigned char c, c1;
  1158.   
  1159.   /* A random tempory spot in PATTERN.  */
  1160.   __const__ char *p1;
  1161.   
  1162.   /* Keeps track of unclosed groups.  */
  1163.   compile_stack_type compile_stack;
  1164.   /* Points to the current (ending) position in the pattern.  */
  1165.   __const__ char *p = pattern;
  1166.   __const__ char *pend = pattern + size;
  1167.   
  1168.   /* How to translate the characters in the pattern.  */
  1169.   unsigned char *translate = (rxb->translate
  1170.       ? rxb->translate
  1171.       : rx_id_translation);
  1172.   /* When parsing is done, this will hold the expression tree. */
  1173.   struct rexp_node * rexp = 0;
  1174.   /* In the midst of compilation, this holds onto the regexp 
  1175.    * first parst while rexp goes on to aquire additional constructs.
  1176.    */
  1177.   struct rexp_node * orig_rexp = 0;
  1178.   struct rexp_node * fewer_side_effects = 0;
  1179.   /* This and top_expression are saved on the compile stack. */
  1180.   struct rexp_node ** top_expression = &rexp;
  1181.   struct rexp_node ** last_expression = top_expression;
  1182.   
  1183.   /* Parameter to `goto append_node' */
  1184.   struct rexp_node * append;
  1185.   /* Counts open-groups as they are encountered.  This is the index of the
  1186.    * innermost group being compiled.
  1187.    */
  1188.   regnum_t regnum = 0;
  1189.   /* Place in the uncompiled pattern (i.e., the {) to
  1190.    * which to go back if the interval is invalid.  
  1191.    */
  1192.   __const__ char *beg_interval;
  1193.   struct re_se_params * params = 0;
  1194.   int paramc = 0; /* How many complex side effects so far? */
  1195.   rx_side_effect side; /* param to `goto add_side_effect' */
  1196.   bzero (validate_inv_tr, sizeof (validate_inv_tr));
  1197.   rxb->rx.instruction_table = rx_id_instruction_table;
  1198.   /* Initialize the compile stack.  */
  1199.   compile_stack.stack =  (( compile_stack_elt_t *) malloc ((INIT_COMPILE_STACK_SIZE) * sizeof ( compile_stack_elt_t)));
  1200.   if (compile_stack.stack == 0)
  1201.     return REG_ESPACE;
  1202.   compile_stack.size = INIT_COMPILE_STACK_SIZE;
  1203.   compile_stack.avail = 0;
  1204.   /* Initialize the pattern buffer.  */
  1205.   rxb->rx.cache = &default_cache;
  1206.   rxb->syntax = syntax;
  1207.   rxb->fastmap_accurate = 0;
  1208.   rxb->not_bol = rxb->not_eol = 0;
  1209.   rxb->least_subs = 0;
  1210.   
  1211.   /* Always count groups, whether or not rxb->no_sub is set.  
  1212.    * The whole pattern is implicitly group 0, so counting begins
  1213.    * with 1.
  1214.    */
  1215.   rxb->re_nsub = 0;
  1216. #if !defined (emacs) && !defined (SYNTAX_TABLE)
  1217.   /* Initialize the syntax table.  */
  1218.    init_syntax_once ();
  1219. #endif
  1220.   /* Loop through the uncompiled pattern until we're at the end.  */
  1221.   while (p != pend)
  1222.     {
  1223.       PATFETCH (c);
  1224.       switch (c)
  1225.         {
  1226.         case '^':
  1227.           {
  1228.             if (   /* If at start of pattern, it's an operator.  */
  1229.                    p == pattern + 1
  1230.                    /* If context independent, it's an operator.  */
  1231.                 || syntax & RE_CONTEXT_INDEP_ANCHORS
  1232.                    /* Otherwise, depends on what's come before.  */
  1233.                 || at_begline_loc_p (pattern, p, syntax))
  1234.       {
  1235. struct rexp_node * n
  1236.   = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)re_se_hat);
  1237. if (!n)
  1238.   return REG_ESPACE;
  1239. append = n;
  1240. goto append_node;
  1241.       }
  1242.             else
  1243.               goto normal_char;
  1244.           }
  1245.           break;
  1246.         case '$':
  1247.           {
  1248.             if (   /* If at end of pattern, it's an operator.  */
  1249.                    p == pend 
  1250.                    /* If context independent, it's an operator.  */
  1251.                 || syntax & RE_CONTEXT_INDEP_ANCHORS
  1252.                    /* Otherwise, depends on what's next.  */
  1253.                 || at_endline_loc_p (p, pend, syntax))
  1254.       {
  1255. struct rexp_node * n
  1256.   = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)re_se_dollar);
  1257. if (!n)
  1258.   return REG_ESPACE;
  1259. append = n;
  1260. goto append_node;
  1261.       }
  1262.              else
  1263.                goto normal_char;
  1264.            }
  1265.            break;
  1266. case '+':
  1267.         case '?':
  1268.           if ((syntax & RE_BK_PLUS_QM)
  1269.               || (syntax & RE_LIMITED_OPS))
  1270.             goto normal_char;
  1271.         handle_plus:
  1272.         case '*':
  1273.           /* If there is no previous pattern... */
  1274.           if (pointless_if_repeated (*last_expression, params))
  1275.             {
  1276.               if (syntax & RE_CONTEXT_INVALID_OPS)
  1277.                 return REG_BADRPT;
  1278.               else if (!(syntax & RE_CONTEXT_INDEP_OPS))
  1279.                 goto normal_char;
  1280.             }
  1281.           {
  1282.             /* 1 means zero (many) matches is allowed.  */
  1283.             char zero_times_ok = 0, many_times_ok = 0;
  1284.             /* If there is a sequence of repetition chars, collapse it
  1285.                down to just one (the right one).  We can't combine
  1286.                interval operators with these because of, e.g., `a{2}*',
  1287.                which should only match an even number of `a's.  */
  1288.             for (;;)
  1289.               {
  1290.                 zero_times_ok |= c != '+';
  1291.                 many_times_ok |= c != '?';
  1292.                 if (p == pend)
  1293.                   break;
  1294.                 PATFETCH (c);
  1295.                 if (c == '*'
  1296.                     || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
  1297.                   ;
  1298.                 else if (syntax & RE_BK_PLUS_QM  &&  c == '\')
  1299.                   {
  1300.                     if (p == pend) return REG_EESCAPE;
  1301.                     PATFETCH (c1);
  1302.                     if (!(c1 == '+' || c1 == '?'))
  1303.                       {
  1304.                         PATUNFETCH;
  1305.                         PATUNFETCH;
  1306.                         break;
  1307.                       }
  1308.                     c = c1;
  1309.                   }
  1310.                 else
  1311.                   {
  1312.                     PATUNFETCH;
  1313.                     break;
  1314.                   }
  1315.                 /* If we get here, we found another repeat character.  */
  1316.                }
  1317.             /* Star, etc. applied to an empty pattern is equivalent
  1318.                to an empty pattern.  */
  1319.             if (!last_expression)
  1320.               break;
  1321.     /* Now we know whether or not zero matches is allowed
  1322.      * and also whether or not two or more matches is allowed.
  1323.      */
  1324.     {
  1325.       struct rexp_node * inner_exp = *last_expression;
  1326.       int need_sync = 0;
  1327.       if (many_times_ok
  1328.   && has_non_idempotent_epsilon_path (&rxb->rx,
  1329.       inner_exp, params))
  1330. {
  1331.   struct rexp_node * pusher
  1332.     = rx_mk_r_side_effect (&rxb->rx,
  1333.    (rx_side_effect)re_se_pushpos);
  1334.   struct rexp_node * checker
  1335.     = rx_mk_r_side_effect (&rxb->rx,
  1336.    (rx_side_effect)re_se_chkpos);
  1337.   struct rexp_node * pushback
  1338.     = rx_mk_r_side_effect (&rxb->rx,
  1339.    (rx_side_effect)re_se_pushback);
  1340.   rx_Bitset cs = rx_cset (&rxb->rx);
  1341.   struct rexp_node * lit_t = rx_mk_r_cset (&rxb->rx, cs);
  1342.   struct rexp_node * fake_state
  1343.     = rx_mk_r_concat (&rxb->rx, pushback, lit_t);
  1344.   struct rexp_node * phase2
  1345.     = rx_mk_r_concat (&rxb->rx, checker, fake_state);
  1346.   struct rexp_node * popper
  1347.     = rx_mk_r_side_effect (&rxb->rx,
  1348.    (rx_side_effect)re_se_poppos);
  1349.   struct rexp_node * star
  1350.     = rx_mk_r_2phase_star (&rxb->rx, inner_exp, phase2);
  1351.   struct rexp_node * a
  1352.     = rx_mk_r_concat (&rxb->rx, pusher, star);
  1353.   struct rexp_node * whole_thing
  1354.     = rx_mk_r_concat (&rxb->rx, a, popper);
  1355.   if (!(pusher && star && pushback && lit_t && fake_state
  1356. && lit_t && phase2 && checker && popper
  1357. && a && whole_thing))
  1358.     return REG_ESPACE;
  1359.   RX_bitset_enjoin (cs, 't');
  1360.   *last_expression = whole_thing;
  1361. }
  1362.       else
  1363. {
  1364.   struct rexp_node * star =
  1365.     (many_times_ok ? rx_mk_r_star : rx_mk_r_opt)
  1366.       (&rxb->rx, *last_expression);
  1367.   if (!star)
  1368.     return REG_ESPACE;
  1369.   *last_expression = star;
  1370.   need_sync = has_any_se (&rxb->rx, *last_expression);
  1371. }
  1372.       if (!zero_times_ok)
  1373. {
  1374.   struct rexp_node * concat
  1375.     = rx_mk_r_concat (&rxb->rx, inner_exp,
  1376.       rx_copy_rexp (&rxb->rx,
  1377.     *last_expression));
  1378.   if (!concat)
  1379.     return REG_ESPACE;
  1380.   *last_expression = concat;
  1381. }
  1382.       if (need_sync)
  1383. {
  1384.   int sync_se = paramc;
  1385.   params = (params
  1386.     ? ((struct re_se_params *)
  1387.        realloc (params,
  1388. sizeof (*params) * (1 + paramc)))
  1389.     : ((struct re_se_params *)
  1390.        malloc (sizeof (*params))));
  1391.   if (!params)
  1392.     return REG_ESPACE;
  1393.   ++paramc;
  1394.   params [sync_se].se = re_se_tv;
  1395.   side = (rx_side_effect)sync_se;
  1396.   goto add_side_effect;
  1397. }
  1398.     }
  1399.     /* The old regex.c used to optimize `.*n'.  
  1400.      * Maybe rx should too?
  1401.      */
  1402.   }
  1403.   break;
  1404. case '.':
  1405.   {
  1406.     rx_Bitset cs = rx_cset (&rxb->rx);
  1407.     struct rexp_node * n = rx_mk_r_cset (&rxb->rx, cs);
  1408.     if (!(cs && n))
  1409.       return REG_ESPACE;
  1410.     rx_bitset_universe (rxb->rx.local_cset_size, cs);
  1411.     if (!(rxb->syntax & RE_DOT_NEWLINE))
  1412.       RX_bitset_remove (cs, 'n');
  1413.     if (!(rxb->syntax & RE_DOT_NOT_NULL))
  1414.       RX_bitset_remove (cs, 0);
  1415.     append = n;
  1416.     goto append_node;
  1417.     break;
  1418.   }
  1419.         case '[':
  1420.   if (p == pend) return REG_EBRACK;
  1421.           {
  1422.             boolean had_char_class = false;
  1423.     rx_Bitset cs = rx_cset (&rxb->rx);
  1424.     struct rexp_node * node = rx_mk_r_cset (&rxb->rx, cs);
  1425.     int is_inverted = *p == '^';
  1426.     
  1427.     if (!(node && cs))
  1428.       return REG_ESPACE;
  1429.     
  1430.     /* This branch of the switch is normally exited with
  1431.      *`goto append_node'
  1432.      */
  1433.     append = node;
  1434.     
  1435.             if (is_inverted)
  1436.       p++;
  1437.     
  1438.             /* Remember the first position in the bracket expression.  */
  1439.             p1 = p;
  1440.     
  1441.             /* Read in characters and ranges, setting map bits.  */
  1442.             for (;;)
  1443.               {
  1444.                 if (p == pend) return REG_EBRACK;
  1445.                 PATFETCH (c);
  1446.                 /*  might escape characters inside [...] and [^...].  */
  1447.                 if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\')
  1448.                   {
  1449.                     if (p == pend) return REG_EESCAPE;
  1450.     
  1451.                     PATFETCH (c1);
  1452.     {
  1453.       rx_Bitset it = inverse_translation (rxb, 
  1454.   validate_inv_tr,
  1455.   inverse_translate,
  1456.   translate,
  1457.   c1);
  1458.       rx_bitset_union (rxb->rx.local_cset_size, cs, it);
  1459.     }
  1460.                     continue;
  1461.                   }
  1462.                 /* Could be the end of the bracket expression.  If it's
  1463.                    not (i.e., when the bracket expression is `[]' so
  1464.                    far), the ']' character bit gets set way below.  */
  1465.                 if (c == ']' && p != p1 + 1)
  1466.                   goto finalize_class_and_append;
  1467.                 /* Look ahead to see if it's a range when the last thing
  1468.                    was a character class.  */
  1469.                 if (had_char_class && c == '-' && *p != ']')
  1470.                   return REG_ERANGE;
  1471.                 /* Look ahead to see if it's a range when the last thing
  1472.                    was a character: if this is a hyphen not at the
  1473.                    beginning or the end of a list, then it's the range
  1474.                    operator.  */
  1475.                 if (c == '-' 
  1476.                     && !(p - 2 >= pattern && p[-2] == '[') 
  1477.                     && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
  1478.                     && *p != ']')
  1479.                   {
  1480.                     reg_errcode_t ret
  1481.                       = compile_range (rxb, cs, &p, pend, translate, syntax,
  1482.        inverse_translate, validate_inv_tr);
  1483.                     if (ret != REG_NOERROR) return ret;
  1484.                   }
  1485.                 else if (p[0] == '-' && p[1] != ']')
  1486.                   { /* This handles ranges made up of characters only.  */
  1487.                     reg_errcode_t ret;
  1488.     
  1489.     /* Move past the `-'.  */
  1490.                     PATFETCH (c1);
  1491.                     
  1492.                     ret = compile_range (rxb, cs, &p, pend, translate, syntax,
  1493.  inverse_translate, validate_inv_tr);
  1494.                     if (ret != REG_NOERROR) return ret;
  1495.                   }
  1496.                 /* See if we're at the beginning of a possible character
  1497.                    class.  */
  1498. else if ((syntax & RE_CHAR_CLASSES)
  1499.  && (c == '[') && (*p == ':'))
  1500.                   {
  1501.                     char str[CHAR_CLASS_MAX_LENGTH + 1];
  1502.     
  1503.                     PATFETCH (c);
  1504.                     c1 = 0;
  1505.     
  1506.                     /* If pattern is `[[:'.  */
  1507.                     if (p == pend) return REG_EBRACK;
  1508.     
  1509.                     for (;;)
  1510.                       {
  1511.                         PATFETCH (c);
  1512.                         if (c == ':' || c == ']' || p == pend
  1513.                             || c1 == CHAR_CLASS_MAX_LENGTH)
  1514.   break;
  1515.                         str[c1++] = c;
  1516.                       }
  1517.                     str[c1] = '';
  1518.     
  1519.                     /* If isn't a word bracketed by `[:' and:`]':
  1520.                        undo the ending character, the letters, and leave 
  1521.                        the leading `:' and `[' (but set bits for them).  */
  1522.                     if (c == ':' && *p == ']')
  1523.                       {
  1524.                         int ch;
  1525.                         boolean is_alnum = !strcmp (str, "alnum");
  1526.                         boolean is_alpha = !strcmp (str, "alpha");
  1527.                         boolean is_blank = !strcmp (str, "blank");
  1528.                         boolean is_cntrl = !strcmp (str, "cntrl");
  1529.                         boolean is_digit = !strcmp (str, "digit");
  1530.                         boolean is_graph = !strcmp (str, "graph");
  1531.                         boolean is_lower = !strcmp (str, "lower");
  1532.                         boolean is_print = !strcmp (str, "print");
  1533.                         boolean is_punct = !strcmp (str, "punct");
  1534.                         boolean is_space = !strcmp (str, "space");
  1535.                         boolean is_upper = !strcmp (str, "upper");
  1536.                         boolean is_xdigit = !strcmp (str, "xdigit");
  1537.                         
  1538.                         if (!IS_CHAR_CLASS (str)) return REG_ECTYPE;
  1539.                         /* Throw away the ] at the end of the character
  1540.                            class.  */
  1541.                         PATFETCH (c);
  1542.                         if (p == pend) return REG_EBRACK;
  1543.                         for (ch = 0; ch < 1 << CHARBITS; ch++)
  1544.                           {
  1545.                             if (   (is_alnum  && isalnum (ch))
  1546.                                 || (is_alpha  && isalpha (ch))
  1547.                                 || (is_blank  && isblank (ch))
  1548.                                 || (is_cntrl  && iscntrl (ch))
  1549.                                 || (is_digit  && isdigit (ch))
  1550.                                 || (is_graph  && isgraph (ch))
  1551.                                 || (is_lower  && islower (ch))
  1552.                                 || (is_print  && isprint (ch))
  1553.                                 || (is_punct  && ispunct (ch))
  1554.                                 || (is_space  && isspace (ch))
  1555.                                 || (is_upper  && isupper (ch))
  1556.                                 || (is_xdigit && isxdigit (ch)))
  1557.       {
  1558. rx_Bitset it =
  1559.   inverse_translation (rxb, 
  1560.        validate_inv_tr,
  1561.        inverse_translate,
  1562.        translate,
  1563.        ch);
  1564. rx_bitset_union (rxb->rx.local_cset_size,
  1565.  cs, it);
  1566.       }
  1567.                           }
  1568.                         had_char_class = true;
  1569.                       }
  1570.                     else
  1571.                       {
  1572.                         c1++;
  1573.                         while (c1--)    
  1574.                           PATUNFETCH;
  1575. {
  1576.   rx_Bitset it =
  1577.     inverse_translation (rxb, 
  1578.  validate_inv_tr,
  1579.  inverse_translate,
  1580.  translate,
  1581.  '[');
  1582.   rx_bitset_union (rxb->rx.local_cset_size,
  1583.    cs, it);
  1584. }
  1585. {
  1586.   rx_Bitset it =
  1587.     inverse_translation (rxb, 
  1588.  validate_inv_tr,
  1589.  inverse_translate,
  1590.  translate,
  1591.  ':');
  1592.   rx_bitset_union (rxb->rx.local_cset_size,
  1593.    cs, it);
  1594. }
  1595.                         had_char_class = false;
  1596.                       }
  1597.                   }
  1598.                 else
  1599.                   {
  1600.                     had_char_class = false;
  1601.     {
  1602.       rx_Bitset it = inverse_translation (rxb, 
  1603.   validate_inv_tr,
  1604.   inverse_translate,
  1605.   translate,
  1606.   c);
  1607.       rx_bitset_union (rxb->rx.local_cset_size, cs, it);
  1608.     }
  1609.                   }
  1610.               }
  1611.   finalize_class_and_append:
  1612.     if (is_inverted)
  1613.       {
  1614. rx_bitset_complement (rxb->rx.local_cset_size, cs);
  1615. if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
  1616.   RX_bitset_remove (cs, 'n');
  1617.       }
  1618.     goto append_node;
  1619.           }
  1620.           break;
  1621. case '(':
  1622.           if (syntax & RE_NO_BK_PARENS)
  1623.             goto handle_open;
  1624.           else
  1625.             goto normal_char;
  1626.         case ')':
  1627.           if (syntax & RE_NO_BK_PARENS)
  1628.             goto handle_close;
  1629.           else
  1630.             goto normal_char;
  1631.         case 'n':
  1632.           if (syntax & RE_NEWLINE_ALT)
  1633.             goto handle_alt;
  1634.           else
  1635.             goto normal_char;
  1636. case '|':
  1637.           if (syntax & RE_NO_BK_VBAR)
  1638.             goto handle_alt;
  1639.           else
  1640.             goto normal_char;
  1641.         case '{':
  1642.   if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
  1643.     goto handle_interval;
  1644.   else
  1645.     goto normal_char;
  1646.         case '\':
  1647.           if (p == pend) return REG_EESCAPE;
  1648.           /* Do not translate the character after the , so that we can
  1649.              distinguish, e.g., B from b, even if we normally would
  1650.              translate, e.g., B to b.  */
  1651.           PATFETCH_RAW (c);
  1652.           switch (c)
  1653.             {
  1654.             case '(':
  1655.               if (syntax & RE_NO_BK_PARENS)
  1656.                 goto normal_backslash;
  1657.             handle_open:
  1658.               rxb->re_nsub++;
  1659.               regnum++;
  1660.               if (COMPILE_STACK_FULL)
  1661.                 { 
  1662.                   ((compile_stack.stack) =
  1663.    (compile_stack_elt_t *) realloc (compile_stack.stack, ( compile_stack.size << 1) * sizeof (
  1664.       compile_stack_elt_t)));
  1665.                   if (compile_stack.stack == 0) return REG_ESPACE;
  1666.                   compile_stack.size <<= 1;
  1667.                 }
  1668.       if (*last_expression)
  1669. {
  1670.   struct rexp_node * concat
  1671.     = rx_mk_r_concat (&rxb->rx, *last_expression, 0);
  1672.   if (!concat)
  1673.     return REG_ESPACE;
  1674.   *last_expression = concat;
  1675.   last_expression = &concat->params.pair.right;
  1676. }
  1677.               /*
  1678.        * These are the values to restore when we hit end of this
  1679.                * group.  
  1680.        */
  1681.       COMPILE_STACK_TOP.top_expression = top_expression;
  1682.       COMPILE_STACK_TOP.last_expression = last_expression;
  1683.               COMPILE_STACK_TOP.regnum = regnum;
  1684.       
  1685.               compile_stack.avail++;
  1686.       
  1687.       top_expression = last_expression;
  1688.       break;
  1689.             case ')':
  1690.               if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
  1691.             handle_close:
  1692.               /* See similar code for backslashed left paren above.  */
  1693.               if (COMPILE_STACK_EMPTY)
  1694.                 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
  1695.                   goto normal_char;
  1696.                 else
  1697.                   return REG_ERPAREN;
  1698.               /* Since we just checked for an empty stack above, this
  1699.                  ``can't happen''.  */
  1700.               {
  1701.                 /* We don't just want to restore into `regnum', because
  1702.                    later groups should continue to be numbered higher,
  1703.                    as in `(ab)c(de)' -- the second group is #2.  */
  1704.                 regnum_t this_group_regnum;
  1705. struct rexp_node ** inner = top_expression;
  1706.                 compile_stack.avail--;
  1707. top_expression = COMPILE_STACK_TOP.top_expression;
  1708. last_expression = COMPILE_STACK_TOP.last_expression;
  1709.                 this_group_regnum = COMPILE_STACK_TOP.regnum;
  1710. {
  1711.   int left_se = paramc;
  1712.   int right_se = paramc + 1;
  1713.   params = (params
  1714.     ? ((struct re_se_params *)
  1715.        realloc (params,
  1716. (paramc + 2) * sizeof (params[0])))
  1717.     : ((struct re_se_params *)
  1718.        malloc (2 * sizeof (params[0]))));
  1719.   if (!params)
  1720.     return REG_ESPACE;
  1721.   paramc += 2;
  1722.   params[left_se].se = re_se_lparen;
  1723.   params[left_se].op1 = this_group_regnum;
  1724.   params[right_se].se = re_se_rparen;
  1725.   params[right_se].op1 = this_group_regnum;
  1726.   {
  1727.     struct rexp_node * left
  1728.       = rx_mk_r_side_effect (&rxb->rx,
  1729.      (rx_side_effect)left_se);
  1730.     struct rexp_node * right
  1731.       = rx_mk_r_side_effect (&rxb->rx,
  1732.      (rx_side_effect)right_se);
  1733.     struct rexp_node * c1
  1734.       = (*inner
  1735.  ? rx_mk_r_concat (&rxb->rx, left, *inner) : left);
  1736.     struct rexp_node * c2
  1737.       = rx_mk_r_concat (&rxb->rx, c1, right);
  1738.     if (!(left && right && c1 && c2))
  1739.       return REG_ESPACE;
  1740.     *inner = c2;
  1741.   }
  1742. }
  1743. break;
  1744.       }
  1745.             case '|': /* `|'.  */
  1746.               if ((syntax & RE_LIMITED_OPS) || (syntax & RE_NO_BK_VBAR))
  1747.                 goto normal_backslash;
  1748.             handle_alt:
  1749.               if (syntax & RE_LIMITED_OPS)
  1750.                 goto normal_char;
  1751.       {
  1752. struct rexp_node * alt
  1753.   = rx_mk_r_alternate (&rxb->rx, *top_expression, 0);
  1754. if (!alt)
  1755.   return REG_ESPACE;
  1756. *top_expression = alt;
  1757. last_expression = &alt->params.pair.right;
  1758. {
  1759.   int sync_se = paramc;
  1760.   params = (params
  1761.     ? ((struct re_se_params *)
  1762.        realloc (params,
  1763. (paramc + 1) * sizeof (params[0])))
  1764.     : ((struct re_se_params *)
  1765.        malloc (sizeof (params[0]))));
  1766.   if (!params)
  1767.     return REG_ESPACE;
  1768.   ++paramc;
  1769.   params[sync_se].se = re_se_tv;
  1770.   {
  1771.     struct rexp_node * sync
  1772.       = rx_mk_r_side_effect (&rxb->rx,
  1773.      (rx_side_effect)sync_se);
  1774.     struct rexp_node * conc
  1775.       = rx_mk_r_concat (&rxb->rx, sync, 0);
  1776.     if (!sync || !conc)
  1777.       return REG_ESPACE;
  1778.     *last_expression = conc;
  1779.     last_expression = &conc->params.pair.right;
  1780.   }
  1781. }
  1782.       }
  1783.               break;
  1784.             case '{': 
  1785.               /* If { is a literal.  */
  1786.               if (!(syntax & RE_INTERVALS)
  1787.                      /* If we're at `{' and it's not the open-interval 
  1788.                         operator.  */
  1789.                   || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
  1790.                   || (p - 2 == pattern  &&  p == pend))
  1791.                 goto normal_backslash;
  1792.             handle_interval:
  1793.               {
  1794.                 /* If got here, then the syntax allows intervals.  */
  1795.                 /* At least (most) this many matches must be made.  */
  1796.                 int lower_bound = -1, upper_bound = -1;
  1797.                 beg_interval = p - 1;
  1798.                 if (p == pend)
  1799.                   {
  1800.                     if (syntax & RE_NO_BK_BRACES)
  1801.                       goto unfetch_interval;
  1802.                     else
  1803.                       return REG_EBRACE;
  1804.                   }
  1805.                 GET_UNSIGNED_NUMBER (lower_bound);
  1806.                 if (c == ',')
  1807.                   {
  1808.                     GET_UNSIGNED_NUMBER (upper_bound);
  1809.                     if (upper_bound < 0) upper_bound = RE_DUP_MAX;
  1810.                   }
  1811.                 else
  1812.                   /* Interval such as `{1}' => match exactly once. */
  1813.                   upper_bound = lower_bound;
  1814.                 if (lower_bound < 0 || upper_bound > RE_DUP_MAX
  1815.                     || lower_bound > upper_bound)
  1816.                   {
  1817.                     if (syntax & RE_NO_BK_BRACES)
  1818.                       goto unfetch_interval;
  1819.                     else 
  1820.                       return REG_BADBR;
  1821.                   }
  1822.                 if (!(syntax & RE_NO_BK_BRACES)) 
  1823.                   {
  1824.                     if (c != '\') return REG_EBRACE;
  1825.                     PATFETCH (c);
  1826.                   }
  1827.                 if (c != '}')
  1828.                   {
  1829.                     if (syntax & RE_NO_BK_BRACES)
  1830.                       goto unfetch_interval;
  1831.                     else 
  1832.                       return REG_BADBR;
  1833.                   }
  1834.                 /* We just parsed a valid interval.  */
  1835.                 /* If it's invalid to have no preceding re.  */
  1836.                 if (pointless_if_repeated (*last_expression, params))
  1837.                   {
  1838.                     if (syntax & RE_CONTEXT_INVALID_OPS)
  1839.                       return REG_BADRPT;
  1840.                     else if (!(syntax & RE_CONTEXT_INDEP_OPS))
  1841.                       goto unfetch_interval;
  1842.     /* was: else laststart = b; */
  1843.                   }
  1844.                 /* If the upper bound is zero, don't want to iterate
  1845.                  * at all.
  1846.  */
  1847.                  if (upper_bound == 0)
  1848.    {
  1849.      if (*last_expression)
  1850.        {
  1851.  rx_free_rexp (&rxb->rx, *last_expression);
  1852.  *last_expression = 0;
  1853.        }
  1854.    }
  1855. else
  1856.   /* Otherwise, we have a nontrivial interval. */
  1857.   {
  1858.     int iter_se = paramc;
  1859.     int end_se = paramc + 1;
  1860.     params = (params
  1861.       ? ((struct re_se_params *)
  1862.  realloc (params,
  1863.   sizeof (*params) * (2 + paramc)))
  1864.       : ((struct re_se_params *)
  1865.  malloc (2 * sizeof (*params))));
  1866.     if (!params)
  1867.       return REG_ESPACE;
  1868.     paramc += 2;
  1869.     params [iter_se].se = re_se_iter;
  1870.     params [iter_se].op1 = lower_bound;
  1871.     params[iter_se].op2 = upper_bound;
  1872.     params[end_se].se = re_se_end_iter;
  1873.     params[end_se].op1 = lower_bound;
  1874.     params[end_se].op2 = upper_bound;
  1875.     {
  1876.       struct rexp_node * push0
  1877. = rx_mk_r_side_effect (&rxb->rx,
  1878.        (rx_side_effect)re_se_push0);
  1879.       struct rexp_node * start_one_iter
  1880. = rx_mk_r_side_effect (&rxb->rx,
  1881.        (rx_side_effect)iter_se);
  1882.       struct rexp_node * phase1
  1883. = rx_mk_r_concat (&rxb->rx, start_one_iter,
  1884.   *last_expression);
  1885.       struct rexp_node * pushback
  1886. = rx_mk_r_side_effect (&rxb->rx,
  1887.        (rx_side_effect)re_se_pushback);
  1888.       rx_Bitset cs = rx_cset (&rxb->rx);
  1889.       struct rexp_node * lit_t
  1890. = rx_mk_r_cset (&rxb->rx, cs);
  1891.       struct rexp_node * phase2
  1892. = rx_mk_r_concat (&rxb->rx, pushback, lit_t);
  1893.       struct rexp_node * loop
  1894. = rx_mk_r_2phase_star (&rxb->rx, phase1, phase2);
  1895.       struct rexp_node * push_n_loop
  1896. = rx_mk_r_concat (&rxb->rx, push0, loop);
  1897.       struct rexp_node * final_test
  1898. = rx_mk_r_side_effect (&rxb->rx,
  1899.        (rx_side_effect)end_se);
  1900.       struct rexp_node * full_exp
  1901. = rx_mk_r_concat (&rxb->rx, push_n_loop, final_test);
  1902.       if (!(push0 && start_one_iter && phase1
  1903.     && pushback && lit_t && phase2
  1904.     && loop && push_n_loop && final_test && full_exp))
  1905. return REG_ESPACE;
  1906.       RX_bitset_enjoin(cs, 't');
  1907.       *last_expression = full_exp;
  1908.     }
  1909.   }
  1910.                 beg_interval = 0;
  1911.               }
  1912.               break;
  1913.             unfetch_interval:
  1914.               /* If an invalid interval, match the characters as literals.  */
  1915.                p = beg_interval;
  1916.                beg_interval = NULL;
  1917.                /* normal_char and normal_backslash need `c'.  */
  1918.                PATFETCH (c);
  1919.                if (!(syntax & RE_NO_BK_BRACES))
  1920.                  {
  1921.                    if (p > pattern  &&  p[-1] == '\')
  1922.                      goto normal_backslash;
  1923.                  }
  1924.                goto normal_char;
  1925. #ifdef emacs
  1926.             /* There is no way to specify the before_dot and after_dot
  1927.                operators.  rms says this is ok.  --karl  */
  1928.             case '=':
  1929.       side = at_dot;
  1930.       goto add_side_effect;
  1931.               break;
  1932.             case 's':
  1933.     case 'S':
  1934.       {
  1935. rx_Bitset cs = cset (&rxb->rx);
  1936. struct rexp_node * set = rx_mk_r_cset (&rxb->rx, cs);
  1937. if (!(cs && set))
  1938.   return REG_ESPACE;
  1939. if (c == 'S')
  1940.   rx_bitset_universe (rxb->rx.local_cset_size, cs);
  1941. PATFETCH (c);
  1942. {
  1943.   int x;
  1944.   char code = syntax_spec_code (c);
  1945.   for (x = 0; x < 256; ++x)
  1946.     {
  1947.       
  1948.       if (SYNTAX (x) & code)
  1949. {
  1950.   rx_Bitset it =
  1951.     inverse_translation (rxb, validate_inv_tr,
  1952.  inverse_translate,
  1953.  translate, x);
  1954.   rx_bitset_xor (rxb->rx.local_cset_size, cs, it);
  1955. }
  1956.     }
  1957. }
  1958. goto append_node;
  1959.       }
  1960.               break;
  1961. #endif /* emacs */
  1962.             case 'w':
  1963.             case 'W':
  1964.       {
  1965. rx_Bitset cs = rx_cset (&rxb->rx);
  1966. struct rexp_node * n = (cs ? rx_mk_r_cset (&rxb->rx, cs) : 0);
  1967. if (!(cs && n))
  1968.   return REG_ESPACE;
  1969. if (c == 'W')
  1970.   rx_bitset_universe (rxb->rx.local_cset_size ,cs);
  1971. {
  1972.   int x;
  1973.   for (x = rxb->rx.local_cset_size - 1; x > 0; --x)
  1974.     if (re_syntax_table[x] & Sword)
  1975.       RX_bitset_toggle (cs, x);
  1976. }
  1977. append = n;
  1978. goto append_node;
  1979.       }
  1980.               break;
  1981. /* With a little extra work, some of these side effects could be optimized
  1982.  * away (basicly by looking at what we already know about the surrounding
  1983.  * chars).  
  1984.  */
  1985.             case '<':
  1986.       side = (rx_side_effect)re_se_wordbeg;
  1987.       goto add_side_effect;
  1988.               break;
  1989.             case '>':
  1990.               side = (rx_side_effect)re_se_wordend;
  1991.       goto add_side_effect;
  1992.               break;
  1993.             case 'b':
  1994.               side = (rx_side_effect)re_se_wordbound;
  1995.       goto add_side_effect;
  1996.               break;
  1997.             case 'B':
  1998.               side = (rx_side_effect)re_se_notwordbound;
  1999.       goto add_side_effect;
  2000.               break;
  2001.             case '`':
  2002.       side = (rx_side_effect)re_se_begbuf;
  2003.       goto add_side_effect;
  2004.       break;
  2005.       
  2006.             case ''':
  2007.       side = (rx_side_effect)re_se_endbuf;
  2008.       goto add_side_effect;
  2009.               break;
  2010.     add_side_effect:
  2011.       {
  2012. struct rexp_node * se
  2013.   = rx_mk_r_side_effect (&rxb->rx, side);
  2014. if (!se)
  2015.   return REG_ESPACE;
  2016. append = se;
  2017. goto append_node;
  2018.       }
  2019.       break;
  2020.             case '1': case '2': case '3': case '4': case '5':
  2021.             case '6': case '7': case '8': case '9':
  2022.               if (syntax & RE_NO_BK_REFS)
  2023.                 goto normal_char;
  2024.               c1 = c - '0';
  2025.               if (c1 > regnum)
  2026.                 return REG_ESUBREG;
  2027.               /* Can't back reference to a subexpression if inside of it.  */
  2028.               if (group_in_compile_stack (compile_stack, c1))
  2029. return REG_ESUBREG;
  2030.       {
  2031. int backref_se = paramc;
  2032. params = (params
  2033.   ? ((struct re_se_params *)
  2034.      realloc (params,
  2035.       sizeof (*params) * (1 + paramc)))
  2036.   : ((struct re_se_params *)
  2037.      malloc (sizeof (*params))));
  2038. if (!params)
  2039.   return REG_ESPACE;
  2040. ++paramc;
  2041. params[backref_se].se = re_se_backref;
  2042. params[backref_se].op1 = c1;
  2043. side = (rx_side_effect)backref_se;
  2044. goto add_side_effect;
  2045.       }
  2046.               break;
  2047.             case '+':
  2048.             case '?':
  2049.               if (syntax & RE_BK_PLUS_QM)
  2050.                 goto handle_plus;
  2051.               else
  2052.                 goto normal_backslash;
  2053.             default:
  2054.             normal_backslash:
  2055.               /* You might think it would be useful for  to mean
  2056.                  not to translate; but if we don't translate it
  2057.                  it will never match anything.  */
  2058.               c = TRANSLATE (c);
  2059.               goto normal_char;
  2060.             }
  2061.           break;
  2062. default:
  2063.         /* Expects the character in `c'.  */
  2064. normal_char:
  2065.     {
  2066.       rx_Bitset cs = rx_cset(&rxb->rx);
  2067.       struct rexp_node * match = rx_mk_r_cset (&rxb->rx, cs);
  2068.       rx_Bitset it;
  2069.       if (!(cs && match))
  2070. return REG_ESPACE;
  2071.       it = inverse_translation (rxb, validate_inv_tr,
  2072. inverse_translate, translate, c);
  2073.       rx_bitset_union (CHAR_SET_SIZE, cs, it);
  2074.       append = match;
  2075.     append_node:
  2076.       /* This genericly appends the rexp APPEND to *LAST_EXPRESSION
  2077.        * and then parses the next character normally.
  2078.        */
  2079.       if (*last_expression)
  2080. {
  2081.   struct rexp_node * concat
  2082.     = rx_mk_r_concat (&rxb->rx, *last_expression, append);
  2083.   if (!concat)
  2084.     return REG_ESPACE;
  2085.   *last_expression = concat;
  2086.   last_expression = &concat->params.pair.right;
  2087. }
  2088.       else
  2089. *last_expression = append;
  2090.     }
  2091. } /* switch (c) */
  2092.     } /* while p != pend */
  2093.   
  2094.   {
  2095.     int win_se = paramc;
  2096.     params = (params
  2097.       ? ((struct re_se_params *)
  2098.  realloc (params,
  2099.   sizeof (*params) * (1 + paramc)))
  2100.       : ((struct re_se_params *)
  2101.  malloc (sizeof (*params))));
  2102.     if (!params)
  2103.       return REG_ESPACE;
  2104.     ++paramc;
  2105.     params[win_se].se = re_se_win;
  2106.     {
  2107.       struct rexp_node * se
  2108. = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)win_se);
  2109.       struct rexp_node * concat
  2110. = rx_mk_r_concat (&rxb->rx, rexp, se);
  2111.       if (!(se && concat))
  2112. return REG_ESPACE;
  2113.       rexp = concat;
  2114.     }
  2115.   }
  2116.   /* Through the pattern now.  */
  2117.   if (!COMPILE_STACK_EMPTY) 
  2118.     return REG_EPAREN;
  2119.       free (compile_stack.stack);
  2120.   orig_rexp = rexp;
  2121. #ifdef RX_DEBUG
  2122.   if (rx_debug_compile)
  2123.     {
  2124.       dbug_rxb = rxb;
  2125.       fputs ("nnCompiling ", stdout);
  2126.       fwrite (pattern, 1, size, stdout);
  2127.       fputs (":n", stdout);
  2128.       rxb->se_params = params;
  2129.       print_rexp (&rxb->rx, orig_rexp, 2, re_seprint, stdout);
  2130.     }
  2131. #endif
  2132.   {
  2133.     rx_Bitset cs = rx_cset(&rxb->rx);
  2134.     rx_Bitset cs2 = rx_cset(&rxb->rx);
  2135.     char * se_map = (char *) alloca (paramc);
  2136.     struct rexp_node * new_rexp = 0;
  2137.     bzero (se_map, paramc);
  2138.     find_backrefs (se_map, rexp, params);
  2139.     fewer_side_effects =
  2140.       remove_unecessary_side_effects (&rxb->rx, se_map,
  2141.       rx_copy_rexp (&rxb->rx, rexp), params);
  2142.     speed_up_alt (&rxb->rx, rexp, 0);
  2143.     speed_up_alt (&rxb->rx, fewer_side_effects, 1);
  2144.     {
  2145.       char * syntax_parens = rxb->syntax_parens;
  2146.       if (syntax_parens == (char *)0x1)
  2147. rexp = remove_unecessary_side_effects
  2148.   (&rxb->rx, se_map, rexp, params);
  2149.       else if (syntax_parens)
  2150. {
  2151.   int x;
  2152.   for (x = 0; x < paramc; ++x)
  2153.     if ((   (params[x].se == re_se_lparen)
  2154.  || (params[x].se == re_se_rparen))
  2155. && (!syntax_parens [params[x].op1]))
  2156.       se_map [x] = 1;
  2157.   rexp = remove_unecessary_side_effects
  2158.     (&rxb->rx, se_map, rexp, params);
  2159. }
  2160.     }
  2161.     /* At least one more optimization would be nice to have here but i ran out 
  2162.      * of time.  The idea would be to delay side effects.  
  2163.      * For examle, `(abc)' is the same thing as `abc()' except that the
  2164.      * left paren is offset by 3 (which we know at compile time).
  2165.      * (In this comment, write that second pattern `abc(:3:)' 
  2166.      * where `(:3:' is a syntactic unit.)
  2167.      *
  2168.      * Trickier:  `(abc|defg)'  is the same as `(abc(:3:|defg(:4:))'
  2169.      * (The paren nesting may be hard to follow -- that's an alternation
  2170.      * of `abc(:3:' and `defg(:4:' inside (purely syntactic) parens
  2171.      *  followed by the closing paren from the original expression.)
  2172.      *
  2173.      * Neither the expression tree representation nor the the nfa make
  2174.      * this very easy to write. :(
  2175.      */
  2176.   /* What we compile is different than what the parser returns.
  2177.    * Suppose the parser returns expression R.
  2178.    * Let R' be R with unnecessary register assignments removed 
  2179.    * (see REMOVE_UNECESSARY_SIDE_EFFECTS, above).
  2180.    *
  2181.    * What we will compile is the expression:
  2182.    *
  2183.    *    m{try}R{win}|s{try}R'{win}
  2184.    *
  2185.    * {try} and {win} denote side effect epsilons (see EXPLORE_FUTURE).
  2186.    * 
  2187.    * When trying a match, we insert an `m' at the beginning of the 
  2188.    * string if the user wants registers to be filled, `s' if not.
  2189.    */
  2190.     new_rexp =
  2191.       rx_mk_r_alternate
  2192. (&rxb->rx,
  2193.  rx_mk_r_concat (&rxb->rx, rx_mk_r_cset (&rxb->rx, cs2), rexp),
  2194.  rx_mk_r_concat (&rxb->rx,
  2195.  rx_mk_r_cset (&rxb->rx, cs), fewer_side_effects));
  2196.     if (!(new_rexp && cs && cs2))
  2197.       return REG_ESPACE;
  2198.     RX_bitset_enjoin (cs2, ''); /* prefixed to the rexp used for matching. */
  2199.     RX_bitset_enjoin (cs, '1'); /* prefixed to the rexp used for searching. */
  2200.     rexp = new_rexp;
  2201.   }
  2202. #ifdef RX_DEBUG
  2203.   if (rx_debug_compile)
  2204.     {
  2205.       fputs ("n...which is compiled as:n", stdout);
  2206.       print_rexp (&rxb->rx, rexp, 2, re_seprint, stdout);
  2207.     }
  2208. #endif
  2209.   {
  2210.     struct rx_nfa_state *start = 0;
  2211.     struct rx_nfa_state *end = 0;
  2212.     if (!rx_build_nfa (&rxb->rx, rexp, &start, &end))
  2213.       return REG_ESPACE; /*  */
  2214.     else
  2215.       {
  2216. void * mem = (void *)rxb->buffer;
  2217. unsigned long size = rxb->allocated;
  2218. int start_id;
  2219. char * perm_mem;
  2220. int iterator_size = paramc * sizeof (params[0]);
  2221. end->is_final = 1;
  2222. start->is_start = 1;
  2223. rx_name_nfa_states (&rxb->rx);
  2224. start_id = start->id;
  2225. #ifdef RX_DEBUG
  2226. if (rx_debug_compile)
  2227.   {
  2228.     fputs ("...giving the NFA: n", stdout);
  2229.     dbug_rxb = rxb;
  2230.     print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout);
  2231.   }
  2232. #endif
  2233. if (!rx_eclose_nfa (&rxb->rx))
  2234.   return REG_ESPACE;
  2235. else
  2236.   {
  2237.     rx_delete_epsilon_transitions (&rxb->rx);
  2238.     
  2239.     /* For compatability reasons, we need to shove the
  2240.      * compiled nfa into one chunk of malloced memory.
  2241.      */
  2242.     rxb->rx.reserved = (   sizeof (params[0]) * paramc
  2243. +  rx_sizeof_bitset (rxb->rx.local_cset_size));
  2244. #ifdef RX_DEBUG
  2245.     if (rx_debug_compile)
  2246.       {
  2247. dbug_rxb = rxb;
  2248. fputs ("...which cooks down (uncompactified) to: n", stdout);
  2249. print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout);
  2250.       }
  2251. #endif
  2252.     if (!rx_compactify_nfa (&rxb->rx, &mem, &size))
  2253.       return REG_ESPACE;
  2254.     rxb->buffer = mem;
  2255.     rxb->allocated = size;
  2256.     rxb->rx.buffer = mem;
  2257.     rxb->rx.allocated = size;
  2258.     perm_mem = ((char *)rxb->rx.buffer
  2259. + rxb->rx.allocated - rxb->rx.reserved);
  2260.     rxb->se_params = ((struct re_se_params *)perm_mem);
  2261.     bcopy (params, rxb->se_params, iterator_size);
  2262.     perm_mem += iterator_size;
  2263.     rxb->fastset = (rx_Bitset) perm_mem;
  2264.     rxb->start = rx_id_to_nfa_state (&rxb->rx, start_id);
  2265.   }
  2266. rx_bitset_null (rxb->rx.local_cset_size, rxb->fastset);
  2267. rxb->can_match_empty = compute_fastset (rxb, orig_rexp);
  2268. rxb->match_regs_on_stack =
  2269.   registers_on_stack (rxb, orig_rexp, 0, params); 
  2270. rxb->search_regs_on_stack =
  2271.   registers_on_stack (rxb, fewer_side_effects, 0, params);
  2272. if (rxb->can_match_empty)
  2273.   rx_bitset_universe (rxb->rx.local_cset_size, rxb->fastset);
  2274. rxb->is_anchored = is_anchored (orig_rexp, (rx_side_effect) re_se_hat);
  2275. rxb->begbuf_only = is_anchored (orig_rexp,
  2276. (rx_side_effect) re_se_begbuf);
  2277.       }
  2278.     rx_free_rexp (&rxb->rx, rexp);
  2279.     if (params)
  2280.       free (params);
  2281. #ifdef RX_DEBUG
  2282.     if (rx_debug_compile)
  2283.       {
  2284. dbug_rxb = rxb;
  2285. fputs ("...which cooks down to: n", stdout);
  2286. print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout);
  2287.       }
  2288. #endif
  2289.   }
  2290.   return REG_NOERROR;
  2291. }
  2292. /* This table gives an error message for each of the error codes listed
  2293.    in regex.h.  Obviously the order here has to be same as there.  */
  2294. __const__ char * rx_error_msg[] =
  2295. { 0, /* REG_NOERROR */
  2296.     "No match", /* REG_NOMATCH */
  2297.     "Invalid regular expression", /* REG_BADPAT */
  2298.     "Invalid collation character", /* REG_ECOLLATE */
  2299.     "Invalid character class name", /* REG_ECTYPE */
  2300.     "Trailing backslash", /* REG_EESCAPE */
  2301.     "Invalid back reference", /* REG_ESUBREG */
  2302.     "Unmatched [ or [^", /* REG_EBRACK */
  2303.     "Unmatched ( or \(", /* REG_EPAREN */
  2304.     "Unmatched \{", /* REG_EBRACE */
  2305.     "Invalid content of \{\}", /* REG_BADBR */
  2306.     "Invalid range end", /* REG_ERANGE */
  2307.     "Memory exhausted", /* REG_ESPACE */
  2308.     "Invalid preceding regular expression", /* REG_BADRPT */
  2309.     "Premature end of regular expression", /* REG_EEND */
  2310.     "Regular expression too big", /* REG_ESIZE */
  2311.     "Unmatched ) or \)", /* REG_ERPAREN */
  2312. };
  2313. char rx_slowmap [256] =
  2314. {
  2315.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2316.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2317.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2318.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2319.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2320.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2321.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2322.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2323.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2324.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2325.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2326.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2327.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2328.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2329.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2330.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  2331. };
  2332. #ifdef __STDC__
  2333. RX_DECL void
  2334. rx_blow_up_fastmap (struct re_pattern_buffer * rxb)
  2335. #else
  2336. RX_DECL void
  2337. rx_blow_up_fastmap (rxb)
  2338.      struct re_pattern_buffer * rxb;
  2339. #endif
  2340. {
  2341.   int x;
  2342.   for (x = 0; x < 256; ++x) /* &&&& 3.6 % */
  2343.     rxb->fastmap [x] = !!RX_bitset_member (rxb->fastset, x);
  2344.   rxb->fastmap_accurate = 1;
  2345. }
  2346. #if !defined(REGEX_MALLOC) && !defined(__GNUC__)
  2347. #define RE_SEARCH_2_FN inner_re_search_2
  2348. #define RE_S2_QUAL static
  2349. #else
  2350. #define RE_SEARCH_2_FN re_search_2
  2351. #define RE_S2_QUAL 
  2352. #endif
  2353. struct re_search_2_closure
  2354. {
  2355.   __const__ char * string1;
  2356.   int size1;
  2357.   __const__ char * string2;
  2358.   int size2;
  2359. };
  2360. static __inline__ enum rx_get_burst_return
  2361. re_search_2_get_burst (pos, vclosure, stop)
  2362.      struct rx_string_position * pos;
  2363.      void * vclosure;
  2364.      int stop;
  2365. {
  2366.   struct re_search_2_closure * closure;
  2367.   closure = (struct re_search_2_closure *)vclosure;
  2368.   if (!closure->string2)
  2369.     {
  2370.       int inset;
  2371.       inset = pos->pos - pos->string;
  2372.       if ((inset < 0) || (inset > closure->size1))
  2373. return rx_get_burst_no_more;
  2374.       else
  2375. {
  2376.   pos->pos = closure->string1 + inset;
  2377.   pos->string = closure->string1;
  2378.   pos->size = closure->size1;
  2379.   pos->end = ((__const__ unsigned char *)
  2380.       MIN(closure->string1 + closure->size1,
  2381.   closure->string1 + stop));
  2382.   pos->offset = 0;
  2383.   return ((pos->pos < pos->end)
  2384.   ? rx_get_burst_ok
  2385.   :  rx_get_burst_no_more);
  2386. }
  2387.     }
  2388.   else if (!closure->string1)
  2389.     {
  2390.       int inset;
  2391.       inset = pos->pos - pos->string;
  2392.       pos->pos = closure->string2 + inset;
  2393.       pos->string = closure->string2;
  2394.       pos->size = closure->size2;
  2395.       pos->end = ((__const__ unsigned char *)
  2396.   MIN(closure->string2 + closure->size2,
  2397.       closure->string2 + stop));
  2398.       pos->offset = 0;
  2399.       return ((pos->pos < pos->end)
  2400.       ? rx_get_burst_ok
  2401.       :  rx_get_burst_no_more);
  2402.     }
  2403.   else
  2404.     {
  2405.       int inset;
  2406.       inset = pos->pos - pos->string;
  2407.       if (inset < closure->size1)
  2408. {
  2409.   pos->pos = closure->string1 + inset;
  2410.   pos->string = closure->string1;
  2411.   pos->size = closure->size1;
  2412.   pos->end = ((__const__ unsigned char *)
  2413.       MIN(closure->string1 + closure->size1,
  2414.   closure->string1 + stop));
  2415.   pos->offset = 0;
  2416.   return rx_get_burst_ok;
  2417. }
  2418.       else
  2419. {
  2420.   pos->pos = closure->string2 + inset - closure->size1;
  2421.   pos->string = closure->string2;
  2422.   pos->size = closure->size2;
  2423.   pos->end = ((__const__ unsigned char *)
  2424.       MIN(closure->string2 + closure->size2,
  2425.   closure->string2 + stop - closure->size1));
  2426.   pos->offset = closure->size1;
  2427.   return ((pos->pos < pos->end)
  2428.   ? rx_get_burst_ok
  2429.   :  rx_get_burst_no_more);
  2430. }
  2431.     }
  2432. }
  2433. static __inline__ enum rx_back_check_return
  2434. re_search_2_back_check (pos, lparen, rparen, translate, vclosure, stop)
  2435.      struct rx_string_position * pos;
  2436.      int lparen;
  2437.      int rparen;
  2438.      unsigned char * translate;
  2439.      void * vclosure;
  2440.      int stop;
  2441. {
  2442.   struct rx_string_position there;
  2443.   struct rx_string_position past;
  2444.   there = *pos;
  2445.   there.pos = there.string + lparen - there.offset;
  2446.   re_search_2_get_burst (&there, vclosure, stop);
  2447.   past = *pos;
  2448.   past.pos = past.string + rparen - there.offset;
  2449.   re_search_2_get_burst (&past, vclosure, stop);
  2450.   ++pos->pos;
  2451.   re_search_2_get_burst (pos, vclosure, stop);
  2452.   while (   (there.pos != past.pos)
  2453.  && (pos->pos != pos->end))
  2454.     if (TRANSLATE(*there.pos) != TRANSLATE(*pos->pos))
  2455.       return rx_back_check_fail;
  2456.     else
  2457.       {
  2458. ++there.pos;
  2459. ++pos->pos;
  2460. if (there.pos == there.end)
  2461.   re_search_2_get_burst (&there, vclosure, stop);
  2462. if (pos->pos == pos->end)
  2463.   re_search_2_get_burst (pos, vclosure, stop);
  2464.       }
  2465.   if (there.pos != past.pos)
  2466.     return rx_back_check_fail;
  2467.   --pos->pos;
  2468.   re_search_2_get_burst (pos, vclosure, stop);
  2469.   return rx_back_check_pass;
  2470. }
  2471. static __inline__ int
  2472. re_search_2_fetch_char (pos, offset, app_closure, stop)
  2473.      struct rx_string_position * pos;
  2474.      int offset;
  2475.      void * app_closure;
  2476.      int stop;
  2477. {
  2478.   struct re_search_2_closure * closure;
  2479.   closure = (struct re_search_2_closure *)app_closure;
  2480.   if (offset == 0)
  2481.     return *pos->pos;
  2482.   if (pos->pos == pos->end)
  2483.     return *closure->string2;
  2484.   else
  2485.     return *pos->pos;
  2486. }
  2487.      
  2488. #ifdef __STDC__
  2489. RE_S2_QUAL int
  2490. RE_SEARCH_2_FN (struct re_pattern_buffer *rxb,
  2491. __const__ char * string1, int size1,
  2492. __const__ char * string2, int size2,
  2493. int startpos, int range,
  2494. struct re_registers *regs,
  2495. int stop)
  2496. #else
  2497. RE_S2_QUAL int
  2498. RE_SEARCH_2_FN (rxb,
  2499. string1, size1, string2, size2, startpos, range, regs, stop)
  2500.      struct re_pattern_buffer *rxb;
  2501.      __const__ char * string1;
  2502.      int size1;
  2503.      __const__ char * string2;
  2504.      int size2;
  2505.      int startpos;
  2506.      int range;
  2507.      struct re_registers *regs;
  2508.      int stop;
  2509. #endif
  2510. {
  2511.   int answer;
  2512.   struct re_search_2_closure closure;
  2513.   closure.string1 = string1;
  2514.   closure.size1 = size1;
  2515.   closure.string2 = string2;
  2516.   closure.size2 = size2;
  2517.   answer = rx_search (rxb, startpos, range, stop, size1 + size2,
  2518.       re_search_2_get_burst,
  2519.       re_search_2_back_check,
  2520.       re_search_2_fetch_char,
  2521.       (void *)&closure,
  2522.       regs,
  2523.       0,
  2524.       0);
  2525.   switch (answer)
  2526.     {
  2527.     case rx_search_continuation:
  2528.       abort ();
  2529.     case rx_search_error:
  2530.       return -2;
  2531.     case rx_search_soft_fail:
  2532.     case rx_search_fail:
  2533.       return -1;
  2534.     default:
  2535.       return answer;
  2536.     }
  2537. }
  2538. /* Export rx_search to callers outside this file.  */
  2539. int
  2540. re_rx_search (rxb, startpos, range, stop, total_size,
  2541.       get_burst, back_check, fetch_char,
  2542.       app_closure, regs, resume_state, save_state)
  2543.      struct re_pattern_buffer * rxb;
  2544.      int startpos;
  2545.      int range;
  2546.      int stop;
  2547.      int total_size;
  2548.      rx_get_burst_fn get_burst;
  2549.      rx_back_check_fn back_check;
  2550.      rx_fetch_char_fn fetch_char;
  2551.      void * app_closure;
  2552.      struct re_registers * regs;
  2553.      struct rx_search_state * resume_state;
  2554.      struct rx_search_state * save_state;
  2555. {
  2556.   return rx_search (rxb, startpos, range, stop, total_size,
  2557.     get_burst, back_check, fetch_char, app_closure,
  2558.     regs, resume_state, save_state);
  2559. }
  2560. #if !defined(REGEX_MALLOC) && !defined(__GNUC__)
  2561. #ifdef __STDC__
  2562. int
  2563. re_search_2 (struct re_pattern_buffer *rxb,
  2564.      __const__ char * string1, int size1,
  2565.      __const__ char * string2, int size2,
  2566.      int startpos, int range,
  2567.      struct re_registers *regs,
  2568.      int stop)
  2569. #else
  2570. int
  2571. re_search_2 (rxb, string1, size1, string2, size2, startpos, range, regs, stop)
  2572.      struct re_pattern_buffer *rxb;
  2573.      __const__ char * string1;
  2574.      int size1;
  2575.      __const__ char * string2;
  2576.      int size2;
  2577.      int startpos;
  2578.      int range;
  2579.      struct re_registers *regs;
  2580.      int stop;
  2581. #endif
  2582. {
  2583.   int ret;
  2584.   ret = inner_re_search_2 (rxb, string1, size1, string2, size2, startpos,
  2585.    range, regs, stop);
  2586.   alloca (0);
  2587.   return ret;
  2588. }
  2589. #endif
  2590. /* Like re_search_2, above, but only one string is specified, and
  2591.  * doesn't let you say where to stop matching.
  2592.  */
  2593. #ifdef __STDC__
  2594. int
  2595. re_search (struct re_pattern_buffer * rxb, __const__ char *string,
  2596.    int size, int startpos, int range,
  2597.    struct re_registers *regs)
  2598. #else
  2599. int
  2600. re_search (rxb, string, size, startpos, range, regs)
  2601.      struct re_pattern_buffer * rxb;
  2602.      __const__ char * string;
  2603.      int size;
  2604.      int startpos;
  2605.      int range;
  2606.      struct re_registers *regs;
  2607. #endif
  2608. {
  2609.   return re_search_2 (rxb, 0, 0, string, size, startpos, range, regs, size);
  2610. }
  2611. #ifdef __STDC__
  2612. int
  2613. re_match_2 (struct re_pattern_buffer * rxb,
  2614.     __const__ char * string1, int size1,
  2615.     __const__ char * string2, int size2,
  2616.     int pos, struct re_registers *regs, int stop)
  2617. #else
  2618. int
  2619. re_match_2 (rxb, string1, size1, string2, size2, pos, regs, stop)
  2620.      struct re_pattern_buffer * rxb;
  2621.      __const__ char * string1;
  2622.      int size1;
  2623.      __const__ char * string2;
  2624.      int size2;
  2625.      int pos;
  2626.      struct re_registers *regs;
  2627.      int stop;
  2628. #endif
  2629. {
  2630.   struct re_registers some_regs;
  2631.   regoff_t start;
  2632.   regoff_t end;
  2633.   int srch;
  2634.   int save = rxb->regs_allocated;
  2635.   struct re_registers * regs_to_pass = regs;
  2636.   if (!regs)
  2637.     {
  2638.       some_regs.start = &start;
  2639.       some_regs.end = &end;
  2640.       some_regs.num_regs = 1;
  2641.       regs_to_pass = &some_regs;
  2642.       rxb->regs_allocated = REGS_FIXED;
  2643.     }
  2644.   srch = re_search_2 (rxb, string1, size1, string2, size2,
  2645.       pos, 1, regs_to_pass, stop);
  2646.   if (regs_to_pass != regs)
  2647.     rxb->regs_allocated = save;
  2648.   if (srch < 0)
  2649.     return srch;
  2650.   return regs_to_pass->end[0] - regs_to_pass->start[0];
  2651. }
  2652. /* re_match is like re_match_2 except it takes only a single string.  */
  2653. #ifdef __STDC__
  2654. int
  2655. re_match (struct re_pattern_buffer * rxb,
  2656.   __const__ char * string,
  2657.   int size, int pos,
  2658.   struct re_registers *regs)
  2659. #else
  2660. int
  2661. re_match (rxb, string, size, pos, regs)
  2662.      struct re_pattern_buffer * rxb;
  2663.      __const__ char *string;
  2664.      int size;
  2665.      int pos;
  2666.      struct re_registers *regs;
  2667. #endif
  2668. {
  2669.   return re_match_2 (rxb, string, size, 0, 0, pos, regs, size);
  2670. }
  2671. /* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
  2672.    also be assigned to arbitrarily: each pattern buffer stores its own
  2673.    syntax, so it can be changed between regex compilations.  */
  2674. reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS;
  2675. /* Specify the precise syntax of regexps for compilation.  This provides
  2676.    for compatibility for various utilities which historically have
  2677.    different, incompatible syntaxes.
  2678.    The argument SYNTAX is a bit mask comprised of the various bits
  2679.    defined in regex.h.  We return the old syntax.  */
  2680. #ifdef __STDC__
  2681. reg_syntax_t
  2682. re_set_syntax (reg_syntax_t syntax)
  2683. #else
  2684. reg_syntax_t
  2685. re_set_syntax (syntax)
  2686.     reg_syntax_t syntax;
  2687. #endif
  2688. {
  2689.   reg_syntax_t ret = re_syntax_options;
  2690.   re_syntax_options = syntax;
  2691.   return ret;
  2692. }
  2693. /* Set REGS to hold NUM_REGS registers, storing them in STARTS and
  2694.    ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
  2695.    this memory for recording register information.  STARTS and ENDS
  2696.    must be allocated using the malloc library routine, and must each
  2697.    be at least NUM_REGS * sizeof (regoff_t) bytes long.
  2698.    If NUM_REGS == 0, then subsequent matches should allocate their own
  2699.    register data.
  2700.    Unless this function is called, the first search or match using
  2701.    PATTERN_BUFFER will allocate its own register data, without
  2702.    freeing the old data.  */
  2703. #ifdef __STDC__
  2704. void
  2705. re_set_registers (struct re_pattern_buffer *bufp,
  2706.   struct re_registers *regs,
  2707.   unsigned num_regs,
  2708.   regoff_t * starts, regoff_t * ends)
  2709. #else
  2710. void
  2711. re_set_registers (bufp, regs, num_regs, starts, ends)
  2712.      struct re_pattern_buffer *bufp;
  2713.      struct re_registers *regs;
  2714.      unsigned num_regs;
  2715.      regoff_t * starts;
  2716.      regoff_t * ends;
  2717. #endif
  2718. {
  2719.   if (num_regs)
  2720.     {
  2721.       bufp->regs_allocated = REGS_REALLOCATE;
  2722.       regs->num_regs = num_regs;
  2723.       regs->start = starts;
  2724.       regs->end = ends;
  2725.     }
  2726.   else
  2727.     {
  2728.       bufp->regs_allocated = REGS_UNALLOCATED;
  2729.       regs->num_regs = 0;
  2730.       regs->start = regs->end = (regoff_t) 0;
  2731.     }
  2732. }
  2733. #ifdef __STDC__
  2734. static int 
  2735. cplx_se_sublist_len (struct rx_se_list * list)
  2736. #else
  2737. static int 
  2738. cplx_se_sublist_len (list)
  2739.      struct rx_se_list * list;
  2740. #endif
  2741. {
  2742.   int x = 0;
  2743.   while (list)
  2744.     {
  2745.       if ((long)list->car >= 0)
  2746. ++x;
  2747.       list = list->cdr;
  2748.     }
  2749.   return x;
  2750. }
  2751. /* For rx->se_list_cmp */
  2752. #ifdef __STDC__
  2753. static int 
  2754. posix_se_list_order (struct rx * rx,
  2755.      struct rx_se_list * a, struct rx_se_list * b)
  2756. #else
  2757. static int 
  2758. posix_se_list_order (rx, a, b)
  2759.      struct rx * rx;
  2760.      struct rx_se_list * a;
  2761.      struct rx_se_list * b;
  2762. #endif
  2763. {
  2764.   int al = cplx_se_sublist_len (a);
  2765.   int bl = cplx_se_sublist_len (b);
  2766.   if (!al && !bl)
  2767.     return ((a == b)
  2768.     ? 0
  2769.     : ((a < b) ? -1 : 1));
  2770.   
  2771.   else if (!al)
  2772.     return -1;
  2773.   else if (!bl)
  2774.     return 1;
  2775.   else
  2776.     {
  2777.       rx_side_effect * av = ((rx_side_effect *)
  2778.      alloca (sizeof (rx_side_effect) * (al + 1)));
  2779.       rx_side_effect * bv = ((rx_side_effect *)
  2780.      alloca (sizeof (rx_side_effect) * (bl + 1)));
  2781.       struct rx_se_list * ap = a;
  2782.       struct rx_se_list * bp = b;
  2783.       int ai, bi;
  2784.       
  2785.       for (ai = al - 1; ai >= 0; --ai)
  2786. {
  2787.   while ((long)ap->car < 0)
  2788.     ap = ap->cdr;
  2789.   av[ai] = ap->car;
  2790.   ap = ap->cdr;
  2791. }
  2792.       av[al] = (rx_side_effect)-2;
  2793.       for (bi = bl - 1; bi >= 0; --bi)
  2794. {
  2795.   while ((long)bp->car < 0)
  2796.     bp = bp->cdr;
  2797.   bv[bi] = bp->car;
  2798.   bp = bp->cdr;
  2799. }
  2800.       bv[bl] = (rx_side_effect)-1;
  2801.       {
  2802. int ret;
  2803. int x = 0;
  2804. while (av[x] == bv[x])
  2805.   ++x;
  2806.   ret = (((unsigned *)(av[x]) < (unsigned *)(bv[x])) ? -1 : 1);
  2807. return ret;
  2808.       }
  2809.     }
  2810. }
  2811. /* re_compile_pattern is the GNU regular expression compiler: it
  2812.    compiles PATTERN (of length SIZE) and puts the result in RXB.
  2813.    Returns 0 if the pattern was valid, otherwise an error string.
  2814.    Assumes the `allocated' (and perhaps `buffer') and `translate' fields
  2815.    are set in RXB on entry.
  2816.    We call rx_compile to do the actual compilation.  */
  2817. #ifdef __STDC__
  2818. __const__ char *
  2819. re_compile_pattern (__const__ char *pattern,
  2820.     int length,
  2821.     struct re_pattern_buffer * rxb)
  2822. #else
  2823. __const__ char *
  2824. re_compile_pattern (pattern, length, rxb)
  2825.      __const__ char *pattern;
  2826.      int length;
  2827.      struct re_pattern_buffer * rxb;
  2828. #endif
  2829. {
  2830.   reg_errcode_t ret;
  2831.   /* GNU code is written to assume at least RE_NREGS registers will be set
  2832.      (and at least one extra will be -1).  */
  2833.   rxb->regs_allocated = REGS_UNALLOCATED;
  2834.   /* And GNU code determines whether or not to get register information
  2835.      by passing null for the REGS argument to re_match, etc., not by
  2836.      setting no_sub.  */
  2837.   rxb->no_sub = 0;
  2838.   rxb->rx.local_cset_size = 256;
  2839.   /* Match anchors at newline.  */
  2840.   rxb->newline_anchor = 1;
  2841.  
  2842.   rxb->re_nsub = 0;
  2843.   rxb->start = 0;
  2844.   rxb->se_params = 0;
  2845.   rxb->rx.nodec = 0;
  2846.   rxb->rx.epsnodec = 0;
  2847.   rxb->rx.instruction_table = 0;
  2848.   rxb->rx.nfa_states = 0;
  2849.   rxb->rx.se_list_cmp = posix_se_list_order;
  2850.   rxb->rx.start_set = 0;
  2851.   ret = rx_compile (pattern, length, re_syntax_options, rxb);
  2852.   alloca (0);
  2853.   return rx_error_msg[(int) ret];
  2854. }
  2855. #ifdef __STDC__
  2856. int
  2857. re_compile_fastmap (struct re_pattern_buffer * rxb)
  2858. #else
  2859. int
  2860. re_compile_fastmap (rxb)
  2861.      struct re_pattern_buffer * rxb;
  2862. #endif
  2863. {
  2864.   rx_blow_up_fastmap (rxb);
  2865.   return 0;
  2866. }
  2867. /* Entry points compatible with 4.2 BSD regex library.  We don't define
  2868.    them if this is an Emacs or POSIX compilation.  */
  2869. #if (!defined (emacs) && !defined (_POSIX_SOURCE)) || defined(USE_BSD_REGEX)
  2870. /* BSD has one and only one pattern buffer.  */
  2871. static struct re_pattern_buffer rx_comp_buf;
  2872. #ifdef __STDC__
  2873. char *
  2874. re_comp (__const__ char *s)
  2875. #else
  2876. char *
  2877. re_comp (s)
  2878.     __const__ char *s;
  2879. #endif
  2880. {
  2881.   reg_errcode_t ret;
  2882.   if (!s || (*s == ''))
  2883.     {
  2884.       if (!rx_comp_buf.buffer)
  2885. return "No previous regular expression";
  2886.       return 0;
  2887.     }
  2888.   if (!rx_comp_buf.fastmap)
  2889.     {
  2890.       rx_comp_buf.fastmap = (char *) malloc (1 << CHARBITS);
  2891.       if (!rx_comp_buf.fastmap)
  2892. return "Memory exhausted";
  2893.     }
  2894.   /* Since `rx_exec' always passes NULL for the `regs' argument, we
  2895.      don't need to initialize the pattern buffer fields which affect it.  */
  2896.   /* Match anchors at newlines.  */
  2897.   rx_comp_buf.newline_anchor = 1;
  2898.   rx_comp_buf.re_nsub = 0;
  2899.   rx_comp_buf.start = 0;
  2900.   rx_comp_buf.se_params = 0;
  2901.   rx_comp_buf.rx.nodec = 0;
  2902.   rx_comp_buf.rx.epsnodec = 0;
  2903.   rx_comp_buf.rx.instruction_table = 0;
  2904.   rx_comp_buf.rx.nfa_states = 0;
  2905.   rx_comp_buf.rx.start = 0;
  2906.   rx_comp_buf.rx.se_list_cmp = posix_se_list_order;
  2907.   ret = rx_compile (s, strlen (s), re_syntax_options, &rx_comp_buf);
  2908.   alloca (0);
  2909.   /* Yes, we're discarding `__const__' here.  */
  2910.   return (char *) rx_error_msg[(int) ret];
  2911. }
  2912. #ifdef __STDC__
  2913. int
  2914. re_exec (__const__ char *s)
  2915. #else
  2916. int
  2917. re_exec (s)
  2918.     __const__ char *s;
  2919. #endif
  2920. {
  2921.   __const__ int len = strlen (s);
  2922.   return
  2923.     0 <= re_search (&rx_comp_buf, s, len, 0, len, (struct re_registers *) 0);
  2924. }
  2925. #endif /* not emacs and not _POSIX_SOURCE */
  2926. /* POSIX.2 functions.  Don't define these for Emacs.  */
  2927. #if !defined(emacs)
  2928. /* regcomp takes a regular expression as a string and compiles it.
  2929.    PREG is a regex_t *.  We do not expect any fields to be initialized,
  2930.    since POSIX says we shouldn't.  Thus, we set
  2931.      `buffer' to the compiled pattern;
  2932.      `used' to the length of the compiled pattern;
  2933.      `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
  2934.        REG_EXTENDED bit in CFLAGS is set; otherwise, to
  2935.        RE_SYNTAX_POSIX_BASIC;
  2936.      `newline_anchor' to REG_NEWLINE being set in CFLAGS;
  2937.      `fastmap' and `fastmap_accurate' to zero;
  2938.      `re_nsub' to the number of subexpressions in PATTERN.
  2939.    PATTERN is the address of the pattern string.
  2940.    CFLAGS is a series of bits which affect compilation.
  2941.      If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
  2942.      use POSIX basic syntax.
  2943.      If REG_NEWLINE is set, then . and [^...] don't match newline.
  2944.      Also, regexec will try a match beginning after every newline.
  2945.      If REG_ICASE is set, then we considers upper- and lowercase
  2946.      versions of letters to be equivalent when matching.
  2947.      If REG_NOSUB is set, then when PREG is passed to regexec, that
  2948.      routine will report only success or failure, and nothing about the
  2949.      registers.
  2950.    It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
  2951.    the return codes and their meanings.)  */
  2952. #ifdef __STDC__
  2953. int
  2954. regcomp (regex_t * preg, __const__ char * pattern, int cflags)
  2955. #else
  2956. int
  2957. regcomp (preg, pattern, cflags)
  2958.     regex_t * preg;
  2959.     __const__ char * pattern;
  2960.     int cflags;
  2961. #endif
  2962. {
  2963.   reg_errcode_t ret;
  2964.   unsigned syntax
  2965.     = cflags & REG_EXTENDED ? RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
  2966.   /* regex_compile will allocate the space for the compiled pattern.  */
  2967.   preg->buffer = 0;
  2968.   preg->allocated = 0;
  2969.   preg->fastmap = malloc (256);
  2970.   if (!preg->fastmap)
  2971.     return REG_ESPACE;
  2972.   preg->fastmap_accurate = 0;
  2973.   if (cflags & REG_ICASE)
  2974.     {
  2975.       unsigned i;
  2976.       preg->translate = (unsigned char *) malloc (256);
  2977.       if (!preg->translate)
  2978.         return (int) REG_ESPACE;
  2979.       /* Map uppercase characters to corresponding lowercase ones.  */
  2980.       for (i = 0; i < CHAR_SET_SIZE; i++)
  2981.         preg->translate[i] = isupper (i) ? tolower (i) : i;
  2982.     }
  2983.   else
  2984.     preg->translate = 0;
  2985.   /* If REG_NEWLINE is set, newlines are treated differently.  */
  2986.   if (cflags & REG_NEWLINE)
  2987.     { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
  2988.       syntax &= ~RE_DOT_NEWLINE;
  2989.       syntax |= RE_HAT_LISTS_NOT_NEWLINE;
  2990.       /* It also changes the matching behavior.  */
  2991.       preg->newline_anchor = 1;
  2992.     }
  2993.   else
  2994.     preg->newline_anchor = 0;
  2995.   preg->no_sub = !!(cflags & REG_NOSUB);
  2996.   /* POSIX says a null character in the pattern terminates it, so we
  2997.      can use strlen here in compiling the pattern.  */
  2998.   preg->re_nsub = 0;
  2999.   preg->start = 0;
  3000.   preg->se_params = 0;
  3001.   preg->rx.nodec = 0;
  3002.   preg->rx.epsnodec = 0;
  3003.   preg->rx.instruction_table = 0;
  3004.   preg->rx.nfa_states = 0;
  3005.   preg->rx.local_cset_size = 256;
  3006.   preg->rx.start = 0;
  3007.   preg->rx.se_list_cmp = posix_se_list_order;
  3008.   preg->rx.start_set = 0;
  3009.   ret = rx_compile (pattern, strlen (pattern), syntax, preg);
  3010.   alloca (0);
  3011.   /* POSIX doesn't distinguish between an unmatched open-group and an
  3012.      unmatched close-group: both are REG_EPAREN.  */
  3013.   if (ret == REG_ERPAREN) ret = REG_EPAREN;
  3014.   return (int) ret;
  3015. }
  3016. /* regexec searches for a given pattern, specified by PREG, in the
  3017.    string STRING.
  3018.    If NMATCH is zero or REG_NOSUB was set in the cflags argument to
  3019.    `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
  3020.    least NMATCH elements, and we set them to the offsets of the
  3021.    corresponding matched substrings.
  3022.    EFLAGS specifies `execution flags' which affect matching: if
  3023.    REG_NOTBOL is set, then ^ does not match at the beginning of the
  3024.    string; if REG_NOTEOL is set, then $ does not match at the end.
  3025.    We return 0 if we find a match and REG_NOMATCH if not.  */
  3026. #ifdef __STDC__
  3027. int
  3028. regexec (__const__ regex_t *preg, __const__ char *string,
  3029.  size_t nmatch, regmatch_t pmatch[],
  3030.  int eflags)
  3031. #else
  3032. int
  3033. regexec (preg, string, nmatch, pmatch, eflags)
  3034.     __const__ regex_t *preg;
  3035.     __const__ char *string;
  3036.     size_t nmatch;
  3037.     regmatch_t pmatch[];
  3038.     int eflags;
  3039. #endif
  3040. {
  3041.   int ret;
  3042.   struct re_registers regs;
  3043.   regex_t private_preg;
  3044.   int len = strlen (string);
  3045.   boolean want_reg_info = !preg->no_sub && nmatch > 0;
  3046.   private_preg = *preg;
  3047.   private_preg.not_bol = !!(eflags & REG_NOTBOL);
  3048.   private_preg.not_eol = !!(eflags & REG_NOTEOL);
  3049.   /* The user has told us exactly how many registers to return
  3050.    * information about, via `nmatch'.  We have to pass that on to the
  3051.    * matching routines.
  3052.    */
  3053.   private_preg.regs_allocated = REGS_FIXED;
  3054.   if (want_reg_info)
  3055.     {
  3056.       regs.num_regs = nmatch;
  3057.       regs.start =  (( regoff_t *) malloc ((nmatch) * sizeof ( regoff_t)));
  3058.       regs.end =  (( regoff_t *) malloc ((nmatch) * sizeof ( regoff_t)));
  3059.       if (regs.start == 0 || regs.end == 0)
  3060.         return (int) REG_NOMATCH;
  3061.     }
  3062.   /* Perform the searching operation.  */
  3063.   ret = re_search (&private_preg,
  3064.    string, len,
  3065.                    /* start: */ 0,
  3066.    /* range: */ len,
  3067.                    want_reg_info ? &regs : (struct re_registers *) 0);
  3068.   /* Copy the register information to the POSIX structure.  */
  3069.   if (want_reg_info)
  3070.     {
  3071.       if (ret >= 0)
  3072.         {
  3073.           unsigned r;
  3074.           for (r = 0; r < nmatch; r++)
  3075.             {
  3076.               pmatch[r].rm_so = regs.start[r];
  3077.               pmatch[r].rm_eo = regs.end[r];
  3078.             }
  3079.         }
  3080.       /* If we needed the temporary register info, free the space now.  */
  3081.       free (regs.start);
  3082.       free (regs.end);
  3083.     }
  3084.   /* We want zero return to mean success, unlike `re_search'.  */
  3085.   return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
  3086. }
  3087. /* Returns a message corresponding to an error code, ERRCODE, returned
  3088.    from either regcomp or regexec.   */
  3089. #ifdef __STDC__
  3090. size_t
  3091. regerror (int errcode, __const__ regex_t *preg,
  3092.   char *errbuf, size_t errbuf_size)
  3093. #else
  3094. size_t
  3095. regerror (errcode, preg, errbuf, errbuf_size)
  3096.     int errcode;
  3097.     __const__ regex_t *preg;
  3098.     char *errbuf;
  3099.     size_t errbuf_size;
  3100. #endif
  3101. {
  3102.   __const__ char *msg
  3103.     = rx_error_msg[errcode] == 0 ? "Success" : rx_error_msg[errcode];
  3104.   size_t msg_size = strlen (msg) + 1; /* Includes the 0.  */
  3105.   if (errbuf_size != 0)
  3106.     {
  3107.       if (msg_size > errbuf_size)
  3108.         {
  3109.           strncpy (errbuf, msg, errbuf_size - 1);
  3110.           errbuf[errbuf_size - 1] = 0;
  3111.         }
  3112.       else
  3113.         strcpy (errbuf, msg);
  3114.     }
  3115.   return msg_size;
  3116. }
  3117. /* Free dynamically allocated space used by PREG.  */
  3118. #ifdef __STDC__
  3119. void
  3120. regfree (regex_t *preg)
  3121. #else
  3122. void
  3123. regfree (preg)
  3124.     regex_t *preg;
  3125. #endif
  3126. {
  3127.   if (preg->buffer != 0)
  3128.     free (preg->buffer);
  3129.   preg->buffer = 0;
  3130.   preg->allocated = 0;
  3131.   if (preg->fastmap != 0)
  3132.     free (preg->fastmap);
  3133.   preg->fastmap = 0;
  3134.   preg->fastmap_accurate = 0;
  3135.   if (preg->translate != 0)
  3136.     free (preg->translate);
  3137.   preg->translate = 0;
  3138. }
  3139. #endif /* not emacs  */