home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD2.bin / bbs / gnu / libg++-2.6.2.lha / libg++-2.6.2 / librx / rx.c < prev    next >
C/C++ Source or Header  |  1994-11-24  |  177KB  |  7,169 lines

  1. /*    Copyright (C) 1992, 1993 Free Software Foundation, Inc.
  2.  
  3. This file is part of the librx library.
  4.  
  5. Librx is free software; you can redistribute it and/or modify it under
  6. the terms of the GNU Library General Public License as published by
  7. the Free Software Foundation; either version 2, or (at your option)
  8. any later version.
  9.  
  10. Librx is distributed in the hope that it will be useful, but WITHOUT
  11. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13. for more details.
  14.  
  15. You should have received a copy of the GNU Library General Public
  16. License along with this software; see the file COPYING.LIB.  If not,
  17. write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA
  18. 02139, USA.  */
  19.  
  20. /* NOTE!!!  AIX is so losing it requires this to be the first thing in the 
  21.  * file. 
  22.  * Do not put ANYTHING before it!  
  23.  */
  24. #if !defined (__GNUC__) && defined (_AIX)
  25.  #pragma alloca
  26. #endif
  27.  
  28. char rx_version_string[] = "GNU Rx version 0.06";
  29.  
  30.             /* ``Too hard!''
  31.              *        -- anon.
  32.              */
  33.  
  34.  
  35. #include <stdio.h>
  36. #include <ctype.h>
  37. #ifndef isgraph
  38. #define isgraph(c) (isprint (c) && !isspace (c))
  39. #endif
  40. #ifndef isblank
  41. #define isblank(c) ((c) == ' ' || (c) == '\t')
  42. #endif
  43.  
  44. #include <sys/types.h>
  45.  
  46. #undef MAX
  47. #undef MIN
  48. #define MAX(a, b) ((a) > (b) ? (a) : (b))
  49. #define MIN(a, b) ((a) < (b) ? (a) : (b))
  50.  
  51. typedef char boolean;
  52. #define false 0
  53. #define true 1
  54.  
  55. #ifndef RX_DECL
  56. #define RX_DECL static
  57. #endif
  58.  
  59. #ifndef __GCC__
  60. #undef __inline__
  61. #define __inline__
  62. #endif
  63.  
  64. /* Emacs already defines alloca, sometimes.  */
  65. #ifndef alloca
  66.  
  67. /* Make alloca work the best possible way.  */
  68. #ifdef __GNUC__
  69. #define alloca __builtin_alloca
  70. #else /* not __GNUC__ */
  71. #if HAVE_ALLOCA_H
  72. #include <alloca.h>
  73. #else /* not __GNUC__ or HAVE_ALLOCA_H */
  74. #ifndef _AIX /* Already did AIX, up at the top.  */
  75. char *alloca ();
  76. #endif /* not _AIX */
  77. #endif /* not HAVE_ALLOCA_H */ 
  78. #endif /* not __GNUC__ */
  79.  
  80. #endif /* not alloca */
  81.  
  82. /* Memory management and stuff for emacs. */
  83.  
  84. #define CHARBITS 8
  85. #define remalloc(M, S) (M ? realloc (M, S) : malloc (S))
  86.  
  87.  
  88. /* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
  89.  * use `alloca' instead of `malloc' for the backtracking stack.
  90.  *
  91.  * Emacs will die miserably if we don't do this.
  92.  */
  93.  
  94. #ifdef REGEX_MALLOC
  95. #define REGEX_ALLOCATE malloc
  96. #else /* not REGEX_MALLOC  */
  97. #define REGEX_ALLOCATE alloca
  98. #endif /* not REGEX_MALLOC */
  99.  
  100. #ifdef RX_WANT_RX_DEFS
  101. #define RX_DECL extern
  102. #define RX_DEF_QUAL 
  103. #else
  104. #define RX_WANT_RX_DEFS
  105. #define RX_DECL static
  106. #define RX_DEF_QUAL static
  107. #endif
  108. #include "rx.h"
  109. #undef RX_DECL
  110. #define RX_DECL RX_DEF_QUAL
  111.  
  112.  
  113. #ifndef emacs
  114.  
  115. #ifdef SYNTAX_TABLE
  116. extern char *re_syntax_table;
  117. #else /* not SYNTAX_TABLE */
  118.  
  119. /* RX_DECL char re_syntax_table[CHAR_SET_SIZE]; */
  120.  
  121. #ifdef __STDC__
  122. static void
  123. init_syntax_once (void)
  124. #else
  125. static void
  126. init_syntax_once ()
  127. #endif
  128. {
  129.    register int c;
  130.    static int done = 0;
  131.  
  132.    if (done)
  133.      return;
  134.  
  135.    bzero (re_syntax_table, sizeof re_syntax_table);
  136.  
  137.    for (c = 'a'; c <= 'z'; c++)
  138.      re_syntax_table[c] = Sword;
  139.  
  140.    for (c = 'A'; c <= 'Z'; c++)
  141.      re_syntax_table[c] = Sword;
  142.  
  143.    for (c = '0'; c <= '9'; c++)
  144.      re_syntax_table[c] = Sword;
  145.  
  146.    re_syntax_table['_'] = Sword;
  147.  
  148.    done = 1;
  149. }
  150. #endif /* not SYNTAX_TABLE */
  151. #endif /* not emacs */
  152.  
  153. /* Compile with `-DRX_DEBUG' and use the following flags.
  154.  *
  155.  * Debugging flags:
  156.  *       rx_debug - print information as a regexp is compiled
  157.  *     rx_debug_trace - print information as a regexp is executed
  158.  */
  159.  
  160. #ifdef RX_DEBUG
  161.  
  162. int rx_debug_compile = 0;
  163. int rx_debug_trace = 0;
  164. static struct re_pattern_buffer * dbug_rxb = 0;
  165.  
  166. #ifdef __STDC__
  167. typedef void (*side_effect_printer) (struct rx *, void *, FILE *);
  168. #else
  169. typedef void (*side_effect_printer) ();
  170. #endif
  171.  
  172. #ifdef __STDC__
  173. static void print_cset (struct rx *rx, rx_Bitset cset, FILE * fp);
  174. #else
  175. static void print_cset ();
  176. #endif
  177.  
  178. #ifdef __STDC__
  179. static void
  180. print_rexp (struct rx *rx,
  181.         struct rexp_node *node, int depth,
  182.         side_effect_printer seprint, FILE * fp)
  183. #else
  184. static void
  185. print_rexp (rx, node, depth, seprint, fp)
  186.      struct rx *rx;
  187.      struct rexp_node *node;
  188.      int depth;
  189.      side_effect_printer seprint;
  190.      FILE * fp;
  191. #endif
  192. {
  193.   if (!node)
  194.     return;
  195.   else
  196.     {
  197.       switch (node->type)
  198.     {
  199.     case r_cset:
  200.       {
  201.         fprintf (fp, "%*s", depth, "");
  202.         print_cset (rx, node->params.cset, fp);
  203.         fputc ('\n', fp);
  204.         break;
  205.       }
  206.  
  207.      case r_opt:
  208.     case r_star:
  209.       fprintf (fp, "%*s%s\n", depth, "",
  210.            node->type == r_opt ? "opt" : "star");
  211.       print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp);
  212.       break;
  213.  
  214.     case r_2phase_star:
  215.       fprintf (fp, "%*s2phase star\n", depth, "");
  216.       print_rexp (rx, node->params.pair.right, depth + 3, seprint, fp);
  217.       print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp);
  218.       break;
  219.  
  220.  
  221.     case r_alternate:
  222.     case r_concat:
  223.       fprintf (fp, "%*s%s\n", depth, "",
  224.            node->type == r_alternate ? "alt" : "concat");
  225.       print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp);
  226.       print_rexp (rx, node->params.pair.right, depth + 3, seprint, fp);
  227.       break;
  228.     case r_side_effect:
  229.       fprintf (fp, "%*sSide effect: ", depth, "");
  230.       seprint (rx, node->params.side_effect, fp);
  231.       fputc ('\n', fp);
  232.     }
  233.     }
  234. }
  235.  
  236. #ifdef __STDC__
  237. static void
  238. print_nfa (struct rx * rx,
  239.        struct rx_nfa_state * n,
  240.        side_effect_printer seprint, FILE * fp)
  241. #else
  242. static void
  243. print_nfa (rx, n, seprint, fp)
  244.      struct rx * rx;
  245.      struct rx_nfa_state * n;
  246.      side_effect_printer seprint;
  247.      FILE * fp;
  248. #endif
  249. {
  250.   while (n)
  251.     {
  252.       struct rx_nfa_edge *e = n->edges;
  253.       struct rx_possible_future *ec = n->futures;
  254.       fprintf (fp, "node %d %s\n", n->id,
  255.            n->is_final ? "final" : (n->is_start ? "start" : ""));
  256.       while (e)
  257.     {
  258.       fprintf (fp, "   edge to %d, ", e->dest->id);
  259.       switch (e->type)
  260.         {
  261.         case ne_epsilon:
  262.           fprintf (fp, "epsilon\n");
  263.           break;
  264.         case ne_side_effect:
  265.           fprintf (fp, "side effect ");
  266.           seprint (rx, e->params.side_effect, fp);
  267.           fputc ('\n', fp);
  268.           break;
  269.         case ne_cset:
  270.           fprintf (fp, "cset ");
  271.           print_cset (rx, e->params.cset, fp);
  272.           fputc ('\n', fp);
  273.           break;
  274.         }
  275.       e = e->next;
  276.     }
  277.  
  278.       while (ec)
  279.     {
  280.       int x;
  281.       struct rx_nfa_state_set * s;
  282.       struct rx_se_list * l;
  283.       fprintf (fp, "   eclosure to {");
  284.       for (s = ec->destset; s; s = s->cdr)
  285.         fprintf (fp, "%d ", s->car->id);
  286.       fprintf (fp, "} (");
  287.       for (l = ec->effects; l; l = l->cdr)
  288.         {
  289.           seprint (rx, l->car, fp);
  290.           fputc (' ', fp);
  291.         }
  292.       fprintf (fp, ")\n");
  293.       ec = ec->next;
  294.     }
  295.       n = n->next;
  296.     }
  297. }
  298.  
  299. static char * efnames [] =
  300. {
  301.   "bogon",
  302.   "re_se_try",
  303.   "re_se_pushback",
  304.   "re_se_push0",
  305.   "re_se_pushpos",
  306.   "re_se_chkpos",
  307.   "re_se_poppos",
  308.   "re_se_at_dot",
  309.   "re_se_syntax",
  310.   "re_se_not_syntax",
  311.   "re_se_begbuf",
  312.   "re_se_hat",
  313.   "re_se_wordbeg",
  314.   "re_se_wordbound",
  315.   "re_se_notwordbound",
  316.   "re_se_wordend",
  317.   "re_se_endbuf",
  318.   "re_se_dollar",
  319.   "re_se_fail",
  320. };
  321.  
  322. static char * efnames2[] =
  323. {
  324.   "re_se_win",
  325.   "re_se_lparen",
  326.   "re_se_rparen",
  327.   "re_se_backref",
  328.   "re_se_iter",
  329.   "re_se_end_iter",
  330.   "re_se_tv"
  331. };
  332.  
  333. static char * inx_names[] = 
  334. {
  335.   "rx_backtrack_point",
  336.   "rx_do_side_effects",
  337.   "rx_cache_miss",
  338.   "rx_next_char",
  339.   "rx_backtrack",
  340.   "rx_error_inx",
  341.   "rx_num_instructions"
  342. };
  343.  
  344.  
  345. #ifdef __STDC__
  346. static void
  347. re_seprint (struct rx * rx, void * effect, FILE * fp)
  348. #else
  349. static void
  350. re_seprint (rx, effect, fp)
  351.      struct rx * rx;
  352.      void * effect;
  353.      FILE * fp;
  354. #endif
  355. {
  356.   if ((int)effect < 0)
  357.     fputs (efnames[-(int)effect], fp);
  358.   else if (dbug_rxb)
  359.     {
  360.       struct re_se_params * p = &dbug_rxb->se_params[(int)effect];
  361.       fprintf (fp, "%s(%d,%d)", efnames2[p->se], p->op1, p->op2);
  362.     }
  363.   else
  364.     fprintf (fp, "[complex op # %d]", (int)effect);
  365. }
  366.  
  367.  
  368. /* These are so the regex.c regression tests will compile. */
  369. void
  370. print_compiled_pattern (rxb)
  371.      struct re_pattern_buffer * rxb;
  372. {
  373. }
  374.  
  375. void
  376. print_fastmap (fm)
  377.      char * fm;
  378. {
  379. }
  380.  
  381. #endif /* RX_DEBUG */
  382.  
  383.  
  384.  
  385. /* This page: Bitsets.  Completely unintersting. */
  386.  
  387. #ifdef __STDC__
  388. RX_DECL int
  389. rx_bitset_is_equal (int size, rx_Bitset a, rx_Bitset b)
  390. #else
  391. RX_DECL int
  392. rx_bitset_is_equal (size, a, b)
  393.      int size;
  394.      rx_Bitset a;
  395.      rx_Bitset b;
  396. #endif
  397. {
  398.   int x;
  399.   RX_subset s = b[0];
  400.   b[0] = ~a[0];
  401.  
  402.   for (x = rx_bitset_numb_subsets(size) - 1; a[x] == b[x]; --x)
  403.     ;
  404.  
  405.   b[0] = s;
  406.   return !x && s == a[0];
  407. }
  408.  
  409. #ifdef __STDC__
  410. RX_DECL int
  411. rx_bitset_is_subset (int size, rx_Bitset a, rx_Bitset b)
  412. #else
  413. RX_DECL int
  414. rx_bitset_is_subset (size, a, b)
  415.      int size;
  416.      rx_Bitset a;
  417.      rx_Bitset b;
  418. #endif
  419. {
  420.   int x = rx_bitset_numb_subsets(size) - 1;
  421.   while (x-- && (a[x] & b[x]) == a[x]);
  422.   return x == -1;
  423. }
  424.  
  425.  
  426. #ifdef __STDC__
  427. RX_DECL int
  428. rx_bitset_empty (int size, rx_Bitset set)
  429. #else
  430. RX_DECL int
  431. rx_bitset_empty (size, set)
  432.      int size;
  433.      rx_Bitset set;
  434. #endif
  435. {
  436.   int x;
  437.   RX_subset s = set[0];
  438.   set[0] = 1;
  439.   for (x = rx_bitset_numb_subsets(size) - 1; !set[x]; --x)
  440.     ;
  441.   set[0] = s;
  442.   return !s;
  443. }
  444.  
  445. #ifdef __STDC__
  446. RX_DECL void
  447. rx_bitset_null (int size, rx_Bitset b)
  448. #else
  449. RX_DECL void
  450. rx_bitset_null (size, b)
  451.      int size;
  452.      rx_Bitset b;
  453. #endif
  454. {
  455.   bzero (b, rx_sizeof_bitset(size));
  456. }
  457.  
  458.  
  459. #ifdef __STDC__
  460. RX_DECL void
  461. rx_bitset_universe (int size, rx_Bitset b)
  462. #else
  463. RX_DECL void
  464. rx_bitset_universe (size, b)
  465.      int size;
  466.      rx_Bitset b;
  467. #endif
  468. {
  469.   int x = rx_bitset_numb_subsets (size);
  470.   while (x--)
  471.     *b++ = ~(RX_subset)0;
  472. }
  473.  
  474.  
  475. #ifdef __STDC__
  476. RX_DECL void
  477. rx_bitset_complement (int size, rx_Bitset b)
  478. #else
  479. RX_DECL void
  480. rx_bitset_complement (size, b)
  481.      int size;
  482.      rx_Bitset b;
  483. #endif
  484. {
  485.   int x = rx_bitset_numb_subsets (size);
  486.   while (x--)
  487.     {
  488.       *b = ~*b;
  489.       ++b;
  490.     }
  491. }
  492.  
  493.  
  494. #ifdef __STDC__
  495. RX_DECL void
  496. rx_bitset_assign (int size, rx_Bitset a, rx_Bitset b)
  497. #else
  498. RX_DECL void
  499. rx_bitset_assign (size, a, b)
  500.      int size;
  501.      rx_Bitset a;
  502.      rx_Bitset b;
  503. #endif
  504. {
  505.   int x;
  506.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  507.     a[x] = b[x];
  508. }
  509.  
  510.  
  511. #ifdef __STDC__
  512. RX_DECL void
  513. rx_bitset_union (int size, rx_Bitset a, rx_Bitset b)
  514. #else
  515. RX_DECL void
  516. rx_bitset_union (size, a, b)
  517.      int size;
  518.      rx_Bitset a;
  519.      rx_Bitset b;
  520. #endif
  521. {
  522.   int x;
  523.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  524.     a[x] |= b[x];
  525. }
  526.  
  527.  
  528. #ifdef __STDC__
  529. RX_DECL void
  530. rx_bitset_intersection (int size,
  531.             rx_Bitset a, rx_Bitset b)
  532. #else
  533. RX_DECL void
  534. rx_bitset_intersection (size, a, b)
  535.      int size;
  536.      rx_Bitset a;
  537.      rx_Bitset b;
  538. #endif
  539. {
  540.   int x;
  541.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  542.     a[x] &= b[x];
  543. }
  544.  
  545.  
  546. #ifdef __STDC__
  547. RX_DECL void
  548. rx_bitset_difference (int size, rx_Bitset a, rx_Bitset b)
  549. #else
  550. RX_DECL void
  551. rx_bitset_difference (size, a, b)
  552.      int size;
  553.      rx_Bitset a;
  554.      rx_Bitset b;
  555. #endif
  556. {
  557.   int x;
  558.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  559.     a[x] &=  ~ b[x];
  560. }
  561.  
  562.  
  563. #ifdef __STDC__
  564. RX_DECL void
  565. rx_bitset_revdifference (int size,
  566.              rx_Bitset a, rx_Bitset b)
  567. #else
  568. RX_DECL void
  569. rx_bitset_revdifference (size, a, b)
  570.      int size;
  571.      rx_Bitset a;
  572.      rx_Bitset b;
  573. #endif
  574. {
  575.   int x;
  576.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  577.     a[x] = ~a[x] & b[x];
  578. }
  579.  
  580. #ifdef __STDC__
  581. RX_DECL void
  582. rx_bitset_xor (int size, rx_Bitset a, rx_Bitset b)
  583. #else
  584. RX_DECL void
  585. rx_bitset_xor (size, a, b)
  586.      int size;
  587.      rx_Bitset a;
  588.      rx_Bitset b;
  589. #endif
  590. {
  591.   int x;
  592.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  593.     a[x] ^= b[x];
  594. }
  595.  
  596.  
  597. #ifdef __STDC__
  598. RX_DECL unsigned long
  599. rx_bitset_hash (int size, rx_Bitset b)
  600. #else
  601. RX_DECL unsigned long
  602. rx_bitset_hash (size, b)
  603.      int size;
  604.      rx_Bitset b;
  605. #endif
  606. {
  607.   int x;
  608.   unsigned long hash = (unsigned long)rx_bitset_hash;
  609.  
  610.   for (x = rx_bitset_numb_subsets(size) - 1; x >= 0; --x)
  611.     hash ^= rx_bitset_subset_val(b, x);
  612.  
  613.   return hash;
  614. }
  615.  
  616.  
  617. RX_DECL RX_subset rx_subset_singletons [RX_subset_bits] = 
  618. {
  619.   0x1,
  620.   0x2,
  621.   0x4,
  622.   0x8,
  623.   0x10,
  624.   0x20,
  625.   0x40,
  626.   0x80,
  627.   0x100,
  628.   0x200,
  629.   0x400,
  630.   0x800,
  631.   0x1000,
  632.   0x2000,
  633.   0x4000,
  634.   0x8000,
  635.   0x10000,
  636.   0x20000,
  637.   0x40000,
  638.   0x80000,
  639.   0x100000,
  640.   0x200000,
  641.   0x400000,
  642.   0x800000,
  643.   0x1000000,
  644.   0x2000000,
  645.   0x4000000,
  646.   0x8000000,
  647.   0x10000000,
  648.   0x20000000,
  649.   0x40000000,
  650.   0x80000000
  651. };
  652.  
  653. #ifdef RX_DEBUG
  654.  
  655. #ifdef __STDC__
  656. static void
  657. print_cset (struct rx *rx, rx_Bitset cset, FILE * fp)
  658. #else
  659. static void
  660. print_cset (rx, cset, fp)
  661.      struct rx *rx;
  662.      rx_Bitset cset;
  663.      FILE * fp;
  664. #endif
  665. {
  666.   int x;
  667.   fputc ('[', fp);
  668.   for (x = 0; x < rx->local_cset_size; ++x)
  669.     if (RX_bitset_member (cset, x))
  670.       {
  671.     if (isprint(x))
  672.       fputc (x, fp);
  673.     else
  674.       fprintf (fp, "\\0%o ", x);
  675.       }
  676.   fputc (']', fp);
  677. }
  678.  
  679. #endif /*  RX_DEBUG */
  680.  
  681.  
  682.  
  683. static unsigned long rx_hash_masks[4] =
  684. {
  685.   0x12488421,
  686.   0x96699669,
  687.   0xbe7dd7eb,
  688.   0xffffffff
  689. };
  690.  
  691.  
  692. /* Hash tables */
  693. #ifdef __STDC__
  694. RX_DECL struct rx_hash_item * 
  695. rx_hash_find (struct rx_hash * table,
  696.           unsigned long hash,
  697.           void * value,
  698.           struct rx_hash_rules * rules)
  699. #else
  700. RX_DECL struct rx_hash_item * 
  701. rx_hash_find (table, hash, value, rules)
  702.      struct rx_hash * table;
  703.      unsigned long hash;
  704.      void * value;
  705.      struct rx_hash_rules * rules;
  706. #endif
  707. {
  708.   rx_hash_eq eq = rules->eq;
  709.   int maskc = 0;
  710.   long mask = rx_hash_masks [0];
  711.   int bucket = (hash & mask) % 13;
  712.  
  713.   while (table->children [bucket])
  714.     {
  715.       table = table->children [bucket];
  716.       ++maskc;
  717.       mask = rx_hash_masks[maskc];
  718.       bucket = (hash & mask) % 13;
  719.     }
  720.  
  721.   {
  722.     struct rx_hash_item * it = table->buckets[bucket];
  723.     while (it)
  724.       if (eq (it->data, value))
  725.     return it;
  726.       else
  727.     it = it->next_same_hash;
  728.   }
  729.  
  730.   return 0;
  731. }
  732.  
  733.  
  734. #ifdef __STDC__
  735. RX_DECL struct rx_hash_item *
  736. rx_hash_store (struct rx_hash * table,
  737.            unsigned long hash,
  738.            void * value,
  739.            struct rx_hash_rules * rules)
  740. #else
  741. RX_DECL struct rx_hash_item *
  742. rx_hash_store (table, hash, value, rules)
  743.      struct rx_hash * table;
  744.      unsigned long hash;
  745.      void * value;
  746.      struct rx_hash_rules * rules;
  747. #endif
  748. {
  749.   rx_hash_eq eq = rules->eq;
  750.   int maskc = 0;
  751.   long mask = rx_hash_masks[0];
  752.   int bucket = (hash & mask) % 13;
  753.   int depth = 0;
  754.   
  755.   while (table->children [bucket])
  756.     {
  757.       table = table->children [bucket];
  758.       ++maskc;
  759.       mask = rx_hash_masks[maskc];
  760.       bucket = (hash & mask) % 13;
  761.       ++depth;
  762.     }
  763.   
  764.   {
  765.     struct rx_hash_item * it = table->buckets[bucket];
  766.     while (it)
  767.       if (eq (it->data, value))
  768.     return it;
  769.       else
  770.     it = it->next_same_hash;
  771.   }
  772.   
  773.   {
  774.     if (   (depth < 3)
  775.     && (table->bucket_size [bucket] >= 4))
  776.       {
  777.     struct rx_hash * newtab = ((struct rx_hash *)
  778.                    rules->hash_alloc (rules));
  779.     if (!newtab)
  780.       goto add_to_bucket;
  781.     bzero (newtab, sizeof (*newtab));
  782.     newtab->parent = table;
  783.     {
  784.       struct rx_hash_item * them = table->buckets[bucket];
  785.       unsigned long newmask = rx_hash_masks[maskc + 1];
  786.       while (them)
  787.         {
  788.           struct rx_hash_item * save = them->next_same_hash;
  789.           int new_buck = (them->hash & newmask) % 13;
  790.           them->next_same_hash = newtab->buckets[new_buck];
  791.           newtab->buckets[new_buck] = them;
  792.           them->table = newtab;
  793.           them = save;
  794.           ++newtab->bucket_size[new_buck];
  795.           ++newtab->refs;
  796.         }
  797.       table->refs = (table->refs - table->bucket_size[bucket] + 1);
  798.       table->bucket_size[bucket] = 0;
  799.       table->buckets[bucket] = 0;
  800.       table->children[bucket] = newtab;
  801.       table = newtab;
  802.       bucket = (hash & newmask) % 13;
  803.     }
  804.       }
  805.   }
  806.  add_to_bucket:
  807.   {
  808.     struct rx_hash_item  * it = ((struct rx_hash_item *)
  809.                  rules->hash_item_alloc (rules, value));
  810.     if (!it)
  811.       return 0;
  812.     it->hash = hash;
  813.     it->table = table;
  814.     /* DATA and BINDING are to be set in hash_item_alloc */
  815.     it->next_same_hash = table->buckets [bucket];
  816.     table->buckets[bucket] = it;
  817.     ++table->bucket_size [bucket];
  818.     ++table->refs;
  819.     return it;
  820.   }
  821. }
  822.  
  823.  
  824. #ifdef __STDC__
  825. RX_DECL void
  826. rx_hash_free (struct rx_hash_item * it, struct rx_hash_rules * rules)
  827. #else
  828. RX_DECL void
  829. rx_hash_free (it, rules)
  830.      struct rx_hash_item * it;
  831.      struct rx_hash_rules * rules;
  832. #endif
  833. {
  834.   if (it)
  835.     {
  836.       struct rx_hash * table = it->table;
  837.       unsigned long hash = it->hash;
  838.       int depth = (table->parent
  839.            ? (table->parent->parent
  840.               ? (table->parent->parent->parent
  841.              ? 3
  842.              : 2)
  843.               : 1)
  844.            : 0);
  845.       int bucket = (hash & rx_hash_masks [depth]) % 13;
  846.       struct rx_hash_item ** pos = &table->buckets [bucket];
  847.       
  848.       while (*pos != it)
  849.     pos = &(*pos)->next_same_hash;
  850.       *pos = it->next_same_hash;
  851.       rules->free_hash_item (it, rules);
  852.       --table->bucket_size[bucket];
  853.       --table->refs;
  854.       while (!table->refs && depth)
  855.     {
  856.       struct rx_hash * save = table;
  857.       table = table->parent;
  858.       --depth;
  859.       bucket = (hash & rx_hash_masks [depth]) % 13;
  860.       --table->refs;
  861.       table->children[bucket] = 0;
  862.       rules->free_hash (save, rules);
  863.     }
  864.     }
  865. }
  866.  
  867. #ifdef __STDC__
  868. RX_DECL void
  869. rx_free_hash_table (struct rx_hash * tab, rx_hash_freefn freefn,
  870.             struct rx_hash_rules * rules)
  871. #else
  872. RX_DECL void
  873. rx_free_hash_table (tab, freefn, rules)
  874.      struct rx_hash * tab;
  875.      rx_hash_freefn freefn;
  876.      struct rx_hash_rules * rules;
  877. #endif
  878. {
  879.   int x;
  880.  
  881.   for (x = 0; x < 13; ++x)
  882.     if (tab->children[x])
  883.       {
  884.     rx_free_hash_table (tab->children[x], freefn, rules);
  885.     rules->free_hash (tab->children[x], rules);
  886.       }
  887.     else
  888.       {
  889.     struct rx_hash_item * them = tab->buckets[x];
  890.     while (them)
  891.       {
  892.         struct rx_hash_item * that = them;
  893.         them = that->next_same_hash;
  894.         freefn (that);
  895.         rules->free_hash_item (that, rules);
  896.       }
  897.       }
  898. }
  899.  
  900.  
  901.  
  902. /* Utilities for manipulating bitset represntations of characters sets. */
  903.  
  904. #ifdef __STDC__
  905. RX_DECL rx_Bitset
  906. rx_cset (struct rx *rx)
  907. #else
  908. RX_DECL rx_Bitset
  909. rx_cset (rx)
  910.      struct rx *rx;
  911. #endif
  912. {
  913.   rx_Bitset b = (rx_Bitset) malloc (rx_sizeof_bitset (rx->local_cset_size));
  914.   if (b)
  915.     rx_bitset_null (rx->local_cset_size, b);
  916.   return b;
  917. }
  918.  
  919.  
  920. #ifdef __STDC__
  921. RX_DECL rx_Bitset
  922. rx_copy_cset (struct rx *rx, rx_Bitset a)
  923. #else
  924. RX_DECL rx_Bitset
  925. rx_copy_cset (rx, a)
  926.      struct rx *rx;
  927.      rx_Bitset a;
  928. #endif
  929. {
  930.   rx_Bitset cs = rx_cset (rx);
  931.  
  932.   if (cs)
  933.     rx_bitset_union (rx->local_cset_size, cs, a);
  934.  
  935.   return cs;
  936. }
  937.  
  938.  
  939. #ifdef __STDC__
  940. RX_DECL void
  941. rx_free_cset (struct rx * rx, rx_Bitset c)
  942. #else
  943. RX_DECL void
  944. rx_free_cset (rx, c)
  945.      struct rx * rx;
  946.      rx_Bitset c;
  947. #endif
  948. {
  949.   if (c)
  950.     free ((char *)c);
  951. }
  952.  
  953.  
  954. /* Hash table memory allocation policy for the regexp compiler */
  955.  
  956. #ifdef __STDC__
  957. static struct rx_hash *
  958. compiler_hash_alloc (struct rx_hash_rules * rules)
  959. #else
  960. static struct rx_hash *
  961. compiler_hash_alloc (rules)
  962.      struct rx_hash_rules * rules;
  963. #endif
  964. {
  965.   return (struct rx_hash *)malloc (sizeof (struct rx_hash));
  966. }
  967.  
  968.  
  969. #ifdef __STDC__
  970. static struct rx_hash_item *
  971. compiler_hash_item_alloc (struct rx_hash_rules * rules, void * value)
  972. #else
  973. static struct rx_hash_item *
  974. compiler_hash_item_alloc (rules, value)
  975.      struct rx_hash_rules * rules;
  976.      void * value;
  977. #endif
  978. {
  979.   struct rx_hash_item * it;
  980.   it = (struct rx_hash_item *)malloc (sizeof (*it));
  981.   if (it)
  982.     {
  983.       it->data = value;
  984.       it->binding = 0;
  985.     }
  986.   return it;
  987. }
  988.  
  989.  
  990. #ifdef __STDC__
  991. static void
  992. compiler_free_hash (struct rx_hash * tab,
  993.             struct rx_hash_rules * rules)
  994. #else
  995. static void
  996. compiler_free_hash (tab, rules)
  997.      struct rx_hash * tab;
  998.      struct rx_hash_rules * rules;
  999. #endif
  1000. {
  1001.   free ((char *)tab);
  1002. }
  1003.  
  1004.  
  1005. #ifdef __STDC__
  1006. static void
  1007. compiler_free_hash_item (struct rx_hash_item * item,
  1008.              struct rx_hash_rules * rules)
  1009. #else
  1010. static void
  1011. compiler_free_hash_item (item, rules)
  1012.      struct rx_hash_item * item;
  1013.      struct rx_hash_rules * rules;
  1014. #endif
  1015. {
  1016.   free ((char *)item);
  1017. }
  1018.  
  1019.  
  1020. /* This page: REXP_NODE (expression tree) structures. */
  1021.  
  1022. #ifdef __STDC__
  1023. RX_DECL struct rexp_node *
  1024. rexp_node (struct rx *rx,
  1025.        enum rexp_node_type type)
  1026. #else
  1027. RX_DECL struct rexp_node *
  1028. rexp_node (rx, type)
  1029.      struct rx *rx;
  1030.      enum rexp_node_type type;
  1031. #endif
  1032. {
  1033.   struct rexp_node *n;
  1034.  
  1035.   n = (struct rexp_node *)malloc (sizeof (*n));
  1036.   bzero (n, sizeof (*n));
  1037.   if (n)
  1038.     n->type = type;
  1039.   return n;
  1040. }
  1041.  
  1042.  
  1043. /* free_rexp_node assumes that the bitset passed to rx_mk_r_cset
  1044.  * can be freed using rx_free_cset.
  1045.  */
  1046. #ifdef __STDC__
  1047. RX_DECL struct rexp_node *
  1048. rx_mk_r_cset (struct rx * rx,
  1049.           rx_Bitset b)
  1050. #else
  1051. RX_DECL struct rexp_node *
  1052. rx_mk_r_cset (rx, b)
  1053.      struct rx * rx;
  1054.      rx_Bitset b;
  1055. #endif
  1056. {
  1057.   struct rexp_node * n = rexp_node (rx, r_cset);
  1058.   if (n)
  1059.     n->params.cset = b;
  1060.   return n;
  1061. }
  1062.  
  1063.  
  1064. #ifdef __STDC__
  1065. RX_DECL struct rexp_node *
  1066. rx_mk_r_concat (struct rx * rx,
  1067.         struct rexp_node * a,
  1068.         struct rexp_node * b)
  1069. #else
  1070. RX_DECL struct rexp_node *
  1071. rx_mk_r_concat (rx, a, b)
  1072.      struct rx * rx;
  1073.      struct rexp_node * a;
  1074.      struct rexp_node * b;
  1075. #endif
  1076. {
  1077.   struct rexp_node * n = rexp_node (rx, r_concat);
  1078.   if (n)
  1079.     {
  1080.       n->params.pair.left = a;
  1081.       n->params.pair.right = b;
  1082.     }
  1083.   return n;
  1084. }
  1085.  
  1086.  
  1087. #ifdef __STDC__
  1088. RX_DECL struct rexp_node *
  1089. rx_mk_r_alternate (struct rx * rx,
  1090.            struct rexp_node * a,
  1091.            struct rexp_node * b)
  1092. #else
  1093. RX_DECL struct rexp_node *
  1094. rx_mk_r_alternate (rx, a, b)
  1095.      struct rx * rx;
  1096.      struct rexp_node * a;
  1097.      struct rexp_node * b;
  1098. #endif
  1099. {
  1100.   struct rexp_node * n = rexp_node (rx, r_alternate);
  1101.   if (n)
  1102.     {
  1103.       n->params.pair.left = a;
  1104.       n->params.pair.right = b;
  1105.     }
  1106.   return n;
  1107. }
  1108.  
  1109.  
  1110. #ifdef __STDC__
  1111. RX_DECL struct rexp_node *
  1112. rx_mk_r_opt (struct rx * rx,
  1113.          struct rexp_node * a)
  1114. #else
  1115. RX_DECL struct rexp_node *
  1116. rx_mk_r_opt (rx, a)
  1117.      struct rx * rx;
  1118.      struct rexp_node * a;
  1119. #endif
  1120. {
  1121.   struct rexp_node * n = rexp_node (rx, r_opt);
  1122.   if (n)
  1123.     {
  1124.       n->params.pair.left = a;
  1125.       n->params.pair.right = 0;
  1126.     }
  1127.   return n;
  1128. }
  1129.  
  1130.  
  1131. #ifdef __STDC__
  1132. RX_DECL struct rexp_node *
  1133. rx_mk_r_star (struct rx * rx,
  1134.           struct rexp_node * a)
  1135. #else
  1136. RX_DECL struct rexp_node *
  1137. rx_mk_r_star (rx, a)
  1138.      struct rx * rx;
  1139.      struct rexp_node * a;
  1140. #endif
  1141. {
  1142.   struct rexp_node * n = rexp_node (rx, r_star);
  1143.   if (n)
  1144.     {
  1145.       n->params.pair.left = a;
  1146.       n->params.pair.right = 0;
  1147.     }
  1148.   return n;
  1149. }
  1150.  
  1151.  
  1152. #ifdef __STDC__
  1153. RX_DECL struct rexp_node *
  1154. rx_mk_r_2phase_star (struct rx * rx,
  1155.              struct rexp_node * a,
  1156.              struct rexp_node * b)
  1157. #else
  1158. RX_DECL struct rexp_node *
  1159. rx_mk_r_2phase_star (rx, a, b)
  1160.      struct rx * rx;
  1161.      struct rexp_node * a;
  1162.      struct rexp_node * b;
  1163. #endif
  1164. {
  1165.   struct rexp_node * n = rexp_node (rx, r_2phase_star);
  1166.   if (n)
  1167.     {
  1168.       n->params.pair.left = a;
  1169.       n->params.pair.right = b;
  1170.     }
  1171.   return n;
  1172. }
  1173.  
  1174.  
  1175. #ifdef __STDC__
  1176. RX_DECL struct rexp_node *
  1177. rx_mk_r_side_effect (struct rx * rx,
  1178.              rx_side_effect a)
  1179. #else
  1180. RX_DECL struct rexp_node *
  1181. rx_mk_r_side_effect (rx, a)
  1182.      struct rx * rx;
  1183.      rx_side_effect a;
  1184. #endif
  1185. {
  1186.   struct rexp_node * n = rexp_node (rx, r_side_effect);
  1187.   if (n)
  1188.     {
  1189.       n->params.side_effect = a;
  1190.       n->params.pair.right = 0;
  1191.     }
  1192.   return n;
  1193. }
  1194.  
  1195.  
  1196. #ifdef __STDC__
  1197. RX_DECL struct rexp_node *
  1198. rx_mk_r_data  (struct rx * rx,
  1199.            void * a)
  1200. #else
  1201. RX_DECL struct rexp_node *
  1202. rx_mk_r_data  (rx, a)
  1203.      struct rx * rx;
  1204.      void * a;
  1205. #endif
  1206. {
  1207.   struct rexp_node * n = rexp_node (rx, r_data);
  1208.   if (n)
  1209.     {
  1210.       n->params.pair.left = a;
  1211.       n->params.pair.right = 0;
  1212.     }
  1213.   return n;
  1214. }
  1215.  
  1216.  
  1217. #ifdef __STDC__
  1218. RX_DECL void
  1219. rx_free_rexp (struct rx * rx, struct rexp_node * node)
  1220. #else
  1221. RX_DECL void
  1222. rx_free_rexp (rx, node)
  1223.      struct rx * rx;
  1224.      struct rexp_node * node;
  1225. #endif
  1226. {
  1227.   if (node)
  1228.     {
  1229.       switch (node->type)
  1230.     {
  1231.     case r_cset:
  1232.       if (node->params.cset)
  1233.         rx_free_cset (rx, node->params.cset);
  1234.  
  1235.     case r_side_effect:
  1236.       break;
  1237.       
  1238.     case r_concat:
  1239.     case r_alternate:
  1240.     case r_2phase_star:
  1241.     case r_opt:
  1242.     case r_star:
  1243.       rx_free_rexp (rx, node->params.pair.left);
  1244.       rx_free_rexp (rx, node->params.pair.right);
  1245.       break;
  1246.  
  1247.     case r_data:
  1248.       /* This shouldn't occur. */
  1249.       break;
  1250.     }
  1251.       free ((char *)node);
  1252.     }
  1253. }
  1254.  
  1255.  
  1256. #ifdef __STDC__
  1257. RX_DECL struct rexp_node * 
  1258. rx_copy_rexp (struct rx *rx,
  1259.        struct rexp_node *node)
  1260. #else
  1261. RX_DECL struct rexp_node * 
  1262. rx_copy_rexp (rx, node)
  1263.      struct rx *rx;
  1264.      struct rexp_node *node;
  1265. #endif
  1266. {
  1267.   if (!node)
  1268.     return 0;
  1269.   else
  1270.     {
  1271.       struct rexp_node *n = rexp_node (rx, node->type);
  1272.       if (!n)
  1273.     return 0;
  1274.       switch (node->type)
  1275.     {
  1276.     case r_cset:
  1277.       n->params.cset = rx_copy_cset (rx, node->params.cset);
  1278.       if (!n->params.cset)
  1279.         {
  1280.           rx_free_rexp (rx, n);
  1281.           return 0;
  1282.         }
  1283.       break;
  1284.  
  1285.     case r_side_effect:
  1286.       n->params.side_effect = node->params.side_effect;
  1287.       break;
  1288.  
  1289.     case r_concat:
  1290.     case r_alternate:
  1291.     case r_opt:
  1292.     case r_2phase_star:
  1293.     case r_star:
  1294.       n->params.pair.left =
  1295.         rx_copy_rexp (rx, node->params.pair.left);
  1296.       n->params.pair.right =
  1297.         rx_copy_rexp (rx, node->params.pair.right);
  1298.       if (   (node->params.pair.left && !n->params.pair.left)
  1299.           || (node->params.pair.right && !n->params.pair.right))
  1300.         {
  1301.           rx_free_rexp  (rx, n);
  1302.           return 0;
  1303.         }
  1304.       break;
  1305.     case r_data:
  1306.       /* shouldn't happen */
  1307.       break;
  1308.     }
  1309.       return n;
  1310.     }
  1311. }
  1312.  
  1313.  
  1314.  
  1315. /* This page: functions to build and destroy graphs that describe nfa's */
  1316.  
  1317. /* Constructs a new nfa node. */
  1318. #ifdef __STDC__
  1319. RX_DECL struct rx_nfa_state *
  1320. rx_nfa_state (struct rx *rx)
  1321. #else
  1322. RX_DECL struct rx_nfa_state *
  1323. rx_nfa_state (rx)
  1324.      struct rx *rx;
  1325. #endif
  1326. {
  1327.   struct rx_nfa_state * n = (struct rx_nfa_state *)malloc (sizeof (*n));
  1328.   if (!n)
  1329.     return 0;
  1330.   bzero (n, sizeof (*n));
  1331.   n->next = rx->nfa_states;
  1332.   rx->nfa_states = n;
  1333.   return n;
  1334. }
  1335.  
  1336.  
  1337. #ifdef __STDC__
  1338. RX_DECL void
  1339. rx_free_nfa_state (struct rx_nfa_state * n)
  1340. #else
  1341. RX_DECL void
  1342. rx_free_nfa_state (n)
  1343.   struct rx_nfa_state * n;
  1344. #endif
  1345. {
  1346.   free ((char *)n);
  1347. }
  1348.  
  1349.  
  1350. /* This looks up an nfa node, given a numeric id.  Numeric id's are
  1351.  * assigned after the nfa has been built.
  1352.  */
  1353. #ifdef __STDC__
  1354. RX_DECL struct rx_nfa_state * 
  1355. rx_id_to_nfa_state (struct rx * rx,
  1356.             int id)
  1357. #else
  1358. RX_DECL struct rx_nfa_state * 
  1359. rx_id_to_nfa_state (rx, id)
  1360.      struct rx * rx;
  1361.      int id;
  1362. #endif
  1363. {
  1364.   struct rx_nfa_state * n;
  1365.   for (n = rx->nfa_states; n; n = n->next)
  1366.     if (n->id == id)
  1367.       return n;
  1368.   return 0;
  1369. }
  1370.  
  1371.  
  1372. /* This adds an edge between two nodes, but doesn't initialize the 
  1373.  * edge label.
  1374.  */
  1375.  
  1376. #ifdef __STDC__
  1377. RX_DECL struct rx_nfa_edge * 
  1378. rx_nfa_edge (struct rx *rx,
  1379.          enum rx_nfa_etype type,
  1380.          struct rx_nfa_state *start,
  1381.          struct rx_nfa_state *dest)
  1382. #else
  1383. RX_DECL struct rx_nfa_edge * 
  1384. rx_nfa_edge (rx, type, start, dest)
  1385.      struct rx *rx;
  1386.      enum rx_nfa_etype type;
  1387.      struct rx_nfa_state *start;
  1388.      struct rx_nfa_state *dest;
  1389. #endif
  1390. {
  1391.   struct rx_nfa_edge *e;
  1392.   e = (struct rx_nfa_edge *)malloc (sizeof (*e));
  1393.   if (!e)
  1394.     return 0;
  1395.   e->next = start->edges;
  1396.   start->edges = e;
  1397.   e->type = type;
  1398.   e->dest = dest;
  1399.   return e;
  1400. }
  1401.  
  1402.  
  1403. #ifdef __STDC__
  1404. RX_DECL void
  1405. rx_free_nfa_edge (struct rx_nfa_edge * e)
  1406. #else
  1407. RX_DECL void
  1408. rx_free_nfa_edge (e)
  1409.      struct rx_nfa_edge * e;
  1410. #endif
  1411. {
  1412.   free ((char *)e);
  1413. }
  1414.  
  1415.  
  1416. /* This constructs a POSSIBLE_FUTURE, which is a kind epsilon-closure
  1417.  * of an NFA.  These are added to an nfa automaticly by eclose_nfa.
  1418.  */  
  1419.  
  1420. #ifdef __STDC__
  1421. static struct rx_possible_future * 
  1422. rx_possible_future (struct rx * rx,
  1423.          struct rx_se_list * effects)
  1424. #else
  1425. static struct rx_possible_future * 
  1426. rx_possible_future (rx, effects)
  1427.      struct rx * rx;
  1428.      struct rx_se_list * effects;
  1429. #endif
  1430. {
  1431.   struct rx_possible_future *ec;
  1432.   ec = (struct rx_possible_future *) malloc (sizeof (*ec));
  1433.   if (!ec)
  1434.     return 0;
  1435.   ec->destset = 0;
  1436.   ec->next = 0;
  1437.   ec->effects = effects;
  1438.   return ec;
  1439. }
  1440.  
  1441.  
  1442. #ifdef __STDC__
  1443. static void
  1444. rx_free_possible_future (struct rx_possible_future * pf)
  1445. #else
  1446. static void
  1447. rx_free_possible_future (pf)
  1448.      struct rx_possible_future * pf;
  1449. #endif
  1450. {
  1451.   free ((char *)pf);
  1452. }
  1453.  
  1454.  
  1455. #ifdef __STDC__
  1456. RX_DECL void
  1457. rx_free_nfa (struct rx *rx)
  1458. #else
  1459. RX_DECL void
  1460. rx_free_nfa (rx)
  1461.      struct rx *rx;
  1462. #endif
  1463. {
  1464.   while (rx->nfa_states)
  1465.     {
  1466.       while (rx->nfa_states->edges)
  1467.     {
  1468.       switch (rx->nfa_states->edges->type)
  1469.         {
  1470.         case ne_cset:
  1471.           rx_free_cset (rx, rx->nfa_states->edges->params.cset);
  1472.           break;
  1473.         default:
  1474.           break;
  1475.         }
  1476.       {
  1477.         struct rx_nfa_edge * e;
  1478.         e = rx->nfa_states->edges;
  1479.         rx->nfa_states->edges = rx->nfa_states->edges->next;
  1480.         rx_free_nfa_edge (e);
  1481.       }
  1482.     } /* while (rx->nfa_states->edges) */
  1483.       {
  1484.     /* Iterate over the partial epsilon closures of rx->nfa_states */
  1485.     struct rx_possible_future * pf = rx->nfa_states->futures;
  1486.     while (pf)
  1487.       {
  1488.         struct rx_possible_future * pft = pf;
  1489.         pf = pf->next;
  1490.         rx_free_possible_future (pft);
  1491.       }
  1492.       }
  1493.       {
  1494.     struct rx_nfa_state *n;
  1495.     n = rx->nfa_states;
  1496.     rx->nfa_states = rx->nfa_states->next;
  1497.     rx_free_nfa_state (n);
  1498.       }
  1499.     }
  1500. }
  1501.  
  1502.  
  1503.  
  1504. /* This page: translating a pattern expression into an nfa and doing the 
  1505.  * static part of the nfa->super-nfa translation.
  1506.  */
  1507.  
  1508. /* This is the thompson regexp->nfa algorithm. 
  1509.  * It is modified to allow for `side-effect epsilons.'  Those are
  1510.  * edges that are taken whenever a similar epsilon edge would be,
  1511.  * but which imply that some side effect occurs when the edge 
  1512.  * is taken.
  1513.  *
  1514.  * Side effects are used to model parts of the pattern langauge 
  1515.  * that are not regular (in the formal sense).
  1516.  */
  1517.  
  1518. #ifdef __STDC__
  1519. RX_DECL int
  1520. rx_build_nfa (struct rx *rx,
  1521.           struct rexp_node *rexp,
  1522.           struct rx_nfa_state **start,
  1523.           struct rx_nfa_state **end)
  1524. #else
  1525. RX_DECL int
  1526. rx_build_nfa (rx, rexp, start, end)
  1527.      struct rx *rx;
  1528.      struct rexp_node *rexp;
  1529.      struct rx_nfa_state **start;
  1530.      struct rx_nfa_state **end;
  1531. #endif
  1532. {
  1533.   struct rx_nfa_edge *edge;
  1534.  
  1535.   /* Start & end nodes may have been allocated by the caller. */
  1536.   *start = *start ? *start : rx_nfa_state (rx);
  1537.  
  1538.   if (!*start)
  1539.     return 0;
  1540.  
  1541.   if (!rexp)
  1542.     {
  1543.       *end = *start;
  1544.       return 1;
  1545.     }
  1546.  
  1547.   *end = *end ? *end : rx_nfa_state (rx);
  1548.  
  1549.   if (!*end)
  1550.     {
  1551.       rx_free_nfa_state (*start);
  1552.       return 0;
  1553.     }
  1554.  
  1555.   switch (rexp->type)
  1556.     {
  1557.     case r_data:
  1558.       return 0;
  1559.  
  1560.     case r_cset:
  1561.       edge = rx_nfa_edge (rx, ne_cset, *start, *end);
  1562.       if (!edge)
  1563.     return 0;
  1564.       edge->params.cset = rx_copy_cset (rx, rexp->params.cset);
  1565.       if (!edge->params.cset)
  1566.     {
  1567.       rx_free_nfa_edge (edge);
  1568.       return 0;
  1569.     }
  1570.       return 1;
  1571.  
  1572.     case r_opt:
  1573.       return (rx_build_nfa (rx, rexp->params.pair.left, start, end)
  1574.           && rx_nfa_edge (rx, ne_epsilon, *start, *end));
  1575.  
  1576.     case r_star:
  1577.       {
  1578.     struct rx_nfa_state * star_start = 0;
  1579.     struct rx_nfa_state * star_end = 0;
  1580.     return (rx_build_nfa (rx, rexp->params.pair.left,
  1581.                   &star_start, &star_end)
  1582.         && star_start
  1583.         && star_end
  1584.         && rx_nfa_edge (rx, ne_epsilon, star_start, star_end)
  1585.         && rx_nfa_edge (rx, ne_epsilon, *start, star_start)
  1586.         && rx_nfa_edge (rx, ne_epsilon, star_end, *end)
  1587.  
  1588.         && rx_nfa_edge (rx, ne_epsilon, star_end, star_start));
  1589.       }
  1590.  
  1591.     case r_2phase_star:
  1592.       {
  1593.     struct rx_nfa_state * star_start = 0;
  1594.     struct rx_nfa_state * star_end = 0;
  1595.     struct rx_nfa_state * loop_exp_start = 0;
  1596.     struct rx_nfa_state * loop_exp_end = 0;
  1597.  
  1598.     return (rx_build_nfa (rx, rexp->params.pair.left,
  1599.                   &star_start, &star_end)
  1600.         && rx_build_nfa (rx, rexp->params.pair.right,
  1601.                  &loop_exp_start, &loop_exp_end)
  1602.         && star_start
  1603.         && star_end
  1604.         && loop_exp_end
  1605.         && loop_exp_start
  1606.         && rx_nfa_edge (rx, ne_epsilon, star_start, *end)
  1607.         && rx_nfa_edge (rx, ne_epsilon, *start, star_start)
  1608.         && rx_nfa_edge (rx, ne_epsilon, star_end, *end)
  1609.  
  1610.         && rx_nfa_edge (rx, ne_epsilon, star_end, loop_exp_start)
  1611.         && rx_nfa_edge (rx, ne_epsilon, loop_exp_end, star_start));
  1612.       }
  1613.  
  1614.  
  1615.     case r_concat:
  1616.       {
  1617.     struct rx_nfa_state *shared = 0;
  1618.     return
  1619.       (rx_build_nfa (rx, rexp->params.pair.left, start, &shared)
  1620.        && rx_build_nfa (rx, rexp->params.pair.right, &shared, end));
  1621.       }
  1622.  
  1623.     case r_alternate:
  1624.       {
  1625.     struct rx_nfa_state *ls = 0;
  1626.     struct rx_nfa_state *le = 0;
  1627.     struct rx_nfa_state *rs = 0;
  1628.     struct rx_nfa_state *re = 0;
  1629.     return (rx_build_nfa (rx, rexp->params.pair.left, &ls, &le)
  1630.         && rx_build_nfa (rx, rexp->params.pair.right, &rs, &re)
  1631.         && rx_nfa_edge (rx, ne_epsilon, *start, ls)
  1632.         && rx_nfa_edge (rx, ne_epsilon, *start, rs)
  1633.         && rx_nfa_edge (rx, ne_epsilon, le, *end)
  1634.         && rx_nfa_edge (rx, ne_epsilon, re, *end));
  1635.       }
  1636.  
  1637.     case r_side_effect:
  1638.       edge = rx_nfa_edge (rx, ne_side_effect, *start, *end);
  1639.       if (!edge)
  1640.     return 0;
  1641.       edge->params.side_effect = rexp->params.side_effect;
  1642.       return 1;
  1643.     }
  1644.  
  1645.   /* this should never happen */
  1646.   return 0;
  1647. }
  1648.  
  1649.  
  1650. /* RX_NAME_NFA_STATES identifies all nodes with outgoing non-epsilon
  1651.  * transitions.  Only these nodes can occur in super-states.  
  1652.  * All nodes are given an integer id. 
  1653.  * The id is non-negative if the node has non-epsilon out-transitions, negative
  1654.  * otherwise (this is because we want the non-negative ids to be used as 
  1655.  * array indexes in a few places).
  1656.  */
  1657.  
  1658. #ifdef __STDC__
  1659. RX_DECL void
  1660. rx_name_nfa_states (struct rx *rx)
  1661. #else
  1662. RX_DECL void
  1663. rx_name_nfa_states (rx)
  1664.      struct rx *rx;
  1665. #endif
  1666. {
  1667.   struct rx_nfa_state *n = rx->nfa_states;
  1668.  
  1669.   rx->nodec = 0;
  1670.   rx->epsnodec = -1;
  1671.  
  1672.   while (n)
  1673.     {
  1674.       struct rx_nfa_edge *e = n->edges;
  1675.  
  1676.       if (n->is_start)
  1677.     n->eclosure_needed = 1;
  1678.  
  1679.       while (e)
  1680.     {
  1681.       switch (e->type)
  1682.         {
  1683.         case ne_epsilon:
  1684.         case ne_side_effect:
  1685.           break;
  1686.  
  1687.         case ne_cset:
  1688.           n->id = rx->nodec++;
  1689.           {
  1690.         struct rx_nfa_edge *from_n = n->edges;
  1691.         while (from_n)
  1692.           {
  1693.             from_n->dest->eclosure_needed = 1;
  1694.             from_n = from_n->next;
  1695.           }
  1696.           }
  1697.           goto cont;
  1698.         }
  1699.       e = e->next;
  1700.     }
  1701.       n->id = rx->epsnodec--;
  1702.     cont:
  1703.       n = n->next;
  1704.     }
  1705.   rx->epsnodec = -rx->epsnodec;
  1706. }
  1707.  
  1708.  
  1709. /* This page: data structures for the static part of the nfa->supernfa
  1710.  * translation.
  1711.  *
  1712.  * There are side effect lists -- lists of side effects occuring
  1713.  * along an uninterrupted, acyclic path of side-effect epsilon edges.
  1714.  * Such paths are collapsed to single edges in the course of computing
  1715.  * epsilon closures.  Such single edges are labled with a list of all
  1716.  * the side effects entailed in crossing them.  Like lists of side
  1717.  * effects are made == by the constructors below.
  1718.  *
  1719.  * There are also nfa state sets.  These are used to hold a list of all
  1720.  * states reachable from a starting state for a given type of transition
  1721.  * and side effect list.   These are also hash-consed.
  1722.  */
  1723.  
  1724. /* The next several functions compare, construct, etc. lists of side
  1725.  * effects.  See ECLOSE_NFA (below) for details.
  1726.  */
  1727.  
  1728. /* Ordering of rx_se_list
  1729.  * (-1, 0, 1 return value convention).
  1730.  */
  1731.  
  1732. #ifdef __STDC__
  1733. static int 
  1734. se_list_cmp (void * va, void * vb)
  1735. #else
  1736. static int 
  1737. se_list_cmp (va, vb)
  1738.      void * va;
  1739.      void * vb;
  1740. #endif
  1741. {
  1742.   struct rx_se_list * a = (struct rx_se_list *)va;
  1743.   struct rx_se_list * b = (struct rx_se_list *)vb;
  1744.  
  1745.   return ((va == vb)
  1746.       ? 0
  1747.       : (!va
  1748.          ? -1
  1749.          : (!vb
  1750.         ? 1
  1751.         : ((long)a->car < (long)b->car
  1752.            ? 1
  1753.            : ((long)a->car > (long)b->car
  1754.               ? -1
  1755.               : se_list_cmp ((void *)a->cdr, (void *)b->cdr))))));
  1756. }
  1757.  
  1758.  
  1759. #ifdef __STDC__
  1760. static int 
  1761. se_list_equal (void * va, void * vb)
  1762. #else
  1763. static int 
  1764. se_list_equal (va, vb)
  1765.      void * va;
  1766.      void * vb;
  1767. #endif
  1768. {
  1769.   return !(se_list_cmp (va, vb));
  1770. }
  1771.  
  1772. static struct rx_hash_rules se_list_hash_rules =
  1773. {
  1774.   se_list_equal,
  1775.   compiler_hash_alloc,
  1776.   compiler_free_hash,
  1777.   compiler_hash_item_alloc,
  1778.   compiler_free_hash_item
  1779. };
  1780.  
  1781.  
  1782. #ifdef __STDC__
  1783. static struct rx_se_list * 
  1784. side_effect_cons (struct rx * rx,
  1785.           void * se, struct rx_se_list * list)
  1786. #else
  1787. static struct rx_se_list * 
  1788. side_effect_cons (rx, se, list)
  1789.      struct rx * rx;
  1790.      void * se;
  1791.      struct rx_se_list * list;
  1792. #endif
  1793. {
  1794.   struct rx_se_list * l;
  1795.   l = ((struct rx_se_list *) malloc (sizeof (*l)));
  1796.   if (!l)
  1797.     return 0;
  1798.   l->car = se;
  1799.   l->cdr = list;
  1800.   return l;
  1801. }
  1802.  
  1803.  
  1804. #ifdef __STDC__
  1805. static struct rx_se_list *
  1806. hash_cons_se_prog (struct rx * rx,
  1807.            struct rx_hash * memo,
  1808.            void * car, struct rx_se_list * cdr)
  1809. #else
  1810. static struct rx_se_list *
  1811. hash_cons_se_prog (rx, memo, car, cdr)
  1812.      struct rx * rx;
  1813.      struct rx_hash * memo;
  1814.      void * car;
  1815.      struct rx_se_list * cdr;
  1816. #endif
  1817. {
  1818.   long hash = (long)car ^ (long)cdr;
  1819.   struct rx_se_list template;
  1820.  
  1821.   template.car = car;
  1822.   template.cdr = cdr;
  1823.   {
  1824.     struct rx_hash_item * it = rx_hash_store (memo, hash,
  1825.                           (void *)&template,
  1826.                           &se_list_hash_rules);
  1827.     if (!it)
  1828.       return 0;
  1829.     if (it->data == (void *)&template)
  1830.       {
  1831.     struct rx_se_list * consed;
  1832.     consed = (struct rx_se_list *) malloc (sizeof (*consed));
  1833.     *consed = template;
  1834.     it->data = (void *)consed;
  1835.       }
  1836.     return (struct rx_se_list *)it->data;
  1837.   }
  1838. }
  1839.      
  1840.  
  1841. #ifdef __STDC__
  1842. static struct rx_se_list *
  1843. hash_se_prog (struct rx * rx, struct rx_hash * memo, struct rx_se_list * prog)
  1844. #else
  1845. static struct rx_se_list *
  1846. hash_se_prog (rx, memo, prog)
  1847.      struct rx * rx;
  1848.      struct rx_hash * memo;
  1849.      struct rx_se_list * prog;
  1850. #endif
  1851. {
  1852.   struct rx_se_list * answer = 0;
  1853.   while (prog)
  1854.     {
  1855.       answer = hash_cons_se_prog (rx, memo, prog->car, answer);
  1856.       if (!answer)
  1857.     return 0;
  1858.       prog = prog->cdr;
  1859.     }
  1860.   return answer;
  1861. }
  1862.  
  1863. #ifdef __STDC__
  1864. static int 
  1865. nfa_set_cmp (void * va, void * vb)
  1866. #else
  1867. static int 
  1868. nfa_set_cmp (va, vb)
  1869.      void * va;
  1870.      void * vb;
  1871. #endif
  1872. {
  1873.   struct rx_nfa_state_set * a = (struct rx_nfa_state_set *)va;
  1874.   struct rx_nfa_state_set * b = (struct rx_nfa_state_set *)vb;
  1875.  
  1876.   return ((va == vb)
  1877.       ? 0
  1878.       : (!va
  1879.          ? -1
  1880.          : (!vb
  1881.         ? 1
  1882.         : (a->car->id < b->car->id
  1883.            ? 1
  1884.            : (a->car->id > b->car->id
  1885.               ? -1
  1886.               : nfa_set_cmp ((void *)a->cdr, (void *)b->cdr))))));
  1887. }
  1888.  
  1889. #ifdef __STDC__
  1890. static int 
  1891. nfa_set_equal (void * va, void * vb)
  1892. #else
  1893. static int 
  1894. nfa_set_equal (va, vb)
  1895.      void * va;
  1896.      void * vb;
  1897. #endif
  1898. {
  1899.   return !nfa_set_cmp (va, vb);
  1900. }
  1901.  
  1902. static struct rx_hash_rules nfa_set_hash_rules =
  1903. {
  1904.   nfa_set_equal,
  1905.   compiler_hash_alloc,
  1906.   compiler_free_hash,
  1907.   compiler_hash_item_alloc,
  1908.   compiler_free_hash_item
  1909. };
  1910.  
  1911.  
  1912. #ifdef __STDC__
  1913. static struct rx_nfa_state_set * 
  1914. nfa_set_cons (struct rx * rx,
  1915.           struct rx_hash * memo, struct rx_nfa_state * state,
  1916.           struct rx_nfa_state_set * set)
  1917. #else
  1918. static struct rx_nfa_state_set * 
  1919. nfa_set_cons (rx, memo, state, set)
  1920.      struct rx * rx;
  1921.      struct rx_hash * memo;
  1922.      struct rx_nfa_state * state;
  1923.      struct rx_nfa_state_set * set;
  1924. #endif
  1925. {
  1926.   struct rx_nfa_state_set template;
  1927.   struct rx_hash_item * node;
  1928.   template.car = state;
  1929.   template.cdr = set;
  1930.   node = rx_hash_store (memo,
  1931.             (((long)state) >> 8) ^ (long)set,
  1932.             &template, &nfa_set_hash_rules);
  1933.   if (!node)
  1934.     return 0;
  1935.   if (node->data == &template)
  1936.     {
  1937.       struct rx_nfa_state_set * l;
  1938.       l = (struct rx_nfa_state_set *) malloc (sizeof (*l));
  1939.       node->data = (void *) l;
  1940.       if (!l)
  1941.     return 0;
  1942.       *l = template;
  1943.     }
  1944.   return (struct rx_nfa_state_set *)node->data;
  1945. }
  1946.  
  1947.  
  1948. #ifdef __STDC__
  1949. static struct rx_nfa_state_set * 
  1950. nfa_set_enjoin (struct rx * rx,
  1951.         struct rx_hash * memo, struct rx_nfa_state * state,
  1952.         struct rx_nfa_state_set * set)
  1953. #else
  1954. static struct rx_nfa_state_set * 
  1955. nfa_set_enjoin (rx, memo, state, set)
  1956.      struct rx * rx;
  1957.      struct rx_hash * memo;
  1958.      struct rx_nfa_state * state;
  1959.      struct rx_nfa_state_set * set;
  1960. #endif
  1961. {
  1962.   if (!set || state->id < set->car->id)
  1963.     return nfa_set_cons (rx, memo, state, set);
  1964.   if (state->id == set->car->id)
  1965.     return set;
  1966.   else
  1967.     {
  1968.       struct rx_nfa_state_set * newcdr
  1969.     = nfa_set_enjoin (rx, memo, state, set->cdr);
  1970.       if (newcdr != set->cdr)
  1971.     set = nfa_set_cons (rx, memo, set->car, newcdr);
  1972.       return set;
  1973.     }
  1974. }
  1975.  
  1976.  
  1977.  
  1978. /* This page: computing epsilon closures.  The closures aren't total.
  1979.  * Each node's closures are partitioned according to the side effects entailed
  1980.  * along the epsilon edges.  Return true on success.
  1981.  */ 
  1982.  
  1983. struct eclose_frame
  1984. {
  1985.   struct rx_se_list *prog_backwards;
  1986. };
  1987.  
  1988.  
  1989. #ifdef __STDC__
  1990. static int 
  1991. eclose_node (struct rx *rx, struct rx_nfa_state *outnode,
  1992.          struct rx_nfa_state *node, struct eclose_frame *frame)
  1993. #else
  1994. static int 
  1995. eclose_node (rx, outnode, node, frame)
  1996.      struct rx *rx;
  1997.      struct rx_nfa_state *outnode;
  1998.      struct rx_nfa_state *node;
  1999.      struct eclose_frame *frame;
  2000. #endif
  2001. {
  2002.   struct rx_nfa_edge *e = node->edges;
  2003.  
  2004.   /* For each node, we follow all epsilon paths to build the closure.
  2005.    * The closure omits nodes that have only epsilon edges.
  2006.    * The closure is split into partial closures -- all the states in
  2007.    * a partial closure are reached by crossing the same list of
  2008.    * of side effects (though not necessarily the same path).
  2009.    */
  2010.   if (node->mark)
  2011.     return 1;
  2012.   node->mark = 1;
  2013.  
  2014.   if (node->id >= 0 || node->is_final)
  2015.     {
  2016.       struct rx_possible_future **ec;
  2017.       struct rx_se_list * prog_in_order
  2018.     = ((struct rx_se_list *)hash_se_prog (rx,
  2019.                           &rx->se_list_memo,
  2020.                           frame->prog_backwards));
  2021.       int cmp;
  2022.  
  2023.       ec = &outnode->futures;
  2024.  
  2025.       while (*ec)
  2026.     {
  2027.       cmp = se_list_cmp ((void *)(*ec)->effects, (void *)prog_in_order);
  2028.       if (cmp <= 0)
  2029.         break;
  2030.       ec = &(*ec)->next;
  2031.     }
  2032.       if (!*ec || (cmp < 0))
  2033.     {
  2034.       struct rx_possible_future * saved = *ec;
  2035.       *ec = rx_possible_future (rx, prog_in_order);
  2036.       (*ec)->next = saved;
  2037.       if (!*ec)
  2038.         return 0;
  2039.     }
  2040.       if (node->id >= 0)
  2041.     {
  2042.       (*ec)->destset = nfa_set_enjoin (rx, &rx->set_list_memo,
  2043.                        node, (*ec)->destset);
  2044.       if (!(*ec)->destset)
  2045.         return 0;
  2046.     }
  2047.     }
  2048.  
  2049.   while (e)
  2050.     {
  2051.       switch (e->type)
  2052.     {
  2053.     case ne_epsilon:
  2054.       if (!eclose_node (rx, outnode, e->dest, frame))
  2055.         return 0;
  2056.       break;
  2057.     case ne_side_effect:
  2058.       {
  2059.         frame->prog_backwards = side_effect_cons (rx, 
  2060.                               e->params.side_effect,
  2061.                               frame->prog_backwards);
  2062.         if (!frame->prog_backwards)
  2063.           return 0;
  2064.         if (!eclose_node (rx, outnode, e->dest, frame))
  2065.           return 0;
  2066.         {
  2067.           struct rx_se_list * dying = frame->prog_backwards;
  2068.           frame->prog_backwards = frame->prog_backwards->cdr;
  2069.           free ((char *)dying);
  2070.         }
  2071.         break;
  2072.       }
  2073.     default:
  2074.       break;
  2075.     }
  2076.       e = e->next;
  2077.     }
  2078.   node->mark = 0;
  2079.   return 1;
  2080. }
  2081.  
  2082.  
  2083. #ifdef __STDC__
  2084. RX_DECL int 
  2085. rx_eclose_nfa (struct rx *rx)
  2086. #else
  2087. RX_DECL int 
  2088. rx_eclose_nfa (rx)
  2089.      struct rx *rx;
  2090. #endif
  2091. {
  2092.   struct rx_nfa_state *n = rx->nfa_states;
  2093.   struct eclose_frame frame;
  2094.   static int rx_id = 0;
  2095.   
  2096.   frame.prog_backwards = 0;
  2097.   rx->rx_id = rx_id++;
  2098.   bzero (&rx->se_list_memo, sizeof (rx->se_list_memo));
  2099.   bzero (&rx->set_list_memo, sizeof (rx->set_list_memo));
  2100.   while (n)
  2101.     {
  2102.       n->futures = 0;
  2103.       if (n->eclosure_needed && !eclose_node (rx, n, n, &frame))
  2104.     return 0;
  2105.       /* clear_marks (rx); */
  2106.       n = n->next;
  2107.     }
  2108.   return 1;
  2109. }
  2110.  
  2111.  
  2112. /* This deletes epsilon edges from an NFA.  After running eclose_node,
  2113.  * we have no more need for these edges.  They are removed to simplify
  2114.  * further operations on the NFA.
  2115.  */
  2116.  
  2117. #ifdef __STDC__
  2118. RX_DECL void 
  2119. rx_delete_epsilon_transitions (struct rx *rx)
  2120. #else
  2121. RX_DECL void 
  2122. rx_delete_epsilon_transitions (rx)
  2123.      struct rx *rx;
  2124. #endif
  2125. {
  2126.   struct rx_nfa_state *n = rx->nfa_states;
  2127.   struct rx_nfa_edge **e;
  2128.  
  2129.   while (n)
  2130.     {
  2131.       e = &n->edges;
  2132.       while (*e)
  2133.     {
  2134.       struct rx_nfa_edge *t;
  2135.       switch ((*e)->type)
  2136.         {
  2137.         case ne_epsilon:
  2138.         case ne_side_effect:
  2139.           t = *e;
  2140.           *e = t->next;
  2141.           rx_free_nfa_edge (t);
  2142.           break;
  2143.  
  2144.         default:
  2145.           e = &(*e)->next;
  2146.           break;
  2147.         }
  2148.     }
  2149.       n = n->next;
  2150.     }
  2151. }
  2152.  
  2153.  
  2154. /* This page: storing the nfa in a contiguous region of memory for
  2155.  * subsequent conversion to a super-nfa.
  2156.  */
  2157.  
  2158. /* This is for qsort on an array of nfa_states. The order
  2159.  * is based on state ids and goes 
  2160.  *        [0...MAX][MIN..-1] where (MAX>=0) and (MIN<0)
  2161.  * This way, positive ids double as array indices.
  2162.  */
  2163.  
  2164. #ifdef __STDC__
  2165. static int 
  2166. nfacmp (void * va, void * vb)
  2167. #else
  2168. static int 
  2169. nfacmp (va, vb)
  2170.      void * va;
  2171.      void * vb;
  2172. #endif
  2173. {
  2174.   struct rx_nfa_state **a = (struct rx_nfa_state **)va;
  2175.   struct rx_nfa_state **b = (struct rx_nfa_state **)vb;
  2176.   return (*a == *b        /* &&&& 3.18 */
  2177.       ? 0
  2178.       : (((*a)->id < 0) == ((*b)->id < 0)
  2179.          ? (((*a)->id  < (*b)->id) ? -1 : 1)
  2180.          : (((*a)->id < 0)
  2181.         ? 1 : -1)));
  2182. }
  2183.  
  2184. #ifdef __STDC__
  2185. static int 
  2186. count_hash_nodes (struct rx_hash * st)
  2187. #else
  2188. static int 
  2189. count_hash_nodes (st)
  2190.      struct rx_hash * st;
  2191. #endif
  2192. {
  2193.   int x;
  2194.   int count = 0;
  2195.   for (x = 0; x < 13; ++x)
  2196.     count += ((st->children[x])
  2197.           ? count_hash_nodes (st->children[x])
  2198.           : st->bucket_size[x]);
  2199.   
  2200.   return count;
  2201. }
  2202.  
  2203.  
  2204. #ifdef __STDC__
  2205. static void 
  2206. se_memo_freer (struct rx_hash_item * node)
  2207. #else
  2208. static void 
  2209. se_memo_freer (node)
  2210.      struct rx_hash_item * node;
  2211. #endif
  2212. {
  2213.   free ((char *)node->data);
  2214. }
  2215.  
  2216.  
  2217. #ifdef __STDC__
  2218. static void 
  2219. nfa_set_freer (struct rx_hash_item * node)
  2220. #else
  2221. static void 
  2222. nfa_set_freer (node)
  2223.      struct rx_hash_item * node;
  2224. #endif
  2225. {
  2226.   free ((char *)node->data);
  2227. }
  2228.  
  2229.  
  2230. /* This copies an entire NFA into a single malloced block of memory.
  2231.  * Mostly this is for compatability with regex.c, though it is convenient
  2232.  * to have the nfa nodes in an array.
  2233.  */
  2234.  
  2235. #ifdef __STDC__
  2236. RX_DECL int 
  2237. rx_compactify_nfa (struct rx *rx,
  2238.            void **mem, unsigned long *size)
  2239. #else
  2240. RX_DECL int 
  2241. rx_compactify_nfa (rx, mem, size)
  2242.      struct rx *rx;
  2243.      void **mem;
  2244.      unsigned long *size;
  2245. #endif
  2246. {
  2247.   int total_nodec;
  2248.   struct rx_nfa_state *n;
  2249.   int edgec = 0;
  2250.   int eclosec = 0;
  2251.   int se_list_consc = count_hash_nodes (&rx->se_list_memo);
  2252.   int nfa_setc = count_hash_nodes (&rx->set_list_memo);
  2253.   unsigned long total_size;
  2254.  
  2255.   /* This takes place in two stages.   First, the total size of the
  2256.    * nfa is computed, then structures are copied.  
  2257.    */   
  2258.   n = rx->nfa_states;
  2259.   total_nodec = 0;
  2260.   while (n)
  2261.     {
  2262.       struct rx_nfa_edge *e = n->edges;
  2263.       struct rx_possible_future *ec = n->futures;
  2264.       ++total_nodec;
  2265.       while (e)
  2266.     {
  2267.       ++edgec;
  2268.       e = e->next;
  2269.     }
  2270.       while (ec)
  2271.     {
  2272.       ++eclosec;
  2273.       ec = ec->next;
  2274.     }
  2275.       n = n->next;
  2276.     }
  2277.  
  2278.   total_size = (total_nodec * sizeof (struct rx_nfa_state)
  2279.         + edgec * rx_sizeof_bitset (rx->local_cset_size)
  2280.         + edgec * sizeof (struct rx_nfa_edge)
  2281.         + nfa_setc * sizeof (struct rx_nfa_state_set)
  2282.         + eclosec * sizeof (struct rx_possible_future)
  2283.         + se_list_consc * sizeof (struct rx_se_list)
  2284.         + rx->reserved);
  2285.  
  2286.   if (total_size > *size)
  2287.     {
  2288.       *mem = remalloc (*mem, total_size);
  2289.       if (*mem)
  2290.     *size = total_size;
  2291.       else
  2292.     return 0;
  2293.     }
  2294.   /* Now we've allocated the memory; this copies the NFA. */
  2295.   {
  2296.     static struct rx_nfa_state **scratch = 0;
  2297.     static int scratch_alloc = 0;
  2298.     struct rx_nfa_state *state_base = (struct rx_nfa_state *) * mem;
  2299.     struct rx_nfa_state *new_state = state_base;
  2300.     struct rx_nfa_edge *new_edge =
  2301.       (struct rx_nfa_edge *)
  2302.     ((char *) state_base + total_nodec * sizeof (struct rx_nfa_state));
  2303.     struct rx_se_list * new_se_list =
  2304.       (struct rx_se_list *)
  2305.     ((char *)new_edge + edgec * sizeof (struct rx_nfa_edge));
  2306.     struct rx_possible_future *new_close =
  2307.       ((struct rx_possible_future *)
  2308.        ((char *) new_se_list
  2309.     + se_list_consc * sizeof (struct rx_se_list)));
  2310.     struct rx_nfa_state_set * new_nfa_set =
  2311.       ((struct rx_nfa_state_set *)
  2312.        ((char *)new_close + eclosec * sizeof (struct rx_possible_future)));
  2313.     char *new_bitset =
  2314.       ((char *) new_nfa_set + nfa_setc * sizeof (struct rx_nfa_state_set));
  2315.     int x;
  2316.     struct rx_nfa_state *n;
  2317.  
  2318.     if (scratch_alloc < total_nodec)
  2319.       {
  2320.     scratch = ((struct rx_nfa_state **)
  2321.            remalloc (scratch, total_nodec * sizeof (*scratch)));
  2322.     if (scratch)
  2323.       scratch_alloc = total_nodec;
  2324.     else
  2325.       {
  2326.         scratch_alloc = 0;
  2327.         return 0;
  2328.       }
  2329.       }
  2330.  
  2331.     for (x = 0, n = rx->nfa_states; n; n = n->next)
  2332.       scratch[x++] = n;
  2333.  
  2334.     qsort (scratch, total_nodec,
  2335.        sizeof (struct rx_nfa_state *), (int (*)())nfacmp);
  2336.  
  2337.     for (x = 0; x < total_nodec; ++x)
  2338.       {
  2339.     struct rx_possible_future *eclose = scratch[x]->futures;
  2340.     struct rx_nfa_edge *edge = scratch[x]->edges;
  2341.     struct rx_nfa_state *cn = new_state++;
  2342.     cn->futures = 0;
  2343.     cn->edges = 0;
  2344.     cn->next = (x == total_nodec - 1) ? 0 : (cn + 1);
  2345.     cn->id = scratch[x]->id;
  2346.     cn->is_final = scratch[x]->is_final;
  2347.     cn->is_start = scratch[x]->is_start;
  2348.     cn->mark = 0;
  2349.     while (edge)
  2350.       {
  2351.         int indx = (edge->dest->id < 0
  2352.              ? (total_nodec + edge->dest->id)
  2353.              : edge->dest->id);
  2354.         struct rx_nfa_edge *e = new_edge++;
  2355.         rx_Bitset cset = (rx_Bitset) new_bitset;
  2356.         new_bitset += rx_sizeof_bitset (rx->local_cset_size);
  2357.         rx_bitset_null (rx->local_cset_size, cset);
  2358.         rx_bitset_union (rx->local_cset_size, cset, edge->params.cset);
  2359.         e->next = cn->edges;
  2360.         cn->edges = e;
  2361.         e->type = edge->type;
  2362.         e->dest = state_base + indx;
  2363.         e->params.cset = cset;
  2364.         edge = edge->next;
  2365.       }
  2366.     while (eclose)
  2367.       {
  2368.         struct rx_possible_future *ec = new_close++;
  2369.         struct rx_hash_item * sp;
  2370.         struct rx_se_list ** sepos;
  2371.         struct rx_se_list * sesrc;
  2372.         struct rx_nfa_state_set * destlst;
  2373.         struct rx_nfa_state_set ** destpos;
  2374.         ec->next = cn->futures;
  2375.         cn->futures = ec;
  2376.         for (sepos = &ec->effects, sesrc = eclose->effects;
  2377.          sesrc;
  2378.          sesrc = sesrc->cdr, sepos = &(*sepos)->cdr)
  2379.           {
  2380.         sp = rx_hash_find (&rx->se_list_memo,
  2381.                    (long)sesrc->car ^ (long)sesrc->cdr,
  2382.                    sesrc, &se_list_hash_rules);
  2383.         if (sp->binding)
  2384.           {
  2385.             sesrc = (struct rx_se_list *)sp->binding;
  2386.             break;
  2387.           }
  2388.         *new_se_list = *sesrc;
  2389.         sp->binding = (void *)new_se_list;
  2390.         *sepos = new_se_list;
  2391.         ++new_se_list;
  2392.           }
  2393.         *sepos = sesrc;
  2394.         for (destpos = &ec->destset, destlst = eclose->destset;
  2395.          destlst;
  2396.          destpos = &(*destpos)->cdr, destlst = destlst->cdr)
  2397.           {
  2398.         sp = rx_hash_find (&rx->set_list_memo,
  2399.                    ((((long)destlst->car) >> 8)
  2400.                     ^ (long)destlst->cdr),
  2401.                    destlst, &nfa_set_hash_rules);
  2402.         if (sp->binding)
  2403.           {
  2404.             destlst = (struct rx_nfa_state_set *)sp->binding;
  2405.             break;
  2406.           }
  2407.         *new_nfa_set = *destlst;
  2408.         new_nfa_set->car = state_base + destlst->car->id;
  2409.         sp->binding = (void *)new_nfa_set;
  2410.         *destpos = new_nfa_set;
  2411.         ++new_nfa_set;
  2412.           }
  2413.         *destpos = destlst;
  2414.         eclose = eclose->next;
  2415.       }
  2416.       }
  2417.   }
  2418.   rx_free_hash_table (&rx->se_list_memo, se_memo_freer, &se_list_hash_rules);
  2419.   bzero (&rx->se_list_memo, sizeof (rx->se_list_memo));
  2420.   rx_free_hash_table (&rx->set_list_memo, nfa_set_freer, &nfa_set_hash_rules);
  2421.   bzero (&rx->set_list_memo, sizeof (rx->set_list_memo));
  2422.  
  2423.   rx_free_nfa (rx);
  2424.   rx->nfa_states = (struct rx_nfa_state *)*mem;
  2425.   return 1;
  2426. }
  2427.  
  2428.  
  2429. /* The functions in the next several pages define the lazy-NFA-conversion used
  2430.  * by matchers.  The input to this construction is an NFA such as 
  2431.  * is built by compactify_nfa (rx.c).  The output is the superNFA.
  2432.  */
  2433.  
  2434. /* Match engines can use arbitrary values for opcodes.  So, the parse tree 
  2435.  * is built using instructions names (enum rx_opcode), but the superstate
  2436.  * nfa is populated with mystery opcodes (void *).
  2437.  *
  2438.  * For convenience, here is an id table.  The opcodes are == to their inxs
  2439.  *
  2440.  * The lables in re_search_2 would make good values for instructions.
  2441.  */
  2442.  
  2443. void * rx_id_instruction_table[rx_num_instructions] =
  2444. {
  2445.   (void *) rx_backtrack_point,
  2446.   (void *) rx_do_side_effects,
  2447.   (void *) rx_cache_miss,
  2448.   (void *) rx_next_char,
  2449.   (void *) rx_backtrack,
  2450.   (void *) rx_error_inx
  2451. };
  2452.  
  2453.  
  2454.  
  2455. /* Memory mgt. for superstate graphs. */
  2456.  
  2457. #ifdef __STDC__
  2458. static char *
  2459. rx_cache_malloc (struct rx_cache * cache, int bytes)
  2460. #else
  2461. static char *
  2462. rx_cache_malloc (cache, bytes)
  2463.      struct rx_cache * cache;
  2464.      int bytes;
  2465. #endif
  2466. {
  2467.   while (cache->bytes_left < bytes)
  2468.     {
  2469.       if (cache->memory_pos)
  2470.     cache->memory_pos = cache->memory_pos->next;
  2471.       if (!cache->memory_pos)
  2472.     {
  2473.       cache->morecore (cache);
  2474.       if (!cache->memory_pos)
  2475.         return 0;
  2476.     }
  2477.       cache->bytes_left = cache->memory_pos->bytes;
  2478.       cache->memory_addr = ((char *)cache->memory_pos
  2479.                 + sizeof (struct rx_blocklist));
  2480.     }
  2481.   cache->bytes_left -= bytes;
  2482.   {
  2483.     char * addr = cache->memory_addr;
  2484.     cache->memory_addr += bytes;
  2485.     return addr;
  2486.   }
  2487. }
  2488.  
  2489. #ifdef __STDC__
  2490. static void
  2491. rx_cache_free (struct rx_cache * cache,
  2492.            struct rx_freelist ** freelist, char * mem)
  2493. #else
  2494. static void
  2495. rx_cache_free (cache, freelist, mem)
  2496.      struct rx_cache * cache;
  2497.      struct rx_freelist ** freelist;
  2498.      char * mem;
  2499. #endif
  2500. {
  2501.   struct rx_freelist * it = (struct rx_freelist *)mem;
  2502.   it->next = *freelist;
  2503.   *freelist = it;
  2504. }
  2505.  
  2506.  
  2507. /* The partially instantiated superstate graph has a transition 
  2508.  * table at every node.  There is one entry for every character.
  2509.  * This fills in the transition for a set.
  2510.  */
  2511. #ifdef __STDC__
  2512. static void 
  2513. install_transition (struct rx_superstate *super,
  2514.             struct rx_inx *answer, rx_Bitset trcset) 
  2515. #else
  2516. static void 
  2517. install_transition (super, answer, trcset)
  2518.      struct rx_superstate *super;
  2519.      struct rx_inx *answer;
  2520.      rx_Bitset trcset;
  2521. #endif
  2522. {
  2523.   struct rx_inx * transitions = super->transitions;
  2524.   int chr;
  2525.   for (chr = 0; chr < 256; )
  2526.     if (!*trcset)
  2527.       {
  2528.     ++trcset;
  2529.     chr += 32;
  2530.       }
  2531.     else
  2532.       {
  2533.     RX_subset sub = *trcset;
  2534.     RX_subset mask = 1;
  2535.     int bound = chr + 32;
  2536.     while (chr < bound)
  2537.       {
  2538.         if (sub & mask)
  2539.           transitions [chr] = *answer;
  2540.         ++chr;
  2541.         mask <<= 1;
  2542.       }
  2543.     ++trcset;
  2544.       }
  2545. }
  2546.  
  2547.  
  2548. #ifdef __STDC__
  2549. static int
  2550. qlen (struct rx_superstate * q)
  2551. #else
  2552. static int
  2553. qlen (q)
  2554.      struct rx_superstate * q;
  2555. #endif
  2556. {
  2557.   int count = 1;
  2558.   struct rx_superstate * it;
  2559.   if (!q)
  2560.     return 0;
  2561.   for (it = q->next_recyclable; it != q; it = it->next_recyclable)
  2562.     ++count;
  2563.   return count;
  2564. }
  2565.  
  2566. #ifdef __STDC__
  2567. static void
  2568. check_cache (struct rx_cache * cache)
  2569. #else
  2570. static void
  2571. check_cache (cache)
  2572.      struct rx_cache * cache;
  2573. #endif
  2574. {
  2575.   struct rx_cache * you_fucked_up = 0;
  2576.   int total = cache->superstates;
  2577.   int semi = cache->semifree_superstates;
  2578.   if (semi != qlen (cache->semifree_superstate))
  2579.     check_cache (you_fucked_up);
  2580.   if ((total - semi) != qlen (cache->lru_superstate))
  2581.     check_cache (you_fucked_up);
  2582. }
  2583.  
  2584. /* When a superstate is old and neglected, it can enter a 
  2585.  * semi-free state.  A semi-free state is slated to die.
  2586.  * Incoming transitions to a semi-free state are re-written
  2587.  * to cause an (interpreted) fault when they are taken.
  2588.  * The fault handler revives the semi-free state, patches
  2589.  * incoming transitions back to normal, and continues.
  2590.  *
  2591.  * The idea is basicly to free in two stages, aborting 
  2592.  * between the two if the state turns out to be useful again.
  2593.  * When a free is aborted, the rescued superstate is placed
  2594.  * in the most-favored slot to maximize the time until it
  2595.  * is next semi-freed.
  2596.  */
  2597.  
  2598. #ifdef __STDC__
  2599. static void
  2600. semifree_superstate (struct rx_cache * cache)
  2601. #else
  2602. static void
  2603. semifree_superstate (cache)
  2604.      struct rx_cache * cache;
  2605. #endif
  2606. {
  2607.   int disqualified = cache->semifree_superstates;
  2608.   if (disqualified == cache->superstates)
  2609.     return;
  2610.   while (cache->lru_superstate->locks)
  2611.     {
  2612.       cache->lru_superstate = cache->lru_superstate->next_recyclable;
  2613.       ++disqualified;
  2614.       if (disqualified == cache->superstates)
  2615.     return;
  2616.     }
  2617.   {
  2618.     struct rx_superstate * it = cache->lru_superstate;
  2619.     it->next_recyclable->prev_recyclable = it->prev_recyclable;
  2620.     it->prev_recyclable->next_recyclable = it->next_recyclable;
  2621.     cache->lru_superstate = (it == it->next_recyclable
  2622.                  ? 0
  2623.                  : it->next_recyclable);
  2624.     if (!cache->semifree_superstate)
  2625.       {
  2626.     cache->semifree_superstate = it;
  2627.     it->next_recyclable = it;
  2628.     it->prev_recyclable = it;
  2629.       }
  2630.     else
  2631.       {
  2632.     it->prev_recyclable = cache->semifree_superstate->prev_recyclable;
  2633.     it->next_recyclable = cache->semifree_superstate;
  2634.     it->prev_recyclable->next_recyclable = it;
  2635.     it->next_recyclable->prev_recyclable = it;
  2636.       }
  2637.     {
  2638.       struct rx_distinct_future *df;
  2639.       it->is_semifree = 1;
  2640.       ++cache->semifree_superstates;
  2641.       df = it->transition_refs;
  2642.       if (df)
  2643.     {
  2644.       df->prev_same_dest->next_same_dest = 0;
  2645.       for (df = it->transition_refs; df; df = df->next_same_dest)
  2646.         {
  2647.           df->future_frame.inx = cache->instruction_table[rx_cache_miss];
  2648.           df->future_frame.data = 0;
  2649.           df->future_frame.data_2 = (void *) df;
  2650.           /* If there are any NEXT-CHAR instruction frames that
  2651.            * refer to this state, we convert them to CACHE-MISS frames.
  2652.            */
  2653.           if (!df->effects
  2654.           && (df->edge->options->next_same_super_edge[0]
  2655.               == df->edge->options))
  2656.         install_transition (df->present, &df->future_frame,
  2657.                     df->edge->cset);
  2658.         }
  2659.       df = it->transition_refs;
  2660.       df->prev_same_dest->next_same_dest = df;
  2661.     }
  2662.     }
  2663.   }
  2664. }
  2665.  
  2666.  
  2667. #ifdef __STDC__
  2668. static void 
  2669. refresh_semifree_superstate (struct rx_cache * cache,
  2670.                  struct rx_superstate * super)
  2671. #else
  2672. static void 
  2673. refresh_semifree_superstate (cache, super)
  2674.      struct rx_cache * cache;
  2675.      struct rx_superstate * super;
  2676. #endif
  2677. {
  2678.   struct rx_distinct_future *df;
  2679.  
  2680.   if (super->transition_refs)
  2681.     {
  2682.       super->transition_refs->prev_same_dest->next_same_dest = 0; 
  2683.       for (df = super->transition_refs; df; df = df->next_same_dest)
  2684.     {
  2685.       df->future_frame.inx = cache->instruction_table[rx_next_char];
  2686.       df->future_frame.data = (void *) super->transitions;
  2687.       /* CACHE-MISS instruction frames that refer to this state,
  2688.        * must be converted to NEXT-CHAR frames.
  2689.        */
  2690.       if (!df->effects
  2691.           && (df->edge->options->next_same_super_edge[0]
  2692.           == df->edge->options))
  2693.         install_transition (df->present, &df->future_frame,
  2694.                 df->edge->cset);
  2695.     }
  2696.       super->transition_refs->prev_same_dest->next_same_dest
  2697.     = super->transition_refs;
  2698.     }
  2699.   if (cache->semifree_superstate == super)
  2700.     cache->semifree_superstate = (super->prev_recyclable == super
  2701.                   ? 0
  2702.                   : super->prev_recyclable);
  2703.   super->next_recyclable->prev_recyclable = super->prev_recyclable;
  2704.   super->prev_recyclable->next_recyclable = super->next_recyclable;
  2705.  
  2706.   if (!cache->lru_superstate)
  2707.     (cache->lru_superstate
  2708.      = super->next_recyclable
  2709.      = super->prev_recyclable
  2710.      = super);
  2711.   else
  2712.     {
  2713.       super->next_recyclable = cache->lru_superstate;
  2714.       super->prev_recyclable = cache->lru_superstate->prev_recyclable;
  2715.       super->next_recyclable->prev_recyclable = super;
  2716.       super->prev_recyclable->next_recyclable = super;
  2717.     }
  2718.   super->is_semifree = 0;
  2719.   --cache->semifree_superstates;
  2720. }
  2721.  
  2722. #ifdef __STDC__
  2723. static void
  2724. rx_refresh_this_superstate (struct rx_cache * cache, struct rx_superstate * superstate)
  2725. #else
  2726. static void
  2727. rx_refresh_this_superstate (cache, superstate)
  2728.      struct rx_cache * cache;
  2729.      struct rx_superstate * superstate;
  2730. #endif
  2731. {
  2732.   if (superstate->is_semifree)
  2733.     refresh_semifree_superstate (cache, superstate);
  2734.   else if (cache->lru_superstate == superstate)
  2735.     cache->lru_superstate = superstate->next_recyclable;
  2736.   else if (superstate != cache->lru_superstate->prev_recyclable)
  2737.     {
  2738.       superstate->next_recyclable->prev_recyclable
  2739.     = superstate->prev_recyclable;
  2740.       superstate->prev_recyclable->next_recyclable
  2741.     = superstate->next_recyclable;
  2742.       superstate->next_recyclable = cache->lru_superstate;
  2743.       superstate->prev_recyclable = cache->lru_superstate->prev_recyclable;
  2744.       superstate->next_recyclable->prev_recyclable = superstate;
  2745.       superstate->prev_recyclable->next_recyclable = superstate;
  2746.     }
  2747. }
  2748.  
  2749. #ifdef __STDC__
  2750. static void 
  2751. release_superset_low (struct rx_cache * cache,
  2752.              struct rx_superset *set)
  2753. #else
  2754. static void 
  2755. release_superset_low (cache, set)
  2756.      struct rx_cache * cache;
  2757.      struct rx_superset *set;
  2758. #endif
  2759. {
  2760.   if (!--set->refs)
  2761.     {
  2762.       if (set->cdr)
  2763.     release_superset_low (cache, set->cdr);
  2764.  
  2765.       set->starts_for = 0;
  2766.  
  2767.       rx_hash_free
  2768.     (rx_hash_find
  2769.      (&cache->superset_table,
  2770.       (unsigned long)set->car ^ set->id ^ (unsigned long)set->cdr,
  2771.       (void *)set,
  2772.       &cache->superset_hash_rules),
  2773.      &cache->superset_hash_rules);
  2774.       rx_cache_free (cache, &cache->free_supersets, (char *)set);
  2775.     }
  2776. }
  2777.  
  2778. #ifdef __STDC__
  2779. RX_DECL void 
  2780. rx_release_superset (struct rx *rx,
  2781.              struct rx_superset *set)
  2782. #else
  2783. RX_DECL void 
  2784. rx_release_superset (rx, set)
  2785.      struct rx *rx;
  2786.      struct rx_superset *set;
  2787. #endif
  2788. {
  2789.   release_superset_low (rx->cache, set);
  2790. }
  2791.  
  2792. /* This tries to add a new superstate to the superstate freelist.
  2793.  * It might, as a result, free some edge pieces or hash tables.
  2794.  * If nothing can be freed because too many locks are being held, fail.
  2795.  */
  2796.  
  2797. #ifdef __STDC__
  2798. static int
  2799. rx_really_free_superstate (struct rx_cache * cache)
  2800. #else
  2801. static int
  2802. rx_really_free_superstate (cache)
  2803.      struct rx_cache * cache;
  2804. #endif
  2805. {
  2806.   int locked_superstates = 0;
  2807.   struct rx_superstate * it;
  2808.  
  2809.   if (!cache->superstates)
  2810.     return 0;
  2811.  
  2812.   {
  2813.     /* This is a total guess.  The idea is that we should expect as
  2814.      * many misses as we've recently experienced.  I.e., cache->misses
  2815.      * should be the same as cache->semifree_superstates.
  2816.      */
  2817.     while ((cache->hits + cache->misses) > cache->superstates_allowed)
  2818.       {
  2819.     cache->hits >>= 1;
  2820.     cache->misses >>= 1;
  2821.       }
  2822.     if (  ((cache->hits + cache->misses) * cache->semifree_superstates)
  2823.     < (cache->superstates         * cache->misses))
  2824.       {
  2825.     semifree_superstate (cache);
  2826.     semifree_superstate (cache);
  2827.       }
  2828.   }
  2829.  
  2830.   while (cache->semifree_superstate && cache->semifree_superstate->locks)
  2831.     {
  2832.       refresh_semifree_superstate (cache, cache->semifree_superstate);
  2833.       ++locked_superstates;
  2834.       if (locked_superstates == cache->superstates)
  2835.     return 0;
  2836.     }
  2837.  
  2838.   if (cache->semifree_superstate)
  2839.     {
  2840.       it = cache->semifree_superstate;
  2841.       it->next_recyclable->prev_recyclable = it->prev_recyclable;
  2842.       it->prev_recyclable->next_recyclable = it->next_recyclable;
  2843.       cache->semifree_superstate = ((it == it->next_recyclable)
  2844.                     ? 0
  2845.                     : it->next_recyclable);
  2846.       --cache->semifree_superstates;
  2847.     }
  2848.   else
  2849.     {
  2850.       while (cache->lru_superstate->locks)
  2851.     {
  2852.       cache->lru_superstate = cache->lru_superstate->next_recyclable;
  2853.       ++locked_superstates;
  2854.       if (locked_superstates == cache->superstates)
  2855.         return 0;
  2856.     }
  2857.       it = cache->lru_superstate;
  2858.       it->next_recyclable->prev_recyclable = it->prev_recyclable;
  2859.       it->prev_recyclable->next_recyclable = it->next_recyclable;
  2860.       cache->lru_superstate = ((it == it->next_recyclable)
  2861.                     ? 0
  2862.                     : it->next_recyclable);
  2863.     }
  2864.  
  2865.   if (it->transition_refs)
  2866.     {
  2867.       struct rx_distinct_future *df;
  2868.       for (df = it->transition_refs,
  2869.        df->prev_same_dest->next_same_dest = 0;
  2870.        df;
  2871.        df = df->next_same_dest)
  2872.     {
  2873.       df->future_frame.inx = cache->instruction_table[rx_cache_miss];
  2874.       df->future_frame.data = 0;
  2875.       df->future_frame.data_2 = (void *) df;
  2876.       df->future = 0;
  2877.     }
  2878.       it->transition_refs->prev_same_dest->next_same_dest =
  2879.     it->transition_refs;
  2880.     }
  2881.   {
  2882.     struct rx_super_edge *tc = it->edges;
  2883.     while (tc)
  2884.       {
  2885.     struct rx_distinct_future * df;
  2886.     struct rx_super_edge *tct = tc->next;
  2887.     df = tc->options;
  2888.     df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
  2889.     while (df)
  2890.       {
  2891.         struct rx_distinct_future *dft = df;
  2892.         df = df->next_same_super_edge[0];
  2893.         
  2894.         
  2895.         if (dft->future && dft->future->transition_refs == dft)
  2896.           {
  2897.         dft->future->transition_refs = dft->next_same_dest;
  2898.         if (dft->future->transition_refs == dft)
  2899.           dft->future->transition_refs = 0;
  2900.           }
  2901.         dft->next_same_dest->prev_same_dest = dft->prev_same_dest;
  2902.         dft->prev_same_dest->next_same_dest = dft->next_same_dest;
  2903.         rx_cache_free (cache, &cache->free_discernable_futures,
  2904.                (char *)dft);
  2905.       }
  2906.     rx_cache_free (cache, &cache->free_transition_classes, (char *)tc);
  2907.     tc = tct;
  2908.       }
  2909.   }
  2910.   
  2911.   if (it->contents->superstate == it)
  2912.     it->contents->superstate = 0;
  2913.   release_superset_low (cache, it->contents);
  2914.   rx_cache_free (cache, &cache->free_superstates, (char *)it);
  2915.   --cache->superstates;
  2916.   return 1;
  2917. }
  2918.  
  2919. #ifdef __STDC__
  2920. static char *
  2921. rx_cache_get (struct rx_cache * cache,
  2922.           struct rx_freelist ** freelist)
  2923. #else
  2924. static char *
  2925. rx_cache_get (cache, freelist)
  2926.      struct rx_cache * cache;
  2927.      struct rx_freelist ** freelist;
  2928. #endif
  2929. {
  2930.   while (!*freelist && rx_really_free_superstate (cache))
  2931.     ;
  2932.   if (!*freelist)
  2933.     return 0;
  2934.   {
  2935.     struct rx_freelist * it = *freelist;
  2936.     *freelist = it->next;
  2937.     return (char *)it;
  2938.   }
  2939. }
  2940.  
  2941. #ifdef __STDC__
  2942. static char *
  2943. rx_cache_malloc_or_get (struct rx_cache * cache,
  2944.             struct rx_freelist ** freelist, int bytes)
  2945. #else
  2946. static char *
  2947. rx_cache_malloc_or_get (cache, freelist, bytes)
  2948.      struct rx_cache * cache;
  2949.      struct rx_freelist ** freelist;
  2950.      int bytes;
  2951. #endif
  2952. {
  2953.   if (!*freelist)
  2954.     {
  2955.       char * answer = rx_cache_malloc (cache, bytes);
  2956.       if (answer)
  2957.     return answer;
  2958.     }
  2959.  
  2960.   return rx_cache_get (cache, freelist);
  2961. }
  2962.  
  2963. #ifdef __STDC__
  2964. static char *
  2965. rx_cache_get_superstate (struct rx_cache * cache)
  2966. #else
  2967. static char *
  2968. rx_cache_get_superstate (cache)
  2969.       struct rx_cache * cache;
  2970. #endif
  2971. {
  2972.   char * answer;
  2973.   int bytes = (   sizeof (struct rx_superstate)
  2974.            +  cache->local_cset_size * sizeof (struct rx_inx));
  2975.   if (!cache->free_superstates
  2976.       && (cache->superstates < cache->superstates_allowed))
  2977.     {
  2978.       answer = rx_cache_malloc (cache, bytes);
  2979.       if (answer)
  2980.     {
  2981.       ++cache->superstates;
  2982.       return answer;
  2983.     }
  2984.     }
  2985.   answer = rx_cache_get (cache, &cache->free_superstates);
  2986.   if (!answer)
  2987.     {
  2988.       answer = rx_cache_malloc (cache, bytes);
  2989.       if (answer)
  2990.     ++cache->superstates_allowed;
  2991.     }
  2992.   ++cache->superstates;
  2993.   return answer;
  2994. }
  2995.  
  2996.  
  2997.  
  2998. #ifdef __STDC__
  2999. static int
  3000. supersetcmp (void * va, void * vb)
  3001. #else
  3002. static int
  3003. supersetcmp (va, vb)
  3004.      void * va;
  3005.      void * vb;
  3006. #endif
  3007. {
  3008.   struct rx_superset * a = (struct rx_superset *)va;
  3009.   struct rx_superset * b = (struct rx_superset *)vb;
  3010.   return (   (a == b)
  3011.       || (a && b && (a->car == b->car) && (a->cdr == b->cdr)));
  3012. }
  3013.  
  3014. #ifdef __STDC__
  3015. static struct rx_hash_item *
  3016. superset_allocator (struct rx_hash_rules * rules, void * val)
  3017. #else
  3018. static struct rx_hash_item *
  3019. superset_allocator (rules, val)
  3020.      struct rx_hash_rules * rules;
  3021.      void * val;
  3022. #endif
  3023. {
  3024.   struct rx_cache * cache
  3025.     = ((struct rx_cache *)
  3026.        ((char *)rules
  3027.     - (unsigned long)(&((struct rx_cache *)0)->superset_hash_rules)));
  3028.   struct rx_superset * template = (struct rx_superset *)val;
  3029.   struct rx_superset * newset
  3030.     = ((struct rx_superset *)
  3031.        rx_cache_malloc_or_get (cache,
  3032.                    &cache->free_supersets,
  3033.                    sizeof (*template)));
  3034.   if (!newset)
  3035.     return 0;
  3036.   newset->refs = 0;
  3037.   newset->car = template->car;
  3038.   newset->id = template->car->id;
  3039.   newset->cdr = template->cdr;
  3040.   newset->superstate = 0;
  3041.   rx_protect_superset (rx, template->cdr);
  3042.   newset->hash_item.data = (void *)newset;
  3043.   newset->hash_item.binding = 0;
  3044.   return &newset->hash_item;
  3045. }
  3046.  
  3047. #ifdef __STDC__
  3048. static struct rx_hash * 
  3049. super_hash_allocator (struct rx_hash_rules * rules)
  3050. #else
  3051. static struct rx_hash * 
  3052. super_hash_allocator (rules)
  3053.      struct rx_hash_rules * rules;
  3054. #endif
  3055. {
  3056.   struct rx_cache * cache
  3057.     = ((struct rx_cache *)
  3058.        ((char *)rules
  3059.     - (unsigned long)(&((struct rx_cache *)0)->superset_hash_rules)));
  3060.   return ((struct rx_hash *)
  3061.       rx_cache_malloc_or_get (cache,
  3062.                   &cache->free_hash, sizeof (struct rx_hash)));
  3063. }
  3064.  
  3065.  
  3066. #ifdef __STDC__
  3067. static void
  3068. super_hash_liberator (struct rx_hash * hash, struct rx_hash_rules * rules)
  3069. #else
  3070. static void
  3071. super_hash_liberator (hash, rules)
  3072.      struct rx_hash * hash;
  3073.      struct rx_hash_rules * rules;
  3074. #endif
  3075. {
  3076.   struct rx_cache * cache
  3077.     = ((struct rx_cache *)
  3078.        (char *)rules - (long)(&((struct rx_cache *)0)->superset_hash_rules));
  3079.   rx_cache_free (cache, &cache->free_hash, (char *)hash);
  3080. }
  3081.  
  3082. #ifdef __STDC__
  3083. static void
  3084. superset_hash_item_liberator (struct rx_hash_item * it,
  3085.                   struct rx_hash_rules * rules)
  3086. #else
  3087. static void
  3088. superset_hash_item_liberator (it, rules) /* Well, it does ya know. */
  3089.      struct rx_hash_item * it;
  3090.      struct rx_hash_rules * rules;
  3091. #endif
  3092. {
  3093. }
  3094.  
  3095. int rx_cache_bound = 128;
  3096. static int rx_default_cache_got = 0;
  3097.  
  3098. #ifdef __STDC__
  3099. static int
  3100. bytes_for_cache_size (int supers, int cset_size)
  3101. #else
  3102. static int
  3103. bytes_for_cache_size (supers, cset_size)
  3104.      int supers;
  3105.      int cset_size;
  3106. #endif
  3107. {
  3108.   /* What the hell is this? !!!*/
  3109.   return (int)
  3110.     ((float)supers *
  3111.      (  (1.03 * (float) (  rx_sizeof_bitset (cset_size)
  3112.              + sizeof (struct rx_super_edge)))
  3113.       + (1.80 * (float) sizeof (struct rx_possible_future))
  3114.       + (float) (  sizeof (struct rx_superstate)
  3115.          + cset_size * sizeof (struct rx_inx))));
  3116. }
  3117.  
  3118. #ifdef __STDC__
  3119. static void
  3120. rx_morecore (struct rx_cache * cache)
  3121. #else
  3122. static void
  3123. rx_morecore (cache)
  3124.      struct rx_cache * cache;
  3125. #endif
  3126. {
  3127.   if (rx_default_cache_got >= rx_cache_bound)
  3128.     return;
  3129.  
  3130.   rx_default_cache_got += 16;
  3131.   cache->superstates_allowed = rx_cache_bound;
  3132.   {
  3133.     struct rx_blocklist ** pos = &cache->memory;
  3134.     int size = bytes_for_cache_size (16, cache->local_cset_size);
  3135.     while (*pos)
  3136.       pos = &(*pos)->next;
  3137.     *pos = ((struct rx_blocklist *)
  3138.         malloc (size + sizeof (struct rx_blocklist))); 
  3139.     if (!*pos)
  3140.       return;
  3141.  
  3142.     (*pos)->next = 0;
  3143.     (*pos)->bytes = size;
  3144.     cache->memory_pos = *pos;
  3145.     cache->memory_addr = (char *)*pos + sizeof (**pos);
  3146.     cache->bytes_left = size;
  3147.   }
  3148. }
  3149.  
  3150. static struct rx_cache default_cache = 
  3151. {
  3152.   {
  3153.     supersetcmp,
  3154.     super_hash_allocator,
  3155.     super_hash_liberator,
  3156.     superset_allocator,
  3157.     superset_hash_item_liberator,
  3158.   },
  3159.   0,
  3160.   0,
  3161.   0,
  3162.   0,
  3163.   rx_morecore,
  3164.  
  3165.   0,
  3166.   0,
  3167.   0,
  3168.   0,
  3169.   0,
  3170.  
  3171.   0,
  3172.   0,
  3173.  
  3174.   0,
  3175.  
  3176.   0,
  3177.   0,
  3178.   0,
  3179.   0,
  3180.   128,
  3181.  
  3182.   256,
  3183.   rx_id_instruction_table,
  3184.  
  3185.   {
  3186.     0,
  3187.     0,
  3188.     {0},
  3189.     {0},
  3190.     {0}
  3191.   }
  3192. };
  3193.  
  3194. /* This adds an element to a superstate set.  These sets are lists, such
  3195.  * that lists with == elements are ==.  The empty set is returned by
  3196.  * superset_cons (rx, 0, 0) and is NOT equivelent to 
  3197.  * (struct rx_superset)0.
  3198.  */
  3199.  
  3200. #ifdef __STDC__
  3201. RX_DECL struct rx_superset *
  3202. rx_superset_cons (struct rx * rx,
  3203.           struct rx_nfa_state *car, struct rx_superset *cdr)
  3204. #else
  3205. RX_DECL struct rx_superset *
  3206. rx_superset_cons (rx, car, cdr)
  3207.      struct rx * rx;
  3208.      struct rx_nfa_state *car;
  3209.      struct rx_superset *cdr;
  3210. #endif
  3211. {
  3212.   struct rx_cache * cache = rx->cache;
  3213.   if (!car && !cdr)
  3214.     {
  3215.       if (!cache->empty_superset)
  3216.     {
  3217.       cache->empty_superset
  3218.         = ((struct rx_superset *)
  3219.            rx_cache_malloc_or_get (cache, &cache->free_supersets,
  3220.                        sizeof (struct rx_superset)));
  3221.       if (!cache->empty_superset)
  3222.         return 0;
  3223.       bzero (cache->empty_superset, sizeof (struct rx_superset));
  3224.       cache->empty_superset->refs = 1000;
  3225.     }
  3226.       return cache->empty_superset;
  3227.     }
  3228.   {
  3229.     struct rx_superset template;
  3230.     struct rx_hash_item * hit;
  3231.     template.car = car;
  3232.     template.cdr = cdr;
  3233.     template.id = car->id;
  3234.     hit = rx_hash_store (&cache->superset_table,
  3235.              (unsigned long)car ^ car->id ^ (unsigned long)cdr,
  3236.              (void *)&template,
  3237.              &cache->superset_hash_rules);
  3238.     return (hit
  3239.         ?  (struct rx_superset *)hit->data
  3240.         : 0);
  3241.   }
  3242. }
  3243.  
  3244. /* This computes a union of two NFA state sets.  The sets do not have the
  3245.  * same representation though.  One is a RX_SUPERSET structure (part
  3246.  * of the superstate NFA) and the other is an NFA_STATE_SET (part of the NFA).
  3247.  */
  3248.  
  3249. #ifdef __STDC__
  3250. RX_DECL struct rx_superset *
  3251. rx_superstate_eclosure_union
  3252.   (struct rx * rx, struct rx_superset *set, struct rx_nfa_state_set *ecl) 
  3253. #else
  3254. RX_DECL struct rx_superset *
  3255. rx_superstate_eclosure_union (rx, set, ecl)
  3256.      struct rx * rx;
  3257.      struct rx_superset *set;
  3258.      struct rx_nfa_state_set *ecl;
  3259. #endif
  3260. {
  3261.   if (!ecl)
  3262.     return set;
  3263.  
  3264.   if (!set->car)
  3265.     return rx_superset_cons (rx, ecl->car,
  3266.                  rx_superstate_eclosure_union (rx, set, ecl->cdr));
  3267.   if (set->car == ecl->car)
  3268.     return rx_superstate_eclosure_union (rx, set, ecl->cdr);
  3269.  
  3270.   {
  3271.     struct rx_superset * tail;
  3272.     struct rx_nfa_state * first;
  3273.  
  3274.     if (set->car > ecl->car)
  3275.       {
  3276.     tail = rx_superstate_eclosure_union (rx, set->cdr, ecl);
  3277.     first = set->car;
  3278.       }
  3279.     else
  3280.       {
  3281.     tail = rx_superstate_eclosure_union (rx, set, ecl->cdr);
  3282.     first = ecl->car;
  3283.       }
  3284.     if (!tail)
  3285.       return 0;
  3286.     else
  3287.       {
  3288.     struct rx_superset * answer;
  3289.     answer = rx_superset_cons (rx, first, tail);
  3290.     if (!answer)
  3291.       {
  3292.         rx_protect_superset (rx, tail);
  3293.         rx_release_superset (rx, tail);
  3294.         return 0;
  3295.       }
  3296.     else
  3297.       return answer;
  3298.       }
  3299.   }
  3300. }
  3301.  
  3302.  
  3303.  
  3304.  
  3305. /*
  3306.  * This makes sure that a list of rx_distinct_futures contains
  3307.  * a future for each possible set of side effects in the eclosure
  3308.  * of a given state.  This is some of the work of filling in a
  3309.  * superstate transition. 
  3310.  */
  3311.  
  3312. #ifdef __STDC__
  3313. static struct rx_distinct_future *
  3314. include_futures (struct rx *rx,
  3315.          struct rx_distinct_future *df, struct rx_nfa_state
  3316.          *state, struct rx_superstate *superstate) 
  3317. #else
  3318. static struct rx_distinct_future *
  3319. include_futures (rx, df, state, superstate)
  3320.      struct rx *rx;
  3321.      struct rx_distinct_future *df;
  3322.      struct rx_nfa_state *state;
  3323.      struct rx_superstate *superstate;
  3324. #endif
  3325. {
  3326.   struct rx_possible_future *future;
  3327.   struct rx_cache * cache = rx->cache;
  3328.   for (future = state->futures; future; future = future->next)
  3329.     {
  3330.       struct rx_distinct_future *dfp;
  3331.       struct rx_distinct_future *insert_before = 0;
  3332.       if (df)
  3333.     df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
  3334.       for (dfp = df; dfp; dfp = dfp->next_same_super_edge[0])
  3335.     if (dfp->effects == future->effects)
  3336.       break;
  3337.     else
  3338.       {
  3339.         int order = rx->se_list_cmp (rx, dfp->effects, future->effects);
  3340.         if (order > 0)
  3341.           {
  3342.         insert_before = dfp;
  3343.         dfp = 0;
  3344.         break;
  3345.           }
  3346.       }
  3347.       if (df)
  3348.     df->next_same_super_edge[1]->next_same_super_edge[0] = df;
  3349.       if (!dfp)
  3350.     {
  3351.       dfp
  3352.         = ((struct rx_distinct_future *)
  3353.            rx_cache_malloc_or_get (cache, &cache->free_discernable_futures,
  3354.                        sizeof (struct rx_distinct_future)));
  3355.       if (!dfp)
  3356.         return 0;
  3357.       if (!df)
  3358.         {
  3359.           df = insert_before = dfp;
  3360.           df->next_same_super_edge[0] = df->next_same_super_edge[1] = df;
  3361.         }
  3362.       else if (!insert_before)
  3363.         insert_before = df;
  3364.       else if (insert_before == df)
  3365.         df = dfp;
  3366.  
  3367.       dfp->next_same_super_edge[0] = insert_before;
  3368.       dfp->next_same_super_edge[1]
  3369.         = insert_before->next_same_super_edge[1];
  3370.       dfp->next_same_super_edge[1]->next_same_super_edge[0] = dfp;
  3371.       dfp->next_same_super_edge[0]->next_same_super_edge[1] = dfp;
  3372.       dfp->next_same_dest = dfp->prev_same_dest = dfp;
  3373.       dfp->future = 0;
  3374.       dfp->present = superstate;
  3375.       dfp->future_frame.inx = rx->instruction_table[rx_cache_miss];
  3376.       dfp->future_frame.data = 0;
  3377.       dfp->future_frame.data_2 = (void *) dfp;
  3378.       dfp->side_effects_frame.inx
  3379.         = rx->instruction_table[rx_do_side_effects];
  3380.       dfp->side_effects_frame.data = 0;
  3381.       dfp->side_effects_frame.data_2 = (void *) dfp;
  3382.       dfp->effects = future->effects;
  3383.     }
  3384.     }
  3385.   return df;
  3386. }
  3387.  
  3388.  
  3389.  
  3390. /* This constructs a new superstate from its state set.  The only 
  3391.  * complexity here is memory management.
  3392.  */
  3393. #ifdef __STDC__
  3394. RX_DECL struct rx_superstate *
  3395. rx_superstate (struct rx *rx,
  3396.            struct rx_superset *set)
  3397. #else
  3398. RX_DECL struct rx_superstate *
  3399. rx_superstate (rx, set)
  3400.      struct rx *rx;
  3401.      struct rx_superset *set;
  3402. #endif
  3403. {
  3404.   struct rx_cache * cache = rx->cache;
  3405.   struct rx_superstate * superstate = 0;
  3406.  
  3407.   /* Does the superstate already exist in the cache? */
  3408.   if (set->superstate)
  3409.     {
  3410.       if (set->superstate->rx_id != rx->rx_id)
  3411.     {
  3412.       /* Aha.  It is in the cache, but belongs to a superstate
  3413.        * that refers to an NFA that no longer exists.
  3414.        * (We know it no longer exists because it was evidently
  3415.        *  stored in the same region of memory as the current nfa
  3416.        *  yet it has a different id.)
  3417.        */
  3418.       superstate = set->superstate;
  3419.       if (!superstate->is_semifree)
  3420.         {
  3421.           if (cache->lru_superstate == superstate)
  3422.         {
  3423.           cache->lru_superstate = superstate->next_recyclable;
  3424.           if (cache->lru_superstate == superstate)
  3425.             cache->lru_superstate = 0;
  3426.         }
  3427.           {
  3428.         superstate->next_recyclable->prev_recyclable
  3429.           = superstate->prev_recyclable;
  3430.         superstate->prev_recyclable->next_recyclable
  3431.           = superstate->next_recyclable;
  3432.         if (!cache->semifree_superstate)
  3433.           {
  3434.             (cache->semifree_superstate
  3435.              = superstate->next_recyclable
  3436.              = superstate->prev_recyclable
  3437.              = superstate);
  3438.           }
  3439.         else
  3440.           {
  3441.             superstate->next_recyclable = cache->semifree_superstate;
  3442.             superstate->prev_recyclable
  3443.               = cache->semifree_superstate->prev_recyclable;
  3444.             superstate->next_recyclable->prev_recyclable
  3445.               = superstate;
  3446.             superstate->prev_recyclable->next_recyclable
  3447.               = superstate;
  3448.             cache->semifree_superstate = superstate;
  3449.           }
  3450.         ++cache->semifree_superstates;
  3451.           }
  3452.         }
  3453.       set->superstate = 0;
  3454.       goto handle_cache_miss;
  3455.     }
  3456.       ++cache->hits;
  3457.       superstate = set->superstate;
  3458.  
  3459.       rx_refresh_this_superstate (cache, superstate);
  3460.       return superstate;
  3461.     }
  3462.  
  3463.  handle_cache_miss:
  3464.  
  3465.   /* This point reached only for cache misses. */
  3466.   ++cache->misses;
  3467. #if RX_DEBUG
  3468.   if (rx_debug_trace > 1)
  3469.     {
  3470.       struct rx_superset * setp = set;
  3471.       fprintf (stderr, "Building a superstet %d(%d): ", rx->rx_id, set);
  3472.       while (setp)
  3473.     {
  3474.       fprintf (stderr, "%d ", setp->id);
  3475.       setp = setp->cdr;
  3476.     }
  3477.       fprintf (stderr, "(%d)\n", set);
  3478.     }
  3479. #endif
  3480.   superstate = (struct rx_superstate *)rx_cache_get_superstate (cache);
  3481.   if (!superstate)
  3482.     return 0;
  3483.  
  3484.   if (!cache->lru_superstate)
  3485.     (cache->lru_superstate
  3486.      = superstate->next_recyclable
  3487.      = superstate->prev_recyclable
  3488.      = superstate);
  3489.   else
  3490.     {
  3491.       superstate->next_recyclable = cache->lru_superstate;
  3492.       superstate->prev_recyclable = cache->lru_superstate->prev_recyclable;
  3493.       (  superstate->prev_recyclable->next_recyclable
  3494.        = superstate->next_recyclable->prev_recyclable
  3495.        = superstate);
  3496.     }
  3497.   superstate->rx_id = rx->rx_id;
  3498.   superstate->transition_refs = 0;
  3499.   superstate->locks = 0;
  3500.   superstate->is_semifree = 0;
  3501.   set->superstate = superstate;
  3502.   superstate->contents = set;
  3503.   rx_protect_superset (rx, set);
  3504.   superstate->edges = 0;
  3505.   {
  3506.     int x;
  3507.     /* None of the transitions from this superstate are known yet. */
  3508.     for (x = 0; x < rx->local_cset_size; ++x) /* &&&&& 3.8 % */
  3509.       {
  3510.     struct rx_inx * ifr = &superstate->transitions[x];
  3511.     ifr->inx = rx->instruction_table [rx_cache_miss];
  3512.     ifr->data = ifr->data_2 = 0;
  3513.       }
  3514.   }
  3515.   return superstate;
  3516. }
  3517.  
  3518.  
  3519. /* This computes the destination set of one edge of the superstate NFA.
  3520.  * Note that a RX_DISTINCT_FUTURE is a superstate edge.
  3521.  * Returns 0 on an allocation failure.
  3522.  */
  3523.  
  3524. #ifdef __STDC__
  3525. static int 
  3526. solve_destination (struct rx *rx, struct rx_distinct_future *df)
  3527. #else
  3528. static int 
  3529. solve_destination (rx, df)
  3530.      struct rx *rx;
  3531.      struct rx_distinct_future *df;
  3532. #endif
  3533. {
  3534.   struct rx_super_edge *tc = df->edge;
  3535.   struct rx_superset *nfa_state;
  3536.   struct rx_superset *nil_set = rx_superset_cons (rx, 0, 0);
  3537.   struct rx_superset *solution = nil_set;
  3538.   struct rx_superstate *dest;
  3539.  
  3540.   rx_protect_superset (rx, solution);
  3541.   /* Iterate over all NFA states in the state set of this superstate. */
  3542.   for (nfa_state = df->present->contents;
  3543.        nfa_state->car;
  3544.        nfa_state = nfa_state->cdr)
  3545.     {
  3546.       struct rx_nfa_edge *e;
  3547.       /* Iterate over all edges of each NFA state. */
  3548.       for (e = nfa_state->car->edges; e; e = e->next)
  3549.         /* If we find an edge that is labeled with 
  3550.      * the characters we are solving for.....
  3551.      */
  3552.     if (rx_bitset_is_subset (rx->local_cset_size,
  3553.                  tc->cset, e->params.cset))
  3554.       {
  3555.         struct rx_nfa_state *n = e->dest;
  3556.         struct rx_possible_future *pf;
  3557.         /* ....search the partial epsilon closures of the destination
  3558.          * of that edge for a path that involves the same set of
  3559.          * side effects we are solving for.
  3560.          * If we find such a RX_POSSIBLE_FUTURE, we add members to the
  3561.          * stateset we are computing.
  3562.          */
  3563.         for (pf = n->futures; pf; pf = pf->next)
  3564.           if (pf->effects == df->effects)
  3565.         {
  3566.           struct rx_superset * old_sol;
  3567.           old_sol = solution;
  3568.           solution = rx_superstate_eclosure_union (rx, solution,
  3569.                                pf->destset);
  3570.           if (!solution)
  3571.             return 0;
  3572.           rx_protect_superset (rx, solution);
  3573.           rx_release_superset (rx, old_sol);
  3574.         }
  3575.       }
  3576.     }
  3577.   /* It is possible that the RX_DISTINCT_FUTURE we are working on has 
  3578.    * the empty set of NFA states as its definition.  In that case, this
  3579.    * is a failure point.
  3580.    */
  3581.   if (solution == nil_set)
  3582.     {
  3583.       df->future_frame.inx = (void *) rx_backtrack;
  3584.       df->future_frame.data = 0;
  3585.       df->future_frame.data_2 = 0;
  3586.       return 1;
  3587.     }
  3588.   dest = rx_superstate (rx, solution);
  3589.   rx_release_superset (rx, solution);
  3590.   if (!dest)
  3591.     return 0;
  3592.  
  3593.   {
  3594.     struct rx_distinct_future *dft;
  3595.     dft = df;
  3596.     df->prev_same_dest->next_same_dest = 0;
  3597.     while (dft)
  3598.       {
  3599.     dft->future = dest;
  3600.     dft->future_frame.inx = rx->instruction_table[rx_next_char];
  3601.     dft->future_frame.data = (void *) dest->transitions;
  3602.     dft = dft->next_same_dest;
  3603.       }
  3604.     df->prev_same_dest->next_same_dest = df;
  3605.   }
  3606.   if (!dest->transition_refs)
  3607.     dest->transition_refs = df;
  3608.   else
  3609.     {
  3610.       struct rx_distinct_future *dft = dest->transition_refs->next_same_dest;
  3611.       dest->transition_refs->next_same_dest = df->next_same_dest;
  3612.       df->next_same_dest->prev_same_dest = dest->transition_refs;
  3613.       df->next_same_dest = dft;
  3614.       dft->prev_same_dest = df;
  3615.     }
  3616.   return 1;
  3617. }
  3618.  
  3619.  
  3620. /* This takes a superstate and a character, and computes some edges
  3621.  * from the superstate NFA.  In particular, this computes all edges
  3622.  * that lead from SUPERSTATE given CHR.   This function also 
  3623.  * computes the set of characters that share this edge set.
  3624.  * This returns 0 on allocation error.
  3625.  * The character set and list of edges are returned through 
  3626.  * the paramters CSETOUT and DFOUT.
  3627. } */
  3628.  
  3629. #ifdef __STDC__
  3630. static int 
  3631. compute_super_edge (struct rx *rx, struct rx_distinct_future **dfout,
  3632.               rx_Bitset csetout, struct rx_superstate *superstate,
  3633.               unsigned char chr)  
  3634. #else
  3635. static int 
  3636. compute_super_edge (rx, dfout, csetout, superstate, chr)
  3637.      struct rx *rx;
  3638.      struct rx_distinct_future **dfout;
  3639.      rx_Bitset csetout;
  3640.      struct rx_superstate *superstate;
  3641.      unsigned char chr;
  3642. #endif
  3643. {
  3644.   struct rx_superset *stateset = superstate->contents;
  3645.  
  3646.   /* To compute the set of characters that share edges with CHR, 
  3647.    * we start with the full character set, and subtract.
  3648.    */
  3649.   rx_bitset_universe (rx->local_cset_size, csetout);
  3650.   *dfout = 0;
  3651.  
  3652.   /* Iterate over the NFA states in the superstate state-set. */
  3653.   while (stateset->car)
  3654.     {
  3655.       struct rx_nfa_edge *e;
  3656.       for (e = stateset->car->edges; e; e = e->next)
  3657.     if (RX_bitset_member (e->params.cset, chr))
  3658.       {
  3659.         /* If we find an NFA edge that applies, we make sure there
  3660.          * are corresponding edges in the superstate NFA.
  3661.          */
  3662.         {
  3663.           struct rx_distinct_future * saved;
  3664.           saved = *dfout;
  3665.           *dfout = include_futures (rx, *dfout, e->dest, superstate);
  3666.           if (!*dfout)
  3667.         {
  3668.           struct rx_distinct_future * df;
  3669.           df = saved;
  3670.           df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
  3671.           while (df)
  3672.             {
  3673.               struct rx_distinct_future *dft;
  3674.               dft = df;
  3675.               df = df->next_same_super_edge[0];
  3676.  
  3677.               if (dft->future && dft->future->transition_refs == dft)
  3678.             {
  3679.               dft->future->transition_refs = dft->next_same_dest;
  3680.               if (dft->future->transition_refs == dft)
  3681.                 dft->future->transition_refs = 0;
  3682.             }
  3683.               dft->next_same_dest->prev_same_dest = dft->prev_same_dest;
  3684.               dft->prev_same_dest->next_same_dest = dft->next_same_dest;
  3685.               rx_cache_free (rx->cache,
  3686.                      &rx->cache->free_discernable_futures,
  3687.                      (char *)dft);
  3688.             }
  3689.           return 0;
  3690.         }
  3691.         }
  3692.         /* We also trim the character set a bit. */
  3693.         rx_bitset_intersection (rx->local_cset_size,
  3694.                     csetout, e->params.cset);
  3695.       }
  3696.     else
  3697.       /* An edge that doesn't apply at least tells us some characters
  3698.        * that don't share the same edge set as CHR.
  3699.        */
  3700.       rx_bitset_difference (rx->local_cset_size, csetout, e->params.cset);
  3701.       stateset = stateset->cdr;
  3702.     }
  3703.   return 1;
  3704. }
  3705.  
  3706.  
  3707. /* This is a constructor for RX_SUPER_EDGE structures.  These are
  3708.  * wrappers for lists of superstate NFA edges that share character sets labels.
  3709.  * If a transition class contains more than one rx_distinct_future (superstate
  3710.  * edge), then it represents a non-determinism in the superstate NFA.
  3711.  */
  3712.  
  3713. #ifdef __STDC__
  3714. static struct rx_super_edge *
  3715. rx_super_edge (struct rx *rx,
  3716.            struct rx_superstate *super, rx_Bitset cset,
  3717.            struct rx_distinct_future *df) 
  3718. #else
  3719. static struct rx_super_edge *
  3720. rx_super_edge (rx, super, cset, df)
  3721.      struct rx *rx;
  3722.      struct rx_superstate *super;
  3723.      rx_Bitset cset;
  3724.      struct rx_distinct_future *df;
  3725. #endif
  3726. {
  3727.   struct rx_super_edge *tc =
  3728.     (struct rx_super_edge *)rx_cache_malloc_or_get
  3729.       (rx->cache, &rx->cache->free_transition_classes,
  3730.        sizeof (struct rx_super_edge) + rx_sizeof_bitset (rx->local_cset_size));
  3731.  
  3732.   if (!tc)
  3733.     return 0;
  3734.   tc->next = super->edges;
  3735.   super->edges = tc;
  3736.   tc->rx_backtrack_frame.inx = rx->instruction_table[rx_backtrack_point];
  3737.   tc->rx_backtrack_frame.data = 0;
  3738.   tc->rx_backtrack_frame.data_2 = (void *) tc;
  3739.   tc->options = df;
  3740.   tc->cset = (rx_Bitset) ((char *) tc + sizeof (*tc));
  3741.   rx_bitset_assign (rx->local_cset_size, tc->cset, cset);
  3742.   if (df)
  3743.     {
  3744.       struct rx_distinct_future * dfp = df;
  3745.       df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
  3746.       while (dfp)
  3747.     {
  3748.       dfp->edge = tc;
  3749.       dfp = dfp->next_same_super_edge[0];
  3750.     }
  3751.       df->next_same_super_edge[1]->next_same_super_edge[0] = df;
  3752.     }
  3753.   return tc;
  3754. }
  3755.  
  3756.  
  3757. /* There are three kinds of cache miss.  The first occurs when a
  3758.  * transition is taken that has never been computed during the
  3759.  * lifetime of the source superstate.  That cache miss is handled by
  3760.  * calling COMPUTE_SUPER_EDGE.  The second kind of cache miss
  3761.  * occurs when the destination superstate of a transition doesn't
  3762.  * exist.  SOLVE_DESTINATION is used to construct the destination superstate.
  3763.  * Finally, the third kind of cache miss occurs when the destination
  3764.  * superstate of a transition is in a `semi-free state'.  That case is
  3765.  * handled by UNFREE_SUPERSTATE.
  3766.  *
  3767.  * The function of HANDLE_CACHE_MISS is to figure out which of these
  3768.  * cases applies.
  3769.  */
  3770.  
  3771. #ifdef __STDC__
  3772. static void
  3773. install_partial_transition  (struct rx_superstate *super,
  3774.                  struct rx_inx *answer,
  3775.                  RX_subset set, int offset)
  3776. #else
  3777. static void
  3778. install_partial_transition  (super, answer, set, offset)
  3779.      struct rx_superstate *super;
  3780.      struct rx_inx *answer;
  3781.      RX_subset set;
  3782.      int offset;
  3783. #endif
  3784. {
  3785.   int start = offset;
  3786.   int end = start + 32;
  3787.   RX_subset pos = 1;
  3788.   struct rx_inx * transitions = super->transitions;
  3789.   
  3790.   while (start < end)
  3791.     {
  3792.       if (set & pos)
  3793.     transitions[start] = *answer;
  3794.       pos <<= 1;
  3795.       ++start;
  3796.     }
  3797. }
  3798.  
  3799.  
  3800. #ifdef __STDC__
  3801. RX_DECL struct rx_inx *
  3802. rx_handle_cache_miss
  3803.   (struct rx *rx, struct rx_superstate *super, unsigned char chr, void *data) 
  3804. #else
  3805. RX_DECL struct rx_inx *
  3806. rx_handle_cache_miss (rx, super, chr, data)
  3807.      struct rx *rx;
  3808.      struct rx_superstate *super;
  3809.      unsigned char chr;
  3810.      void *data;
  3811. #endif
  3812. {
  3813.   int offset = chr / RX_subset_bits;
  3814.   struct rx_distinct_future *df = data;
  3815.  
  3816.   if (!df)            /* must be the shared_cache_miss_frame */
  3817.     {
  3818.       /* Perhaps this is just a transition waiting to be filled. */
  3819.       struct rx_super_edge *tc;
  3820.       RX_subset mask = rx_subset_singletons [chr % RX_subset_bits];
  3821.  
  3822.       for (tc = super->edges; tc; tc = tc->next)
  3823.     if (tc->cset[offset] & mask)
  3824.       {
  3825.         struct rx_inx * answer;
  3826.         df = tc->options;
  3827.         answer = ((tc->options->next_same_super_edge[0] != tc->options)
  3828.               ? &tc->rx_backtrack_frame
  3829.               : (df->effects
  3830.              ? &df->side_effects_frame
  3831.              : &df->future_frame));
  3832.         install_partial_transition (super, answer,
  3833.                     tc->cset [offset], offset * 32);
  3834.         return answer;
  3835.       }
  3836.       /* Otherwise, it's a flushed or  newly encountered edge. */
  3837.       {
  3838.     char cset_space[1024];    /* this limit is far from unreasonable */
  3839.     rx_Bitset trcset;
  3840.     struct rx_inx *answer;
  3841.  
  3842.     if (rx_sizeof_bitset (rx->local_cset_size) > sizeof (cset_space))
  3843.       return 0;        /* If the arbitrary limit is hit, always fail */
  3844.                 /* cleanly. */
  3845.     trcset = (rx_Bitset)cset_space;
  3846.     rx_lock_superstate (rx, super);
  3847.     if (!compute_super_edge (rx, &df, trcset, super, chr))
  3848.       {
  3849.         rx_unlock_superstate (rx, super);
  3850.         return 0;
  3851.       }
  3852.     if (!df)        /* We just computed the fail transition. */
  3853.       {
  3854.         static struct rx_inx
  3855.           shared_fail_frame = { 0, 0, (void *)rx_backtrack, 0 };
  3856.         answer = &shared_fail_frame;
  3857.       }
  3858.     else
  3859.       {
  3860.         tc = rx_super_edge (rx, super, trcset, df);
  3861.         if (!tc)
  3862.           {
  3863.         rx_unlock_superstate (rx, super);
  3864.         return 0;
  3865.           }
  3866.         answer = ((tc->options->next_same_super_edge[0] != tc->options)
  3867.               ? &tc->rx_backtrack_frame
  3868.               : (df->effects
  3869.              ? &df->side_effects_frame
  3870.              : &df->future_frame));
  3871.       }
  3872.     install_partial_transition (super, answer,
  3873.                     trcset[offset], offset * 32);
  3874.     rx_unlock_superstate (rx, super);
  3875.     return answer;
  3876.       }
  3877.     }
  3878.   else if (df->future) /* A cache miss on an edge with a future? Must be
  3879.             * a semi-free destination. */
  3880.     {                
  3881.       if (df->future->is_semifree)
  3882.     refresh_semifree_superstate (rx->cache, df->future);
  3883.       return &df->future_frame;
  3884.     }
  3885.   else
  3886.     /* no future superstate on an existing edge */
  3887.     {
  3888.       rx_lock_superstate (rx, super);
  3889.       if (!solve_destination (rx, df))
  3890.     {
  3891.       rx_unlock_superstate (rx, super);
  3892.       return 0;
  3893.     }
  3894.       if (!df->effects
  3895.       && (df->edge->options->next_same_super_edge[0] == df->edge->options))
  3896.     install_partial_transition (super, &df->future_frame,
  3897.                     df->edge->cset[offset], offset * 32);
  3898.       rx_unlock_superstate (rx, super);
  3899.       return &df->future_frame;
  3900.     }
  3901. }
  3902.  
  3903.  
  3904.  
  3905.  
  3906. /* The rest of the code provides a regex.c compatable interface. */
  3907.  
  3908.  
  3909. __const__ char *re_error_msg[] =
  3910. {
  3911.   0,                        /* REG_NOUT */
  3912.   "No match",                    /* REG_NOMATCH */
  3913.   "Invalid regular expression",            /* REG_BADPAT */
  3914.   "Invalid collation character",        /* REG_ECOLLATE */
  3915.   "Invalid character class name",        /* REG_ECTYPE */
  3916.   "Trailing backslash",                /* REG_EESCAPE */
  3917.   "Invalid back reference",            /* REG_ESUBREG */
  3918.   "Unmatched [ or [^",                /* REG_EBRACK */
  3919.   "Unmatched ( or \\(",                /* REG_EPAREN */
  3920.   "Unmatched \\{",                /* REG_EBRACE */
  3921.   "Invalid content of \\{\\}",            /* REG_BADBR */
  3922.   "Invalid range end",                /* REG_ERANGE */
  3923.   "Memory exhausted",                /* REG_ESPACE */
  3924.   "Invalid preceding regular expression",    /* REG_BADRPT */
  3925.   "Premature end of regular expression",    /* REG_EEND */
  3926.   "Regular expression too big",            /* REG_ESIZE */
  3927.   "Unmatched ) or \\)",                /* REG_ERPAREN */
  3928. };
  3929.  
  3930.  
  3931.  
  3932. /* 
  3933.  * Macros used while compiling patterns.
  3934.  *
  3935.  * By convention, PEND points just past the end of the uncompiled pattern,
  3936.  * P points to the read position in the pattern.  `translate' is the name
  3937.  * of the translation table (`TRANSLATE' is the name of a macro that looks
  3938.  * things up in `translate').
  3939.  */
  3940.  
  3941.  
  3942. /*
  3943.  * Fetch the next character in the uncompiled pattern---translating it 
  3944.  * if necessary. *Also cast from a signed character in the constant
  3945.  * string passed to us by the user to an unsigned char that we can use
  3946.  * as an array index (in, e.g., `translate').
  3947.  */
  3948. #define PATFETCH(c)                            \
  3949.  do {if (p == pend) return REG_EEND;                    \
  3950.     c = (unsigned char) *p++;                        \
  3951.     c = translate[c];                             \
  3952.  } while (0)
  3953.  
  3954. /* 
  3955.  * Fetch the next character in the uncompiled pattern, with no
  3956.  * translation.
  3957.  */
  3958. #define PATFETCH_RAW(c)                            \
  3959.   do {if (p == pend) return REG_EEND;                    \
  3960.     c = (unsigned char) *p++;                         \
  3961.   } while (0)
  3962.  
  3963. /* Go backwards one character in the pattern.  */
  3964. #define PATUNFETCH p--
  3965.  
  3966.  
  3967. #define TRANSLATE(d) translate[(unsigned char) (d)]
  3968.  
  3969. typedef unsigned regnum_t;
  3970.  
  3971. /* Since offsets can go either forwards or backwards, this type needs to
  3972.  * be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.
  3973.  */
  3974. typedef int pattern_offset_t;
  3975.  
  3976. typedef struct
  3977. {
  3978.   struct rexp_node ** top_expression; /* was begalt */
  3979.   struct rexp_node ** last_expression; /* was laststart */
  3980.   pattern_offset_t inner_group_offset;
  3981.   regnum_t regnum;
  3982. } compile_stack_elt_t;
  3983.  
  3984. typedef struct
  3985. {
  3986.   compile_stack_elt_t *stack;
  3987.   unsigned size;
  3988.   unsigned avail;            /* Offset of next open position.  */
  3989. } compile_stack_type;
  3990.  
  3991.  
  3992. #define INIT_COMPILE_STACK_SIZE 32
  3993.  
  3994. #define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
  3995. #define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
  3996.  
  3997. /* The next available element.  */
  3998. #define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
  3999.  
  4000.  
  4001. /* Set the bit for character C in a list.  */
  4002. #define SET_LIST_BIT(c)                               \
  4003.   (b[((unsigned char) (c)) / CHARBITS]               \
  4004.    |= 1 << (((unsigned char) c) % CHARBITS))
  4005.  
  4006. /* Get the next unsigned number in the uncompiled pattern.  */
  4007. #define GET_UNSIGNED_NUMBER(num)                     \
  4008.   { if (p != pend)                            \
  4009.      {                                    \
  4010.        PATFETCH (c);                             \
  4011.        while (isdigit (c))                         \
  4012.          {                                 \
  4013.            if (num < 0)                            \
  4014.               num = 0;                            \
  4015.            num = num * 10 + c - '0';                     \
  4016.            if (p == pend)                         \
  4017.               break;                             \
  4018.            PATFETCH (c);                        \
  4019.          }                                 \
  4020.        }                                 \
  4021.     }        
  4022.  
  4023. #define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
  4024.  
  4025. #define IS_CHAR_CLASS(string)                        \
  4026.    (!strcmp (string, "alpha") || !strcmp (string, "upper")        \
  4027.     || !strcmp (string, "lower") || !strcmp (string, "digit")        \
  4028.     || !strcmp (string, "alnum") || !strcmp (string, "xdigit")        \
  4029.     || !strcmp (string, "space") || !strcmp (string, "print")        \
  4030.     || !strcmp (string, "punct") || !strcmp (string, "graph")        \
  4031.     || !strcmp (string, "cntrl") || !strcmp (string, "blank"))
  4032.  
  4033.  
  4034. /* These predicates are used in regex_compile. */
  4035.  
  4036. /* P points to just after a ^ in PATTERN.  Return true if that ^ comes
  4037.  * after an alternative or a begin-subexpression.  We assume there is at
  4038.  * least one character before the ^.  
  4039.  */
  4040.  
  4041. #ifdef __STDC__
  4042. static boolean
  4043. at_begline_loc_p (__const__ char *pattern, __const__ char * p, reg_syntax_t syntax)
  4044. #else
  4045. static boolean
  4046. at_begline_loc_p (pattern, p, syntax)
  4047.      __const__ char *pattern;
  4048.      __const__ char * p;
  4049.      reg_syntax_t syntax;
  4050. #endif
  4051. {
  4052.   __const__ char *prev = p - 2;
  4053.   boolean prev_prev_backslash = ((prev > pattern) && (prev[-1] == '\\'));
  4054.   
  4055.     return
  4056.       
  4057.       (/* After a subexpression?  */
  4058.        ((*prev == '(') && ((syntax & RE_NO_BK_PARENS) || prev_prev_backslash))
  4059.        ||
  4060.        /* After an alternative?  */
  4061.        ((*prev == '|') && ((syntax & RE_NO_BK_VBAR) || prev_prev_backslash))
  4062.        );
  4063. }
  4064.  
  4065. /* The dual of at_begline_loc_p.  This one is for $.  We assume there is
  4066.  * at least one character after the $, i.e., `P < PEND'.
  4067.  */
  4068.  
  4069. #ifdef __STDC__
  4070. static boolean
  4071. at_endline_loc_p (__const__ char *p, __const__ char *pend, int syntax)
  4072. #else
  4073. static boolean
  4074. at_endline_loc_p (p, pend, syntax)
  4075.      __const__ char *p;
  4076.      __const__ char *pend;
  4077.      int syntax;
  4078. #endif
  4079. {
  4080.   __const__ char *next = p;
  4081.   boolean next_backslash = (*next == '\\');
  4082.   __const__ char *next_next = (p + 1 < pend) ? (p + 1) : 0;
  4083.   
  4084.   return
  4085.     (
  4086.      /* Before a subexpression?  */
  4087.      ((syntax & RE_NO_BK_PARENS)
  4088.       ? (*next == ')')
  4089.       : (next_backslash && next_next && (*next_next == ')')))
  4090.     ||
  4091.      /* Before an alternative?  */
  4092.      ((syntax & RE_NO_BK_VBAR)
  4093.       ? (*next == '|')
  4094.       : (next_backslash && next_next && (*next_next == '|')))
  4095.      );
  4096. }
  4097.  
  4098.  
  4099. unsigned char rx_id_translation[256] =
  4100. {
  4101.   0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
  4102.  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  4103.  20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
  4104.  30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
  4105.  40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
  4106.  50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  4107.  60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
  4108.  70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
  4109.  80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
  4110.  90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
  4111.  
  4112.  100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
  4113.  110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
  4114.  120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
  4115.  130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
  4116.  140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
  4117.  150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
  4118.  160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
  4119.  170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
  4120.  180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
  4121.  190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
  4122.  
  4123.  200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
  4124.  210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
  4125.  220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
  4126.  230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
  4127.  240, 241, 242, 243, 244, 245, 246, 247, 248, 249,
  4128.  250, 251, 252, 253, 254, 255
  4129. };
  4130.  
  4131. /* The compiler keeps an inverted translation table.
  4132.  * This looks up/inititalize elements.
  4133.  * VALID is an array of booleans that validate CACHE.
  4134.  */
  4135.  
  4136. #ifdef __STDC__
  4137. static rx_Bitset
  4138. inverse_translation (struct re_pattern_buffer * rxb,
  4139.              char * valid, rx_Bitset cache,
  4140.              unsigned char * translate, int c)
  4141. #else
  4142. static rx_Bitset
  4143. inverse_translation (rxb, valid, cache, translate, c)
  4144.      struct re_pattern_buffer * rxb;
  4145.      char * valid;
  4146.      rx_Bitset cache;
  4147.      unsigned char * translate;
  4148.      int c;
  4149. #endif
  4150. {
  4151.   rx_Bitset cs
  4152.     = cache + c * rx_bitset_numb_subsets (rxb->rx.local_cset_size); 
  4153.  
  4154.   if (!valid[c])
  4155.     {
  4156.       int x;
  4157.       int c_tr = TRANSLATE(c);
  4158.       rx_bitset_null (rxb->rx.local_cset_size, cs);
  4159.       for (x = 0; x < 256; ++x)    /* &&&& 13.37 */
  4160.     if (TRANSLATE(x) == c_tr)
  4161.       RX_bitset_enjoin (cs, x);
  4162.       valid[c] = 1;
  4163.     }
  4164.   return cs;
  4165. }
  4166.  
  4167.  
  4168.  
  4169.  
  4170. /* More subroutine declarations and macros for regex_compile.  */
  4171.  
  4172. /* Returns true if REGNUM is in one of COMPILE_STACK's elements and 
  4173.    false if it's not.  */
  4174.  
  4175. #ifdef __STDC__
  4176. static boolean
  4177. group_in_compile_stack (compile_stack_type compile_stack, regnum_t regnum)
  4178. #else
  4179. static boolean
  4180. group_in_compile_stack (compile_stack, regnum)
  4181.     compile_stack_type compile_stack;
  4182.     regnum_t regnum;
  4183. #endif
  4184. {
  4185.   int this_element;
  4186.  
  4187.   for (this_element = compile_stack.avail - 1;  
  4188.        this_element >= 0; 
  4189.        this_element--)
  4190.     if (compile_stack.stack[this_element].regnum == regnum)
  4191.       return true;
  4192.  
  4193.   return false;
  4194. }
  4195.  
  4196.  
  4197. /*
  4198.  * Read the ending character of a range (in a bracket expression) from the
  4199.  * uncompiled pattern *P_PTR (which ends at PEND).  We assume the
  4200.  * starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
  4201.  * Then we set the translation of all bits between the starting and
  4202.  * ending characters (inclusive) in the compiled pattern B.
  4203.  * 
  4204.  * Return an error code.
  4205.  * 
  4206.  * We use these short variable names so we can use the same macros as
  4207.  * `regex_compile' itself.  
  4208.  */
  4209.  
  4210. #ifdef __STDC__
  4211. static reg_errcode_t
  4212. compile_range (struct re_pattern_buffer * rxb, rx_Bitset cs,
  4213.            __const__ char ** p_ptr, __const__ char * pend,
  4214.            unsigned char * translate, reg_syntax_t syntax,
  4215.            rx_Bitset inv_tr,  char * valid_inv_tr)
  4216. #else
  4217. static reg_errcode_t
  4218. compile_range (rxb, cs, p_ptr, pend, translate, syntax, inv_tr, valid_inv_tr)
  4219.      struct re_pattern_buffer * rxb;
  4220.      rx_Bitset cs;
  4221.      __const__ char ** p_ptr;
  4222.      __const__ char * pend;
  4223.      unsigned char * translate;
  4224.      reg_syntax_t syntax;
  4225.      rx_Bitset inv_tr;
  4226.      char * valid_inv_tr;
  4227. #endif
  4228. {
  4229.   unsigned this_char;
  4230.  
  4231.   __const__ char *p = *p_ptr;
  4232.  
  4233.   unsigned char range_end;
  4234.   unsigned char range_start = TRANSLATE(p[-2]);
  4235.  
  4236.   if (p == pend)
  4237.     return REG_ERANGE;
  4238.  
  4239.   PATFETCH (range_end);
  4240.  
  4241.   (*p_ptr)++;
  4242.  
  4243.   if (range_start > range_end)
  4244.     return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
  4245.  
  4246.   for (this_char = range_start; this_char <= range_end; this_char++)
  4247.     {
  4248.       rx_Bitset it =
  4249.     inverse_translation (rxb, valid_inv_tr, inv_tr, translate, this_char);
  4250.       rx_bitset_union (rxb->rx.local_cset_size, cs, it);
  4251.     }
  4252.   
  4253.   return REG_NOERROR;
  4254. }
  4255.  
  4256.  
  4257. /* This searches a regexp for backreference side effects.
  4258.  * It fills in the array OUT with 1 at the index of every register pair
  4259.  * referenced by a backreference.
  4260.  *
  4261.  * This is used to help optimize patterns for searching.  The information is
  4262.  * useful because, if the caller doesn't want register values, backreferenced
  4263.  * registers are the only registers for which we need rx_backtrack.
  4264.  */
  4265.  
  4266. #ifdef __STDC__
  4267. static void
  4268. find_backrefs (char * out, struct rexp_node * rexp,
  4269.            struct re_se_params * params)
  4270. #else
  4271. static void
  4272. find_backrefs (out, rexp, params)
  4273.      char * out;
  4274.      struct rexp_node * rexp;
  4275.      struct re_se_params * params;
  4276. #endif
  4277. {
  4278.   if (rexp)
  4279.     switch (rexp->type)
  4280.       {
  4281.       case r_cset:
  4282.       case r_data:
  4283.     return;
  4284.       case r_alternate:
  4285.       case r_concat:
  4286.       case r_opt:
  4287.       case r_star:
  4288.       case r_2phase_star:
  4289.     find_backrefs (out, rexp->params.pair.left, params);
  4290.     find_backrefs (out, rexp->params.pair.right, params);
  4291.     return;
  4292.       case r_side_effect:
  4293.     if (   ((long)rexp->params.side_effect >= 0)
  4294.         && (params [(long)rexp->params.side_effect].se == re_se_backref))
  4295.       out[ params [(long)rexp->params.side_effect].op1] = 1;
  4296.     return;
  4297.       }
  4298. }
  4299.  
  4300.  
  4301.  
  4302. /* Returns 0 unless the pattern can match the empty string. */
  4303.  
  4304. #ifdef __STDC__
  4305. static int
  4306. compute_fastset (struct re_pattern_buffer * rxb, struct rexp_node * rexp)
  4307. #else
  4308. static int
  4309. compute_fastset (rxb, rexp)
  4310.      struct re_pattern_buffer * rxb;
  4311.      struct rexp_node * rexp;
  4312. #endif
  4313. {
  4314.   if (!rexp)
  4315.     return 1;
  4316.   switch (rexp->type)
  4317.     {
  4318.     case r_data:
  4319.       return 1;
  4320.     case r_cset:
  4321.       {
  4322.     rx_bitset_union (rxb->rx.local_cset_size,
  4323.              rxb->fastset, rexp->params.cset);
  4324.       }
  4325.       return 0;
  4326.     case r_concat:
  4327.       return (compute_fastset (rxb, rexp->params.pair.left)
  4328.           && compute_fastset (rxb, rexp->params.pair.right));
  4329.     case r_2phase_star:
  4330.       compute_fastset (rxb, rexp->params.pair.left);
  4331.       /* compute_fastset (rxb, rexp->params.pair.right);  nope... */
  4332.       return 1;
  4333.     case r_alternate:
  4334.       return !!(compute_fastset (rxb, rexp->params.pair.left)
  4335.         + compute_fastset (rxb, rexp->params.pair.right));
  4336.     case r_opt:
  4337.     case r_star:
  4338.       compute_fastset (rxb, rexp->params.pair.left);
  4339.       return 1;
  4340.     case r_side_effect:
  4341.       return 1;
  4342.     }
  4343.  
  4344.   /* this should never happen */
  4345.   return 0;
  4346. }
  4347.  
  4348.  
  4349. /* returns
  4350.  *  1 -- yes, definately anchored by the given side effect.
  4351.  *  2 -- maybe anchored, maybe the empty string.
  4352.  *  0 -- definately not anchored
  4353.  *  There is simply no other possibility.
  4354.  */
  4355.  
  4356. #ifdef __STDC__
  4357. static int
  4358. is_anchored (struct rexp_node * rexp, rx_side_effect se)
  4359. #else
  4360. static int
  4361. is_anchored (rexp, se)
  4362.      struct rexp_node * rexp;
  4363.      rx_side_effect se;
  4364. #endif
  4365. {
  4366.   if (!rexp)
  4367.     return 2;
  4368.   switch (rexp->type)
  4369.     {
  4370.     case r_cset:
  4371.     case r_data:
  4372.       return 0;
  4373.     case r_concat:
  4374.     case r_2phase_star:
  4375.       {
  4376.     int l = is_anchored (rexp->params.pair.left, se);
  4377.     return (l == 2 ? is_anchored (rexp->params.pair.right, se) : l);
  4378.       }
  4379.     case r_alternate:
  4380.       {
  4381.     int l = is_anchored (rexp->params.pair.left, se);
  4382.     int r = l ? is_anchored (rexp->params.pair.right, se) : 0;
  4383.  
  4384.     if (l == r)
  4385.       return l;
  4386.     else if ((l == 0) || (r == 0))
  4387.       return 0;
  4388.     else
  4389.       return 2;
  4390.       }
  4391.     case r_opt:
  4392.     case r_star:
  4393.       return is_anchored (rexp->params.pair.left, se) ? 2 : 0;
  4394.       
  4395.     case r_side_effect:
  4396.       return ((rexp->params.side_effect == se)
  4397.           ? 1 : 2);
  4398.     }
  4399.  
  4400.   /* this should never happen */
  4401.   return 0;
  4402. }
  4403.  
  4404.  
  4405. /* This removes register assignments that aren't required by backreferencing.
  4406.  * This can speed up explore_future, especially if it eliminates
  4407.  * non-determinism in the superstate NFA.
  4408.  * 
  4409.  * NEEDED is an array of characters, presumably filled in by FIND_BACKREFS.
  4410.  * The non-zero elements of the array indicate which register assignments
  4411.  * can NOT be removed from the expression.
  4412.  */
  4413.  
  4414. #ifdef __STDC__
  4415. static struct rexp_node *
  4416. remove_unecessary_side_effects (struct rx * rx, char * needed,
  4417.                 struct rexp_node * rexp,
  4418.                 struct re_se_params * params)
  4419. #else
  4420. static struct rexp_node *
  4421. remove_unecessary_side_effects (rx, needed, rexp, params)
  4422.      struct rx * rx;
  4423.      char * needed;
  4424.      struct rexp_node * rexp;
  4425.      struct re_se_params * params;
  4426. #endif
  4427. {
  4428.   struct rexp_node * l;
  4429.   struct rexp_node * r;
  4430.   if (!rexp)
  4431.     return 0;
  4432.   else
  4433.     switch (rexp->type)
  4434.       {
  4435.       case r_cset:
  4436.       case r_data:
  4437.     return rexp;
  4438.       case r_alternate:
  4439.       case r_concat:
  4440.       case r_2phase_star:
  4441.     l = remove_unecessary_side_effects (rx, needed,
  4442.                         rexp->params.pair.left, params);
  4443.     r = remove_unecessary_side_effects (rx, needed,
  4444.                         rexp->params.pair.right, params);
  4445.     if ((l && r) || (rexp->type != r_concat))
  4446.       {
  4447.         rexp->params.pair.left = l;
  4448.         rexp->params.pair.right = r;
  4449.         return rexp;
  4450.       }
  4451.     else
  4452.       {
  4453.         rexp->params.pair.left = rexp->params.pair.right = 0;
  4454.         rx_free_rexp (rx, rexp);
  4455.         return l ? l : r;
  4456.       }
  4457.       case r_opt:
  4458.       case r_star:
  4459.     l = remove_unecessary_side_effects (rx, needed,
  4460.                         rexp->params.pair.left, params);
  4461.     if (l)
  4462.       {
  4463.         rexp->params.pair.left = l;
  4464.         return rexp;
  4465.       }
  4466.     else
  4467.       {
  4468.         rexp->params.pair.left = 0;
  4469.         rx_free_rexp (rx, rexp);
  4470.         return 0;
  4471.       }
  4472.       case r_side_effect:
  4473.     {
  4474.       int se = (long)rexp->params.side_effect;
  4475.       if (   (se >= 0)
  4476.           && (   ((enum re_side_effects)params[se].se == re_se_lparen)
  4477.           || ((enum re_side_effects)params[se].se == re_se_rparen))
  4478.           && (params [se].op1 > 0)
  4479.           && (!needed [params [se].op1]))
  4480.         {
  4481.           rx_free_rexp (rx, rexp);
  4482.           return 0;
  4483.         }
  4484.       else
  4485.         return rexp;
  4486.     }
  4487.       }
  4488.  
  4489.   /* this should never happen */
  4490.   return 0;
  4491. }
  4492.  
  4493.  
  4494.  
  4495. #ifdef __STDC__
  4496. static int
  4497. pointless_if_repeated (struct rexp_node * node, struct re_se_params * params)
  4498. #else
  4499. static int
  4500. pointless_if_repeated (node, params)
  4501.      struct rexp_node * node;
  4502.      struct re_se_params * params;
  4503. #endif
  4504. {
  4505.   if (!node)
  4506.     return 1;
  4507.   switch (node->type)
  4508.     {
  4509.     case r_cset:
  4510.       return 0;
  4511.     case r_alternate:
  4512.     case r_concat:
  4513.     case r_2phase_star:
  4514.       return (pointless_if_repeated (node->params.pair.left, params)
  4515.           && pointless_if_repeated (node->params.pair.right, params));
  4516.     case r_opt:
  4517.     case r_star:
  4518.       return pointless_if_repeated (node->params.pair.left, params);
  4519.     case r_side_effect:
  4520.       switch (((long)node->params.side_effect < 0)
  4521.           ? (enum re_side_effects)node->params.side_effect
  4522.           : (enum re_side_effects)params[(long)node->params.side_effect].se)
  4523.     {
  4524.     case re_se_try:
  4525.     case re_se_at_dot:
  4526.     case re_se_begbuf:
  4527.     case re_se_hat:
  4528.     case re_se_wordbeg:
  4529.     case re_se_wordbound:
  4530.     case re_se_notwordbound:
  4531.     case re_se_wordend:
  4532.     case re_se_endbuf:
  4533.     case re_se_dollar:
  4534.     case re_se_fail:
  4535.     case re_se_win:
  4536.       return 1;
  4537.     case re_se_lparen:
  4538.     case re_se_rparen:
  4539.     case re_se_iter:
  4540.     case re_se_end_iter:
  4541.     case re_se_syntax:
  4542.     case re_se_not_syntax:
  4543.     case re_se_backref:
  4544.       return 0;
  4545.     }
  4546.     case r_data:
  4547.     default:
  4548.       return 0;
  4549.     }
  4550. }
  4551.  
  4552.  
  4553.  
  4554. #ifdef __STDC__
  4555. static int
  4556. registers_on_stack (struct re_pattern_buffer * rxb,
  4557.             struct rexp_node * rexp, int in_danger,
  4558.             struct re_se_params * params)
  4559. #else
  4560. static int
  4561. registers_on_stack (rxb, rexp, in_danger, params)
  4562.      struct re_pattern_buffer * rxb;
  4563.      struct rexp_node * rexp;
  4564.      int in_danger;
  4565.      struct re_se_params * params;
  4566. #endif
  4567. {
  4568.   if (!rexp)
  4569.     return 0;
  4570.   else
  4571.     switch (rexp->type)
  4572.       {
  4573.       case r_cset:
  4574.       case r_data:
  4575.     return 0;
  4576.       case r_alternate:
  4577.       case r_concat:
  4578.     return (   registers_on_stack (rxb, rexp->params.pair.left,
  4579.                        in_danger, params)
  4580.         || (registers_on_stack
  4581.             (rxb, rexp->params.pair.right,
  4582.              in_danger, params)));
  4583.       case r_opt:
  4584.     return registers_on_stack (rxb, rexp->params.pair.left, 0, params);
  4585.       case r_star:
  4586.     return registers_on_stack (rxb, rexp->params.pair.left, 1, params);
  4587.       case r_2phase_star:
  4588.     return
  4589.       (   registers_on_stack (rxb, rexp->params.pair.left, 1, params)
  4590.        || registers_on_stack (rxb, rexp->params.pair.right, 1, params));
  4591.       case r_side_effect:
  4592.     {
  4593.       int se = (long)rexp->params.side_effect;
  4594.       if (   in_danger
  4595.           && (se >= 0)
  4596.           && (params [se].op1 > 0)
  4597.           && (   ((enum re_side_effects)params[se].se == re_se_lparen)
  4598.           || ((enum re_side_effects)params[se].se == re_se_rparen)))
  4599.         return 1;
  4600.       else
  4601.         return 0;
  4602.     }
  4603.       }
  4604.  
  4605.   /* this should never happen */
  4606.   return 0;
  4607. }
  4608.  
  4609.  
  4610.  
  4611. static char idempotent_complex_se[] =
  4612. {
  4613. #define RX_WANT_SE_DEFS 1
  4614. #undef RX_DEF_SE
  4615. #undef RX_DEF_CPLX_SE
  4616. #define RX_DEF_SE(IDEM, NAME, VALUE)          
  4617. #define RX_DEF_CPLX_SE(IDEM, NAME, VALUE)     IDEM,
  4618. #include "rx.h"
  4619. #undef RX_DEF_SE
  4620. #undef RX_DEF_CPLX_SE
  4621. #undef RX_WANT_SE_DEFS
  4622.   23
  4623. };
  4624.  
  4625. static char idempotent_se[] =
  4626. {
  4627.   13,
  4628. #define RX_WANT_SE_DEFS 1
  4629. #undef RX_DEF_SE
  4630. #undef RX_DEF_CPLX_SE
  4631. #define RX_DEF_SE(IDEM, NAME, VALUE)          IDEM,
  4632. #define RX_DEF_CPLX_SE(IDEM, NAME, VALUE)     
  4633. #include "rx.h"
  4634. #undef RX_DEF_SE
  4635. #undef RX_DEF_CPLX_SE
  4636. #undef RX_WANT_SE_DEFS
  4637.   42
  4638. };
  4639.  
  4640.  
  4641.  
  4642.  
  4643. #ifdef __STDC__
  4644. static int
  4645. has_any_se (struct rx * rx,
  4646.         struct rexp_node * rexp)
  4647. #else
  4648. static int
  4649. has_any_se (rx, rexp)
  4650.      struct rx * rx;
  4651.      struct rexp_node * rexp;
  4652. #endif
  4653. {
  4654.   if (!rexp)
  4655.     return 0;
  4656.  
  4657.   switch (rexp->type)
  4658.     {
  4659.     case r_cset:
  4660.     case r_data:
  4661.       return 0;
  4662.  
  4663.     case r_side_effect:
  4664.       return 1;
  4665.       
  4666.     case r_2phase_star:
  4667.     case r_concat:
  4668.     case r_alternate:
  4669.       return
  4670.     (   has_any_se (rx, rexp->params.pair.left)
  4671.      || has_any_se (rx, rexp->params.pair.right));
  4672.  
  4673.     case r_opt:
  4674.     case r_star:
  4675.       return has_any_se (rx, rexp->params.pair.left);
  4676.     }
  4677.  
  4678.   /* this should never happen */
  4679.   return 0;
  4680. }
  4681.  
  4682.  
  4683.  
  4684. /* This must be called AFTER `convert_hard_loops' for a given REXP. */
  4685. #ifdef __STDC__
  4686. static int
  4687. has_non_idempotent_epsilon_path (struct rx * rx,
  4688.                  struct rexp_node * rexp,
  4689.                  struct re_se_params * params)
  4690. #else
  4691. static int
  4692. has_non_idempotent_epsilon_path (rx, rexp, params)
  4693.      struct rx * rx;
  4694.      struct rexp_node * rexp;
  4695.      struct re_se_params * params;
  4696. #endif
  4697. {
  4698.   if (!rexp)
  4699.     return 0;
  4700.  
  4701.   switch (rexp->type)
  4702.     {
  4703.     case r_cset:
  4704.     case r_data:
  4705.     case r_star:
  4706.       return 0;
  4707.  
  4708.     case r_side_effect:
  4709.       return
  4710.     !((long)rexp->params.side_effect > 0
  4711.       ? idempotent_complex_se [ params [(long)rexp->params.side_effect].se ]
  4712.       : idempotent_se [-(long)rexp->params.side_effect]);
  4713.       
  4714.     case r_alternate:
  4715.       return
  4716.     (   has_non_idempotent_epsilon_path (rx,
  4717.                          rexp->params.pair.left, params)
  4718.      || has_non_idempotent_epsilon_path (rx,
  4719.                          rexp->params.pair.right, params));
  4720.  
  4721.     case r_2phase_star:
  4722.     case r_concat:
  4723.       return
  4724.     (   has_non_idempotent_epsilon_path (rx,
  4725.                          rexp->params.pair.left, params)
  4726.      && has_non_idempotent_epsilon_path (rx,
  4727.                          rexp->params.pair.right, params));
  4728.  
  4729.     case r_opt:
  4730.       return has_non_idempotent_epsilon_path (rx,
  4731.                           rexp->params.pair.left, params);
  4732.     }
  4733.  
  4734.   /* this should never happen */
  4735.   return 0;
  4736. }
  4737.  
  4738.  
  4739.  
  4740. /* This computes rougly what it's name suggests.   It can (and does) go wrong 
  4741.  * in the direction of returning spurious 0 without causing disasters.
  4742.  */
  4743. #ifdef __STDC__
  4744. static int
  4745. begins_with_complex_se (struct rx * rx, struct rexp_node * rexp)
  4746. #else
  4747. static int
  4748. begins_with_complex_se (rx, rexp)
  4749.      struct rx * rx;
  4750.      struct rexp_node * rexp;
  4751. #endif
  4752. {
  4753.   if (!rexp)
  4754.     return 0;
  4755.  
  4756.   switch (rexp->type)
  4757.     {
  4758.     case r_cset:
  4759.     case r_data:
  4760.       return 0;
  4761.  
  4762.     case r_side_effect:
  4763.       return ((long)rexp->params.side_effect >= 0);
  4764.       
  4765.     case r_alternate:
  4766.       return
  4767.     (   begins_with_complex_se (rx, rexp->params.pair.left)
  4768.      && begins_with_complex_se (rx, rexp->params.pair.right));
  4769.  
  4770.  
  4771.     case r_concat:
  4772.       return has_any_se (rx, rexp->params.pair.left);
  4773.     case r_opt:
  4774.     case r_star:
  4775.     case r_2phase_star:
  4776.       return 0;
  4777.     }
  4778.  
  4779.   /* this should never happen */
  4780.   return 0;
  4781. }
  4782.  
  4783.  
  4784. /* This destructively removes some of the re_se_tv side effects from 
  4785.  * a rexp tree.  In particular, during parsing re_se_tv was inserted on the
  4786.  * right half of every | to guarantee that posix path preference could be 
  4787.  * honored.  This function removes some which it can be determined aren't 
  4788.  * needed.  
  4789.  */
  4790.  
  4791. #ifdef __STDC__
  4792. static void
  4793. speed_up_alt (struct rx * rx,
  4794.           struct rexp_node * rexp,
  4795.           int unposix)
  4796. #else
  4797. static void
  4798. speed_up_alt (rx, rexp, unposix)
  4799.      struct rx * rx;
  4800.      struct rexp_node * rexp;
  4801.      int unposix;
  4802. #endif
  4803. {
  4804.   if (!rexp)
  4805.     return;
  4806.  
  4807.   switch (rexp->type)
  4808.     {
  4809.     case r_cset:
  4810.     case r_data:
  4811.     case r_side_effect:
  4812.       return;
  4813.  
  4814.     case r_opt:
  4815.     case r_star:
  4816.       speed_up_alt (rx, rexp->params.pair.left, unposix);
  4817.       return;
  4818.  
  4819.     case r_2phase_star:
  4820.     case r_concat:
  4821.       speed_up_alt (rx, rexp->params.pair.left, unposix);
  4822.       speed_up_alt (rx, rexp->params.pair.right, unposix);
  4823.       return;
  4824.  
  4825.     case r_alternate:
  4826.       /* the right child is guaranteed to be (concat re_se_tv <subexp>) */
  4827.  
  4828.       speed_up_alt (rx, rexp->params.pair.left, unposix);
  4829.       speed_up_alt (rx, rexp->params.pair.right->params.pair.right, unposix);
  4830.       
  4831.       if (   unposix
  4832.       || (begins_with_complex_se
  4833.           (rx, rexp->params.pair.right->params.pair.right))
  4834.       || !(   has_any_se (rx, rexp->params.pair.right->params.pair.right)
  4835.            || has_any_se (rx, rexp->params.pair.left)))
  4836.     {
  4837.       struct rexp_node * conc = rexp->params.pair.right;
  4838.       rexp->params.pair.right = conc->params.pair.right;
  4839.       conc->params.pair.right = 0;
  4840.       rx_free_rexp (rx, conc);
  4841.     }
  4842.     }
  4843. }
  4844.  
  4845.  
  4846.  
  4847.  
  4848.  
  4849. /* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
  4850.    Returns one of error codes defined in `regex.h', or zero for success.
  4851.  
  4852.    Assumes the `allocated' (and perhaps `buffer') and `translate'
  4853.    fields are set in BUFP on entry.
  4854.  
  4855.    If it succeeds, results are put in BUFP (if it returns an error, the
  4856.    contents of BUFP are undefined):
  4857.      `buffer' is the compiled pattern;
  4858.      `syntax' is set to SYNTAX;
  4859.      `used' is set to the length of the compiled pattern;
  4860.      `fastmap_accurate' is set to zero;
  4861.      `re_nsub' is set to the number of groups in PATTERN;
  4862.      `not_bol' and `not_eol' are set to zero.
  4863.    
  4864.    The `fastmap' and `newline_anchor' fields are neither
  4865.    examined nor set.  */
  4866.  
  4867.  
  4868.  
  4869. #ifdef __STDC__
  4870. RX_DECL reg_errcode_t
  4871. rx_compile (__const__ char *pattern, int size,
  4872.         reg_syntax_t syntax,
  4873.         struct re_pattern_buffer * rxb) 
  4874. #else
  4875. RX_DECL reg_errcode_t
  4876. rx_compile (pattern, size, syntax, rxb)
  4877.      __const__ char *pattern;
  4878.      int size;
  4879.      reg_syntax_t syntax;
  4880.      struct re_pattern_buffer * rxb;
  4881. #endif
  4882. {
  4883.   RX_subset
  4884.     inverse_translate [CHAR_SET_SIZE * rx_bitset_numb_subsets(CHAR_SET_SIZE)];
  4885.   char
  4886.     validate_inv_tr [CHAR_SET_SIZE * rx_bitset_numb_subsets(CHAR_SET_SIZE)];
  4887.  
  4888.   /* We fetch characters from PATTERN here.  Even though PATTERN is
  4889.      `char *' (i.e., signed), we declare these variables as unsigned, so
  4890.      they can be reliably used as array indices.  */
  4891.   register unsigned char c, c1;
  4892.   
  4893.   /* A random tempory spot in PATTERN.  */
  4894.   __const__ char *p1;
  4895.   
  4896.   /* Keeps track of unclosed groups.  */
  4897.   compile_stack_type compile_stack;
  4898.  
  4899.   /* Points to the current (ending) position in the pattern.  */
  4900.   __const__ char *p = pattern;
  4901.   __const__ char *pend = pattern + size;
  4902.   
  4903.   /* How to translate the characters in the pattern.  */
  4904.   unsigned char *translate = (rxb->translate
  4905.                   ? rxb->translate
  4906.                   : rx_id_translation);
  4907.  
  4908.   /* When parsing is done, this will hold the expression tree. */
  4909.   struct rexp_node * rexp = 0;
  4910.  
  4911.   /* In the midst of compilation, this holds onto the regexp 
  4912.    * first parst while rexp goes on to aquire additional constructs.
  4913.    */
  4914.   struct rexp_node * orig_rexp = 0;
  4915.   struct rexp_node * fewer_side_effects = 0;
  4916.  
  4917.   /* This and top_expression are saved on the compile stack. */
  4918.   struct rexp_node ** top_expression = &rexp;
  4919.   struct rexp_node ** last_expression = top_expression;
  4920.   
  4921.   /* Parameter to `goto append_node' */
  4922.   struct rexp_node * append;
  4923.  
  4924.   /* Counts open-groups as they are encountered.  This is the index of the
  4925.    * innermost group being compiled.
  4926.    */
  4927.   regnum_t regnum = 0;
  4928.  
  4929.   /* Place in the uncompiled pattern (i.e., the {) to
  4930.    * which to go back if the interval is invalid.  
  4931.    */
  4932.   __const__ char *beg_interval;
  4933.  
  4934.   struct re_se_params * params = 0;
  4935.   int paramc = 0;        /* How many complex side effects so far? */
  4936.  
  4937.   rx_side_effect side;        /* param to `goto add_side_effect' */
  4938.  
  4939.   bzero (validate_inv_tr, sizeof (validate_inv_tr));
  4940.  
  4941.   rxb->rx.instruction_table = rx_id_instruction_table;
  4942.  
  4943.  
  4944.   /* Initialize the compile stack.  */
  4945.   compile_stack.stack =  (( compile_stack_elt_t *) malloc ((INIT_COMPILE_STACK_SIZE) * sizeof ( compile_stack_elt_t)));
  4946.   if (compile_stack.stack == 0)
  4947.     return REG_ESPACE;
  4948.  
  4949.   compile_stack.size = INIT_COMPILE_STACK_SIZE;
  4950.   compile_stack.avail = 0;
  4951.  
  4952.   /* Initialize the pattern buffer.  */
  4953.   rxb->rx.cache = &default_cache;
  4954.   rxb->syntax = syntax;
  4955.   rxb->fastmap_accurate = 0;
  4956.   rxb->not_bol = rxb->not_eol = 0;
  4957.   rxb->least_subs = 0;
  4958.   
  4959.   /* Always count groups, whether or not rxb->no_sub is set.  
  4960.    * The whole pattern is implicitly group 0, so counting begins
  4961.    * with 1.
  4962.    */
  4963.   rxb->re_nsub = 0;
  4964.  
  4965. #if !defined (emacs) && !defined (SYNTAX_TABLE)
  4966.   /* Initialize the syntax table.  */
  4967.    init_syntax_once ();
  4968. #endif
  4969.  
  4970.   /* Loop through the uncompiled pattern until we're at the end.  */
  4971.   while (p != pend)
  4972.     {
  4973.       PATFETCH (c);
  4974.  
  4975.       switch (c)
  4976.         {
  4977.         case '^':
  4978.           {
  4979.             if (   /* If at start of pattern, it's an operator.  */
  4980.                    p == pattern + 1
  4981.                    /* If context independent, it's an operator.  */
  4982.                 || syntax & RE_CONTEXT_INDEP_ANCHORS
  4983.                    /* Otherwise, depends on what's come before.  */
  4984.                 || at_begline_loc_p (pattern, p, syntax))
  4985.           {
  4986.         struct rexp_node * n
  4987.           = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)re_se_hat);
  4988.         if (!n)
  4989.           return REG_ESPACE;
  4990.         append = n;
  4991.         goto append_node;
  4992.           }
  4993.             else
  4994.               goto normal_char;
  4995.           }
  4996.           break;
  4997.  
  4998.  
  4999.         case '$':
  5000.           {
  5001.             if (   /* If at end of pattern, it's an operator.  */
  5002.                    p == pend 
  5003.                    /* If context independent, it's an operator.  */
  5004.                 || syntax & RE_CONTEXT_INDEP_ANCHORS
  5005.                    /* Otherwise, depends on what's next.  */
  5006.                 || at_endline_loc_p (p, pend, syntax))
  5007.           {
  5008.         struct rexp_node * n
  5009.           = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)re_se_dollar);
  5010.         if (!n)
  5011.           return REG_ESPACE;
  5012.         append = n;
  5013.         goto append_node;
  5014.           }
  5015.              else
  5016.                goto normal_char;
  5017.            }
  5018.            break;
  5019.  
  5020.  
  5021.     case '+':
  5022.         case '?':
  5023.           if ((syntax & RE_BK_PLUS_QM)
  5024.               || (syntax & RE_LIMITED_OPS))
  5025.             goto normal_char;
  5026.  
  5027.         handle_plus:
  5028.         case '*':
  5029.           /* If there is no previous pattern... */
  5030.           if (pointless_if_repeated (*last_expression, params))
  5031.             {
  5032.               if (syntax & RE_CONTEXT_INVALID_OPS)
  5033.                 return REG_BADRPT;
  5034.               else if (!(syntax & RE_CONTEXT_INDEP_OPS))
  5035.                 goto normal_char;
  5036.             }
  5037.  
  5038.           {
  5039.             /* 1 means zero (many) matches is allowed.  */
  5040.             char zero_times_ok = 0, many_times_ok = 0;
  5041.  
  5042.             /* If there is a sequence of repetition chars, collapse it
  5043.                down to just one (the right one).  We can't combine
  5044.                interval operators with these because of, e.g., `a{2}*',
  5045.                which should only match an even number of `a's.  */
  5046.  
  5047.             for (;;)
  5048.               {
  5049.                 zero_times_ok |= c != '+';
  5050.                 many_times_ok |= c != '?';
  5051.  
  5052.                 if (p == pend)
  5053.                   break;
  5054.  
  5055.                 PATFETCH (c);
  5056.  
  5057.                 if (c == '*'
  5058.                     || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
  5059.                   ;
  5060.  
  5061.                 else if (syntax & RE_BK_PLUS_QM  &&  c == '\\')
  5062.                   {
  5063.                     if (p == pend) return REG_EESCAPE;
  5064.  
  5065.                     PATFETCH (c1);
  5066.                     if (!(c1 == '+' || c1 == '?'))
  5067.                       {
  5068.                         PATUNFETCH;
  5069.                         PATUNFETCH;
  5070.                         break;
  5071.                       }
  5072.  
  5073.                     c = c1;
  5074.                   }
  5075.                 else
  5076.                   {
  5077.                     PATUNFETCH;
  5078.                     break;
  5079.                   }
  5080.  
  5081.                 /* If we get here, we found another repeat character.  */
  5082.                }
  5083.  
  5084.             /* Star, etc. applied to an empty pattern is equivalent
  5085.                to an empty pattern.  */
  5086.             if (!last_expression)
  5087.               break;
  5088.  
  5089.         /* Now we know whether or not zero matches is allowed
  5090.          * and also whether or not two or more matches is allowed.
  5091.          */
  5092.  
  5093.         {
  5094.           struct rexp_node * inner_exp = *last_expression;
  5095.           int need_sync = 0;
  5096.  
  5097.           if (many_times_ok
  5098.           && has_non_idempotent_epsilon_path (&rxb->rx,
  5099.                               inner_exp, params))
  5100.         {
  5101.           struct rexp_node * pusher
  5102.             = rx_mk_r_side_effect (&rxb->rx,
  5103.                        (rx_side_effect)re_se_pushpos);
  5104.           struct rexp_node * checker
  5105.             = rx_mk_r_side_effect (&rxb->rx,
  5106.                        (rx_side_effect)re_se_chkpos);
  5107.           struct rexp_node * pushback
  5108.             = rx_mk_r_side_effect (&rxb->rx,
  5109.                        (rx_side_effect)re_se_pushback);
  5110.           rx_Bitset cs = rx_cset (&rxb->rx);
  5111.           struct rexp_node * lit_t = rx_mk_r_cset (&rxb->rx, cs);
  5112.           struct rexp_node * fake_state
  5113.             = rx_mk_r_concat (&rxb->rx, pushback, lit_t);
  5114.           struct rexp_node * phase2
  5115.             = rx_mk_r_concat (&rxb->rx, checker, fake_state);
  5116.           struct rexp_node * popper
  5117.             = rx_mk_r_side_effect (&rxb->rx,
  5118.                        (rx_side_effect)re_se_poppos);
  5119.           struct rexp_node * star
  5120.             = rx_mk_r_2phase_star (&rxb->rx, inner_exp, phase2);
  5121.           struct rexp_node * a
  5122.             = rx_mk_r_concat (&rxb->rx, pusher, star);
  5123.           struct rexp_node * whole_thing
  5124.             = rx_mk_r_concat (&rxb->rx, a, popper);
  5125.           if (!(pusher && star && pushback && lit_t && fake_state
  5126.             && lit_t && phase2 && checker && popper
  5127.             && a && whole_thing))
  5128.             return REG_ESPACE;
  5129.           RX_bitset_enjoin (cs, 't');
  5130.           *last_expression = whole_thing;
  5131.         }
  5132.           else
  5133.         {
  5134.           struct rexp_node * star =
  5135.             (many_times_ok ? rx_mk_r_star : rx_mk_r_opt)
  5136.               (&rxb->rx, *last_expression);
  5137.           if (!star)
  5138.             return REG_ESPACE;
  5139.           *last_expression = star;
  5140.           need_sync = has_any_se (&rxb->rx, *last_expression);
  5141.         }
  5142.           if (!zero_times_ok)
  5143.         {
  5144.           struct rexp_node * concat
  5145.             = rx_mk_r_concat (&rxb->rx, inner_exp,
  5146.                       rx_copy_rexp (&rxb->rx,
  5147.                             *last_expression));
  5148.           if (!concat)
  5149.             return REG_ESPACE;
  5150.           *last_expression = concat;
  5151.         }
  5152.           if (need_sync)
  5153.         {
  5154.           int sync_se = paramc;
  5155.           params = (params
  5156.                 ? ((struct re_se_params *)
  5157.                    realloc (params,
  5158.                     sizeof (*params) * (1 + paramc)))
  5159.                 : ((struct re_se_params *)
  5160.                    malloc (sizeof (*params))));
  5161.           if (!params)
  5162.             return REG_ESPACE;
  5163.           ++paramc;
  5164.           params [sync_se].se = re_se_tv;
  5165.           side = (rx_side_effect)sync_se;
  5166.           goto add_side_effect;
  5167.         }
  5168.         }
  5169.         /* The old regex.c used to optimize `.*\n'.  
  5170.          * Maybe rx should too?
  5171.          */
  5172.       }
  5173.       break;
  5174.  
  5175.  
  5176.     case '.':
  5177.       {
  5178.         rx_Bitset cs = rx_cset (&rxb->rx);
  5179.         struct rexp_node * n = rx_mk_r_cset (&rxb->rx, cs);
  5180.         if (!(cs && n))
  5181.           return REG_ESPACE;
  5182.  
  5183.         rx_bitset_universe (rxb->rx.local_cset_size, cs);
  5184.         if (!(rxb->syntax & RE_DOT_NEWLINE))
  5185.           RX_bitset_remove (cs, '\n');
  5186.         if (!(rxb->syntax & RE_DOT_NOT_NULL))
  5187.           RX_bitset_remove (cs, 0);
  5188.  
  5189.         append = n;
  5190.         goto append_node;
  5191.         break;
  5192.       }
  5193.  
  5194.  
  5195.         case '[':
  5196.       if (p == pend) return REG_EBRACK;
  5197.           {
  5198.             boolean had_char_class = false;
  5199.         rx_Bitset cs = rx_cset (&rxb->rx);
  5200.         struct rexp_node * node = rx_mk_r_cset (&rxb->rx, cs);
  5201.         int is_inverted = *p == '^';
  5202.         
  5203.         if (!(node && cs))
  5204.           return REG_ESPACE;
  5205.         
  5206.         /* This branch of the switch is normally exited with
  5207.          *`goto append_node'
  5208.          */
  5209.         append = node;
  5210.         
  5211.             if (is_inverted)
  5212.           p++;
  5213.         
  5214.             /* Remember the first position in the bracket expression.  */
  5215.             p1 = p;
  5216.         
  5217.             /* Read in characters and ranges, setting map bits.  */
  5218.             for (;;)
  5219.               {
  5220.                 if (p == pend) return REG_EBRACK;
  5221.         
  5222.                 PATFETCH (c);
  5223.         
  5224.                 /* \ might escape characters inside [...] and [^...].  */
  5225.                 if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
  5226.                   {
  5227.                     if (p == pend) return REG_EESCAPE;
  5228.             
  5229.                     PATFETCH (c1);
  5230.             {
  5231.               rx_Bitset it = inverse_translation (rxb, 
  5232.                               validate_inv_tr,
  5233.                               inverse_translate,
  5234.                               translate,
  5235.                               c1);
  5236.               rx_bitset_union (rxb->rx.local_cset_size, cs, it);
  5237.             }
  5238.                     continue;
  5239.                   }
  5240.         
  5241.                 /* Could be the end of the bracket expression.  If it's
  5242.                    not (i.e., when the bracket expression is `[]' so
  5243.                    far), the ']' character bit gets set way below.  */
  5244.                 if (c == ']' && p != p1 + 1)
  5245.                   goto finalize_class_and_append;
  5246.         
  5247.                 /* Look ahead to see if it's a range when the last thing
  5248.                    was a character class.  */
  5249.                 if (had_char_class && c == '-' && *p != ']')
  5250.                   return REG_ERANGE;
  5251.         
  5252.                 /* Look ahead to see if it's a range when the last thing
  5253.                    was a character: if this is a hyphen not at the
  5254.                    beginning or the end of a list, then it's the range
  5255.                    operator.  */
  5256.                 if (c == '-' 
  5257.                     && !(p - 2 >= pattern && p[-2] == '[') 
  5258.                     && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
  5259.                     && *p != ']')
  5260.                   {
  5261.                     reg_errcode_t ret
  5262.                       = compile_range (rxb, cs, &p, pend, translate, syntax,
  5263.                        inverse_translate, validate_inv_tr);
  5264.                     if (ret != REG_NOERROR) return ret;
  5265.                   }
  5266.         
  5267.                 else if (p[0] == '-' && p[1] != ']')
  5268.                   { /* This handles ranges made up of characters only.  */
  5269.                     reg_errcode_t ret;
  5270.             
  5271.             /* Move past the `-'.  */
  5272.                     PATFETCH (c1);
  5273.                     
  5274.                     ret = compile_range (rxb, cs, &p, pend, translate, syntax,
  5275.                      inverse_translate, validate_inv_tr);
  5276.                     if (ret != REG_NOERROR) return ret;
  5277.                   }
  5278.         
  5279.                 /* See if we're at the beginning of a possible character
  5280.                    class.  */
  5281.         
  5282.         else if ((syntax & RE_CHAR_CLASSES)
  5283.              && (c == '[') && (*p == ':'))
  5284.                   {
  5285.                     char str[CHAR_CLASS_MAX_LENGTH + 1];
  5286.             
  5287.                     PATFETCH (c);
  5288.                     c1 = 0;
  5289.             
  5290.                     /* If pattern is `[[:'.  */
  5291.                     if (p == pend) return REG_EBRACK;
  5292.             
  5293.                     for (;;)
  5294.                       {
  5295.                         PATFETCH (c);
  5296.                         if (c == ':' || c == ']' || p == pend
  5297.                             || c1 == CHAR_CLASS_MAX_LENGTH)
  5298.               break;
  5299.                         str[c1++] = c;
  5300.                       }
  5301.                     str[c1] = '\0';
  5302.             
  5303.                     /* If isn't a word bracketed by `[:' and:`]':
  5304.                        undo the ending character, the letters, and leave 
  5305.                        the leading `:' and `[' (but set bits for them).  */
  5306.                     if (c == ':' && *p == ']')
  5307.                       {
  5308.                         int ch;
  5309.                         boolean is_alnum = !strcmp (str, "alnum");
  5310.                         boolean is_alpha = !strcmp (str, "alpha");
  5311.                         boolean is_blank = !strcmp (str, "blank");
  5312.                         boolean is_cntrl = !strcmp (str, "cntrl");
  5313.                         boolean is_digit = !strcmp (str, "digit");
  5314.                         boolean is_graph = !strcmp (str, "graph");
  5315.                         boolean is_lower = !strcmp (str, "lower");
  5316.                         boolean is_print = !strcmp (str, "print");
  5317.                         boolean is_punct = !strcmp (str, "punct");
  5318.                         boolean is_space = !strcmp (str, "space");
  5319.                         boolean is_upper = !strcmp (str, "upper");
  5320.                         boolean is_xdigit = !strcmp (str, "xdigit");
  5321.                         
  5322.                         if (!IS_CHAR_CLASS (str)) return REG_ECTYPE;
  5323.             
  5324.                         /* Throw away the ] at the end of the character
  5325.                            class.  */
  5326.                         PATFETCH (c);                    
  5327.             
  5328.                         if (p == pend) return REG_EBRACK;
  5329.             
  5330.                         for (ch = 0; ch < 1 << CHARBITS; ch++)
  5331.                           {
  5332.                             if (   (is_alnum  && isalnum (ch))
  5333.                                 || (is_alpha  && isalpha (ch))
  5334.                                 || (is_blank  && isblank (ch))
  5335.                                 || (is_cntrl  && iscntrl (ch))
  5336.                                 || (is_digit  && isdigit (ch))
  5337.                                 || (is_graph  && isgraph (ch))
  5338.                                 || (is_lower  && islower (ch))
  5339.                                 || (is_print  && isprint (ch))
  5340.                                 || (is_punct  && ispunct (ch))
  5341.                                 || (is_space  && isspace (ch))
  5342.                                 || (is_upper  && isupper (ch))
  5343.                                 || (is_xdigit && isxdigit (ch)))
  5344.                   {
  5345.                 rx_Bitset it =
  5346.                   inverse_translation (rxb, 
  5347.                                validate_inv_tr,
  5348.                                inverse_translate,
  5349.                                translate,
  5350.                                ch);
  5351.                 rx_bitset_union (rxb->rx.local_cset_size,
  5352.                          cs, it);
  5353.                   }
  5354.                           }
  5355.                         had_char_class = true;
  5356.                       }
  5357.                     else
  5358.                       {
  5359.                         c1++;
  5360.                         while (c1--)    
  5361.                           PATUNFETCH;
  5362.             {
  5363.               rx_Bitset it =
  5364.                 inverse_translation (rxb, 
  5365.                          validate_inv_tr,
  5366.                          inverse_translate,
  5367.                          translate,
  5368.                          '[');
  5369.               rx_bitset_union (rxb->rx.local_cset_size,
  5370.                        cs, it);
  5371.             }
  5372.             {
  5373.               rx_Bitset it =
  5374.                 inverse_translation (rxb, 
  5375.                          validate_inv_tr,
  5376.                          inverse_translate,
  5377.                          translate,
  5378.                          ':');
  5379.               rx_bitset_union (rxb->rx.local_cset_size,
  5380.                        cs, it);
  5381.             }
  5382.                         had_char_class = false;
  5383.                       }
  5384.                   }
  5385.                 else
  5386.                   {
  5387.                     had_char_class = false;
  5388.             {
  5389.               rx_Bitset it = inverse_translation (rxb, 
  5390.                               validate_inv_tr,
  5391.                               inverse_translate,
  5392.                               translate,
  5393.                               c);
  5394.               rx_bitset_union (rxb->rx.local_cset_size, cs, it);
  5395.             }
  5396.                   }
  5397.               }
  5398.  
  5399.       finalize_class_and_append:
  5400.         if (is_inverted)
  5401.           {
  5402.         rx_bitset_complement (rxb->rx.local_cset_size, cs);
  5403.         if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
  5404.           RX_bitset_remove (cs, '\n');
  5405.           }
  5406.         goto append_node;
  5407.           }
  5408.           break;
  5409.  
  5410.  
  5411.     case '(':
  5412.           if (syntax & RE_NO_BK_PARENS)
  5413.             goto handle_open;
  5414.           else
  5415.             goto normal_char;
  5416.  
  5417.  
  5418.         case ')':
  5419.           if (syntax & RE_NO_BK_PARENS)
  5420.             goto handle_close;
  5421.           else
  5422.             goto normal_char;
  5423.  
  5424.  
  5425.         case '\n':
  5426.           if (syntax & RE_NEWLINE_ALT)
  5427.             goto handle_alt;
  5428.           else
  5429.             goto normal_char;
  5430.  
  5431.  
  5432.     case '|':
  5433.           if (syntax & RE_NO_BK_VBAR)
  5434.             goto handle_alt;
  5435.           else
  5436.             goto normal_char;
  5437.  
  5438.  
  5439.         case '{':
  5440.       if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
  5441.         goto handle_interval;
  5442.       else
  5443.         goto normal_char;
  5444.  
  5445.  
  5446.         case '\\':
  5447.           if (p == pend) return REG_EESCAPE;
  5448.  
  5449.           /* Do not translate the character after the \, so that we can
  5450.              distinguish, e.g., \B from \b, even if we normally would
  5451.              translate, e.g., B to b.  */
  5452.           PATFETCH_RAW (c);
  5453.  
  5454.           switch (c)
  5455.             {
  5456.             case '(':
  5457.               if (syntax & RE_NO_BK_PARENS)
  5458.                 goto normal_backslash;
  5459.  
  5460.             handle_open:
  5461.               rxb->re_nsub++;
  5462.               regnum++;
  5463.               if (COMPILE_STACK_FULL)
  5464.                 { 
  5465.                   ((compile_stack.stack) =
  5466.            (compile_stack_elt_t *) realloc (compile_stack.stack, ( compile_stack.size << 1) * sizeof (
  5467.                                                           compile_stack_elt_t)));
  5468.                   if (compile_stack.stack == 0) return REG_ESPACE;
  5469.  
  5470.                   compile_stack.size <<= 1;
  5471.                 }
  5472.  
  5473.           if (*last_expression)
  5474.         {
  5475.           struct rexp_node * concat
  5476.             = rx_mk_r_concat (&rxb->rx, *last_expression, 0);
  5477.           if (!concat)
  5478.             return REG_ESPACE;
  5479.           *last_expression = concat;
  5480.           last_expression = &concat->params.pair.right;
  5481.         }
  5482.  
  5483.               /*
  5484.            * These are the values to restore when we hit end of this
  5485.                * group.  
  5486.            */
  5487.           COMPILE_STACK_TOP.top_expression = top_expression;
  5488.           COMPILE_STACK_TOP.last_expression = last_expression;
  5489.               COMPILE_STACK_TOP.regnum = regnum;
  5490.           
  5491.               compile_stack.avail++;
  5492.           
  5493.           top_expression = last_expression;
  5494.           break;
  5495.  
  5496.  
  5497.             case ')':
  5498.               if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
  5499.  
  5500.             handle_close:
  5501.               /* See similar code for backslashed left paren above.  */
  5502.               if (COMPILE_STACK_EMPTY)
  5503.                 if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
  5504.                   goto normal_char;
  5505.                 else
  5506.                   return REG_ERPAREN;
  5507.  
  5508.               /* Since we just checked for an empty stack above, this
  5509.                  ``can't happen''.  */
  5510.  
  5511.               {
  5512.                 /* We don't just want to restore into `regnum', because
  5513.                    later groups should continue to be numbered higher,
  5514.                    as in `(ab)c(de)' -- the second group is #2.  */
  5515.                 regnum_t this_group_regnum;
  5516.         struct rexp_node ** inner = top_expression;
  5517.  
  5518.                 compile_stack.avail--;
  5519.         top_expression = COMPILE_STACK_TOP.top_expression;
  5520.         last_expression = COMPILE_STACK_TOP.last_expression;
  5521.                 this_group_regnum = COMPILE_STACK_TOP.regnum;
  5522.         {
  5523.           int left_se = paramc;
  5524.           int right_se = paramc + 1;
  5525.  
  5526.           params = (params
  5527.                 ? ((struct re_se_params *)
  5528.                    realloc (params,
  5529.                     (paramc + 2) * sizeof (params[0])))
  5530.                 : ((struct re_se_params *)
  5531.                    malloc (2 * sizeof (params[0]))));
  5532.           if (!params)
  5533.             return REG_ESPACE;
  5534.           paramc += 2;
  5535.  
  5536.           params[left_se].se = re_se_lparen;
  5537.           params[left_se].op1 = this_group_regnum;
  5538.           params[right_se].se = re_se_rparen;
  5539.           params[right_se].op1 = this_group_regnum;
  5540.           {
  5541.             struct rexp_node * left
  5542.               = rx_mk_r_side_effect (&rxb->rx,
  5543.                          (rx_side_effect)left_se);
  5544.             struct rexp_node * right
  5545.               = rx_mk_r_side_effect (&rxb->rx,
  5546.                          (rx_side_effect)right_se);
  5547.             struct rexp_node * c1
  5548.               = (*inner
  5549.              ? rx_mk_r_concat (&rxb->rx, left, *inner) : left);
  5550.             struct rexp_node * c2
  5551.               = rx_mk_r_concat (&rxb->rx, c1, right);
  5552.             if (!(left && right && c1 && c2))
  5553.               return REG_ESPACE;
  5554.             *inner = c2;
  5555.           }
  5556.         }
  5557.         break;
  5558.           }
  5559.  
  5560.             case '|':                    /* `\|'.  */
  5561.               if ((syntax & RE_LIMITED_OPS) || (syntax & RE_NO_BK_VBAR))
  5562.                 goto normal_backslash;
  5563.             handle_alt:
  5564.               if (syntax & RE_LIMITED_OPS)
  5565.                 goto normal_char;
  5566.  
  5567.           {
  5568.         struct rexp_node * alt
  5569.           = rx_mk_r_alternate (&rxb->rx, *top_expression, 0);
  5570.         if (!alt)
  5571.           return REG_ESPACE;
  5572.         *top_expression = alt;
  5573.         last_expression = &alt->params.pair.right;
  5574.         {
  5575.           int sync_se = paramc;
  5576.  
  5577.           params = (params
  5578.                 ? ((struct re_se_params *)
  5579.                    realloc (params,
  5580.                     (paramc + 1) * sizeof (params[0])))
  5581.                 : ((struct re_se_params *)
  5582.                    malloc (sizeof (params[0]))));
  5583.           if (!params)
  5584.             return REG_ESPACE;
  5585.           ++paramc;
  5586.  
  5587.           params[sync_se].se = re_se_tv;
  5588.           {
  5589.             struct rexp_node * sync
  5590.               = rx_mk_r_side_effect (&rxb->rx,
  5591.                          (rx_side_effect)sync_se);
  5592.             struct rexp_node * conc
  5593.               = rx_mk_r_concat (&rxb->rx, sync, 0);
  5594.  
  5595.             if (!sync || !conc)
  5596.               return REG_ESPACE;
  5597.  
  5598.             *last_expression = conc;
  5599.             last_expression = &conc->params.pair.right;
  5600.           }
  5601.         }
  5602.           }
  5603.               break;
  5604.  
  5605.  
  5606.             case '{': 
  5607.               /* If \{ is a literal.  */
  5608.               if (!(syntax & RE_INTERVALS)
  5609.                      /* If we're at `\{' and it's not the open-interval 
  5610.                         operator.  */
  5611.                   || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
  5612.                   || (p - 2 == pattern  &&  p == pend))
  5613.                 goto normal_backslash;
  5614.  
  5615.             handle_interval:
  5616.               {
  5617.                 /* If got here, then the syntax allows intervals.  */
  5618.  
  5619.                 /* At least (most) this many matches must be made.  */
  5620.                 int lower_bound = -1, upper_bound = -1;
  5621.  
  5622.                 beg_interval = p - 1;
  5623.  
  5624.                 if (p == pend)
  5625.                   {
  5626.                     if (syntax & RE_NO_BK_BRACES)
  5627.                       goto unfetch_interval;
  5628.                     else
  5629.                       return REG_EBRACE;
  5630.                   }
  5631.  
  5632.                 GET_UNSIGNED_NUMBER (lower_bound);
  5633.  
  5634.                 if (c == ',')
  5635.                   {
  5636.                     GET_UNSIGNED_NUMBER (upper_bound);
  5637.                     if (upper_bound < 0) upper_bound = RE_DUP_MAX;
  5638.                   }
  5639.                 else
  5640.                   /* Interval such as `{1}' => match exactly once. */
  5641.                   upper_bound = lower_bound;
  5642.  
  5643.                 if (lower_bound < 0 || upper_bound > RE_DUP_MAX
  5644.                     || lower_bound > upper_bound)
  5645.                   {
  5646.                     if (syntax & RE_NO_BK_BRACES)
  5647.                       goto unfetch_interval;
  5648.                     else 
  5649.                       return REG_BADBR;
  5650.                   }
  5651.  
  5652.                 if (!(syntax & RE_NO_BK_BRACES)) 
  5653.                   {
  5654.                     if (c != '\\') return REG_EBRACE;
  5655.                     PATFETCH (c);
  5656.                   }
  5657.  
  5658.                 if (c != '}')
  5659.                   {
  5660.                     if (syntax & RE_NO_BK_BRACES)
  5661.                       goto unfetch_interval;
  5662.                     else 
  5663.                       return REG_BADBR;
  5664.                   }
  5665.  
  5666.                 /* We just parsed a valid interval.  */
  5667.  
  5668.                 /* If it's invalid to have no preceding re.  */
  5669.                 if (pointless_if_repeated (*last_expression, params))
  5670.                   {
  5671.                     if (syntax & RE_CONTEXT_INVALID_OPS)
  5672.                       return REG_BADRPT;
  5673.                     else if (!(syntax & RE_CONTEXT_INDEP_OPS))
  5674.                       goto unfetch_interval;
  5675.             /* was: else laststart = b; */
  5676.                   }
  5677.  
  5678.                 /* If the upper bound is zero, don't want to iterate
  5679.                  * at all.
  5680.          */
  5681.                  if (upper_bound == 0)
  5682.            {
  5683.              if (*last_expression)
  5684.                {
  5685.              rx_free_rexp (&rxb->rx, *last_expression);
  5686.              *last_expression = 0;
  5687.                }
  5688.            }
  5689.         else
  5690.           /* Otherwise, we have a nontrivial interval. */
  5691.           {
  5692.             int iter_se = paramc;
  5693.             int end_se = paramc + 1;
  5694.             params = (params
  5695.                   ? ((struct re_se_params *)
  5696.                  realloc (params,
  5697.                       sizeof (*params) * (2 + paramc)))
  5698.                   : ((struct re_se_params *)
  5699.                  malloc (2 * sizeof (*params))));
  5700.             if (!params)
  5701.               return REG_ESPACE;
  5702.             paramc += 2;
  5703.             params [iter_se].se = re_se_iter;
  5704.             params [iter_se].op1 = lower_bound;
  5705.             params[iter_se].op2 = upper_bound;
  5706.  
  5707.             params[end_se].se = re_se_end_iter;
  5708.             params[end_se].op1 = lower_bound;
  5709.             params[end_se].op2 = upper_bound;
  5710.             {
  5711.               struct rexp_node * push0
  5712.             = rx_mk_r_side_effect (&rxb->rx,
  5713.                            (rx_side_effect)re_se_push0);
  5714.               struct rexp_node * start_one_iter
  5715.             = rx_mk_r_side_effect (&rxb->rx,
  5716.                            (rx_side_effect)iter_se);
  5717.               struct rexp_node * phase1
  5718.             = rx_mk_r_concat (&rxb->rx, start_one_iter,
  5719.                       *last_expression);
  5720.               struct rexp_node * pushback
  5721.             = rx_mk_r_side_effect (&rxb->rx,
  5722.                            (rx_side_effect)re_se_pushback);
  5723.               rx_Bitset cs = rx_cset (&rxb->rx);
  5724.               struct rexp_node * lit_t
  5725.             = rx_mk_r_cset (&rxb->rx, cs);
  5726.               struct rexp_node * phase2
  5727.             = rx_mk_r_concat (&rxb->rx, pushback, lit_t);
  5728.               struct rexp_node * loop
  5729.             = rx_mk_r_2phase_star (&rxb->rx, phase1, phase2);
  5730.               struct rexp_node * push_n_loop
  5731.             = rx_mk_r_concat (&rxb->rx, push0, loop);
  5732.               struct rexp_node * final_test
  5733.             = rx_mk_r_side_effect (&rxb->rx,
  5734.                            (rx_side_effect)end_se);
  5735.               struct rexp_node * full_exp
  5736.             = rx_mk_r_concat (&rxb->rx, push_n_loop, final_test);
  5737.  
  5738.               if (!(push0 && start_one_iter && phase1
  5739.                 && pushback && lit_t && phase2
  5740.                 && loop && push_n_loop && final_test && full_exp))
  5741.             return REG_ESPACE;
  5742.  
  5743.               RX_bitset_enjoin(cs, 't');
  5744.  
  5745.               *last_expression = full_exp;
  5746.             }
  5747.           }
  5748.                 beg_interval = 0;
  5749.               }
  5750.               break;
  5751.  
  5752.             unfetch_interval:
  5753.               /* If an invalid interval, match the characters as literals.  */
  5754.                p = beg_interval;
  5755.                beg_interval = NULL;
  5756.  
  5757.                /* normal_char and normal_backslash need `c'.  */
  5758.                PATFETCH (c);    
  5759.  
  5760.                if (!(syntax & RE_NO_BK_BRACES))
  5761.                  {
  5762.                    if (p > pattern  &&  p[-1] == '\\')
  5763.                      goto normal_backslash;
  5764.                  }
  5765.                goto normal_char;
  5766.  
  5767. #ifdef emacs
  5768.             /* There is no way to specify the before_dot and after_dot
  5769.                operators.  rms says this is ok.  --karl  */
  5770.             case '=':
  5771.           side = at_dot;
  5772.           goto add_side_effect;
  5773.               break;
  5774.  
  5775.             case 's':
  5776.         case 'S':
  5777.           {
  5778.         rx_Bitset cs = cset (&rxb->rx);
  5779.         struct rexp_node * set = rx_mk_r_cset (&rxb->rx, cs);
  5780.         if (!(cs && set))
  5781.           return REG_ESPACE;
  5782.         if (c == 'S')
  5783.           rx_bitset_universe (rxb->rx.local_cset_size, cs);
  5784.  
  5785.         PATFETCH (c);
  5786.         {
  5787.           int x;
  5788.           char code = syntax_spec_code (c);
  5789.           for (x = 0; x < 256; ++x)
  5790.             {
  5791.               
  5792.               if (SYNTAX (x) & code)
  5793.             {
  5794.               rx_Bitset it =
  5795.                 inverse_translation (rxb, validate_inv_tr,
  5796.                          inverse_translate,
  5797.                          translate, x);
  5798.               rx_bitset_xor (rxb->rx.local_cset_size, cs, it);
  5799.             }
  5800.             }
  5801.         }
  5802.         goto append_node;
  5803.           }
  5804.               break;
  5805. #endif /* emacs */
  5806.  
  5807.  
  5808.             case 'w':
  5809.             case 'W':
  5810.           {
  5811.         rx_Bitset cs = rx_cset (&rxb->rx);
  5812.         struct rexp_node * n = (cs ? rx_mk_r_cset (&rxb->rx, cs) : 0);
  5813.         if (!(cs && n))
  5814.           return REG_ESPACE;
  5815.         if (c == 'W')
  5816.           rx_bitset_universe (rxb->rx.local_cset_size ,cs);
  5817.         {
  5818.           int x;
  5819.           for (x = rxb->rx.local_cset_size - 1; x > 0; --x)
  5820.             if (re_syntax_table[x] & Sword)
  5821.               RX_bitset_toggle (cs, x);
  5822.         }
  5823.         append = n;
  5824.         goto append_node;
  5825.           }
  5826.               break;
  5827.  
  5828. /* With a little extra work, some of these side effects could be optimized
  5829.  * away (basicly by looking at what we already know about the surrounding
  5830.  * chars).  
  5831.  */
  5832.             case '<':
  5833.           side = (rx_side_effect)re_se_wordbeg;
  5834.           goto add_side_effect;
  5835.               break;
  5836.  
  5837.             case '>':
  5838.               side = (rx_side_effect)re_se_wordend;
  5839.           goto add_side_effect;
  5840.               break;
  5841.  
  5842.             case 'b':
  5843.               side = (rx_side_effect)re_se_wordbound;
  5844.           goto add_side_effect;
  5845.               break;
  5846.  
  5847.             case 'B':
  5848.               side = (rx_side_effect)re_se_notwordbound;
  5849.           goto add_side_effect;
  5850.               break;
  5851.  
  5852.             case '`':
  5853.           side = (rx_side_effect)re_se_begbuf;
  5854.           goto add_side_effect;
  5855.           break;
  5856.           
  5857.             case '\'':
  5858.           side = (rx_side_effect)re_se_endbuf;
  5859.           goto add_side_effect;
  5860.               break;
  5861.  
  5862.         add_side_effect:
  5863.           {
  5864.         struct rexp_node * se
  5865.           = rx_mk_r_side_effect (&rxb->rx, side);
  5866.         if (!se)
  5867.           return REG_ESPACE;
  5868.         append = se;
  5869.         goto append_node;
  5870.           }
  5871.           break;
  5872.  
  5873.             case '1': case '2': case '3': case '4': case '5':
  5874.             case '6': case '7': case '8': case '9':
  5875.               if (syntax & RE_NO_BK_REFS)
  5876.                 goto normal_char;
  5877.  
  5878.               c1 = c - '0';
  5879.  
  5880.               if (c1 > regnum)
  5881.                 return REG_ESUBREG;
  5882.  
  5883.               /* Can't back reference to a subexpression if inside of it.  */
  5884.               if (group_in_compile_stack (compile_stack, c1))
  5885.         return REG_ESUBREG;
  5886.  
  5887.           {
  5888.         int backref_se = paramc;
  5889.         params = (params
  5890.               ? ((struct re_se_params *)
  5891.                  realloc (params,
  5892.                       sizeof (*params) * (1 + paramc)))
  5893.               : ((struct re_se_params *)
  5894.                  malloc (sizeof (*params))));
  5895.         if (!params)
  5896.           return REG_ESPACE;
  5897.         ++paramc;
  5898.         params[backref_se].se = re_se_backref;
  5899.         params[backref_se].op1 = c1;
  5900.         side = (rx_side_effect)backref_se;
  5901.         goto add_side_effect;
  5902.           }
  5903.               break;
  5904.  
  5905.             case '+':
  5906.             case '?':
  5907.               if (syntax & RE_BK_PLUS_QM)
  5908.                 goto handle_plus;
  5909.               else
  5910.                 goto normal_backslash;
  5911.  
  5912.             default:
  5913.             normal_backslash:
  5914.               /* You might think it would be useful for \ to mean
  5915.                  not to translate; but if we don't translate it
  5916.                  it will never match anything.  */
  5917.               c = TRANSLATE (c);
  5918.               goto normal_char;
  5919.             }
  5920.           break;
  5921.  
  5922.  
  5923.     default:
  5924.         /* Expects the character in `c'.  */
  5925.     normal_char:
  5926.         {
  5927.           rx_Bitset cs = rx_cset(&rxb->rx);
  5928.           struct rexp_node * match = rx_mk_r_cset (&rxb->rx, cs);
  5929.           rx_Bitset it;
  5930.           if (!(cs && match))
  5931.         return REG_ESPACE;
  5932.           it = inverse_translation (rxb, validate_inv_tr,
  5933.                     inverse_translate, translate, c);
  5934.           rx_bitset_union (CHAR_SET_SIZE, cs, it);
  5935.           append = match;
  5936.  
  5937.         append_node:
  5938.           /* This genericly appends the rexp APPEND to *LAST_EXPRESSION
  5939.            * and then parses the next character normally.
  5940.            */
  5941.           if (*last_expression)
  5942.         {
  5943.           struct rexp_node * concat
  5944.             = rx_mk_r_concat (&rxb->rx, *last_expression, append);
  5945.           if (!concat)
  5946.             return REG_ESPACE;
  5947.           *last_expression = concat;
  5948.           last_expression = &concat->params.pair.right;
  5949.         }
  5950.           else
  5951.         *last_expression = append;
  5952.         }
  5953.     } /* switch (c) */
  5954.     } /* while p != pend */
  5955.  
  5956.   
  5957.   {
  5958.     int win_se = paramc;
  5959.     params = (params
  5960.           ? ((struct re_se_params *)
  5961.          realloc (params,
  5962.               sizeof (*params) * (1 + paramc)))
  5963.           : ((struct re_se_params *)
  5964.          malloc (sizeof (*params))));
  5965.     if (!params)
  5966.       return REG_ESPACE;
  5967.     ++paramc;
  5968.     params[win_se].se = re_se_win;
  5969.     {
  5970.       struct rexp_node * se
  5971.     = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)win_se);
  5972.       struct rexp_node * concat
  5973.     = rx_mk_r_concat (&rxb->rx, rexp, se);
  5974.       if (!(se && concat))
  5975.     return REG_ESPACE;
  5976.       rexp = concat;
  5977.     }
  5978.   }
  5979.  
  5980.  
  5981.   /* Through the pattern now.  */
  5982.  
  5983.   if (!COMPILE_STACK_EMPTY) 
  5984.     return REG_EPAREN;
  5985.  
  5986.       free (compile_stack.stack);
  5987.  
  5988.   orig_rexp = rexp;
  5989. #ifdef RX_DEBUG
  5990.   if (rx_debug_compile)
  5991.     {
  5992.       dbug_rxb = rxb;
  5993.       fputs ("\n\nCompiling ", stdout);
  5994.       fwrite (pattern, 1, size, stdout);
  5995.       fputs (":\n", stdout);
  5996.       rxb->se_params = params;
  5997.       print_rexp (&rxb->rx, orig_rexp, 2, re_seprint, stdout);
  5998.     }
  5999. #endif
  6000.   {
  6001.     rx_Bitset cs = rx_cset(&rxb->rx);
  6002.     rx_Bitset cs2 = rx_cset(&rxb->rx);
  6003.     char * se_map = (char *) alloca (paramc);
  6004.     struct rexp_node * new_rexp = 0;
  6005.  
  6006.  
  6007.     bzero (se_map, paramc);
  6008.     find_backrefs (se_map, rexp, params);
  6009.     fewer_side_effects =
  6010.       remove_unecessary_side_effects (&rxb->rx, se_map,
  6011.                       rx_copy_rexp (&rxb->rx, rexp), params);
  6012.  
  6013.     speed_up_alt (&rxb->rx, rexp, 0);
  6014.     speed_up_alt (&rxb->rx, fewer_side_effects, 1);
  6015.  
  6016.     {
  6017.       char * syntax_parens = rxb->syntax_parens;
  6018.       if (syntax_parens == (char *)0x1)
  6019.     rexp = remove_unecessary_side_effects
  6020.       (&rxb->rx, se_map, rexp, params);
  6021.       else if (syntax_parens)
  6022.     {
  6023.       int x;
  6024.       for (x = 0; x < paramc; ++x)
  6025.         if ((   (params[x].se == re_se_lparen)
  6026.          || (params[x].se == re_se_rparen))
  6027.         && (!syntax_parens [params[x].op1]))
  6028.           se_map [x] = 1;
  6029.       rexp = remove_unecessary_side_effects
  6030.         (&rxb->rx, se_map, rexp, params);
  6031.     }
  6032.     }
  6033.  
  6034.     /* At least one more optimization would be nice to have here but i ran out 
  6035.      * of time.  The idea would be to delay side effects.  
  6036.      * For examle, `(abc)' is the same thing as `abc()' except that the
  6037.      * left paren is offset by 3 (which we know at compile time).
  6038.      * (In this comment, write that second pattern `abc(:3:)' 
  6039.      * where `(:3:' is a syntactic unit.)
  6040.      *
  6041.      * Trickier:  `(abc|defg)'  is the same as `(abc(:3:|defg(:4:))'
  6042.      * (The paren nesting may be hard to follow -- that's an alternation
  6043.      *    of `abc(:3:' and `defg(:4:' inside (purely syntactic) parens
  6044.      *  followed by the closing paren from the original expression.)
  6045.      *
  6046.      * Neither the expression tree representation nor the the nfa make
  6047.      * this very easy to write. :(
  6048.      */
  6049.  
  6050.   /* What we compile is different than what the parser returns.
  6051.    * Suppose the parser returns expression R.
  6052.    * Let R' be R with unnecessary register assignments removed 
  6053.    * (see REMOVE_UNECESSARY_SIDE_EFFECTS, above).
  6054.    *
  6055.    * What we will compile is the expression:
  6056.    *
  6057.    *    m{try}R{win}\|s{try}R'{win}
  6058.    *
  6059.    * {try} and {win} denote side effect epsilons (see EXPLORE_FUTURE).
  6060.    * 
  6061.    * When trying a match, we insert an `m' at the beginning of the 
  6062.    * string if the user wants registers to be filled, `s' if not.
  6063.    */
  6064.     new_rexp =
  6065.       rx_mk_r_alternate
  6066.     (&rxb->rx,
  6067.      rx_mk_r_concat (&rxb->rx, rx_mk_r_cset (&rxb->rx, cs2), rexp),
  6068.      rx_mk_r_concat (&rxb->rx,
  6069.              rx_mk_r_cset (&rxb->rx, cs), fewer_side_effects));
  6070.  
  6071.     if (!(new_rexp && cs && cs2))
  6072.       return REG_ESPACE;
  6073.     RX_bitset_enjoin (cs2, '\0'); /* prefixed to the rexp used for matching. */
  6074.     RX_bitset_enjoin (cs, '\1'); /* prefixed to the rexp used for searching. */
  6075.     rexp = new_rexp;
  6076.   }
  6077.  
  6078. #ifdef RX_DEBUG
  6079.   if (rx_debug_compile)
  6080.     {
  6081.       fputs ("\n...which is compiled as:\n", stdout);
  6082.       print_rexp (&rxb->rx, rexp, 2, re_seprint, stdout);
  6083.     }
  6084. #endif
  6085.   {
  6086.     struct rx_nfa_state *start = 0;
  6087.     struct rx_nfa_state *end = 0;
  6088.  
  6089.     if (!rx_build_nfa (&rxb->rx, rexp, &start, &end))
  6090.       return REG_ESPACE;    /*  */
  6091.     else
  6092.       {
  6093.     void * mem = (void *)rxb->buffer;
  6094.     unsigned long size = rxb->allocated;
  6095.     int start_id;
  6096.     char * perm_mem;
  6097.     int iterator_size = paramc * sizeof (params[0]);
  6098.  
  6099.     end->is_final = 1;
  6100.     start->is_start = 1;
  6101.     rx_name_nfa_states (&rxb->rx);
  6102.     start_id = start->id;
  6103. #ifdef RX_DEBUG
  6104.     if (rx_debug_compile)
  6105.       {
  6106.         fputs ("...giving the NFA: \n", stdout);
  6107.         dbug_rxb = rxb;
  6108.         print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout);
  6109.       }
  6110. #endif
  6111.     if (!rx_eclose_nfa (&rxb->rx))
  6112.       return REG_ESPACE;
  6113.     else
  6114.       {
  6115.         rx_delete_epsilon_transitions (&rxb->rx);
  6116.         
  6117.         /* For compatability reasons, we need to shove the
  6118.          * compiled nfa into one chunk of malloced memory.
  6119.          */
  6120.         rxb->rx.reserved = (   sizeof (params[0]) * paramc
  6121.                 +  rx_sizeof_bitset (rxb->rx.local_cset_size));
  6122. #ifdef RX_DEBUG
  6123.         if (rx_debug_compile)
  6124.           {
  6125.         dbug_rxb = rxb;
  6126.         fputs ("...which cooks down (uncompactified) to: \n", stdout);
  6127.         print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout);
  6128.           }
  6129. #endif
  6130.         if (!rx_compactify_nfa (&rxb->rx, &mem, &size))
  6131.           return REG_ESPACE;
  6132.         rxb->buffer = mem;
  6133.         rxb->allocated = size;
  6134.         rxb->rx.buffer = mem;
  6135.         rxb->rx.allocated = size;
  6136.         perm_mem = ((char *)rxb->rx.buffer
  6137.             + rxb->rx.allocated - rxb->rx.reserved);
  6138.         rxb->se_params = ((struct re_se_params *)perm_mem);
  6139.         bcopy (params, rxb->se_params, iterator_size);
  6140.         perm_mem += iterator_size;
  6141.         rxb->fastset = (rx_Bitset) perm_mem;
  6142.         rxb->start = rx_id_to_nfa_state (&rxb->rx, start_id);
  6143.       }
  6144.     rx_bitset_null (rxb->rx.local_cset_size, rxb->fastset);
  6145.     rxb->can_match_empty = compute_fastset (rxb, orig_rexp);
  6146.     rxb->match_regs_on_stack =
  6147.       registers_on_stack (rxb, orig_rexp, 0, params); 
  6148.     rxb->search_regs_on_stack =
  6149.       registers_on_stack (rxb, fewer_side_effects, 0, params);
  6150.     if (rxb->can_match_empty)
  6151.       rx_bitset_universe (rxb->rx.local_cset_size, rxb->fastset);
  6152.     rxb->is_anchored = is_anchored (orig_rexp, (rx_side_effect) re_se_hat);
  6153.     rxb->begbuf_only = is_anchored (orig_rexp,
  6154.                     (rx_side_effect) re_se_begbuf);
  6155.       }
  6156.     rx_free_rexp (&rxb->rx, rexp);
  6157.     if (params)
  6158.       free (params);
  6159. #ifdef RX_DEBUG
  6160.     if (rx_debug_compile)
  6161.       {
  6162.     dbug_rxb = rxb;
  6163.     fputs ("...which cooks down to: \n", stdout);
  6164.     print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout);
  6165.       }
  6166. #endif
  6167.   }
  6168.   return REG_NOERROR;
  6169. }
  6170.  
  6171.  
  6172.  
  6173. /* This table gives an error message for each of the error codes listed
  6174.    in regex.h.  Obviously the order here has to be same as there.  */
  6175.  
  6176. __const__ char * rx_error_msg[] =
  6177. { 0,                        /* REG_NOERROR */
  6178.     "No match",                    /* REG_NOMATCH */
  6179.     "Invalid regular expression",        /* REG_BADPAT */
  6180.     "Invalid collation character",        /* REG_ECOLLATE */
  6181.     "Invalid character class name",        /* REG_ECTYPE */
  6182.     "Trailing backslash",            /* REG_EESCAPE */
  6183.     "Invalid back reference",            /* REG_ESUBREG */
  6184.     "Unmatched [ or [^",            /* REG_EBRACK */
  6185.     "Unmatched ( or \\(",            /* REG_EPAREN */
  6186.     "Unmatched \\{",                /* REG_EBRACE */
  6187.     "Invalid content of \\{\\}",        /* REG_BADBR */
  6188.     "Invalid range end",            /* REG_ERANGE */
  6189.     "Memory exhausted",                /* REG_ESPACE */
  6190.     "Invalid preceding regular expression",    /* REG_BADRPT */
  6191.     "Premature end of regular expression",    /* REG_EEND */
  6192.     "Regular expression too big",        /* REG_ESIZE */
  6193.     "Unmatched ) or \\)",            /* REG_ERPAREN */
  6194. };
  6195.  
  6196.  
  6197.  
  6198.  
  6199. char rx_slowmap [256] =
  6200. {
  6201.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6202.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6203.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6204.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6205.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6206.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6207.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6208.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6209.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6210.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6211.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6212.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6213.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6214.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6215.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6216.   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  6217. };
  6218.  
  6219. #ifdef __STDC__
  6220. RX_DECL void
  6221. rx_blow_up_fastmap (struct re_pattern_buffer * rxb)
  6222. #else
  6223. RX_DECL void
  6224. rx_blow_up_fastmap (rxb)
  6225.      struct re_pattern_buffer * rxb;
  6226. #endif
  6227. {
  6228.   int x;
  6229.   for (x = 0; x < 256; ++x)    /* &&&& 3.6 % */
  6230.     rxb->fastmap [x] = !!RX_bitset_member (rxb->fastset, x);
  6231.   rxb->fastmap_accurate = 1;
  6232. }
  6233.  
  6234.  
  6235.  
  6236.  
  6237. #if !defined(REGEX_MALLOC) && !defined(__GNUC__)
  6238. #define RE_SEARCH_2_FN    inner_re_search_2
  6239. #define RE_S2_QUAL static
  6240. #else
  6241. #define RE_SEARCH_2_FN    re_search_2
  6242. #define RE_S2_QUAL 
  6243. #endif
  6244.  
  6245. struct re_search_2_closure
  6246. {
  6247.   __const__ char * string1;
  6248.   int size1;
  6249.   __const__ char * string2;
  6250.   int size2;
  6251. };
  6252.  
  6253.  
  6254. static __inline__ enum rx_get_burst_return
  6255. re_search_2_get_burst (pos, vclosure, stop)
  6256.      struct rx_string_position * pos;
  6257.      void * vclosure;
  6258.      int stop;
  6259. {
  6260.   struct re_search_2_closure * closure;
  6261.   closure = (struct re_search_2_closure *)vclosure;
  6262.   if (!closure->string2)
  6263.     {
  6264.       int inset;
  6265.  
  6266.       inset = pos->pos - pos->string;
  6267.       if ((inset < 0) || (inset > closure->size1))
  6268.     return rx_get_burst_no_more;
  6269.       else
  6270.     {
  6271.       pos->pos = closure->string1 + inset;
  6272.       pos->string = closure->string1;
  6273.       pos->size = closure->size1;
  6274.       pos->end = ((__const__ unsigned char *)
  6275.               MIN(closure->string1 + closure->size1,
  6276.               closure->string1 + stop));
  6277.       pos->offset = 0;
  6278.       return ((pos->pos < pos->end)
  6279.           ? rx_get_burst_ok
  6280.           :  rx_get_burst_no_more);
  6281.     }
  6282.     }
  6283.   else if (!closure->string1)
  6284.     {
  6285.       int inset;
  6286.  
  6287.       inset = pos->pos - pos->string;
  6288.       pos->pos = closure->string2 + inset;
  6289.       pos->string = closure->string2;
  6290.       pos->size = closure->size2;
  6291.       pos->end = ((__const__ unsigned char *)
  6292.           MIN(closure->string2 + closure->size2,
  6293.               closure->string2 + stop));
  6294.       pos->offset = 0;
  6295.       return ((pos->pos < pos->end)
  6296.           ? rx_get_burst_ok
  6297.           :  rx_get_burst_no_more);
  6298.     }
  6299.   else
  6300.     {
  6301.       int inset;
  6302.  
  6303.       inset = pos->pos - pos->string;
  6304.       if (inset < closure->size1)
  6305.     {
  6306.       pos->pos = closure->string1 + inset;
  6307.       pos->string = closure->string1;
  6308.       pos->size = closure->size1;
  6309.       pos->end = ((__const__ unsigned char *)
  6310.               MIN(closure->string1 + closure->size1,
  6311.               closure->string1 + stop));
  6312.       pos->offset = 0;
  6313.       return rx_get_burst_ok;
  6314.     }
  6315.       else
  6316.     {
  6317.       pos->pos = closure->string2 + inset - closure->size1;
  6318.       pos->string = closure->string2;
  6319.       pos->size = closure->size2;
  6320.       pos->end = ((__const__ unsigned char *)
  6321.               MIN(closure->string2 + closure->size2,
  6322.               closure->string2 + stop - closure->size1));
  6323.       pos->offset = closure->size1;
  6324.       return ((pos->pos < pos->end)
  6325.           ? rx_get_burst_ok
  6326.           :  rx_get_burst_no_more);
  6327.     }
  6328.     }
  6329. }
  6330.  
  6331.  
  6332. static __inline__ enum rx_back_check_return
  6333. re_search_2_back_check (pos, lparen, rparen, translate, vclosure, stop)
  6334.      struct rx_string_position * pos;
  6335.      int lparen;
  6336.      int rparen;
  6337.      unsigned char * translate;
  6338.      void * vclosure;
  6339.      int stop;
  6340. {
  6341.   struct rx_string_position there;
  6342.   struct rx_string_position past;
  6343.  
  6344.   there = *pos;
  6345.   there.pos = there.string + lparen - there.offset;
  6346.   re_search_2_get_burst (&there, vclosure, stop);
  6347.  
  6348.   past = *pos;
  6349.   past.pos = past.string + rparen - there.offset;
  6350.   re_search_2_get_burst (&past, vclosure, stop);
  6351.  
  6352.   ++pos->pos;
  6353.   re_search_2_get_burst (pos, vclosure, stop);
  6354.  
  6355.   while (   (there.pos != past.pos)
  6356.      && (pos->pos != pos->end))
  6357.     if (TRANSLATE(*there.pos) != TRANSLATE(*pos->pos))
  6358.       return rx_back_check_fail;
  6359.     else
  6360.       {
  6361.     ++there.pos;
  6362.     ++pos->pos;
  6363.     if (there.pos == there.end)
  6364.       re_search_2_get_burst (&there, vclosure, stop);
  6365.     if (pos->pos == pos->end)
  6366.       re_search_2_get_burst (pos, vclosure, stop);
  6367.       }
  6368.  
  6369.   if (there.pos != past.pos)
  6370.     return rx_back_check_fail;
  6371.   --pos->pos;
  6372.   re_search_2_get_burst (pos, vclosure, stop);
  6373.   return rx_back_check_pass;
  6374. }
  6375.  
  6376. static __inline__ int
  6377. re_search_2_fetch_char (pos, offset, app_closure, stop)
  6378.      struct rx_string_position * pos;
  6379.      int offset;
  6380.      void * app_closure;
  6381.      int stop;
  6382. {
  6383.   struct re_search_2_closure * closure;
  6384.   closure = (struct re_search_2_closure *)app_closure;
  6385.   if (offset == 0)
  6386.     return *pos->pos;
  6387.   if (pos->pos == pos->end)
  6388.     return *closure->string2;
  6389.   else
  6390.     return *pos->pos;
  6391. }
  6392.      
  6393.  
  6394. #ifdef __STDC__
  6395. RE_S2_QUAL int
  6396. RE_SEARCH_2_FN (struct re_pattern_buffer *rxb,
  6397.         __const__ char * string1, int size1,
  6398.         __const__ char * string2, int size2,
  6399.         int startpos, int range,
  6400.         struct re_registers *regs,
  6401.         int stop)
  6402. #else
  6403. RE_S2_QUAL int
  6404. RE_SEARCH_2_FN (rxb,
  6405.         string1, size1, string2, size2, startpos, range, regs, stop)
  6406.      struct re_pattern_buffer *rxb;
  6407.      __const__ char * string1;
  6408.      int size1;
  6409.      __const__ char * string2;
  6410.      int size2;
  6411.      int startpos;
  6412.      int range;
  6413.      struct re_registers *regs;
  6414.      int stop;
  6415. #endif
  6416. {
  6417.   int answer;
  6418.   struct re_search_2_closure closure;
  6419.   closure.string1 = string1;
  6420.   closure.size1 = size1;
  6421.   closure.string2 = string2;
  6422.   closure.size2 = size2;
  6423.   answer = rx_search (rxb, startpos, range, stop, size1 + size2,
  6424.               re_search_2_get_burst,
  6425.               re_search_2_back_check,
  6426.               re_search_2_fetch_char,
  6427.               (void *)&closure,
  6428.               regs,
  6429.               0,
  6430.               0);
  6431.   switch (answer)
  6432.     {
  6433.     case rx_search_continuation:
  6434.       abort ();
  6435.     case rx_search_error:
  6436.       return -2;
  6437.     case rx_search_soft_fail:
  6438.     case rx_search_fail:
  6439.       return -1;
  6440.     default:
  6441.       return answer;
  6442.     }
  6443. }
  6444.  
  6445. /* Export rx_search to callers outside this file.  */
  6446.  
  6447. int
  6448. re_rx_search (rxb, startpos, range, stop, total_size,
  6449.           get_burst, back_check, fetch_char,
  6450.           app_closure, regs, resume_state, save_state)
  6451.      struct re_pattern_buffer * rxb;
  6452.      int startpos;
  6453.      int range;
  6454.      int stop;
  6455.      int total_size;
  6456.      rx_get_burst_fn get_burst;
  6457.      rx_back_check_fn back_check;
  6458.      rx_fetch_char_fn fetch_char;
  6459.      void * app_closure;
  6460.      struct re_registers * regs;
  6461.      struct rx_search_state * resume_state;
  6462.      struct rx_search_state * save_state;
  6463. {
  6464.   return rx_search (rxb, startpos, range, stop, total_size,
  6465.             get_burst, back_check, fetch_char, app_closure,
  6466.             regs, resume_state, save_state);
  6467. }
  6468.  
  6469. #if !defined(REGEX_MALLOC) && !defined(__GNUC__)
  6470. #ifdef __STDC__
  6471. int
  6472. re_search_2 (struct re_pattern_buffer *rxb,
  6473.          __const__ char * string1, int size1,
  6474.          __const__ char * string2, int size2,
  6475.          int startpos, int range,
  6476.          struct re_registers *regs,
  6477.          int stop)
  6478. #else
  6479. int
  6480. re_search_2 (rxb, string1, size1, string2, size2, startpos, range, regs, stop)
  6481.      struct re_pattern_buffer *rxb;
  6482.      __const__ char * string1;
  6483.      int size1;
  6484.      __const__ char * string2;
  6485.      int size2;
  6486.      int startpos;
  6487.      int range;
  6488.      struct re_registers *regs;
  6489.      int stop;
  6490. #endif
  6491. {
  6492.   int ret;
  6493.   ret = inner_re_search_2 (rxb, string1, size1, string2, size2, startpos,
  6494.                range, regs, stop);
  6495.   alloca (0);
  6496.   return ret;
  6497. }
  6498. #endif
  6499.  
  6500.  
  6501. /* Like re_search_2, above, but only one string is specified, and
  6502.  * doesn't let you say where to stop matching.
  6503.  */
  6504.  
  6505. #ifdef __STDC__
  6506. int
  6507. re_search (struct re_pattern_buffer * rxb, __const__ char *string,
  6508.        int size, int startpos, int range,
  6509.        struct re_registers *regs)
  6510. #else
  6511. int
  6512. re_search (rxb, string, size, startpos, range, regs)
  6513.      struct re_pattern_buffer * rxb;
  6514.      __const__ char * string;
  6515.      int size;
  6516.      int startpos;
  6517.      int range;
  6518.      struct re_registers *regs;
  6519. #endif
  6520. {
  6521.   return re_search_2 (rxb, 0, 0, string, size, startpos, range, regs, size);
  6522. }
  6523.  
  6524. #ifdef __STDC__
  6525. int
  6526. re_match_2 (struct re_pattern_buffer * rxb,
  6527.         __const__ char * string1, int size1,
  6528.         __const__ char * string2, int size2,
  6529.         int pos, struct re_registers *regs, int stop)
  6530. #else
  6531. int
  6532. re_match_2 (rxb, string1, size1, string2, size2, pos, regs, stop)
  6533.      struct re_pattern_buffer * rxb;
  6534.      __const__ char * string1;
  6535.      int size1;
  6536.      __const__ char * string2;
  6537.      int size2;
  6538.      int pos;
  6539.      struct re_registers *regs;
  6540.      int stop;
  6541. #endif
  6542. {
  6543.   struct re_registers some_regs;
  6544.   regoff_t start;
  6545.   regoff_t end;
  6546.   int srch;
  6547.   int save = rxb->regs_allocated;
  6548.   struct re_registers * regs_to_pass = regs;
  6549.  
  6550.   if (!regs)
  6551.     {
  6552.       some_regs.start = &start;
  6553.       some_regs.end = &end;
  6554.       some_regs.num_regs = 1;
  6555.       regs_to_pass = &some_regs;
  6556.       rxb->regs_allocated = REGS_FIXED;
  6557.     }
  6558.  
  6559.   srch = re_search_2 (rxb, string1, size1, string2, size2,
  6560.               pos, 1, regs_to_pass, stop);
  6561.   if (regs_to_pass != regs)
  6562.     rxb->regs_allocated = save;
  6563.   if (srch < 0)
  6564.     return srch;
  6565.   return regs_to_pass->end[0] - regs_to_pass->start[0];
  6566. }
  6567.  
  6568. /* re_match is like re_match_2 except it takes only a single string.  */
  6569.  
  6570. #ifdef __STDC__
  6571. int
  6572. re_match (struct re_pattern_buffer * rxb,
  6573.       __const__ char * string,
  6574.       int size, int pos,
  6575.       struct re_registers *regs)
  6576. #else
  6577. int
  6578. re_match (rxb, string, size, pos, regs)
  6579.      struct re_pattern_buffer * rxb;
  6580.      __const__ char *string;
  6581.      int size;
  6582.      int pos;
  6583.      struct re_registers *regs;
  6584. #endif
  6585. {
  6586.   return re_match_2 (rxb, string, size, 0, 0, pos, regs, size);
  6587. }
  6588.  
  6589.  
  6590.  
  6591. /* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
  6592.    also be assigned to arbitrarily: each pattern buffer stores its own
  6593.    syntax, so it can be changed between regex compilations.  */
  6594. reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS;
  6595.  
  6596.  
  6597. /* Specify the precise syntax of regexps for compilation.  This provides
  6598.    for compatibility for various utilities which historically have
  6599.    different, incompatible syntaxes.
  6600.  
  6601.    The argument SYNTAX is a bit mask comprised of the various bits
  6602.    defined in regex.h.  We return the old syntax.  */
  6603.  
  6604. #ifdef __STDC__
  6605. reg_syntax_t
  6606. re_set_syntax (reg_syntax_t syntax)
  6607. #else
  6608. reg_syntax_t
  6609. re_set_syntax (syntax)
  6610.     reg_syntax_t syntax;
  6611. #endif
  6612. {
  6613.   reg_syntax_t ret = re_syntax_options;
  6614.  
  6615.   re_syntax_options = syntax;
  6616.   return ret;
  6617. }
  6618.  
  6619.  
  6620. /* Set REGS to hold NUM_REGS registers, storing them in STARTS and
  6621.    ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
  6622.    this memory for recording register information.  STARTS and ENDS
  6623.    must be allocated using the malloc library routine, and must each
  6624.    be at least NUM_REGS * sizeof (regoff_t) bytes long.
  6625.  
  6626.    If NUM_REGS == 0, then subsequent matches should allocate their own
  6627.    register data.
  6628.  
  6629.    Unless this function is called, the first search or match using
  6630.    PATTERN_BUFFER will allocate its own register data, without
  6631.    freeing the old data.  */
  6632.  
  6633. #ifdef __STDC__
  6634. void
  6635. re_set_registers (struct re_pattern_buffer *bufp,
  6636.           struct re_registers *regs,
  6637.           unsigned num_regs,
  6638.           regoff_t * starts, regoff_t * ends)
  6639. #else
  6640. void
  6641. re_set_registers (bufp, regs, num_regs, starts, ends)
  6642.      struct re_pattern_buffer *bufp;
  6643.      struct re_registers *regs;
  6644.      unsigned num_regs;
  6645.      regoff_t * starts;
  6646.      regoff_t * ends;
  6647. #endif
  6648. {
  6649.   if (num_regs)
  6650.     {
  6651.       bufp->regs_allocated = REGS_REALLOCATE;
  6652.       regs->num_regs = num_regs;
  6653.       regs->start = starts;
  6654.       regs->end = ends;
  6655.     }
  6656.   else
  6657.     {
  6658.       bufp->regs_allocated = REGS_UNALLOCATED;
  6659.       regs->num_regs = 0;
  6660.       regs->start = regs->end = (regoff_t) 0;
  6661.     }
  6662. }
  6663.  
  6664.  
  6665.  
  6666.  
  6667. #ifdef __STDC__
  6668. static int 
  6669. cplx_se_sublist_len (struct rx_se_list * list)
  6670. #else
  6671. static int 
  6672. cplx_se_sublist_len (list)
  6673.      struct rx_se_list * list;
  6674. #endif
  6675. {
  6676.   int x = 0;
  6677.   while (list)
  6678.     {
  6679.       if ((long)list->car >= 0)
  6680.     ++x;
  6681.       list = list->cdr;
  6682.     }
  6683.   return x;
  6684. }
  6685.  
  6686.  
  6687. /* For rx->se_list_cmp */
  6688.  
  6689. #ifdef __STDC__
  6690. static int 
  6691. posix_se_list_order (struct rx * rx,
  6692.              struct rx_se_list * a, struct rx_se_list * b)
  6693. #else
  6694. static int 
  6695. posix_se_list_order (rx, a, b)
  6696.      struct rx * rx;
  6697.      struct rx_se_list * a;
  6698.      struct rx_se_list * b;
  6699. #endif
  6700. {
  6701.   int al = cplx_se_sublist_len (a);
  6702.   int bl = cplx_se_sublist_len (b);
  6703.  
  6704.   if (!al && !bl)
  6705.     return ((a == b)
  6706.         ? 0
  6707.         : ((a < b) ? -1 : 1));
  6708.   
  6709.   else if (!al)
  6710.     return -1;
  6711.  
  6712.   else if (!bl)
  6713.     return 1;
  6714.  
  6715.   else
  6716.     {
  6717.       rx_side_effect * av = ((rx_side_effect *)
  6718.                  alloca (sizeof (rx_side_effect) * (al + 1)));
  6719.       rx_side_effect * bv = ((rx_side_effect *)
  6720.                  alloca (sizeof (rx_side_effect) * (bl + 1)));
  6721.       struct rx_se_list * ap = a;
  6722.       struct rx_se_list * bp = b;
  6723.       int ai, bi;
  6724.       
  6725.       for (ai = al - 1; ai >= 0; --ai)
  6726.     {
  6727.       while ((long)ap->car < 0)
  6728.         ap = ap->cdr;
  6729.       av[ai] = ap->car;
  6730.       ap = ap->cdr;
  6731.     }
  6732.       av[al] = (rx_side_effect)-2;
  6733.       for (bi = bl - 1; bi >= 0; --bi)
  6734.     {
  6735.       while ((long)bp->car < 0)
  6736.         bp = bp->cdr;
  6737.       bv[bi] = bp->car;
  6738.       bp = bp->cdr;
  6739.     }
  6740.       bv[bl] = (rx_side_effect)-1;
  6741.  
  6742.       {
  6743.     int ret;
  6744.     int x = 0;
  6745.     while (av[x] == bv[x])
  6746.       ++x;
  6747.      ret = (((unsigned *)(av[x]) < (unsigned *)(bv[x])) ? -1 : 1);
  6748.     return ret;
  6749.       }
  6750.     }
  6751. }
  6752.  
  6753.  
  6754.  
  6755.  
  6756. /* re_compile_pattern is the GNU regular expression compiler: it
  6757.    compiles PATTERN (of length SIZE) and puts the result in RXB.
  6758.    Returns 0 if the pattern was valid, otherwise an error string.
  6759.  
  6760.    Assumes the `allocated' (and perhaps `buffer') and `translate' fields
  6761.    are set in RXB on entry.
  6762.  
  6763.    We call rx_compile to do the actual compilation.  */
  6764.  
  6765. #ifdef __STDC__
  6766. __const__ char *
  6767. re_compile_pattern (__const__ char *pattern,
  6768.             int length,
  6769.             struct re_pattern_buffer * rxb)
  6770. #else
  6771. __const__ char *
  6772. re_compile_pattern (pattern, length, rxb)
  6773.      __const__ char *pattern;
  6774.      int length;
  6775.      struct re_pattern_buffer * rxb;
  6776. #endif
  6777. {
  6778.   reg_errcode_t ret;
  6779.  
  6780.   /* GNU code is written to assume at least RE_NREGS registers will be set
  6781.      (and at least one extra will be -1).  */
  6782.   rxb->regs_allocated = REGS_UNALLOCATED;
  6783.  
  6784.   /* And GNU code determines whether or not to get register information
  6785.      by passing null for the REGS argument to re_match, etc., not by
  6786.      setting no_sub.  */
  6787.   rxb->no_sub = 0;
  6788.  
  6789.   rxb->rx.local_cset_size = 256;
  6790.  
  6791.   /* Match anchors at newline.  */
  6792.   rxb->newline_anchor = 1;
  6793.  
  6794.   rxb->re_nsub = 0;
  6795.   rxb->start = 0;
  6796.   rxb->se_params = 0;
  6797.   rxb->rx.nodec = 0;
  6798.   rxb->rx.epsnodec = 0;
  6799.   rxb->rx.instruction_table = 0;
  6800.   rxb->rx.nfa_states = 0;
  6801.   rxb->rx.se_list_cmp = posix_se_list_order;
  6802.   rxb->rx.start_set = 0;
  6803.  
  6804.   ret = rx_compile (pattern, length, re_syntax_options, rxb);
  6805.   alloca (0);
  6806.   return rx_error_msg[(int) ret];
  6807. }
  6808.  
  6809.  
  6810.  
  6811. #ifdef __STDC__
  6812. int
  6813. re_compile_fastmap (struct re_pattern_buffer * rxb)
  6814. #else
  6815. int
  6816. re_compile_fastmap (rxb)
  6817.      struct re_pattern_buffer * rxb;
  6818. #endif
  6819. {
  6820.   rx_blow_up_fastmap (rxb);
  6821.   return 0;
  6822. }
  6823.  
  6824.  
  6825.  
  6826.  
  6827. /* Entry points compatible with 4.2 BSD regex library.  We don't define
  6828.    them if this is an Emacs or POSIX compilation.  */
  6829.  
  6830. #if (!defined (emacs) && !defined (_POSIX_SOURCE)) || defined(USE_BSD_REGEX)
  6831.  
  6832. /* BSD has one and only one pattern buffer.  */
  6833. static struct re_pattern_buffer rx_comp_buf;
  6834.  
  6835. #ifdef __STDC__
  6836. char *
  6837. re_comp (__const__ char *s)
  6838. #else
  6839. char *
  6840. re_comp (s)
  6841.     __const__ char *s;
  6842. #endif
  6843. {
  6844.   reg_errcode_t ret;
  6845.  
  6846.   if (!s || (*s == '\0'))
  6847.     {
  6848.       if (!rx_comp_buf.buffer)
  6849.     return "No previous regular expression";
  6850.       return 0;
  6851.     }
  6852.  
  6853.   if (!rx_comp_buf.fastmap)
  6854.     {
  6855.       rx_comp_buf.fastmap = (char *) malloc (1 << CHARBITS);
  6856.       if (!rx_comp_buf.fastmap)
  6857.     return "Memory exhausted";
  6858.     }
  6859.  
  6860.   /* Since `rx_exec' always passes NULL for the `regs' argument, we
  6861.      don't need to initialize the pattern buffer fields which affect it.  */
  6862.  
  6863.   /* Match anchors at newlines.  */
  6864.   rx_comp_buf.newline_anchor = 1;
  6865.  
  6866.   rx_comp_buf.re_nsub = 0;
  6867.   rx_comp_buf.start = 0;
  6868.   rx_comp_buf.se_params = 0;
  6869.   rx_comp_buf.rx.nodec = 0;
  6870.   rx_comp_buf.rx.epsnodec = 0;
  6871.   rx_comp_buf.rx.instruction_table = 0;
  6872.   rx_comp_buf.rx.nfa_states = 0;
  6873.   rx_comp_buf.rx.start = 0;
  6874.   rx_comp_buf.rx.se_list_cmp = posix_se_list_order;
  6875.  
  6876.   ret = rx_compile (s, strlen (s), re_syntax_options, &rx_comp_buf);
  6877.   alloca (0);
  6878.  
  6879.   /* Yes, we're discarding `__const__' here.  */
  6880.   return (char *) rx_error_msg[(int) ret];
  6881. }
  6882.  
  6883.  
  6884. #ifdef __STDC__
  6885. int
  6886. re_exec (__const__ char *s)
  6887. #else
  6888. int
  6889. re_exec (s)
  6890.     __const__ char *s;
  6891. #endif
  6892. {
  6893.   __const__ int len = strlen (s);
  6894.   return
  6895.     0 <= re_search (&rx_comp_buf, s, len, 0, len, (struct re_registers *) 0);
  6896. }
  6897. #endif /* not emacs and not _POSIX_SOURCE */
  6898.  
  6899.  
  6900.  
  6901. /* POSIX.2 functions.  Don't define these for Emacs.  */
  6902.  
  6903. #if !defined(emacs)
  6904.  
  6905. /* regcomp takes a regular expression as a string and compiles it.
  6906.  
  6907.    PREG is a regex_t *.  We do not expect any fields to be initialized,
  6908.    since POSIX says we shouldn't.  Thus, we set
  6909.  
  6910.      `buffer' to the compiled pattern;
  6911.      `used' to the length of the compiled pattern;
  6912.      `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
  6913.        REG_EXTENDED bit in CFLAGS is set; otherwise, to
  6914.        RE_SYNTAX_POSIX_BASIC;
  6915.      `newline_anchor' to REG_NEWLINE being set in CFLAGS;
  6916.      `fastmap' and `fastmap_accurate' to zero;
  6917.      `re_nsub' to the number of subexpressions in PATTERN.
  6918.  
  6919.    PATTERN is the address of the pattern string.
  6920.  
  6921.    CFLAGS is a series of bits which affect compilation.
  6922.  
  6923.      If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
  6924.      use POSIX basic syntax.
  6925.  
  6926.      If REG_NEWLINE is set, then . and [^...] don't match newline.
  6927.      Also, regexec will try a match beginning after every newline.
  6928.  
  6929.      If REG_ICASE is set, then we considers upper- and lowercase
  6930.      versions of letters to be equivalent when matching.
  6931.  
  6932.      If REG_NOSUB is set, then when PREG is passed to regexec, that
  6933.      routine will report only success or failure, and nothing about the
  6934.      registers.
  6935.  
  6936.    It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
  6937.    the return codes and their meanings.)  */
  6938.  
  6939.  
  6940. #ifdef __STDC__
  6941. int
  6942. regcomp (regex_t * preg, __const__ char * pattern, int cflags)
  6943. #else
  6944. int
  6945. regcomp (preg, pattern, cflags)
  6946.     regex_t * preg;
  6947.     __const__ char * pattern;
  6948.     int cflags;
  6949. #endif
  6950. {
  6951.   reg_errcode_t ret;
  6952.   unsigned syntax
  6953.     = cflags & REG_EXTENDED ? RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
  6954.  
  6955.   /* regex_compile will allocate the space for the compiled pattern.  */
  6956.   preg->buffer = 0;
  6957.   preg->allocated = 0;
  6958.  
  6959.   preg->fastmap = malloc (256);
  6960.   if (!preg->fastmap)
  6961.     return REG_ESPACE;
  6962.   preg->fastmap_accurate = 0;
  6963.  
  6964.   if (cflags & REG_ICASE)
  6965.     {
  6966.       unsigned i;
  6967.  
  6968.       preg->translate = (unsigned char *) malloc (256);
  6969.       if (!preg->translate)
  6970.         return (int) REG_ESPACE;
  6971.  
  6972.       /* Map uppercase characters to corresponding lowercase ones.  */
  6973.       for (i = 0; i < CHAR_SET_SIZE; i++)
  6974.         preg->translate[i] = isupper (i) ? tolower (i) : i;
  6975.     }
  6976.   else
  6977.     preg->translate = 0;
  6978.  
  6979.   /* If REG_NEWLINE is set, newlines are treated differently.  */
  6980.   if (cflags & REG_NEWLINE)
  6981.     { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
  6982.       syntax &= ~RE_DOT_NEWLINE;
  6983.       syntax |= RE_HAT_LISTS_NOT_NEWLINE;
  6984.       /* It also changes the matching behavior.  */
  6985.       preg->newline_anchor = 1;
  6986.     }
  6987.   else
  6988.     preg->newline_anchor = 0;
  6989.  
  6990.   preg->no_sub = !!(cflags & REG_NOSUB);
  6991.  
  6992.   /* POSIX says a null character in the pattern terminates it, so we
  6993.      can use strlen here in compiling the pattern.  */
  6994.   preg->re_nsub = 0;
  6995.   preg->start = 0;
  6996.   preg->se_params = 0;
  6997.   preg->rx.nodec = 0;
  6998.   preg->rx.epsnodec = 0;
  6999.   preg->rx.instruction_table = 0;
  7000.   preg->rx.nfa_states = 0;
  7001.   preg->rx.local_cset_size = 256;
  7002.   preg->rx.start = 0;
  7003.   preg->rx.se_list_cmp = posix_se_list_order;
  7004.   preg->rx.start_set = 0;
  7005.   ret = rx_compile (pattern, strlen (pattern), syntax, preg);
  7006.   alloca (0);
  7007.  
  7008.   /* POSIX doesn't distinguish between an unmatched open-group and an
  7009.      unmatched close-group: both are REG_EPAREN.  */
  7010.   if (ret == REG_ERPAREN) ret = REG_EPAREN;
  7011.  
  7012.   return (int) ret;
  7013. }
  7014.  
  7015.  
  7016. /* regexec searches for a given pattern, specified by PREG, in the
  7017.    string STRING.
  7018.  
  7019.    If NMATCH is zero or REG_NOSUB was set in the cflags argument to
  7020.    `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
  7021.    least NMATCH elements, and we set them to the offsets of the
  7022.    corresponding matched substrings.
  7023.  
  7024.    EFLAGS specifies `execution flags' which affect matching: if
  7025.    REG_NOTBOL is set, then ^ does not match at the beginning of the
  7026.    string; if REG_NOTEOL is set, then $ does not match at the end.
  7027.  
  7028.    We return 0 if we find a match and REG_NOMATCH if not.  */
  7029.  
  7030. #ifdef __STDC__
  7031. int
  7032. regexec (__const__ regex_t *preg, __const__ char *string,
  7033.      size_t nmatch, regmatch_t pmatch[],
  7034.      int eflags)
  7035. #else
  7036. int
  7037. regexec (preg, string, nmatch, pmatch, eflags)
  7038.     __const__ regex_t *preg;
  7039.     __const__ char *string;
  7040.     size_t nmatch;
  7041.     regmatch_t pmatch[];
  7042.     int eflags;
  7043. #endif
  7044. {
  7045.   int ret;
  7046.   struct re_registers regs;
  7047.   regex_t private_preg;
  7048.   int len = strlen (string);
  7049.   boolean want_reg_info = !preg->no_sub && nmatch > 0;
  7050.  
  7051.   private_preg = *preg;
  7052.  
  7053.   private_preg.not_bol = !!(eflags & REG_NOTBOL);
  7054.   private_preg.not_eol = !!(eflags & REG_NOTEOL);
  7055.  
  7056.   /* The user has told us exactly how many registers to return
  7057.    * information about, via `nmatch'.  We have to pass that on to the
  7058.    * matching routines.
  7059.    */
  7060.   private_preg.regs_allocated = REGS_FIXED;
  7061.  
  7062.   if (want_reg_info)
  7063.     {
  7064.       regs.num_regs = nmatch;
  7065.       regs.start =  (( regoff_t *) malloc ((nmatch) * sizeof ( regoff_t)));
  7066.       regs.end =  (( regoff_t *) malloc ((nmatch) * sizeof ( regoff_t)));
  7067.       if (regs.start == 0 || regs.end == 0)
  7068.         return (int) REG_NOMATCH;
  7069.     }
  7070.  
  7071.   /* Perform the searching operation.  */
  7072.   ret = re_search (&private_preg,
  7073.            string, len,
  7074.                    /* start: */ 0,
  7075.            /* range: */ len,
  7076.                    want_reg_info ? ®s : (struct re_registers *) 0);
  7077.  
  7078.   /* Copy the register information to the POSIX structure.  */
  7079.   if (want_reg_info)
  7080.     {
  7081.       if (ret >= 0)
  7082.         {
  7083.           unsigned r;
  7084.  
  7085.           for (r = 0; r < nmatch; r++)
  7086.             {
  7087.               pmatch[r].rm_so = regs.start[r];
  7088.               pmatch[r].rm_eo = regs.end[r];
  7089.             }
  7090.         }
  7091.  
  7092.       /* If we needed the temporary register info, free the space now.  */
  7093.       free (regs.start);
  7094.       free (regs.end);
  7095.     }
  7096.  
  7097.   /* We want zero return to mean success, unlike `re_search'.  */
  7098.   return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
  7099. }
  7100.  
  7101.  
  7102. /* Returns a message corresponding to an error code, ERRCODE, returned
  7103.    from either regcomp or regexec.   */
  7104.  
  7105. #ifdef __STDC__
  7106. size_t
  7107. regerror (int errcode, __const__ regex_t *preg,
  7108.       char *errbuf, size_t errbuf_size)
  7109. #else
  7110. size_t
  7111. regerror (errcode, preg, errbuf, errbuf_size)
  7112.     int errcode;
  7113.     __const__ regex_t *preg;
  7114.     char *errbuf;
  7115.     size_t errbuf_size;
  7116. #endif
  7117. {
  7118.   __const__ char *msg
  7119.     = rx_error_msg[errcode] == 0 ? "Success" : rx_error_msg[errcode];
  7120.   size_t msg_size = strlen (msg) + 1; /* Includes the 0.  */
  7121.  
  7122.   if (errbuf_size != 0)
  7123.     {
  7124.       if (msg_size > errbuf_size)
  7125.         {
  7126.           strncpy (errbuf, msg, errbuf_size - 1);
  7127.           errbuf[errbuf_size - 1] = 0;
  7128.         }
  7129.       else
  7130.         strcpy (errbuf, msg);
  7131.     }
  7132.  
  7133.   return msg_size;
  7134. }
  7135.  
  7136.  
  7137. /* Free dynamically allocated space used by PREG.  */
  7138.  
  7139. #ifdef __STDC__
  7140. void
  7141. regfree (regex_t *preg)
  7142. #else
  7143. void
  7144. regfree (preg)
  7145.     regex_t *preg;
  7146. #endif
  7147. {
  7148.   if (preg->buffer != 0)
  7149.     free (preg->buffer);
  7150.   preg->buffer = 0;
  7151.   preg->allocated = 0;
  7152.  
  7153.   if (preg->fastmap != 0)
  7154.     free (preg->fastmap);
  7155.   preg->fastmap = 0;
  7156.   preg->fastmap_accurate = 0;
  7157.  
  7158.   if (preg->translate != 0)
  7159.     free (preg->translate);
  7160.   preg->translate = 0;
  7161. }
  7162.  
  7163. #endif /* not emacs  */
  7164.  
  7165.  
  7166.  
  7167.  
  7168.  
  7169.