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

DVD

开发平台:

Unix_Linux

  1. /* Copyright (C) 1992, 1993 Free Software Foundation, Inc.
  2. This file is part of the librx library.
  3. Librx is free software; you can redistribute it and/or modify it under
  4. the terms of the GNU Library General Public License as published by
  5. the Free Software Foundation; either version 2, or (at your option)
  6. any later version.
  7. Librx is distributed in the hope that it will be useful, but WITHOUT
  8. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  9. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  10. for more details.
  11. You should have received a copy of the GNU Library General Public
  12. License along with this software; see the file COPYING.LIB.  If not,
  13. write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA
  14. 02139, USA.  */
  15. /* NOTE!!!  AIX is so losing it requires this to be the first thing in the 
  16.  * file. 
  17.  * Do not put ANYTHING before it!  
  18.  */
  19. #if !defined (__GNUC__) && defined (_AIX)
  20.  #pragma alloca
  21. #endif
  22. char rx_version_string[] = "GNU Rx version 0.06";
  23. /* ``Too hard!''
  24.  *     -- anon.
  25.  */
  26. #include <stdio.h>
  27. #include <ctype.h>
  28. #ifndef isgraph
  29. #define isgraph(c) (isprint (c) && !isspace (c))
  30. #endif
  31. #ifndef isblank
  32. #define isblank(c) ((c) == ' ' || (c) == 't')
  33. #endif
  34. #include <sys/types.h>
  35. #undef MAX
  36. #undef MIN
  37. #define MAX(a, b) ((a) > (b) ? (a) : (b))
  38. #define MIN(a, b) ((a) < (b) ? (a) : (b))
  39. typedef char boolean;
  40. #define false 0
  41. #define true 1
  42. #ifndef RX_DECL
  43. #define RX_DECL static
  44. #endif
  45. #ifndef __GCC__
  46. #undef __inline__
  47. #define __inline__
  48. #endif
  49. /* Emacs already defines alloca, sometimes.  */
  50. #ifndef alloca
  51. /* Make alloca work the best possible way.  */
  52. #ifdef __GNUC__
  53. #define alloca __builtin_alloca
  54. #else /* not __GNUC__ */
  55. #if HAVE_ALLOCA_H
  56. #include <alloca.h>
  57. #else /* not __GNUC__ or HAVE_ALLOCA_H */
  58. #ifndef _AIX /* Already did AIX, up at the top.  */
  59. char *alloca ();
  60. #endif /* not _AIX */
  61. #endif /* not HAVE_ALLOCA_H */ 
  62. #endif /* not __GNUC__ */
  63. #endif /* not alloca */
  64. /* Memory management and stuff for emacs. */
  65. #define CHARBITS 8
  66. #define remalloc(M, S) (M ? realloc (M, S) : malloc (S))
  67. /* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
  68.  * use `alloca' instead of `malloc' for the backtracking stack.
  69.  *
  70.  * Emacs will die miserably if we don't do this.
  71.  */
  72. #ifdef REGEX_MALLOC
  73. #define REGEX_ALLOCATE malloc
  74. #else /* not REGEX_MALLOC  */
  75. #define REGEX_ALLOCATE alloca
  76. #endif /* not REGEX_MALLOC */
  77. #ifdef RX_WANT_RX_DEFS
  78. #define RX_DECL extern
  79. #define RX_DEF_QUAL 
  80. #else
  81. #define RX_WANT_RX_DEFS
  82. #define RX_DECL static
  83. #define RX_DEF_QUAL static
  84. #endif
  85. #include "rx.h"
  86. #undef RX_DECL
  87. #define RX_DECL RX_DEF_QUAL
  88. #ifndef emacs
  89. #ifdef SYNTAX_TABLE
  90. extern char *re_syntax_table;
  91. #else /* not SYNTAX_TABLE */
  92. /* RX_DECL char re_syntax_table[CHAR_SET_SIZE]; */
  93. #ifdef __STDC__
  94. static void
  95. init_syntax_once (void)
  96. #else
  97. static void
  98. init_syntax_once ()
  99. #endif
  100. {
  101.    register int c;
  102.    static int done = 0;
  103.    if (done)
  104.      return;
  105.    bzero (re_syntax_table, sizeof re_syntax_table);
  106.    for (c = 'a'; c <= 'z'; c++)
  107.      re_syntax_table[c] = Sword;
  108.    for (c = 'A'; c <= 'Z'; c++)
  109.      re_syntax_table[c] = Sword;
  110.    for (c = '0'; c <= '9'; c++)
  111.      re_syntax_table[c] = Sword;
  112.    re_syntax_table['_'] = Sword;
  113.    done = 1;
  114. }
  115. #endif /* not SYNTAX_TABLE */
  116. #endif /* not emacs */
  117. /* Compile with `-DRX_DEBUG' and use the following flags.
  118.  *
  119.  * Debugging flags:
  120.  *    rx_debug - print information as a regexp is compiled
  121.  *  rx_debug_trace - print information as a regexp is executed
  122.  */
  123. #ifdef RX_DEBUG
  124. int rx_debug_compile = 0;
  125. int rx_debug_trace = 0;
  126. static struct re_pattern_buffer * dbug_rxb = 0;
  127. #ifdef __STDC__
  128. typedef void (*side_effect_printer) (struct rx *, void *, FILE *);
  129. #else
  130. typedef void (*side_effect_printer) ();
  131. #endif
  132. #ifdef __STDC__
  133. static void print_cset (struct rx *rx, rx_Bitset cset, FILE * fp);
  134. #else
  135. static void print_cset ();
  136. #endif
  137. #ifdef __STDC__
  138. static void
  139. print_rexp (struct rx *rx,
  140.     struct rexp_node *node, int depth,
  141.     side_effect_printer seprint, FILE * fp)
  142. #else
  143. static void
  144. print_rexp (rx, node, depth, seprint, fp)
  145.      struct rx *rx;
  146.      struct rexp_node *node;
  147.      int depth;
  148.      side_effect_printer seprint;
  149.      FILE * fp;
  150. #endif
  151. {
  152.   if (!node)
  153.     return;
  154.   else
  155.     {
  156.       switch (node->type)
  157. {
  158. case r_cset:
  159.   {
  160.     fprintf (fp, "%*s", depth, "");
  161.     print_cset (rx, node->params.cset, fp);
  162.     fputc ('n', fp);
  163.     break;
  164.   }
  165.   case r_opt:
  166. case r_star:
  167.   fprintf (fp, "%*s%sn", depth, "",
  168.    node->type == r_opt ? "opt" : "star");
  169.   print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp);
  170.   break;
  171. case r_2phase_star:
  172.   fprintf (fp, "%*s2phase starn", depth, "");
  173.   print_rexp (rx, node->params.pair.right, depth + 3, seprint, fp);
  174.   print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp);
  175.   break;
  176. case r_alternate:
  177. case r_concat:
  178.   fprintf (fp, "%*s%sn", depth, "",
  179.    node->type == r_alternate ? "alt" : "concat");
  180.   print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp);
  181.   print_rexp (rx, node->params.pair.right, depth + 3, seprint, fp);
  182.   break;
  183. case r_side_effect:
  184.   fprintf (fp, "%*sSide effect: ", depth, "");
  185.   seprint (rx, node->params.side_effect, fp);
  186.   fputc ('n', fp);
  187. }
  188.     }
  189. }
  190. #ifdef __STDC__
  191. static void
  192. print_nfa (struct rx * rx,
  193.    struct rx_nfa_state * n,
  194.    side_effect_printer seprint, FILE * fp)
  195. #else
  196. static void
  197. print_nfa (rx, n, seprint, fp)
  198.      struct rx * rx;
  199.      struct rx_nfa_state * n;
  200.      side_effect_printer seprint;
  201.      FILE * fp;
  202. #endif
  203. {
  204.   while (n)
  205.     {
  206.       struct rx_nfa_edge *e = n->edges;
  207.       struct rx_possible_future *ec = n->futures;
  208.       fprintf (fp, "node %d %sn", n->id,
  209.        n->is_final ? "final" : (n->is_start ? "start" : ""));
  210.       while (e)
  211. {
  212.   fprintf (fp, "   edge to %d, ", e->dest->id);
  213.   switch (e->type)
  214.     {
  215.     case ne_epsilon:
  216.       fprintf (fp, "epsilonn");
  217.       break;
  218.     case ne_side_effect:
  219.       fprintf (fp, "side effect ");
  220.       seprint (rx, e->params.side_effect, fp);
  221.       fputc ('n', fp);
  222.       break;
  223.     case ne_cset:
  224.       fprintf (fp, "cset ");
  225.       print_cset (rx, e->params.cset, fp);
  226.       fputc ('n', fp);
  227.       break;
  228.     }
  229.   e = e->next;
  230. }
  231.       while (ec)
  232. {
  233.   int x;
  234.   struct rx_nfa_state_set * s;
  235.   struct rx_se_list * l;
  236.   fprintf (fp, "   eclosure to {");
  237.   for (s = ec->destset; s; s = s->cdr)
  238.     fprintf (fp, "%d ", s->car->id);
  239.   fprintf (fp, "} (");
  240.   for (l = ec->effects; l; l = l->cdr)
  241.     {
  242.       seprint (rx, l->car, fp);
  243.       fputc (' ', fp);
  244.     }
  245.   fprintf (fp, ")n");
  246.   ec = ec->next;
  247. }
  248.       n = n->next;
  249.     }
  250. }
  251. static char * efnames [] =
  252. {
  253.   "bogon",
  254.   "re_se_try",
  255.   "re_se_pushback",
  256.   "re_se_push0",
  257.   "re_se_pushpos",
  258.   "re_se_chkpos",
  259.   "re_se_poppos",
  260.   "re_se_at_dot",
  261.   "re_se_syntax",
  262.   "re_se_not_syntax",
  263.   "re_se_begbuf",
  264.   "re_se_hat",
  265.   "re_se_wordbeg",
  266.   "re_se_wordbound",
  267.   "re_se_notwordbound",
  268.   "re_se_wordend",
  269.   "re_se_endbuf",
  270.   "re_se_dollar",
  271.   "re_se_fail",
  272. };
  273. static char * efnames2[] =
  274. {
  275.   "re_se_win",
  276.   "re_se_lparen",
  277.   "re_se_rparen",
  278.   "re_se_backref",
  279.   "re_se_iter",
  280.   "re_se_end_iter",
  281.   "re_se_tv"
  282. };
  283. static char * inx_names[] = 
  284. {
  285.   "rx_backtrack_point",
  286.   "rx_do_side_effects",
  287.   "rx_cache_miss",
  288.   "rx_next_char",
  289.   "rx_backtrack",
  290.   "rx_error_inx",
  291.   "rx_num_instructions"
  292. };
  293. #ifdef __STDC__
  294. static void
  295. re_seprint (struct rx * rx, void * effect, FILE * fp)
  296. #else
  297. static void
  298. re_seprint (rx, effect, fp)
  299.      struct rx * rx;
  300.      void * effect;
  301.      FILE * fp;
  302. #endif
  303. {
  304.   if ((int)effect < 0)
  305.     fputs (efnames[-(int)effect], fp);
  306.   else if (dbug_rxb)
  307.     {
  308.       struct re_se_params * p = &dbug_rxb->se_params[(int)effect];
  309.       fprintf (fp, "%s(%d,%d)", efnames2[p->se], p->op1, p->op2);
  310.     }
  311.   else
  312.     fprintf (fp, "[complex op # %d]", (int)effect);
  313. }
  314. /* These are so the regex.c regression tests will compile. */
  315. void
  316. print_compiled_pattern (rxb)
  317.      struct re_pattern_buffer * rxb;
  318. {
  319. }
  320. void
  321. print_fastmap (fm)
  322.      char * fm;
  323. {
  324. }
  325. #endif /* RX_DEBUG */
  326. /* This page: Bitsets.  Completely unintersting. */
  327. #ifdef __STDC__
  328. RX_DECL int
  329. rx_bitset_is_equal (int size, rx_Bitset a, rx_Bitset b)
  330. #else
  331. RX_DECL int
  332. rx_bitset_is_equal (size, a, b)
  333.      int size;
  334.      rx_Bitset a;
  335.      rx_Bitset b;
  336. #endif
  337. {
  338.   int x;
  339.   RX_subset s = b[0];
  340.   b[0] = ~a[0];
  341.   for (x = rx_bitset_numb_subsets(size) - 1; a[x] == b[x]; --x)
  342.     ;
  343.   b[0] = s;
  344.   return !x && s == a[0];
  345. }
  346. #ifdef __STDC__
  347. RX_DECL int
  348. rx_bitset_is_subset (int size, rx_Bitset a, rx_Bitset b)
  349. #else
  350. RX_DECL int
  351. rx_bitset_is_subset (size, a, b)
  352.      int size;
  353.      rx_Bitset a;
  354.      rx_Bitset b;
  355. #endif
  356. {
  357.   int x = rx_bitset_numb_subsets(size) - 1;
  358.   while (x-- && (a[x] & b[x]) == a[x]);
  359.   return x == -1;
  360. }
  361. #ifdef __STDC__
  362. RX_DECL int
  363. rx_bitset_empty (int size, rx_Bitset set)
  364. #else
  365. RX_DECL int
  366. rx_bitset_empty (size, set)
  367.      int size;
  368.      rx_Bitset set;
  369. #endif
  370. {
  371.   int x;
  372.   RX_subset s = set[0];
  373.   set[0] = 1;
  374.   for (x = rx_bitset_numb_subsets(size) - 1; !set[x]; --x)
  375.     ;
  376.   set[0] = s;
  377.   return !s;
  378. }
  379. #ifdef __STDC__
  380. RX_DECL void
  381. rx_bitset_null (int size, rx_Bitset b)
  382. #else
  383. RX_DECL void
  384. rx_bitset_null (size, b)
  385.      int size;
  386.      rx_Bitset b;
  387. #endif
  388. {
  389.   bzero (b, rx_sizeof_bitset(size));
  390. }
  391. #ifdef __STDC__
  392. RX_DECL void
  393. rx_bitset_universe (int size, rx_Bitset b)
  394. #else
  395. RX_DECL void
  396. rx_bitset_universe (size, b)
  397.      int size;
  398.      rx_Bitset b;
  399. #endif
  400. {
  401.   int x = rx_bitset_numb_subsets (size);
  402.   while (x--)
  403.     *b++ = ~(RX_subset)0;
  404. }
  405. #ifdef __STDC__
  406. RX_DECL void
  407. rx_bitset_complement (int size, rx_Bitset b)
  408. #else
  409. RX_DECL void
  410. rx_bitset_complement (size, b)
  411.      int size;
  412.      rx_Bitset b;
  413. #endif
  414. {
  415.   int x = rx_bitset_numb_subsets (size);
  416.   while (x--)
  417.     {
  418.       *b = ~*b;
  419.       ++b;
  420.     }
  421. }
  422. #ifdef __STDC__
  423. RX_DECL void
  424. rx_bitset_assign (int size, rx_Bitset a, rx_Bitset b)
  425. #else
  426. RX_DECL void
  427. rx_bitset_assign (size, a, b)
  428.      int size;
  429.      rx_Bitset a;
  430.      rx_Bitset b;
  431. #endif
  432. {
  433.   int x;
  434.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  435.     a[x] = b[x];
  436. }
  437. #ifdef __STDC__
  438. RX_DECL void
  439. rx_bitset_union (int size, rx_Bitset a, rx_Bitset b)
  440. #else
  441. RX_DECL void
  442. rx_bitset_union (size, a, b)
  443.      int size;
  444.      rx_Bitset a;
  445.      rx_Bitset b;
  446. #endif
  447. {
  448.   int x;
  449.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  450.     a[x] |= b[x];
  451. }
  452. #ifdef __STDC__
  453. RX_DECL void
  454. rx_bitset_intersection (int size,
  455. rx_Bitset a, rx_Bitset b)
  456. #else
  457. RX_DECL void
  458. rx_bitset_intersection (size, a, b)
  459.      int size;
  460.      rx_Bitset a;
  461.      rx_Bitset b;
  462. #endif
  463. {
  464.   int x;
  465.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  466.     a[x] &= b[x];
  467. }
  468. #ifdef __STDC__
  469. RX_DECL void
  470. rx_bitset_difference (int size, rx_Bitset a, rx_Bitset b)
  471. #else
  472. RX_DECL void
  473. rx_bitset_difference (size, a, b)
  474.      int size;
  475.      rx_Bitset a;
  476.      rx_Bitset b;
  477. #endif
  478. {
  479.   int x;
  480.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  481.     a[x] &=  ~ b[x];
  482. }
  483. #ifdef __STDC__
  484. RX_DECL void
  485. rx_bitset_revdifference (int size,
  486.  rx_Bitset a, rx_Bitset b)
  487. #else
  488. RX_DECL void
  489. rx_bitset_revdifference (size, a, b)
  490.      int size;
  491.      rx_Bitset a;
  492.      rx_Bitset b;
  493. #endif
  494. {
  495.   int x;
  496.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  497.     a[x] = ~a[x] & b[x];
  498. }
  499. #ifdef __STDC__
  500. RX_DECL void
  501. rx_bitset_xor (int size, rx_Bitset a, rx_Bitset b)
  502. #else
  503. RX_DECL void
  504. rx_bitset_xor (size, a, b)
  505.      int size;
  506.      rx_Bitset a;
  507.      rx_Bitset b;
  508. #endif
  509. {
  510.   int x;
  511.   for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
  512.     a[x] ^= b[x];
  513. }
  514. #ifdef __STDC__
  515. RX_DECL unsigned long
  516. rx_bitset_hash (int size, rx_Bitset b)
  517. #else
  518. RX_DECL unsigned long
  519. rx_bitset_hash (size, b)
  520.      int size;
  521.      rx_Bitset b;
  522. #endif
  523. {
  524.   int x;
  525.   unsigned long hash = (unsigned long)rx_bitset_hash;
  526.   for (x = rx_bitset_numb_subsets(size) - 1; x >= 0; --x)
  527.     hash ^= rx_bitset_subset_val(b, x);
  528.   return hash;
  529. }
  530. RX_DECL RX_subset rx_subset_singletons [RX_subset_bits] = 
  531. {
  532.   0x1,
  533.   0x2,
  534.   0x4,
  535.   0x8,
  536.   0x10,
  537.   0x20,
  538.   0x40,
  539.   0x80,
  540.   0x100,
  541.   0x200,
  542.   0x400,
  543.   0x800,
  544.   0x1000,
  545.   0x2000,
  546.   0x4000,
  547.   0x8000,
  548.   0x10000,
  549.   0x20000,
  550.   0x40000,
  551.   0x80000,
  552.   0x100000,
  553.   0x200000,
  554.   0x400000,
  555.   0x800000,
  556.   0x1000000,
  557.   0x2000000,
  558.   0x4000000,
  559.   0x8000000,
  560.   0x10000000,
  561.   0x20000000,
  562.   0x40000000,
  563.   0x80000000
  564. };
  565. #ifdef RX_DEBUG
  566. #ifdef __STDC__
  567. static void
  568. print_cset (struct rx *rx, rx_Bitset cset, FILE * fp)
  569. #else
  570. static void
  571. print_cset (rx, cset, fp)
  572.      struct rx *rx;
  573.      rx_Bitset cset;
  574.      FILE * fp;
  575. #endif
  576. {
  577.   int x;
  578.   fputc ('[', fp);
  579.   for (x = 0; x < rx->local_cset_size; ++x)
  580.     if (RX_bitset_member (cset, x))
  581.       {
  582. if (isprint(x))
  583.   fputc (x, fp);
  584. else
  585.   fprintf (fp, "\0%o ", x);
  586.       }
  587.   fputc (']', fp);
  588. }
  589. #endif /*  RX_DEBUG */
  590. static unsigned long rx_hash_masks[4] =
  591. {
  592.   0x12488421,
  593.   0x96699669,
  594.   0xbe7dd7eb,
  595.   0xffffffff
  596. };
  597. /* Hash tables */
  598. #ifdef __STDC__
  599. RX_DECL struct rx_hash_item * 
  600. rx_hash_find (struct rx_hash * table,
  601.       unsigned long hash,
  602.       void * value,
  603.       struct rx_hash_rules * rules)
  604. #else
  605. RX_DECL struct rx_hash_item * 
  606. rx_hash_find (table, hash, value, rules)
  607.      struct rx_hash * table;
  608.      unsigned long hash;
  609.      void * value;
  610.      struct rx_hash_rules * rules;
  611. #endif
  612. {
  613.   rx_hash_eq eq = rules->eq;
  614.   int maskc = 0;
  615.   long mask = rx_hash_masks [0];
  616.   int bucket = (hash & mask) % 13;
  617.   while (table->children [bucket])
  618.     {
  619.       table = table->children [bucket];
  620.       ++maskc;
  621.       mask = rx_hash_masks[maskc];
  622.       bucket = (hash & mask) % 13;
  623.     }
  624.   {
  625.     struct rx_hash_item * it = table->buckets[bucket];
  626.     while (it)
  627.       if (eq (it->data, value))
  628. return it;
  629.       else
  630. it = it->next_same_hash;
  631.   }
  632.   return 0;
  633. }
  634. #ifdef __STDC__
  635. RX_DECL struct rx_hash_item *
  636. rx_hash_store (struct rx_hash * table,
  637.        unsigned long hash,
  638.        void * value,
  639.        struct rx_hash_rules * rules)
  640. #else
  641. RX_DECL struct rx_hash_item *
  642. rx_hash_store (table, hash, value, rules)
  643.      struct rx_hash * table;
  644.      unsigned long hash;
  645.      void * value;
  646.      struct rx_hash_rules * rules;
  647. #endif
  648. {
  649.   rx_hash_eq eq = rules->eq;
  650.   int maskc = 0;
  651.   long mask = rx_hash_masks[0];
  652.   int bucket = (hash & mask) % 13;
  653.   int depth = 0;
  654.   
  655.   while (table->children [bucket])
  656.     {
  657.       table = table->children [bucket];
  658.       ++maskc;
  659.       mask = rx_hash_masks[maskc];
  660.       bucket = (hash & mask) % 13;
  661.       ++depth;
  662.     }
  663.   
  664.   {
  665.     struct rx_hash_item * it = table->buckets[bucket];
  666.     while (it)
  667.       if (eq (it->data, value))
  668. return it;
  669.       else
  670. it = it->next_same_hash;
  671.   }
  672.   
  673.   {
  674.     if (   (depth < 3)
  675. && (table->bucket_size [bucket] >= 4))
  676.       {
  677. struct rx_hash * newtab = ((struct rx_hash *)
  678.    rules->hash_alloc (rules));
  679. if (!newtab)
  680.   goto add_to_bucket;
  681. bzero (newtab, sizeof (*newtab));
  682. newtab->parent = table;
  683. {
  684.   struct rx_hash_item * them = table->buckets[bucket];
  685.   unsigned long newmask = rx_hash_masks[maskc + 1];
  686.   while (them)
  687.     {
  688.       struct rx_hash_item * save = them->next_same_hash;
  689.       int new_buck = (them->hash & newmask) % 13;
  690.       them->next_same_hash = newtab->buckets[new_buck];
  691.       newtab->buckets[new_buck] = them;
  692.       them->table = newtab;
  693.       them = save;
  694.       ++newtab->bucket_size[new_buck];
  695.       ++newtab->refs;
  696.     }
  697.   table->refs = (table->refs - table->bucket_size[bucket] + 1);
  698.   table->bucket_size[bucket] = 0;
  699.   table->buckets[bucket] = 0;
  700.   table->children[bucket] = newtab;
  701.   table = newtab;
  702.   bucket = (hash & newmask) % 13;
  703. }
  704.       }
  705.   }
  706.  add_to_bucket:
  707.   {
  708.     struct rx_hash_item  * it = ((struct rx_hash_item *)
  709.  rules->hash_item_alloc (rules, value));
  710.     if (!it)
  711.       return 0;
  712.     it->hash = hash;
  713.     it->table = table;
  714.     /* DATA and BINDING are to be set in hash_item_alloc */
  715.     it->next_same_hash = table->buckets [bucket];
  716.     table->buckets[bucket] = it;
  717.     ++table->bucket_size [bucket];
  718.     ++table->refs;
  719.     return it;
  720.   }
  721. }
  722. #ifdef __STDC__
  723. RX_DECL void
  724. rx_hash_free (struct rx_hash_item * it, struct rx_hash_rules * rules)
  725. #else
  726. RX_DECL void
  727. rx_hash_free (it, rules)
  728.      struct rx_hash_item * it;
  729.      struct rx_hash_rules * rules;
  730. #endif
  731. {
  732.   if (it)
  733.     {
  734.       struct rx_hash * table = it->table;
  735.       unsigned long hash = it->hash;
  736.       int depth = (table->parent
  737.    ? (table->parent->parent
  738.       ? (table->parent->parent->parent
  739.  ? 3
  740.  : 2)
  741.       : 1)
  742.    : 0);
  743.       int bucket = (hash & rx_hash_masks [depth]) % 13;
  744.       struct rx_hash_item ** pos = &table->buckets [bucket];
  745.       
  746.       while (*pos != it)
  747. pos = &(*pos)->next_same_hash;
  748.       *pos = it->next_same_hash;
  749.       rules->free_hash_item (it, rules);
  750.       --table->bucket_size[bucket];
  751.       --table->refs;
  752.       while (!table->refs && depth)
  753. {
  754.   struct rx_hash * save = table;
  755.   table = table->parent;
  756.   --depth;
  757.   bucket = (hash & rx_hash_masks [depth]) % 13;
  758.   --table->refs;
  759.   table->children[bucket] = 0;
  760.   rules->free_hash (save, rules);
  761. }
  762.     }
  763. }
  764. #ifdef __STDC__
  765. RX_DECL void
  766. rx_free_hash_table (struct rx_hash * tab, rx_hash_freefn freefn,
  767.     struct rx_hash_rules * rules)
  768. #else
  769. RX_DECL void
  770. rx_free_hash_table (tab, freefn, rules)
  771.      struct rx_hash * tab;
  772.      rx_hash_freefn freefn;
  773.      struct rx_hash_rules * rules;
  774. #endif
  775. {
  776.   int x;
  777.   for (x = 0; x < 13; ++x)
  778.     if (tab->children[x])
  779.       {
  780. rx_free_hash_table (tab->children[x], freefn, rules);
  781. rules->free_hash (tab->children[x], rules);
  782.       }
  783.     else
  784.       {
  785. struct rx_hash_item * them = tab->buckets[x];
  786. while (them)
  787.   {
  788.     struct rx_hash_item * that = them;
  789.     them = that->next_same_hash;
  790.     freefn (that);
  791.     rules->free_hash_item (that, rules);
  792.   }
  793.       }
  794. }
  795. /* Utilities for manipulating bitset represntations of characters sets. */
  796. #ifdef __STDC__
  797. RX_DECL rx_Bitset
  798. rx_cset (struct rx *rx)
  799. #else
  800. RX_DECL rx_Bitset
  801. rx_cset (rx)
  802.      struct rx *rx;
  803. #endif
  804. {
  805.   rx_Bitset b = (rx_Bitset) malloc (rx_sizeof_bitset (rx->local_cset_size));
  806.   if (b)
  807.     rx_bitset_null (rx->local_cset_size, b);
  808.   return b;
  809. }
  810. #ifdef __STDC__
  811. RX_DECL rx_Bitset
  812. rx_copy_cset (struct rx *rx, rx_Bitset a)
  813. #else
  814. RX_DECL rx_Bitset
  815. rx_copy_cset (rx, a)
  816.      struct rx *rx;
  817.      rx_Bitset a;
  818. #endif
  819. {
  820.   rx_Bitset cs = rx_cset (rx);
  821.   if (cs)
  822.     rx_bitset_union (rx->local_cset_size, cs, a);
  823.   return cs;
  824. }
  825. #ifdef __STDC__
  826. RX_DECL void
  827. rx_free_cset (struct rx * rx, rx_Bitset c)
  828. #else
  829. RX_DECL void
  830. rx_free_cset (rx, c)
  831.      struct rx * rx;
  832.      rx_Bitset c;
  833. #endif
  834. {
  835.   if (c)
  836.     free ((char *)c);
  837. }
  838. /* Hash table memory allocation policy for the regexp compiler */
  839. #ifdef __STDC__
  840. static struct rx_hash *
  841. compiler_hash_alloc (struct rx_hash_rules * rules)
  842. #else
  843. static struct rx_hash *
  844. compiler_hash_alloc (rules)
  845.      struct rx_hash_rules * rules;
  846. #endif
  847. {
  848.   return (struct rx_hash *)malloc (sizeof (struct rx_hash));
  849. }
  850. #ifdef __STDC__
  851. static struct rx_hash_item *
  852. compiler_hash_item_alloc (struct rx_hash_rules * rules, void * value)
  853. #else
  854. static struct rx_hash_item *
  855. compiler_hash_item_alloc (rules, value)
  856.      struct rx_hash_rules * rules;
  857.      void * value;
  858. #endif
  859. {
  860.   struct rx_hash_item * it;
  861.   it = (struct rx_hash_item *)malloc (sizeof (*it));
  862.   if (it)
  863.     {
  864.       it->data = value;
  865.       it->binding = 0;
  866.     }
  867.   return it;
  868. }
  869. #ifdef __STDC__
  870. static void
  871. compiler_free_hash (struct rx_hash * tab,
  872.     struct rx_hash_rules * rules)
  873. #else
  874. static void
  875. compiler_free_hash (tab, rules)
  876.      struct rx_hash * tab;
  877.      struct rx_hash_rules * rules;
  878. #endif
  879. {
  880.   free ((char *)tab);
  881. }
  882. #ifdef __STDC__
  883. static void
  884. compiler_free_hash_item (struct rx_hash_item * item,
  885.  struct rx_hash_rules * rules)
  886. #else
  887. static void
  888. compiler_free_hash_item (item, rules)
  889.      struct rx_hash_item * item;
  890.      struct rx_hash_rules * rules;
  891. #endif
  892. {
  893.   free ((char *)item);
  894. }
  895. /* This page: REXP_NODE (expression tree) structures. */
  896. #ifdef __STDC__
  897. RX_DECL struct rexp_node *
  898. rexp_node (struct rx *rx,
  899.    enum rexp_node_type type)
  900. #else
  901. RX_DECL struct rexp_node *
  902. rexp_node (rx, type)
  903.      struct rx *rx;
  904.      enum rexp_node_type type;
  905. #endif
  906. {
  907.   struct rexp_node *n;
  908.   n = (struct rexp_node *)malloc (sizeof (*n));
  909.   bzero (n, sizeof (*n));
  910.   if (n)
  911.     n->type = type;
  912.   return n;
  913. }
  914. /* free_rexp_node assumes that the bitset passed to rx_mk_r_cset
  915.  * can be freed using rx_free_cset.
  916.  */
  917. #ifdef __STDC__
  918. RX_DECL struct rexp_node *
  919. rx_mk_r_cset (struct rx * rx,
  920.       rx_Bitset b)
  921. #else
  922. RX_DECL struct rexp_node *
  923. rx_mk_r_cset (rx, b)
  924.      struct rx * rx;
  925.      rx_Bitset b;
  926. #endif
  927. {
  928.   struct rexp_node * n = rexp_node (rx, r_cset);
  929.   if (n)
  930.     n->params.cset = b;
  931.   return n;
  932. }
  933. #ifdef __STDC__
  934. RX_DECL struct rexp_node *
  935. rx_mk_r_concat (struct rx * rx,
  936. struct rexp_node * a,
  937. struct rexp_node * b)
  938. #else
  939. RX_DECL struct rexp_node *
  940. rx_mk_r_concat (rx, a, b)
  941.      struct rx * rx;
  942.      struct rexp_node * a;
  943.      struct rexp_node * b;
  944. #endif
  945. {
  946.   struct rexp_node * n = rexp_node (rx, r_concat);
  947.   if (n)
  948.     {
  949.       n->params.pair.left = a;
  950.       n->params.pair.right = b;
  951.     }
  952.   return n;
  953. }
  954. #ifdef __STDC__
  955. RX_DECL struct rexp_node *
  956. rx_mk_r_alternate (struct rx * rx,
  957.    struct rexp_node * a,
  958.    struct rexp_node * b)
  959. #else
  960. RX_DECL struct rexp_node *
  961. rx_mk_r_alternate (rx, a, b)
  962.      struct rx * rx;
  963.      struct rexp_node * a;
  964.      struct rexp_node * b;
  965. #endif
  966. {
  967.   struct rexp_node * n = rexp_node (rx, r_alternate);
  968.   if (n)
  969.     {
  970.       n->params.pair.left = a;
  971.       n->params.pair.right = b;
  972.     }
  973.   return n;
  974. }
  975. #ifdef __STDC__
  976. RX_DECL struct rexp_node *
  977. rx_mk_r_opt (struct rx * rx,
  978.      struct rexp_node * a)
  979. #else
  980. RX_DECL struct rexp_node *
  981. rx_mk_r_opt (rx, a)
  982.      struct rx * rx;
  983.      struct rexp_node * a;
  984. #endif
  985. {
  986.   struct rexp_node * n = rexp_node (rx, r_opt);
  987.   if (n)
  988.     {
  989.       n->params.pair.left = a;
  990.       n->params.pair.right = 0;
  991.     }
  992.   return n;
  993. }
  994. #ifdef __STDC__
  995. RX_DECL struct rexp_node *
  996. rx_mk_r_star (struct rx * rx,
  997.       struct rexp_node * a)
  998. #else
  999. RX_DECL struct rexp_node *
  1000. rx_mk_r_star (rx, a)
  1001.      struct rx * rx;
  1002.      struct rexp_node * a;
  1003. #endif
  1004. {
  1005.   struct rexp_node * n = rexp_node (rx, r_star);
  1006.   if (n)
  1007.     {
  1008.       n->params.pair.left = a;
  1009.       n->params.pair.right = 0;
  1010.     }
  1011.   return n;
  1012. }
  1013. #ifdef __STDC__
  1014. RX_DECL struct rexp_node *
  1015. rx_mk_r_2phase_star (struct rx * rx,
  1016.      struct rexp_node * a,
  1017.      struct rexp_node * b)
  1018. #else
  1019. RX_DECL struct rexp_node *
  1020. rx_mk_r_2phase_star (rx, a, b)
  1021.      struct rx * rx;
  1022.      struct rexp_node * a;
  1023.      struct rexp_node * b;
  1024. #endif
  1025. {
  1026.   struct rexp_node * n = rexp_node (rx, r_2phase_star);
  1027.   if (n)
  1028.     {
  1029.       n->params.pair.left = a;
  1030.       n->params.pair.right = b;
  1031.     }
  1032.   return n;
  1033. }
  1034. #ifdef __STDC__
  1035. RX_DECL struct rexp_node *
  1036. rx_mk_r_side_effect (struct rx * rx,
  1037.      rx_side_effect a)
  1038. #else
  1039. RX_DECL struct rexp_node *
  1040. rx_mk_r_side_effect (rx, a)
  1041.      struct rx * rx;
  1042.      rx_side_effect a;
  1043. #endif
  1044. {
  1045.   struct rexp_node * n = rexp_node (rx, r_side_effect);
  1046.   if (n)
  1047.     {
  1048.       n->params.side_effect = a;
  1049.       n->params.pair.right = 0;
  1050.     }
  1051.   return n;
  1052. }
  1053. #ifdef __STDC__
  1054. RX_DECL struct rexp_node *
  1055. rx_mk_r_data  (struct rx * rx,
  1056.        void * a)
  1057. #else
  1058. RX_DECL struct rexp_node *
  1059. rx_mk_r_data  (rx, a)
  1060.      struct rx * rx;
  1061.      void * a;
  1062. #endif
  1063. {
  1064.   struct rexp_node * n = rexp_node (rx, r_data);
  1065.   if (n)
  1066.     {
  1067.       n->params.pair.left = a;
  1068.       n->params.pair.right = 0;
  1069.     }
  1070.   return n;
  1071. }
  1072. #ifdef __STDC__
  1073. RX_DECL void
  1074. rx_free_rexp (struct rx * rx, struct rexp_node * node)
  1075. #else
  1076. RX_DECL void
  1077. rx_free_rexp (rx, node)
  1078.      struct rx * rx;
  1079.      struct rexp_node * node;
  1080. #endif
  1081. {
  1082.   if (node)
  1083.     {
  1084.       switch (node->type)
  1085. {
  1086. case r_cset:
  1087.   if (node->params.cset)
  1088.     rx_free_cset (rx, node->params.cset);
  1089. case r_side_effect:
  1090.   break;
  1091.   
  1092. case r_concat:
  1093. case r_alternate:
  1094. case r_2phase_star:
  1095. case r_opt:
  1096. case r_star:
  1097.   rx_free_rexp (rx, node->params.pair.left);
  1098.   rx_free_rexp (rx, node->params.pair.right);
  1099.   break;
  1100. case r_data:
  1101.   /* This shouldn't occur. */
  1102.   break;
  1103. }
  1104.       free ((char *)node);
  1105.     }
  1106. }
  1107. #ifdef __STDC__
  1108. RX_DECL struct rexp_node * 
  1109. rx_copy_rexp (struct rx *rx,
  1110.    struct rexp_node *node)
  1111. #else
  1112. RX_DECL struct rexp_node * 
  1113. rx_copy_rexp (rx, node)
  1114.      struct rx *rx;
  1115.      struct rexp_node *node;
  1116. #endif
  1117. {
  1118.   if (!node)
  1119.     return 0;
  1120.   else
  1121.     {
  1122.       struct rexp_node *n = rexp_node (rx, node->type);
  1123.       if (!n)
  1124. return 0;
  1125.       switch (node->type)
  1126. {
  1127. case r_cset:
  1128.   n->params.cset = rx_copy_cset (rx, node->params.cset);
  1129.   if (!n->params.cset)
  1130.     {
  1131.       rx_free_rexp (rx, n);
  1132.       return 0;
  1133.     }
  1134.   break;
  1135. case r_side_effect:
  1136.   n->params.side_effect = node->params.side_effect;
  1137.   break;
  1138. case r_concat:
  1139. case r_alternate:
  1140. case r_opt:
  1141. case r_2phase_star:
  1142. case r_star:
  1143.   n->params.pair.left =
  1144.     rx_copy_rexp (rx, node->params.pair.left);
  1145.   n->params.pair.right =
  1146.     rx_copy_rexp (rx, node->params.pair.right);
  1147.   if (   (node->params.pair.left && !n->params.pair.left)
  1148.       || (node->params.pair.right && !n->params.pair.right))
  1149.     {
  1150.       rx_free_rexp  (rx, n);
  1151.       return 0;
  1152.     }
  1153.   break;
  1154. case r_data:
  1155.   /* shouldn't happen */
  1156.   break;
  1157. }
  1158.       return n;
  1159.     }
  1160. }
  1161. /* This page: functions to build and destroy graphs that describe nfa's */
  1162. /* Constructs a new nfa node. */
  1163. #ifdef __STDC__
  1164. RX_DECL struct rx_nfa_state *
  1165. rx_nfa_state (struct rx *rx)
  1166. #else
  1167. RX_DECL struct rx_nfa_state *
  1168. rx_nfa_state (rx)
  1169.      struct rx *rx;
  1170. #endif
  1171. {
  1172.   struct rx_nfa_state * n = (struct rx_nfa_state *)malloc (sizeof (*n));
  1173.   if (!n)
  1174.     return 0;
  1175.   bzero (n, sizeof (*n));
  1176.   n->next = rx->nfa_states;
  1177.   rx->nfa_states = n;
  1178.   return n;
  1179. }
  1180. #ifdef __STDC__
  1181. RX_DECL void
  1182. rx_free_nfa_state (struct rx_nfa_state * n)
  1183. #else
  1184. RX_DECL void
  1185. rx_free_nfa_state (n)
  1186.   struct rx_nfa_state * n;
  1187. #endif
  1188. {
  1189.   free ((char *)n);
  1190. }
  1191. /* This looks up an nfa node, given a numeric id.  Numeric id's are
  1192.  * assigned after the nfa has been built.
  1193.  */
  1194. #ifdef __STDC__
  1195. RX_DECL struct rx_nfa_state * 
  1196. rx_id_to_nfa_state (struct rx * rx,
  1197.     int id)
  1198. #else
  1199. RX_DECL struct rx_nfa_state * 
  1200. rx_id_to_nfa_state (rx, id)
  1201.      struct rx * rx;
  1202.      int id;
  1203. #endif
  1204. {
  1205.   struct rx_nfa_state * n;
  1206.   for (n = rx->nfa_states; n; n = n->next)
  1207.     if (n->id == id)
  1208.       return n;
  1209.   return 0;
  1210. }
  1211. /* This adds an edge between two nodes, but doesn't initialize the 
  1212.  * edge label.
  1213.  */
  1214. #ifdef __STDC__
  1215. RX_DECL struct rx_nfa_edge * 
  1216. rx_nfa_edge (struct rx *rx,
  1217.      enum rx_nfa_etype type,
  1218.      struct rx_nfa_state *start,
  1219.      struct rx_nfa_state *dest)
  1220. #else
  1221. RX_DECL struct rx_nfa_edge * 
  1222. rx_nfa_edge (rx, type, start, dest)
  1223.      struct rx *rx;
  1224.      enum rx_nfa_etype type;
  1225.      struct rx_nfa_state *start;
  1226.      struct rx_nfa_state *dest;
  1227. #endif
  1228. {
  1229.   struct rx_nfa_edge *e;
  1230.   e = (struct rx_nfa_edge *)malloc (sizeof (*e));
  1231.   if (!e)
  1232.     return 0;
  1233.   e->next = start->edges;
  1234.   start->edges = e;
  1235.   e->type = type;
  1236.   e->dest = dest;
  1237.   return e;
  1238. }
  1239. #ifdef __STDC__
  1240. RX_DECL void
  1241. rx_free_nfa_edge (struct rx_nfa_edge * e)
  1242. #else
  1243. RX_DECL void
  1244. rx_free_nfa_edge (e)
  1245.      struct rx_nfa_edge * e;
  1246. #endif
  1247. {
  1248.   free ((char *)e);
  1249. }
  1250. /* This constructs a POSSIBLE_FUTURE, which is a kind epsilon-closure
  1251.  * of an NFA.  These are added to an nfa automaticly by eclose_nfa.
  1252.  */  
  1253. #ifdef __STDC__
  1254. static struct rx_possible_future * 
  1255. rx_possible_future (struct rx * rx,
  1256.  struct rx_se_list * effects)
  1257. #else
  1258. static struct rx_possible_future * 
  1259. rx_possible_future (rx, effects)
  1260.      struct rx * rx;
  1261.      struct rx_se_list * effects;
  1262. #endif
  1263. {
  1264.   struct rx_possible_future *ec;
  1265.   ec = (struct rx_possible_future *) malloc (sizeof (*ec));
  1266.   if (!ec)
  1267.     return 0;
  1268.   ec->destset = 0;
  1269.   ec->next = 0;
  1270.   ec->effects = effects;
  1271.   return ec;
  1272. }
  1273. #ifdef __STDC__
  1274. static void
  1275. rx_free_possible_future (struct rx_possible_future * pf)
  1276. #else
  1277. static void
  1278. rx_free_possible_future (pf)
  1279.      struct rx_possible_future * pf;
  1280. #endif
  1281. {
  1282.   free ((char *)pf);
  1283. }
  1284. #ifdef __STDC__
  1285. RX_DECL void
  1286. rx_free_nfa (struct rx *rx)
  1287. #else
  1288. RX_DECL void
  1289. rx_free_nfa (rx)
  1290.      struct rx *rx;
  1291. #endif
  1292. {
  1293.   while (rx->nfa_states)
  1294.     {
  1295.       while (rx->nfa_states->edges)
  1296. {
  1297.   switch (rx->nfa_states->edges->type)
  1298.     {
  1299.     case ne_cset:
  1300.       rx_free_cset (rx, rx->nfa_states->edges->params.cset);
  1301.       break;
  1302.     default:
  1303.       break;
  1304.     }
  1305.   {
  1306.     struct rx_nfa_edge * e;
  1307.     e = rx->nfa_states->edges;
  1308.     rx->nfa_states->edges = rx->nfa_states->edges->next;
  1309.     rx_free_nfa_edge (e);
  1310.   }
  1311. } /* while (rx->nfa_states->edges) */
  1312.       {
  1313. /* Iterate over the partial epsilon closures of rx->nfa_states */
  1314. struct rx_possible_future * pf = rx->nfa_states->futures;
  1315. while (pf)
  1316.   {
  1317.     struct rx_possible_future * pft = pf;
  1318.     pf = pf->next;
  1319.     rx_free_possible_future (pft);
  1320.   }
  1321.       }
  1322.       {
  1323. struct rx_nfa_state *n;
  1324. n = rx->nfa_states;
  1325. rx->nfa_states = rx->nfa_states->next;
  1326. rx_free_nfa_state (n);
  1327.       }
  1328.     }
  1329. }
  1330. /* This page: translating a pattern expression into an nfa and doing the 
  1331.  * static part of the nfa->super-nfa translation.
  1332.  */
  1333. /* This is the thompson regexp->nfa algorithm. 
  1334.  * It is modified to allow for `side-effect epsilons.'  Those are
  1335.  * edges that are taken whenever a similar epsilon edge would be,
  1336.  * but which imply that some side effect occurs when the edge 
  1337.  * is taken.
  1338.  *
  1339.  * Side effects are used to model parts of the pattern langauge 
  1340.  * that are not regular (in the formal sense).
  1341.  */
  1342. #ifdef __STDC__
  1343. RX_DECL int
  1344. rx_build_nfa (struct rx *rx,
  1345.       struct rexp_node *rexp,
  1346.       struct rx_nfa_state **start,
  1347.       struct rx_nfa_state **end)
  1348. #else
  1349. RX_DECL int
  1350. rx_build_nfa (rx, rexp, start, end)
  1351.      struct rx *rx;
  1352.      struct rexp_node *rexp;
  1353.      struct rx_nfa_state **start;
  1354.      struct rx_nfa_state **end;
  1355. #endif
  1356. {
  1357.   struct rx_nfa_edge *edge;
  1358.   /* Start & end nodes may have been allocated by the caller. */
  1359.   *start = *start ? *start : rx_nfa_state (rx);
  1360.   if (!*start)
  1361.     return 0;
  1362.   if (!rexp)
  1363.     {
  1364.       *end = *start;
  1365.       return 1;
  1366.     }
  1367.   *end = *end ? *end : rx_nfa_state (rx);
  1368.   if (!*end)
  1369.     {
  1370.       rx_free_nfa_state (*start);
  1371.       return 0;
  1372.     }
  1373.   switch (rexp->type)
  1374.     {
  1375.     case r_data:
  1376.       return 0;
  1377.     case r_cset:
  1378.       edge = rx_nfa_edge (rx, ne_cset, *start, *end);
  1379.       if (!edge)
  1380. return 0;
  1381.       edge->params.cset = rx_copy_cset (rx, rexp->params.cset);
  1382.       if (!edge->params.cset)
  1383. {
  1384.   rx_free_nfa_edge (edge);
  1385.   return 0;
  1386. }
  1387.       return 1;
  1388.  
  1389.     case r_opt:
  1390.       return (rx_build_nfa (rx, rexp->params.pair.left, start, end)
  1391.       && rx_nfa_edge (rx, ne_epsilon, *start, *end));
  1392.     case r_star:
  1393.       {
  1394. struct rx_nfa_state * star_start = 0;
  1395. struct rx_nfa_state * star_end = 0;
  1396. return (rx_build_nfa (rx, rexp->params.pair.left,
  1397.       &star_start, &star_end)
  1398. && star_start
  1399. && star_end
  1400. && rx_nfa_edge (rx, ne_epsilon, star_start, star_end)
  1401. && rx_nfa_edge (rx, ne_epsilon, *start, star_start)
  1402. && rx_nfa_edge (rx, ne_epsilon, star_end, *end)
  1403. && rx_nfa_edge (rx, ne_epsilon, star_end, star_start));
  1404.       }
  1405.     case r_2phase_star:
  1406.       {
  1407. struct rx_nfa_state * star_start = 0;
  1408. struct rx_nfa_state * star_end = 0;
  1409. struct rx_nfa_state * loop_exp_start = 0;
  1410. struct rx_nfa_state * loop_exp_end = 0;
  1411. return (rx_build_nfa (rx, rexp->params.pair.left,
  1412.       &star_start, &star_end)
  1413. && rx_build_nfa (rx, rexp->params.pair.right,
  1414.  &loop_exp_start, &loop_exp_end)
  1415. && star_start
  1416. && star_end
  1417. && loop_exp_end
  1418. && loop_exp_start
  1419. && rx_nfa_edge (rx, ne_epsilon, star_start, *end)
  1420. && rx_nfa_edge (rx, ne_epsilon, *start, star_start)
  1421. && rx_nfa_edge (rx, ne_epsilon, star_end, *end)
  1422. && rx_nfa_edge (rx, ne_epsilon, star_end, loop_exp_start)
  1423. && rx_nfa_edge (rx, ne_epsilon, loop_exp_end, star_start));
  1424.       }
  1425.     case r_concat:
  1426.       {
  1427. struct rx_nfa_state *shared = 0;
  1428. return
  1429.   (rx_build_nfa (rx, rexp->params.pair.left, start, &shared)
  1430.    && rx_build_nfa (rx, rexp->params.pair.right, &shared, end));
  1431.       }
  1432.     case r_alternate:
  1433.       {
  1434. struct rx_nfa_state *ls = 0;
  1435. struct rx_nfa_state *le = 0;
  1436. struct rx_nfa_state *rs = 0;
  1437. struct rx_nfa_state *re = 0;
  1438. return (rx_build_nfa (rx, rexp->params.pair.left, &ls, &le)
  1439. && rx_build_nfa (rx, rexp->params.pair.right, &rs, &re)
  1440. && rx_nfa_edge (rx, ne_epsilon, *start, ls)
  1441. && rx_nfa_edge (rx, ne_epsilon, *start, rs)
  1442. && rx_nfa_edge (rx, ne_epsilon, le, *end)
  1443. && rx_nfa_edge (rx, ne_epsilon, re, *end));
  1444.       }
  1445.     case r_side_effect:
  1446.       edge = rx_nfa_edge (rx, ne_side_effect, *start, *end);
  1447.       if (!edge)
  1448. return 0;
  1449.       edge->params.side_effect = rexp->params.side_effect;
  1450.       return 1;
  1451.     }
  1452.   /* this should never happen */
  1453.   return 0;
  1454. }
  1455. /* RX_NAME_NFA_STATES identifies all nodes with outgoing non-epsilon
  1456.  * transitions.  Only these nodes can occur in super-states.  
  1457.  * All nodes are given an integer id. 
  1458.  * The id is non-negative if the node has non-epsilon out-transitions, negative
  1459.  * otherwise (this is because we want the non-negative ids to be used as 
  1460.  * array indexes in a few places).
  1461.  */
  1462. #ifdef __STDC__
  1463. RX_DECL void
  1464. rx_name_nfa_states (struct rx *rx)
  1465. #else
  1466. RX_DECL void
  1467. rx_name_nfa_states (rx)
  1468.      struct rx *rx;
  1469. #endif
  1470. {
  1471.   struct rx_nfa_state *n = rx->nfa_states;
  1472.   rx->nodec = 0;
  1473.   rx->epsnodec = -1;
  1474.   while (n)
  1475.     {
  1476.       struct rx_nfa_edge *e = n->edges;
  1477.       if (n->is_start)
  1478. n->eclosure_needed = 1;
  1479.       while (e)
  1480. {
  1481.   switch (e->type)
  1482.     {
  1483.     case ne_epsilon:
  1484.     case ne_side_effect:
  1485.       break;
  1486.     case ne_cset:
  1487.       n->id = rx->nodec++;
  1488.       {
  1489. struct rx_nfa_edge *from_n = n->edges;
  1490. while (from_n)
  1491.   {
  1492.     from_n->dest->eclosure_needed = 1;
  1493.     from_n = from_n->next;
  1494.   }
  1495.       }
  1496.       goto cont;
  1497.     }
  1498.   e = e->next;
  1499. }
  1500.       n->id = rx->epsnodec--;
  1501.     cont:
  1502.       n = n->next;
  1503.     }
  1504.   rx->epsnodec = -rx->epsnodec;
  1505. }
  1506. /* This page: data structures for the static part of the nfa->supernfa
  1507.  * translation.
  1508.  *
  1509.  * There are side effect lists -- lists of side effects occuring
  1510.  * along an uninterrupted, acyclic path of side-effect epsilon edges.
  1511.  * Such paths are collapsed to single edges in the course of computing
  1512.  * epsilon closures.  Such single edges are labled with a list of all
  1513.  * the side effects entailed in crossing them.  Like lists of side
  1514.  * effects are made == by the constructors below.
  1515.  *
  1516.  * There are also nfa state sets.  These are used to hold a list of all
  1517.  * states reachable from a starting state for a given type of transition
  1518.  * and side effect list.   These are also hash-consed.
  1519.  */
  1520. /* The next several functions compare, construct, etc. lists of side
  1521.  * effects.  See ECLOSE_NFA (below) for details.
  1522.  */
  1523. /* Ordering of rx_se_list
  1524.  * (-1, 0, 1 return value convention).
  1525.  */
  1526. #ifdef __STDC__
  1527. static int 
  1528. se_list_cmp (void * va, void * vb)
  1529. #else
  1530. static int 
  1531. se_list_cmp (va, vb)
  1532.      void * va;
  1533.      void * vb;
  1534. #endif
  1535. {
  1536.   struct rx_se_list * a = (struct rx_se_list *)va;
  1537.   struct rx_se_list * b = (struct rx_se_list *)vb;
  1538.   return ((va == vb)
  1539.   ? 0
  1540.   : (!va
  1541.      ? -1
  1542.      : (!vb
  1543. ? 1
  1544. : ((long)a->car < (long)b->car
  1545.    ? 1
  1546.    : ((long)a->car > (long)b->car
  1547.       ? -1
  1548.       : se_list_cmp ((void *)a->cdr, (void *)b->cdr))))));
  1549. }
  1550. #ifdef __STDC__
  1551. static int 
  1552. se_list_equal (void * va, void * vb)
  1553. #else
  1554. static int 
  1555. se_list_equal (va, vb)
  1556.      void * va;
  1557.      void * vb;
  1558. #endif
  1559. {
  1560.   return !(se_list_cmp (va, vb));
  1561. }
  1562. static struct rx_hash_rules se_list_hash_rules =
  1563. {
  1564.   se_list_equal,
  1565.   compiler_hash_alloc,
  1566.   compiler_free_hash,
  1567.   compiler_hash_item_alloc,
  1568.   compiler_free_hash_item
  1569. };
  1570. #ifdef __STDC__
  1571. static struct rx_se_list * 
  1572. side_effect_cons (struct rx * rx,
  1573.   void * se, struct rx_se_list * list)
  1574. #else
  1575. static struct rx_se_list * 
  1576. side_effect_cons (rx, se, list)
  1577.      struct rx * rx;
  1578.      void * se;
  1579.      struct rx_se_list * list;
  1580. #endif
  1581. {
  1582.   struct rx_se_list * l;
  1583.   l = ((struct rx_se_list *) malloc (sizeof (*l)));
  1584.   if (!l)
  1585.     return 0;
  1586.   l->car = se;
  1587.   l->cdr = list;
  1588.   return l;
  1589. }
  1590. #ifdef __STDC__
  1591. static struct rx_se_list *
  1592. hash_cons_se_prog (struct rx * rx,
  1593.    struct rx_hash * memo,
  1594.    void * car, struct rx_se_list * cdr)
  1595. #else
  1596. static struct rx_se_list *
  1597. hash_cons_se_prog (rx, memo, car, cdr)
  1598.      struct rx * rx;
  1599.      struct rx_hash * memo;
  1600.      void * car;
  1601.      struct rx_se_list * cdr;
  1602. #endif
  1603. {
  1604.   long hash = (long)car ^ (long)cdr;
  1605.   struct rx_se_list template;
  1606.   template.car = car;
  1607.   template.cdr = cdr;
  1608.   {
  1609.     struct rx_hash_item * it = rx_hash_store (memo, hash,
  1610.       (void *)&template,
  1611.       &se_list_hash_rules);
  1612.     if (!it)
  1613.       return 0;
  1614.     if (it->data == (void *)&template)
  1615.       {
  1616. struct rx_se_list * consed;
  1617. consed = (struct rx_se_list *) malloc (sizeof (*consed));
  1618. *consed = template;
  1619. it->data = (void *)consed;
  1620.       }
  1621.     return (struct rx_se_list *)it->data;
  1622.   }
  1623. }
  1624.      
  1625. #ifdef __STDC__
  1626. static struct rx_se_list *
  1627. hash_se_prog (struct rx * rx, struct rx_hash * memo, struct rx_se_list * prog)
  1628. #else
  1629. static struct rx_se_list *
  1630. hash_se_prog (rx, memo, prog)
  1631.      struct rx * rx;
  1632.      struct rx_hash * memo;
  1633.      struct rx_se_list * prog;
  1634. #endif
  1635. {
  1636.   struct rx_se_list * answer = 0;
  1637.   while (prog)
  1638.     {
  1639.       answer = hash_cons_se_prog (rx, memo, prog->car, answer);
  1640.       if (!answer)
  1641. return 0;
  1642.       prog = prog->cdr;
  1643.     }
  1644.   return answer;
  1645. }
  1646. #ifdef __STDC__
  1647. static int 
  1648. nfa_set_cmp (void * va, void * vb)
  1649. #else
  1650. static int 
  1651. nfa_set_cmp (va, vb)
  1652.      void * va;
  1653.      void * vb;
  1654. #endif
  1655. {
  1656.   struct rx_nfa_state_set * a = (struct rx_nfa_state_set *)va;
  1657.   struct rx_nfa_state_set * b = (struct rx_nfa_state_set *)vb;
  1658.   return ((va == vb)
  1659.   ? 0
  1660.   : (!va
  1661.      ? -1
  1662.      : (!vb
  1663. ? 1
  1664. : (a->car->id < b->car->id
  1665.    ? 1
  1666.    : (a->car->id > b->car->id
  1667.       ? -1
  1668.       : nfa_set_cmp ((void *)a->cdr, (void *)b->cdr))))));
  1669. }
  1670. #ifdef __STDC__
  1671. static int 
  1672. nfa_set_equal (void * va, void * vb)
  1673. #else
  1674. static int 
  1675. nfa_set_equal (va, vb)
  1676.      void * va;
  1677.      void * vb;
  1678. #endif
  1679. {
  1680.   return !nfa_set_cmp (va, vb);
  1681. }
  1682. static struct rx_hash_rules nfa_set_hash_rules =
  1683. {
  1684.   nfa_set_equal,
  1685.   compiler_hash_alloc,
  1686.   compiler_free_hash,
  1687.   compiler_hash_item_alloc,
  1688.   compiler_free_hash_item
  1689. };
  1690. #ifdef __STDC__
  1691. static struct rx_nfa_state_set * 
  1692. nfa_set_cons (struct rx * rx,
  1693.       struct rx_hash * memo, struct rx_nfa_state * state,
  1694.       struct rx_nfa_state_set * set)
  1695. #else
  1696. static struct rx_nfa_state_set * 
  1697. nfa_set_cons (rx, memo, state, set)
  1698.      struct rx * rx;
  1699.      struct rx_hash * memo;
  1700.      struct rx_nfa_state * state;
  1701.      struct rx_nfa_state_set * set;
  1702. #endif
  1703. {
  1704.   struct rx_nfa_state_set template;
  1705.   struct rx_hash_item * node;
  1706.   template.car = state;
  1707.   template.cdr = set;
  1708.   node = rx_hash_store (memo,
  1709. (((long)state) >> 8) ^ (long)set,
  1710. &template, &nfa_set_hash_rules);
  1711.   if (!node)
  1712.     return 0;
  1713.   if (node->data == &template)
  1714.     {
  1715.       struct rx_nfa_state_set * l;
  1716.       l = (struct rx_nfa_state_set *) malloc (sizeof (*l));
  1717.       node->data = (void *) l;
  1718.       if (!l)
  1719. return 0;
  1720.       *l = template;
  1721.     }
  1722.   return (struct rx_nfa_state_set *)node->data;
  1723. }
  1724. #ifdef __STDC__
  1725. static struct rx_nfa_state_set * 
  1726. nfa_set_enjoin (struct rx * rx,
  1727. struct rx_hash * memo, struct rx_nfa_state * state,
  1728. struct rx_nfa_state_set * set)
  1729. #else
  1730. static struct rx_nfa_state_set * 
  1731. nfa_set_enjoin (rx, memo, state, set)
  1732.      struct rx * rx;
  1733.      struct rx_hash * memo;
  1734.      struct rx_nfa_state * state;
  1735.      struct rx_nfa_state_set * set;
  1736. #endif
  1737. {
  1738.   if (!set || state->id < set->car->id)
  1739.     return nfa_set_cons (rx, memo, state, set);
  1740.   if (state->id == set->car->id)
  1741.     return set;
  1742.   else
  1743.     {
  1744.       struct rx_nfa_state_set * newcdr
  1745. = nfa_set_enjoin (rx, memo, state, set->cdr);
  1746.       if (newcdr != set->cdr)
  1747. set = nfa_set_cons (rx, memo, set->car, newcdr);
  1748.       return set;
  1749.     }
  1750. }
  1751. /* This page: computing epsilon closures.  The closures aren't total.
  1752.  * Each node's closures are partitioned according to the side effects entailed
  1753.  * along the epsilon edges.  Return true on success.
  1754.  */ 
  1755. struct eclose_frame
  1756. {
  1757.   struct rx_se_list *prog_backwards;
  1758. };
  1759. #ifdef __STDC__
  1760. static int 
  1761. eclose_node (struct rx *rx, struct rx_nfa_state *outnode,
  1762.      struct rx_nfa_state *node, struct eclose_frame *frame)
  1763. #else
  1764. static int 
  1765. eclose_node (rx, outnode, node, frame)
  1766.      struct rx *rx;
  1767.      struct rx_nfa_state *outnode;
  1768.      struct rx_nfa_state *node;
  1769.      struct eclose_frame *frame;
  1770. #endif
  1771. {
  1772.   struct rx_nfa_edge *e = node->edges;
  1773.   /* For each node, we follow all epsilon paths to build the closure.
  1774.    * The closure omits nodes that have only epsilon edges.
  1775.    * The closure is split into partial closures -- all the states in
  1776.    * a partial closure are reached by crossing the same list of
  1777.    * of side effects (though not necessarily the same path).
  1778.    */
  1779.   if (node->mark)
  1780.     return 1;
  1781.   node->mark = 1;
  1782.   if (node->id >= 0 || node->is_final)
  1783.     {
  1784.       struct rx_possible_future **ec;
  1785.       struct rx_se_list * prog_in_order
  1786. = ((struct rx_se_list *)hash_se_prog (rx,
  1787.       &rx->se_list_memo,
  1788.       frame->prog_backwards));
  1789.       int cmp;
  1790.       ec = &outnode->futures;
  1791.       while (*ec)
  1792. {
  1793.   cmp = se_list_cmp ((void *)(*ec)->effects, (void *)prog_in_order);
  1794.   if (cmp <= 0)
  1795.     break;
  1796.   ec = &(*ec)->next;
  1797. }
  1798.       if (!*ec || (cmp < 0))
  1799. {
  1800.   struct rx_possible_future * saved = *ec;
  1801.   *ec = rx_possible_future (rx, prog_in_order);
  1802.   (*ec)->next = saved;
  1803.   if (!*ec)
  1804.     return 0;
  1805. }
  1806.       if (node->id >= 0)
  1807. {
  1808.   (*ec)->destset = nfa_set_enjoin (rx, &rx->set_list_memo,
  1809.    node, (*ec)->destset);
  1810.   if (!(*ec)->destset)
  1811.     return 0;
  1812. }
  1813.     }
  1814.   while (e)
  1815.     {
  1816.       switch (e->type)
  1817. {
  1818. case ne_epsilon:
  1819.   if (!eclose_node (rx, outnode, e->dest, frame))
  1820.     return 0;
  1821.   break;
  1822. case ne_side_effect:
  1823.   {
  1824.     frame->prog_backwards = side_effect_cons (rx, 
  1825.       e->params.side_effect,
  1826.       frame->prog_backwards);
  1827.     if (!frame->prog_backwards)
  1828.       return 0;
  1829.     if (!eclose_node (rx, outnode, e->dest, frame))
  1830.       return 0;
  1831.     {
  1832.       struct rx_se_list * dying = frame->prog_backwards;
  1833.       frame->prog_backwards = frame->prog_backwards->cdr;
  1834.       free ((char *)dying);
  1835.     }
  1836.     break;
  1837.   }
  1838. default:
  1839.   break;
  1840. }
  1841.       e = e->next;
  1842.     }
  1843.   node->mark = 0;
  1844.   return 1;
  1845. }
  1846. #ifdef __STDC__
  1847. RX_DECL int 
  1848. rx_eclose_nfa (struct rx *rx)
  1849. #else
  1850. RX_DECL int 
  1851. rx_eclose_nfa (rx)
  1852.      struct rx *rx;
  1853. #endif
  1854. {
  1855.   struct rx_nfa_state *n = rx->nfa_states;
  1856.   struct eclose_frame frame;
  1857.   static int rx_id = 0;
  1858.   
  1859.   frame.prog_backwards = 0;
  1860.   rx->rx_id = rx_id++;
  1861.   bzero (&rx->se_list_memo, sizeof (rx->se_list_memo));
  1862.   bzero (&rx->set_list_memo, sizeof (rx->set_list_memo));
  1863.   while (n)
  1864.     {
  1865.       n->futures = 0;
  1866.       if (n->eclosure_needed && !eclose_node (rx, n, n, &frame))
  1867. return 0;
  1868.       /* clear_marks (rx); */
  1869.       n = n->next;
  1870.     }
  1871.   return 1;
  1872. }
  1873. /* This deletes epsilon edges from an NFA.  After running eclose_node,
  1874.  * we have no more need for these edges.  They are removed to simplify
  1875.  * further operations on the NFA.
  1876.  */
  1877. #ifdef __STDC__
  1878. RX_DECL void 
  1879. rx_delete_epsilon_transitions (struct rx *rx)
  1880. #else
  1881. RX_DECL void 
  1882. rx_delete_epsilon_transitions (rx)
  1883.      struct rx *rx;
  1884. #endif
  1885. {
  1886.   struct rx_nfa_state *n = rx->nfa_states;
  1887.   struct rx_nfa_edge **e;
  1888.   while (n)
  1889.     {
  1890.       e = &n->edges;
  1891.       while (*e)
  1892. {
  1893.   struct rx_nfa_edge *t;
  1894.   switch ((*e)->type)
  1895.     {
  1896.     case ne_epsilon:
  1897.     case ne_side_effect:
  1898.       t = *e;
  1899.       *e = t->next;
  1900.       rx_free_nfa_edge (t);
  1901.       break;
  1902.     default:
  1903.       e = &(*e)->next;
  1904.       break;
  1905.     }
  1906. }
  1907.       n = n->next;
  1908.     }
  1909. }
  1910. /* This page: storing the nfa in a contiguous region of memory for
  1911.  * subsequent conversion to a super-nfa.
  1912.  */
  1913. /* This is for qsort on an array of nfa_states. The order
  1914.  * is based on state ids and goes 
  1915.  * [0...MAX][MIN..-1] where (MAX>=0) and (MIN<0)
  1916.  * This way, positive ids double as array indices.
  1917.  */
  1918. #ifdef __STDC__
  1919. static int 
  1920. nfacmp (void * va, void * vb)
  1921. #else
  1922. static int 
  1923. nfacmp (va, vb)
  1924.      void * va;
  1925.      void * vb;
  1926. #endif
  1927. {
  1928.   struct rx_nfa_state **a = (struct rx_nfa_state **)va;
  1929.   struct rx_nfa_state **b = (struct rx_nfa_state **)vb;
  1930.   return (*a == *b /* &&&& 3.18 */
  1931.   ? 0
  1932.   : (((*a)->id < 0) == ((*b)->id < 0)
  1933.      ? (((*a)->id  < (*b)->id) ? -1 : 1)
  1934.      : (((*a)->id < 0)
  1935. ? 1 : -1)));
  1936. }
  1937. #ifdef __STDC__
  1938. static int 
  1939. count_hash_nodes (struct rx_hash * st)
  1940. #else
  1941. static int 
  1942. count_hash_nodes (st)
  1943.      struct rx_hash * st;
  1944. #endif
  1945. {
  1946.   int x;
  1947.   int count = 0;
  1948.   for (x = 0; x < 13; ++x)
  1949.     count += ((st->children[x])
  1950.       ? count_hash_nodes (st->children[x])
  1951.       : st->bucket_size[x]);
  1952.   
  1953.   return count;
  1954. }
  1955. #ifdef __STDC__
  1956. static void 
  1957. se_memo_freer (struct rx_hash_item * node)
  1958. #else
  1959. static void 
  1960. se_memo_freer (node)
  1961.      struct rx_hash_item * node;
  1962. #endif
  1963. {
  1964.   free ((char *)node->data);
  1965. }
  1966. #ifdef __STDC__
  1967. static void 
  1968. nfa_set_freer (struct rx_hash_item * node)
  1969. #else
  1970. static void 
  1971. nfa_set_freer (node)
  1972.      struct rx_hash_item * node;
  1973. #endif
  1974. {
  1975.   free ((char *)node->data);
  1976. }
  1977. /* This copies an entire NFA into a single malloced block of memory.
  1978.  * Mostly this is for compatability with regex.c, though it is convenient
  1979.  * to have the nfa nodes in an array.
  1980.  */
  1981. #ifdef __STDC__
  1982. RX_DECL int 
  1983. rx_compactify_nfa (struct rx *rx,
  1984.    void **mem, unsigned long *size)
  1985. #else
  1986. RX_DECL int 
  1987. rx_compactify_nfa (rx, mem, size)
  1988.      struct rx *rx;
  1989.      void **mem;
  1990.      unsigned long *size;
  1991. #endif
  1992. {
  1993.   int total_nodec;
  1994.   struct rx_nfa_state *n;
  1995.   int edgec = 0;
  1996.   int eclosec = 0;
  1997.   int se_list_consc = count_hash_nodes (&rx->se_list_memo);
  1998.   int nfa_setc = count_hash_nodes (&rx->set_list_memo);
  1999.   unsigned long total_size;
  2000.   /* This takes place in two stages.   First, the total size of the
  2001.    * nfa is computed, then structures are copied.  
  2002.    */   
  2003.   n = rx->nfa_states;
  2004.   total_nodec = 0;
  2005.   while (n)
  2006.     {
  2007.       struct rx_nfa_edge *e = n->edges;
  2008.       struct rx_possible_future *ec = n->futures;
  2009.       ++total_nodec;
  2010.       while (e)
  2011. {
  2012.   ++edgec;
  2013.   e = e->next;
  2014. }
  2015.       while (ec)
  2016. {
  2017.   ++eclosec;
  2018.   ec = ec->next;
  2019. }
  2020.       n = n->next;
  2021.     }
  2022.   total_size = (total_nodec * sizeof (struct rx_nfa_state)
  2023. + edgec * rx_sizeof_bitset (rx->local_cset_size)
  2024. + edgec * sizeof (struct rx_nfa_edge)
  2025. + nfa_setc * sizeof (struct rx_nfa_state_set)
  2026. + eclosec * sizeof (struct rx_possible_future)
  2027. + se_list_consc * sizeof (struct rx_se_list)
  2028. + rx->reserved);
  2029.   if (total_size > *size)
  2030.     {
  2031.       *mem = remalloc (*mem, total_size);
  2032.       if (*mem)
  2033. *size = total_size;
  2034.       else
  2035. return 0;
  2036.     }
  2037.   /* Now we've allocated the memory; this copies the NFA. */
  2038.   {
  2039.     static struct rx_nfa_state **scratch = 0;
  2040.     static int scratch_alloc = 0;
  2041.     struct rx_nfa_state *state_base = (struct rx_nfa_state *) * mem;
  2042.     struct rx_nfa_state *new_state = state_base;
  2043.     struct rx_nfa_edge *new_edge =
  2044.       (struct rx_nfa_edge *)
  2045. ((char *) state_base + total_nodec * sizeof (struct rx_nfa_state));
  2046.     struct rx_se_list * new_se_list =
  2047.       (struct rx_se_list *)
  2048. ((char *)new_edge + edgec * sizeof (struct rx_nfa_edge));
  2049.     struct rx_possible_future *new_close =
  2050.       ((struct rx_possible_future *)
  2051.        ((char *) new_se_list
  2052. + se_list_consc * sizeof (struct rx_se_list)));
  2053.     struct rx_nfa_state_set * new_nfa_set =
  2054.       ((struct rx_nfa_state_set *)
  2055.        ((char *)new_close + eclosec * sizeof (struct rx_possible_future)));
  2056.     char *new_bitset =
  2057.       ((char *) new_nfa_set + nfa_setc * sizeof (struct rx_nfa_state_set));
  2058.     int x;
  2059.     struct rx_nfa_state *n;
  2060.     if (scratch_alloc < total_nodec)
  2061.       {
  2062. scratch = ((struct rx_nfa_state **)
  2063.    remalloc (scratch, total_nodec * sizeof (*scratch)));
  2064. if (scratch)
  2065.   scratch_alloc = total_nodec;
  2066. else
  2067.   {
  2068.     scratch_alloc = 0;
  2069.     return 0;
  2070.   }
  2071.       }
  2072.     for (x = 0, n = rx->nfa_states; n; n = n->next)
  2073.       scratch[x++] = n;
  2074.     qsort (scratch, total_nodec,
  2075.    sizeof (struct rx_nfa_state *), (int (*)())nfacmp);
  2076.     for (x = 0; x < total_nodec; ++x)
  2077.       {
  2078. struct rx_possible_future *eclose = scratch[x]->futures;
  2079. struct rx_nfa_edge *edge = scratch[x]->edges;
  2080. struct rx_nfa_state *cn = new_state++;
  2081. cn->futures = 0;
  2082. cn->edges = 0;
  2083. cn->next = (x == total_nodec - 1) ? 0 : (cn + 1);
  2084. cn->id = scratch[x]->id;
  2085. cn->is_final = scratch[x]->is_final;
  2086. cn->is_start = scratch[x]->is_start;
  2087. cn->mark = 0;
  2088. while (edge)
  2089.   {
  2090.     int indx = (edge->dest->id < 0
  2091.  ? (total_nodec + edge->dest->id)
  2092.  : edge->dest->id);
  2093.     struct rx_nfa_edge *e = new_edge++;
  2094.     rx_Bitset cset = (rx_Bitset) new_bitset;
  2095.     new_bitset += rx_sizeof_bitset (rx->local_cset_size);
  2096.     rx_bitset_null (rx->local_cset_size, cset);
  2097.     rx_bitset_union (rx->local_cset_size, cset, edge->params.cset);
  2098.     e->next = cn->edges;
  2099.     cn->edges = e;
  2100.     e->type = edge->type;
  2101.     e->dest = state_base + indx;
  2102.     e->params.cset = cset;
  2103.     edge = edge->next;
  2104.   }
  2105. while (eclose)
  2106.   {
  2107.     struct rx_possible_future *ec = new_close++;
  2108.     struct rx_hash_item * sp;
  2109.     struct rx_se_list ** sepos;
  2110.     struct rx_se_list * sesrc;
  2111.     struct rx_nfa_state_set * destlst;
  2112.     struct rx_nfa_state_set ** destpos;
  2113.     ec->next = cn->futures;
  2114.     cn->futures = ec;
  2115.     for (sepos = &ec->effects, sesrc = eclose->effects;
  2116.  sesrc;
  2117.  sesrc = sesrc->cdr, sepos = &(*sepos)->cdr)
  2118.       {
  2119. sp = rx_hash_find (&rx->se_list_memo,
  2120.    (long)sesrc->car ^ (long)sesrc->cdr,
  2121.    sesrc, &se_list_hash_rules);
  2122. if (sp->binding)
  2123.   {
  2124.     sesrc = (struct rx_se_list *)sp->binding;
  2125.     break;
  2126.   }
  2127. *new_se_list = *sesrc;
  2128. sp->binding = (void *)new_se_list;
  2129. *sepos = new_se_list;
  2130. ++new_se_list;
  2131.       }
  2132.     *sepos = sesrc;
  2133.     for (destpos = &ec->destset, destlst = eclose->destset;
  2134.  destlst;
  2135.  destpos = &(*destpos)->cdr, destlst = destlst->cdr)
  2136.       {
  2137. sp = rx_hash_find (&rx->set_list_memo,
  2138.    ((((long)destlst->car) >> 8)
  2139.     ^ (long)destlst->cdr),
  2140.    destlst, &nfa_set_hash_rules);
  2141. if (sp->binding)
  2142.   {
  2143.     destlst = (struct rx_nfa_state_set *)sp->binding;
  2144.     break;
  2145.   }
  2146. *new_nfa_set = *destlst;
  2147. new_nfa_set->car = state_base + destlst->car->id;
  2148. sp->binding = (void *)new_nfa_set;
  2149. *destpos = new_nfa_set;
  2150. ++new_nfa_set;
  2151.       }
  2152.     *destpos = destlst;
  2153.     eclose = eclose->next;
  2154.   }
  2155.       }
  2156.   }
  2157.   rx_free_hash_table (&rx->se_list_memo, se_memo_freer, &se_list_hash_rules);
  2158.   bzero (&rx->se_list_memo, sizeof (rx->se_list_memo));
  2159.   rx_free_hash_table (&rx->set_list_memo, nfa_set_freer, &nfa_set_hash_rules);
  2160.   bzero (&rx->set_list_memo, sizeof (rx->set_list_memo));
  2161.   rx_free_nfa (rx);
  2162.   rx->nfa_states = (struct rx_nfa_state *)*mem;
  2163.   return 1;
  2164. }
  2165. /* The functions in the next several pages define the lazy-NFA-conversion used
  2166.  * by matchers.  The input to this construction is an NFA such as 
  2167.  * is built by compactify_nfa (rx.c).  The output is the superNFA.
  2168.  */
  2169. /* Match engines can use arbitrary values for opcodes.  So, the parse tree 
  2170.  * is built using instructions names (enum rx_opcode), but the superstate
  2171.  * nfa is populated with mystery opcodes (void *).
  2172.  *
  2173.  * For convenience, here is an id table.  The opcodes are == to their inxs
  2174.  *
  2175.  * The lables in re_search_2 would make good values for instructions.
  2176.  */
  2177. void * rx_id_instruction_table[rx_num_instructions] =
  2178. {
  2179.   (void *) rx_backtrack_point,
  2180.   (void *) rx_do_side_effects,
  2181.   (void *) rx_cache_miss,
  2182.   (void *) rx_next_char,
  2183.   (void *) rx_backtrack,
  2184.   (void *) rx_error_inx
  2185. };
  2186. /* Memory mgt. for superstate graphs. */
  2187. #ifdef __STDC__
  2188. static char *
  2189. rx_cache_malloc (struct rx_cache * cache, int bytes)
  2190. #else
  2191. static char *
  2192. rx_cache_malloc (cache, bytes)
  2193.      struct rx_cache * cache;
  2194.      int bytes;
  2195. #endif
  2196. {
  2197.   while (cache->bytes_left < bytes)
  2198.     {
  2199.       if (cache->memory_pos)
  2200. cache->memory_pos = cache->memory_pos->next;
  2201.       if (!cache->memory_pos)
  2202. {
  2203.   cache->morecore (cache);
  2204.   if (!cache->memory_pos)
  2205.     return 0;
  2206. }
  2207.       cache->bytes_left = cache->memory_pos->bytes;
  2208.       cache->memory_addr = ((char *)cache->memory_pos
  2209.     + sizeof (struct rx_blocklist));
  2210.     }
  2211.   cache->bytes_left -= bytes;
  2212.   {
  2213.     char * addr = cache->memory_addr;
  2214.     cache->memory_addr += bytes;
  2215.     return addr;
  2216.   }
  2217. }
  2218. #ifdef __STDC__
  2219. static void
  2220. rx_cache_free (struct rx_cache * cache,
  2221.        struct rx_freelist ** freelist, char * mem)
  2222. #else
  2223. static void
  2224. rx_cache_free (cache, freelist, mem)
  2225.      struct rx_cache * cache;
  2226.      struct rx_freelist ** freelist;
  2227.      char * mem;
  2228. #endif
  2229. {
  2230.   struct rx_freelist * it = (struct rx_freelist *)mem;
  2231.   it->next = *freelist;
  2232.   *freelist = it;
  2233. }
  2234. /* The partially instantiated superstate graph has a transition 
  2235.  * table at every node.  There is one entry for every character.
  2236.  * This fills in the transition for a set.
  2237.  */
  2238. #ifdef __STDC__
  2239. static void 
  2240. install_transition (struct rx_superstate *super,
  2241.     struct rx_inx *answer, rx_Bitset trcset) 
  2242. #else
  2243. static void 
  2244. install_transition (super, answer, trcset)
  2245.      struct rx_superstate *super;
  2246.      struct rx_inx *answer;
  2247.      rx_Bitset trcset;
  2248. #endif
  2249. {
  2250.   struct rx_inx * transitions = super->transitions;
  2251.   int chr;
  2252.   for (chr = 0; chr < 256; )
  2253.     if (!*trcset)
  2254.       {
  2255. ++trcset;
  2256. chr += 32;
  2257.       }
  2258.     else
  2259.       {
  2260. RX_subset sub = *trcset;
  2261. RX_subset mask = 1;
  2262. int bound = chr + 32;
  2263. while (chr < bound)
  2264.   {
  2265.     if (sub & mask)
  2266.       transitions [chr] = *answer;
  2267.     ++chr;
  2268.     mask <<= 1;
  2269.   }
  2270. ++trcset;
  2271.       }
  2272. }
  2273. #ifdef __STDC__
  2274. static int
  2275. qlen (struct rx_superstate * q)
  2276. #else
  2277. static int
  2278. qlen (q)
  2279.      struct rx_superstate * q;
  2280. #endif
  2281. {
  2282.   int count = 1;
  2283.   struct rx_superstate * it;
  2284.   if (!q)
  2285.     return 0;
  2286.   for (it = q->next_recyclable; it != q; it = it->next_recyclable)
  2287.     ++count;
  2288.   return count;
  2289. }
  2290. #ifdef __STDC__
  2291. static void
  2292. check_cache (struct rx_cache * cache)
  2293. #else
  2294. static void
  2295. check_cache (cache)
  2296.      struct rx_cache * cache;
  2297. #endif
  2298. {
  2299.   struct rx_cache * you_fucked_up = 0;
  2300.   int total = cache->superstates;
  2301.   int semi = cache->semifree_superstates;
  2302.   if (semi != qlen (cache->semifree_superstate))
  2303.     check_cache (you_fucked_up);
  2304.   if ((total - semi) != qlen (cache->lru_superstate))
  2305.     check_cache (you_fucked_up);
  2306. }
  2307. /* When a superstate is old and neglected, it can enter a 
  2308.  * semi-free state.  A semi-free state is slated to die.
  2309.  * Incoming transitions to a semi-free state are re-written
  2310.  * to cause an (interpreted) fault when they are taken.
  2311.  * The fault handler revives the semi-free state, patches
  2312.  * incoming transitions back to normal, and continues.
  2313.  *
  2314.  * The idea is basicly to free in two stages, aborting 
  2315.  * between the two if the state turns out to be useful again.
  2316.  * When a free is aborted, the rescued superstate is placed
  2317.  * in the most-favored slot to maximize the time until it
  2318.  * is next semi-freed.
  2319.  */
  2320. #ifdef __STDC__
  2321. static void
  2322. semifree_superstate (struct rx_cache * cache)
  2323. #else
  2324. static void
  2325. semifree_superstate (cache)
  2326.      struct rx_cache * cache;
  2327. #endif
  2328. {
  2329.   int disqualified = cache->semifree_superstates;
  2330.   if (disqualified == cache->superstates)
  2331.     return;
  2332.   while (cache->lru_superstate->locks)
  2333.     {
  2334.       cache->lru_superstate = cache->lru_superstate->next_recyclable;
  2335.       ++disqualified;
  2336.       if (disqualified == cache->superstates)
  2337. return;
  2338.     }
  2339.   {
  2340.     struct rx_superstate * it = cache->lru_superstate;
  2341.     it->next_recyclable->prev_recyclable = it->prev_recyclable;
  2342.     it->prev_recyclable->next_recyclable = it->next_recyclable;
  2343.     cache->lru_superstate = (it == it->next_recyclable
  2344.      ? 0
  2345.      : it->next_recyclable);
  2346.     if (!cache->semifree_superstate)
  2347.       {
  2348. cache->semifree_superstate = it;
  2349. it->next_recyclable = it;
  2350. it->prev_recyclable = it;
  2351.       }
  2352.     else
  2353.       {
  2354. it->prev_recyclable = cache->semifree_superstate->prev_recyclable;
  2355. it->next_recyclable = cache->semifree_superstate;
  2356. it->prev_recyclable->next_recyclable = it;
  2357. it->next_recyclable->prev_recyclable = it;
  2358.       }
  2359.     {
  2360.       struct rx_distinct_future *df;
  2361.       it->is_semifree = 1;
  2362.       ++cache->semifree_superstates;
  2363.       df = it->transition_refs;
  2364.       if (df)
  2365. {
  2366.   df->prev_same_dest->next_same_dest = 0;
  2367.   for (df = it->transition_refs; df; df = df->next_same_dest)
  2368.     {
  2369.       df->future_frame.inx = cache->instruction_table[rx_cache_miss];
  2370.       df->future_frame.data = 0;
  2371.       df->future_frame.data_2 = (void *) df;
  2372.       /* If there are any NEXT-CHAR instruction frames that
  2373.        * refer to this state, we convert them to CACHE-MISS frames.
  2374.        */
  2375.       if (!df->effects
  2376.   && (df->edge->options->next_same_super_edge[0]
  2377.       == df->edge->options))
  2378. install_transition (df->present, &df->future_frame,
  2379.     df->edge->cset);
  2380.     }
  2381.   df = it->transition_refs;
  2382.   df->prev_same_dest->next_same_dest = df;
  2383. }
  2384.     }
  2385.   }
  2386. }
  2387. #ifdef __STDC__
  2388. static void 
  2389. refresh_semifree_superstate (struct rx_cache * cache,
  2390.      struct rx_superstate * super)
  2391. #else
  2392. static void 
  2393. refresh_semifree_superstate (cache, super)
  2394.      struct rx_cache * cache;
  2395.      struct rx_superstate * super;
  2396. #endif
  2397. {
  2398.   struct rx_distinct_future *df;
  2399.   if (super->transition_refs)
  2400.     {
  2401.       super->transition_refs->prev_same_dest->next_same_dest = 0; 
  2402.       for (df = super->transition_refs; df; df = df->next_same_dest)
  2403. {
  2404.   df->future_frame.inx = cache->instruction_table[rx_next_char];
  2405.   df->future_frame.data = (void *) super->transitions;
  2406.   /* CACHE-MISS instruction frames that refer to this state,
  2407.    * must be converted to NEXT-CHAR frames.
  2408.    */
  2409.   if (!df->effects
  2410.       && (df->edge->options->next_same_super_edge[0]
  2411.   == df->edge->options))
  2412.     install_transition (df->present, &df->future_frame,
  2413. df->edge->cset);
  2414. }
  2415.       super->transition_refs->prev_same_dest->next_same_dest
  2416. = super->transition_refs;
  2417.     }
  2418.   if (cache->semifree_superstate == super)
  2419.     cache->semifree_superstate = (super->prev_recyclable == super
  2420.   ? 0
  2421.   : super->prev_recyclable);
  2422.   super->next_recyclable->prev_recyclable = super->prev_recyclable;
  2423.   super->prev_recyclable->next_recyclable = super->next_recyclable;
  2424.   if (!cache->lru_superstate)
  2425.     (cache->lru_superstate
  2426.      = super->next_recyclable
  2427.      = super->prev_recyclable
  2428.      = super);
  2429.   else
  2430.     {
  2431.       super->next_recyclable = cache->lru_superstate;
  2432.       super->prev_recyclable = cache->lru_superstate->prev_recyclable;
  2433.       super->next_recyclable->prev_recyclable = super;
  2434.       super->prev_recyclable->next_recyclable = super;
  2435.     }
  2436.   super->is_semifree = 0;
  2437.   --cache->semifree_superstates;
  2438. }
  2439. #ifdef __STDC__
  2440. static void
  2441. rx_refresh_this_superstate (struct rx_cache * cache, struct rx_superstate * superstate)
  2442. #else
  2443. static void
  2444. rx_refresh_this_superstate (cache, superstate)
  2445.      struct rx_cache * cache;
  2446.      struct rx_superstate * superstate;
  2447. #endif
  2448. {
  2449.   if (superstate->is_semifree)
  2450.     refresh_semifree_superstate (cache, superstate);
  2451.   else if (cache->lru_superstate == superstate)
  2452.     cache->lru_superstate = superstate->next_recyclable;
  2453.   else if (superstate != cache->lru_superstate->prev_recyclable)
  2454.     {
  2455.       superstate->next_recyclable->prev_recyclable
  2456. = superstate->prev_recyclable;
  2457.       superstate->prev_recyclable->next_recyclable
  2458. = superstate->next_recyclable;
  2459.       superstate->next_recyclable = cache->lru_superstate;
  2460.       superstate->prev_recyclable = cache->lru_superstate->prev_recyclable;
  2461.       superstate->next_recyclable->prev_recyclable = superstate;
  2462.       superstate->prev_recyclable->next_recyclable = superstate;
  2463.     }
  2464. }
  2465. #ifdef __STDC__
  2466. static void 
  2467. release_superset_low (struct rx_cache * cache,
  2468.      struct rx_superset *set)
  2469. #else
  2470. static void 
  2471. release_superset_low (cache, set)
  2472.      struct rx_cache * cache;
  2473.      struct rx_superset *set;
  2474. #endif
  2475. {
  2476.   if (!--set->refs)
  2477.     {
  2478.       if (set->cdr)
  2479. release_superset_low (cache, set->cdr);
  2480.       set->starts_for = 0;
  2481.       rx_hash_free
  2482. (rx_hash_find
  2483.  (&cache->superset_table,
  2484.   (unsigned long)set->car ^ set->id ^ (unsigned long)set->cdr,
  2485.   (void *)set,
  2486.   &cache->superset_hash_rules),
  2487.  &cache->superset_hash_rules);
  2488.       rx_cache_free (cache, &cache->free_supersets, (char *)set);
  2489.     }
  2490. }
  2491. #ifdef __STDC__
  2492. RX_DECL void 
  2493. rx_release_superset (struct rx *rx,
  2494.      struct rx_superset *set)
  2495. #else
  2496. RX_DECL void 
  2497. rx_release_superset (rx, set)
  2498.      struct rx *rx;
  2499.      struct rx_superset *set;
  2500. #endif
  2501. {
  2502.   release_superset_low (rx->cache, set);
  2503. }
  2504. /* This tries to add a new superstate to the superstate freelist.
  2505.  * It might, as a result, free some edge pieces or hash tables.
  2506.  * If nothing can be freed because too many locks are being held, fail.
  2507.  */
  2508. #ifdef __STDC__
  2509. static int
  2510. rx_really_free_superstate (struct rx_cache * cache)
  2511. #else
  2512. static int
  2513. rx_really_free_superstate (cache)
  2514.      struct rx_cache * cache;
  2515. #endif
  2516. {
  2517.   int locked_superstates = 0;
  2518.   struct rx_superstate * it;
  2519.   if (!cache->superstates)
  2520.     return 0;
  2521.   {
  2522.     /* This is a total guess.  The idea is that we should expect as
  2523.      * many misses as we've recently experienced.  I.e., cache->misses
  2524.      * should be the same as cache->semifree_superstates.
  2525.      */
  2526.     while ((cache->hits + cache->misses) > cache->superstates_allowed)
  2527.       {
  2528. cache->hits >>= 1;
  2529. cache->misses >>= 1;
  2530.       }
  2531.     if (  ((cache->hits + cache->misses) * cache->semifree_superstates)
  2532. < (cache->superstates  * cache->misses))
  2533.       {
  2534. semifree_superstate (cache);
  2535. semifree_superstate (cache);
  2536.       }
  2537.   }
  2538.   while (cache->semifree_superstate && cache->semifree_superstate->locks)
  2539.     {
  2540.       refresh_semifree_superstate (cache, cache->semifree_superstate);
  2541.       ++locked_superstates;
  2542.       if (locked_superstates == cache->superstates)
  2543. return 0;
  2544.     }
  2545.   if (cache->semifree_superstate)
  2546.     {
  2547.       it = cache->semifree_superstate;
  2548.       it->next_recyclable->prev_recyclable = it->prev_recyclable;
  2549.       it->prev_recyclable->next_recyclable = it->next_recyclable;
  2550.       cache->semifree_superstate = ((it == it->next_recyclable)
  2551.     ? 0
  2552.     : it->next_recyclable);
  2553.       --cache->semifree_superstates;
  2554.     }
  2555.   else
  2556.     {
  2557.       while (cache->lru_superstate->locks)
  2558. {
  2559.   cache->lru_superstate = cache->lru_superstate->next_recyclable;
  2560.   ++locked_superstates;
  2561.   if (locked_superstates == cache->superstates)
  2562.     return 0;
  2563. }
  2564.       it = cache->lru_superstate;
  2565.       it->next_recyclable->prev_recyclable = it->prev_recyclable;
  2566.       it->prev_recyclable->next_recyclable = it->next_recyclable;
  2567.       cache->lru_superstate = ((it == it->next_recyclable)
  2568.     ? 0
  2569.     : it->next_recyclable);
  2570.     }
  2571.   if (it->transition_refs)
  2572.     {
  2573.       struct rx_distinct_future *df;
  2574.       for (df = it->transition_refs,
  2575.    df->prev_same_dest->next_same_dest = 0;
  2576.    df;
  2577.    df = df->next_same_dest)
  2578. {
  2579.   df->future_frame.inx = cache->instruction_table[rx_cache_miss];
  2580.   df->future_frame.data = 0;
  2581.   df->future_frame.data_2 = (void *) df;
  2582.   df->future = 0;
  2583. }
  2584.       it->transition_refs->prev_same_dest->next_same_dest =
  2585. it->transition_refs;
  2586.     }
  2587.   {
  2588.     struct rx_super_edge *tc = it->edges;
  2589.     while (tc)
  2590.       {
  2591. struct rx_distinct_future * df;
  2592. struct rx_super_edge *tct = tc->next;
  2593. df = tc->options;
  2594. df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
  2595. while (df)
  2596.   {
  2597.     struct rx_distinct_future *dft = df;
  2598.     df = df->next_same_super_edge[0];
  2599.     
  2600.     
  2601.     if (dft->future && dft->future->transition_refs == dft)
  2602.       {
  2603. dft->future->transition_refs = dft->next_same_dest;
  2604. if (dft->future->transition_refs == dft)
  2605.   dft->future->transition_refs = 0;
  2606.       }
  2607.     dft->next_same_dest->prev_same_dest = dft->prev_same_dest;
  2608.     dft->prev_same_dest->next_same_dest = dft->next_same_dest;
  2609.     rx_cache_free (cache, &cache->free_discernable_futures,
  2610.    (char *)dft);
  2611.   }
  2612. rx_cache_free (cache, &cache->free_transition_classes, (char *)tc);
  2613. tc = tct;
  2614.       }
  2615.   }
  2616.   
  2617.   if (it->contents->superstate == it)
  2618.     it->contents->superstate = 0;
  2619.   release_superset_low (cache, it->contents);
  2620.   rx_cache_free (cache, &cache->free_superstates, (char *)it);
  2621.   --cache->superstates;
  2622.   return 1;
  2623. }
  2624. #ifdef __STDC__
  2625. static char *
  2626. rx_cache_get (struct rx_cache * cache,
  2627.       struct rx_freelist ** freelist)
  2628. #else
  2629. static char *
  2630. rx_cache_get (cache, freelist)
  2631.      struct rx_cache * cache;
  2632.      struct rx_freelist ** freelist;
  2633. #endif
  2634. {
  2635.   while (!*freelist && rx_really_free_superstate (cache))
  2636.     ;
  2637.   if (!*freelist)
  2638.     return 0;
  2639.   {
  2640.     struct rx_freelist * it = *freelist;
  2641.     *freelist = it->next;
  2642.     return (char *)it;
  2643.   }
  2644. }
  2645. #ifdef __STDC__
  2646. static char *
  2647. rx_cache_malloc_or_get (struct rx_cache * cache,
  2648. struct rx_freelist ** freelist, int bytes)
  2649. #else
  2650. static char *
  2651. rx_cache_malloc_or_get (cache, freelist, bytes)
  2652.      struct rx_cache * cache;
  2653.      struct rx_freelist ** freelist;
  2654.      int bytes;
  2655. #endif
  2656. {
  2657.   if (!*freelist)
  2658.     {
  2659.       char * answer = rx_cache_malloc (cache, bytes);
  2660.       if (answer)
  2661. return answer;
  2662.     }
  2663.   return rx_cache_get (cache, freelist);
  2664. }
  2665. #ifdef __STDC__
  2666. static char *
  2667. rx_cache_get_superstate (struct rx_cache * cache)
  2668. #else
  2669. static char *
  2670. rx_cache_get_superstate (cache)
  2671.   struct rx_cache * cache;
  2672. #endif
  2673. {
  2674.   char * answer;
  2675.   int bytes = (   sizeof (struct rx_superstate)
  2676.        +  cache->local_cset_size * sizeof (struct rx_inx));
  2677.   if (!cache->free_superstates
  2678.       && (cache->superstates < cache->superstates_allowed))
  2679.     {
  2680.       answer = rx_cache_malloc (cache, bytes);
  2681.       if (answer)
  2682. {
  2683.   ++cache->superstates;
  2684.   return answer;
  2685. }
  2686.     }
  2687.   answer = rx_cache_get (cache, &cache->free_superstates);
  2688.   if (!answer)
  2689.     {
  2690.       answer = rx_cache_malloc (cache, bytes);
  2691.       if (answer)
  2692. ++cache->superstates_allowed;
  2693.     }
  2694.   ++cache->superstates;
  2695.   return answer;
  2696. }
  2697. #ifdef __STDC__
  2698. static int
  2699. supersetcmp (void * va, void * vb)
  2700. #else
  2701. static int
  2702. supersetcmp (va, vb)
  2703.      void * va;
  2704.      void * vb;
  2705. #endif
  2706. {
  2707.   struct rx_superset * a = (struct rx_superset *)va;
  2708.   struct rx_superset * b = (struct rx_superset *)vb;
  2709.   return (   (a == b)
  2710.   || (a && b && (a->car == b->car) && (a->cdr == b->cdr)));
  2711. }
  2712. #ifdef __STDC__
  2713. static struct rx_hash_item *
  2714. superset_allocator (struct rx_hash_rules * rules, void * val)
  2715. #else
  2716. static struct rx_hash_item *
  2717. superset_allocator (rules, val)
  2718.      struct rx_hash_rules * rules;
  2719.      void * val;
  2720. #endif
  2721. {
  2722.   struct rx_cache * cache
  2723.     = ((struct rx_cache *)
  2724.        ((char *)rules
  2725. - (unsigned long)(&((struct rx_cache *)0)->superset_hash_rules)));
  2726.   struct rx_superset * template = (struct rx_superset *)val;
  2727.   struct rx_superset * newset
  2728.     = ((struct rx_superset *)
  2729.        rx_cache_malloc_or_get (cache,
  2730.        &cache->free_supersets,
  2731.        sizeof (*template)));
  2732.   if (!newset)
  2733.     return 0;
  2734.   newset->refs = 0;
  2735.   newset->car = template->car;
  2736.   newset->id = template->car->id;
  2737.   newset->cdr = template->cdr;
  2738.   newset->superstate = 0;
  2739.   rx_protect_superset (rx, template->cdr);
  2740.   newset->hash_item.data = (void *)newset;
  2741.   newset->hash_item.binding = 0;
  2742.   return &newset->hash_item;
  2743. }
  2744. #ifdef __STDC__
  2745. static struct rx_hash * 
  2746. super_hash_allocator (struct rx_hash_rules * rules)
  2747. #else
  2748. static struct rx_hash * 
  2749. super_hash_allocator (rules)
  2750.      struct rx_hash_rules * rules;
  2751. #endif
  2752. {
  2753.   struct rx_cache * cache
  2754.     = ((struct rx_cache *)
  2755.        ((char *)rules
  2756. - (unsigned long)(&((struct rx_cache *)0)->superset_hash_rules)));
  2757.   return ((struct rx_hash *)
  2758.   rx_cache_malloc_or_get (cache,
  2759.   &cache->free_hash, sizeof (struct rx_hash)));
  2760. }
  2761. #ifdef __STDC__
  2762. static void
  2763. super_hash_liberator (struct rx_hash * hash, struct rx_hash_rules * rules)
  2764. #else
  2765. static void
  2766. super_hash_liberator (hash, rules)
  2767.      struct rx_hash * hash;
  2768.      struct rx_hash_rules * rules;
  2769. #endif
  2770. {
  2771.   struct rx_cache * cache
  2772.     = ((struct rx_cache *)
  2773.        (char *)rules - (long)(&((struct rx_cache *)0)->superset_hash_rules));
  2774.   rx_cache_free (cache, &cache->free_hash, (char *)hash);
  2775. }
  2776. #ifdef __STDC__
  2777. static void
  2778. superset_hash_item_liberator (struct rx_hash_item * it,
  2779.       struct rx_hash_rules * rules)
  2780. #else
  2781. static void
  2782. superset_hash_item_liberator (it, rules) /* Well, it does ya know. */
  2783.      struct rx_hash_item * it;
  2784.      struct rx_hash_rules * rules;
  2785. #endif
  2786. {
  2787. }
  2788. int rx_cache_bound = 128;
  2789. static int rx_default_cache_got = 0;
  2790. #ifdef __STDC__
  2791. static int
  2792. bytes_for_cache_size (int supers, int cset_size)
  2793. #else
  2794. static int
  2795. bytes_for_cache_size (supers, cset_size)
  2796.      int supers;
  2797.      int cset_size;
  2798. #endif
  2799. {
  2800.   /* What the hell is this? !!!*/
  2801.   return (int)
  2802.     ((float)supers *
  2803.      (  (1.03 * (float) (  rx_sizeof_bitset (cset_size)
  2804.  + sizeof (struct rx_super_edge)))
  2805.       + (1.80 * (float) sizeof (struct rx_possible_future))
  2806.       + (float) (  sizeof (struct rx_superstate)
  2807.  + cset_size * sizeof (struct rx_inx))));
  2808. }
  2809. #ifdef __STDC__
  2810. static void
  2811. rx_morecore (struct rx_cache * cache)
  2812. #else
  2813. static void
  2814. rx_morecore (cache)
  2815.      struct rx_cache * cache;
  2816. #endif
  2817. {
  2818.   if (rx_default_cache_got >= rx_cache_bound)
  2819.     return;
  2820.   rx_default_cache_got += 16;
  2821.   cache->superstates_allowed = rx_cache_bound;
  2822.   {
  2823.     struct rx_blocklist ** pos = &cache->memory;
  2824.     int size = bytes_for_cache_size (16, cache->local_cset_size);
  2825.     while (*pos)
  2826.       pos = &(*pos)->next;
  2827.     *pos = ((struct rx_blocklist *)
  2828.     malloc (size + sizeof (struct rx_blocklist))); 
  2829.     if (!*pos)
  2830.       return;
  2831.     (*pos)->next = 0;
  2832.     (*pos)->bytes = size;
  2833.     cache->memory_pos = *pos;
  2834.     cache->memory_addr = (char *)*pos + sizeof (**pos);
  2835.     cache->bytes_left = size;
  2836.   }
  2837. }
  2838. static struct rx_cache default_cache = 
  2839. {
  2840.   {
  2841.     supersetcmp,
  2842.     super_hash_allocator,
  2843.     super_hash_liberator,
  2844.     superset_allocator,
  2845.     superset_hash_item_liberator,
  2846.   },
  2847.   0,
  2848.   0,
  2849.   0,
  2850.   0,
  2851.   rx_morecore,
  2852.   0,
  2853.   0,
  2854.   0,
  2855.   0,
  2856.   0,
  2857.   0,
  2858.   0,
  2859.   0,
  2860.   0,
  2861.   0,
  2862.   0,
  2863.   0,
  2864.   128,
  2865.   256,
  2866.   rx_id_instruction_table,
  2867.   {
  2868.     0,
  2869.     0,
  2870.     {0},
  2871.     {0},
  2872.     {0}
  2873.   }
  2874. };
  2875. /* This adds an element to a superstate set.  These sets are lists, such
  2876.  * that lists with == elements are ==.  The empty set is returned by
  2877.  * superset_cons (rx, 0, 0) and is NOT equivelent to 
  2878.  * (struct rx_superset)0.
  2879.  */
  2880. #ifdef __STDC__
  2881. RX_DECL struct rx_superset *
  2882. rx_superset_cons (struct rx * rx,
  2883.   struct rx_nfa_state *car, struct rx_superset *cdr)
  2884. #else
  2885. RX_DECL struct rx_superset *
  2886. rx_superset_cons (rx, car, cdr)
  2887.      struct rx * rx;
  2888.      struct rx_nfa_state *car;
  2889.      struct rx_superset *cdr;
  2890. #endif
  2891. {
  2892.   struct rx_cache * cache = rx->cache;
  2893.   if (!car && !cdr)
  2894.     {
  2895.       if (!cache->empty_superset)
  2896. {
  2897.   cache->empty_superset
  2898.     = ((struct rx_superset *)
  2899.        rx_cache_malloc_or_get (cache, &cache->free_supersets,
  2900.        sizeof (struct rx_superset)));
  2901.   if (!cache->empty_superset)
  2902.     return 0;
  2903.   bzero (cache->empty_superset, sizeof (struct rx_superset));
  2904.   cache->empty_superset->refs = 1000;
  2905. }
  2906.       return cache->empty_superset;
  2907.     }
  2908.   {
  2909.     struct rx_superset template;
  2910.     struct rx_hash_item * hit;
  2911.     template.car = car;
  2912.     template.cdr = cdr;
  2913.     template.id = car->id;
  2914.     hit = rx_hash_store (&cache->superset_table,
  2915.  (unsigned long)car ^ car->id ^ (unsigned long)cdr,
  2916.  (void *)&template,
  2917.  &cache->superset_hash_rules);
  2918.     return (hit
  2919.     ?  (struct rx_superset *)hit->data
  2920.     : 0);
  2921.   }
  2922. }
  2923. /* This computes a union of two NFA state sets.  The sets do not have the
  2924.  * same representation though.  One is a RX_SUPERSET structure (part
  2925.  * of the superstate NFA) and the other is an NFA_STATE_SET (part of the NFA).
  2926.  */
  2927. #ifdef __STDC__
  2928. RX_DECL struct rx_superset *
  2929. rx_superstate_eclosure_union
  2930.   (struct rx * rx, struct rx_superset *set, struct rx_nfa_state_set *ecl) 
  2931. #else
  2932. RX_DECL struct rx_superset *
  2933. rx_superstate_eclosure_union (rx, set, ecl)
  2934.      struct rx * rx;
  2935.      struct rx_superset *set;
  2936.      struct rx_nfa_state_set *ecl;
  2937. #endif
  2938. {
  2939.   if (!ecl)
  2940.     return set;
  2941.   if (!set->car)
  2942.     return rx_superset_cons (rx, ecl->car,
  2943.      rx_superstate_eclosure_union (rx, set, ecl->cdr));
  2944.   if (set->car == ecl->car)
  2945.     return rx_superstate_eclosure_union (rx, set, ecl->cdr);
  2946.   {
  2947.     struct rx_superset * tail;
  2948.     struct rx_nfa_state * first;
  2949.     if (set->car > ecl->car)
  2950.       {
  2951. tail = rx_superstate_eclosure_union (rx, set->cdr, ecl);
  2952. first = set->car;
  2953.       }
  2954.     else
  2955.       {
  2956. tail = rx_superstate_eclosure_union (rx, set, ecl->cdr);
  2957. first = ecl->car;
  2958.       }
  2959.     if (!tail)
  2960.       return 0;
  2961.     else
  2962.       {
  2963. struct rx_superset * answer;
  2964. answer = rx_superset_cons (rx, first, tail);
  2965. if (!answer)
  2966.   {
  2967.     rx_protect_superset (rx, tail);
  2968.     rx_release_superset (rx, tail);
  2969.     return 0;
  2970.   }
  2971. else
  2972.   return answer;
  2973.       }
  2974.   }
  2975. }
  2976. /*
  2977.  * This makes sure that a list of rx_distinct_futures contains
  2978.  * a future for each possible set of side effects in the eclosure
  2979.  * of a given state.  This is some of the work of filling in a
  2980.  * superstate transition. 
  2981.  */
  2982. #ifdef __STDC__
  2983. static struct rx_distinct_future *
  2984. include_futures (struct rx *rx,
  2985.  struct rx_distinct_future *df, struct rx_nfa_state
  2986.  *state, struct rx_superstate *superstate) 
  2987. #else
  2988. static struct rx_distinct_future *
  2989. include_futures (rx, df, state, superstate)
  2990.      struct rx *rx;
  2991.      struct rx_distinct_future *df;
  2992.      struct rx_nfa_state *state;
  2993.      struct rx_superstate *superstate;
  2994. #endif
  2995. {
  2996.   struct rx_possible_future *future;
  2997.   struct rx_cache * cache = rx->cache;
  2998.   for (future = state->futures; future; future = future->next)
  2999.     {
  3000.       struct rx_distinct_future *dfp;
  3001.       struct rx_distinct_future *insert_before = 0;
  3002.       if (df)
  3003. df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
  3004.       for (dfp = df; dfp; dfp = dfp->next_same_super_edge[0])
  3005. if (dfp->effects == future->effects)
  3006.   break;
  3007. else
  3008.   {
  3009.     int order = rx->se_list_cmp (rx, dfp->effects, future->effects);
  3010.     if (order > 0)
  3011.       {
  3012. insert_before = dfp;
  3013. dfp = 0;
  3014. break;
  3015.       }
  3016.   }
  3017.       if (df)
  3018. df->next_same_super_edge[1]->next_same_super_edge[0] = df;
  3019.       if (!dfp)
  3020. {
  3021.   dfp
  3022.     = ((struct rx_distinct_future *)
  3023.        rx_cache_malloc_or_get (cache, &cache->free_discernable_futures,
  3024.        sizeof (struct rx_distinct_future)));
  3025.   if (!dfp)
  3026.     return 0;
  3027.   if (!df)
  3028.     {
  3029.       df = insert_before = dfp;
  3030.       df->next_same_super_edge[0] = df->next_same_super_edge[1] = df;
  3031.     }
  3032.   else if (!insert_before)
  3033.     insert_before = df;
  3034.   else if (insert_before == df)
  3035.     df = dfp;
  3036.   dfp->next_same_super_edge[0] = insert_before;
  3037.   dfp->next_same_super_edge[1]
  3038.     = insert_before->next_same_super_edge[1];
  3039.   dfp->next_same_super_edge[1]->next_same_super_edge[0] = dfp;
  3040.   dfp->next_same_super_edge[0]->next_same_super_edge[1] = dfp;
  3041.   dfp->next_same_dest = dfp->prev_same_dest = dfp;
  3042.   dfp->future = 0;
  3043.   dfp->present = superstate;
  3044.   dfp->future_frame.inx = rx->instruction_table[rx_cache_miss];
  3045.   dfp->future_frame.data = 0;
  3046.   dfp->future_frame.data_2 = (void *) dfp;
  3047.   dfp->side_effects_frame.inx
  3048.     = rx->instruction_table[rx_do_side_effects];
  3049.   dfp->side_effects_frame.data = 0;
  3050.   dfp->side_effects_frame.data_2 = (void *) dfp;
  3051.   dfp->effects = future->effects;
  3052. }
  3053.     }
  3054.   return df;
  3055. }
  3056. /* This constructs a new superstate from its state set.  The only 
  3057.  * complexity here is memory management.
  3058.  */
  3059. #ifdef __STDC__
  3060. RX_DECL struct rx_superstate *
  3061. rx_superstate (struct rx *rx,
  3062.        struct rx_superset *set)
  3063. #else
  3064. RX_DECL struct rx_superstate *
  3065. rx_superstate (rx, set)
  3066.      struct rx *rx;
  3067.      struct rx_superset *set;
  3068. #endif
  3069. {
  3070.   struct rx_cache * cache = rx->cache;
  3071.   struct rx_superstate * superstate = 0;
  3072.   /* Does the superstate already exist in the cache? */
  3073.   if (set->superstate)
  3074.     {
  3075.       if (set->superstate->rx_id != rx->rx_id)
  3076. {
  3077.   /* Aha.  It is in the cache, but belongs to a superstate
  3078.    * that refers to an NFA that no longer exists.
  3079.    * (We know it no longer exists because it was evidently
  3080.    *  stored in the same region of memory as the current nfa
  3081.    *  yet it has a different id.)
  3082.    */
  3083.   superstate = set->superstate;
  3084.   if (!superstate->is_semifree)
  3085.     {
  3086.       if (cache->lru_superstate == superstate)
  3087. {
  3088.   cache->lru_superstate = superstate->next_recyclable;
  3089.   if (cache->lru_superstate == superstate)
  3090.     cache->lru_superstate = 0;
  3091. }
  3092.       {
  3093. superstate->next_recyclable->prev_recyclable
  3094.   = superstate->prev_recyclable;
  3095. superstate->prev_recyclable->next_recyclable
  3096.   = superstate->next_recyclable;
  3097. if (!cache->semifree_superstate)
  3098.   {
  3099.     (cache->semifree_superstate
  3100.      = superstate->next_recyclable
  3101.      = superstate->prev_recyclable
  3102.      = superstate);
  3103.   }
  3104. else
  3105.   {
  3106.     superstate->next_recyclable = cache->semifree_superstate;
  3107.     superstate->prev_recyclable
  3108.       = cache->semifree_superstate->prev_recyclable;
  3109.     superstate->next_recyclable->prev_recyclable
  3110.       = superstate;
  3111.     superstate->prev_recyclable->next_recyclable
  3112.       = superstate;
  3113.     cache->semifree_superstate = superstate;
  3114.   }
  3115. ++cache->semifree_superstates;
  3116.       }
  3117.     }
  3118.   set->superstate = 0;
  3119.   goto handle_cache_miss;
  3120. }
  3121.       ++cache->hits;
  3122.       superstate = set->superstate;
  3123.       rx_refresh_this_superstate (cache, superstate);
  3124.       return superstate;
  3125.     }
  3126.  handle_cache_miss:
  3127.   /* This point reached only for cache misses. */
  3128.   ++cache->misses;
  3129. #if RX_DEBUG
  3130.   if (rx_debug_trace > 1)
  3131.     {
  3132.       struct rx_superset * setp = set;
  3133.       fprintf (stderr, "Building a superstet %d(%d): ", rx->rx_id, set);
  3134.       while (setp)
  3135. {
  3136.   fprintf (stderr, "%d ", setp->id);
  3137.   setp = setp->cdr;
  3138. }
  3139.       fprintf (stderr, "(%d)n", set);
  3140.     }
  3141. #endif
  3142.   superstate = (struct rx_superstate *)rx_cache_get_superstate (cache);
  3143.   if (!superstate)
  3144.     return 0;
  3145.   if (!cache->lru_superstate)
  3146.     (cache->lru_superstate
  3147.      = superstate->next_recyclable
  3148.      = superstate->prev_recyclable
  3149.      = superstate);
  3150.   else
  3151.     {
  3152.       superstate->next_recyclable = cache->lru_superstate;
  3153.       superstate->prev_recyclable = cache->lru_superstate->prev_recyclable;
  3154.       (  superstate->prev_recyclable->next_recyclable
  3155.        = superstate->next_recyclable->prev_recyclable
  3156.        = superstate);
  3157.     }
  3158.   superstate->rx_id = rx->rx_id;
  3159.   superstate->transition_refs = 0;
  3160.   superstate->locks = 0;
  3161.   superstate->is_semifree = 0;
  3162.   set->superstate = superstate;
  3163.   superstate->contents = set;
  3164.   rx_protect_superset (rx, set);
  3165.   superstate->edges = 0;
  3166.   {
  3167.     int x;
  3168.     /* None of the transitions from this superstate are known yet. */
  3169.     for (x = 0; x < rx->local_cset_size; ++x) /* &&&&& 3.8 % */
  3170.       {
  3171. struct rx_inx * ifr = &superstate->transitions[x];
  3172. ifr->inx = rx->instruction_table [rx_cache_miss];
  3173. ifr->data = ifr->data_2 = 0;
  3174.       }
  3175.   }
  3176.   return superstate;
  3177. }
  3178. /* This computes the destination set of one edge of the superstate NFA.
  3179.  * Note that a RX_DISTINCT_FUTURE is a superstate edge.
  3180.  * Returns 0 on an allocation failure.
  3181.  */
  3182. #ifdef __STDC__
  3183. static int 
  3184. solve_destination (struct rx *rx, struct rx_distinct_future *df)
  3185. #else
  3186. static int 
  3187. solve_destination (rx, df)
  3188.      struct rx *rx;
  3189.      struct rx_distinct_future *df;
  3190. #endif
  3191. {
  3192.   struct rx_super_edge *tc = df->edge;
  3193.   struct rx_superset *nfa_state;
  3194.   struct rx_superset *nil_set = rx_superset_cons (rx, 0, 0);
  3195.   struct rx_superset *solution = nil_set;
  3196.   struct rx_superstate *dest;
  3197.   rx_protect_superset (rx, solution);
  3198.   /* Iterate over all NFA states in the state set of this superstate. */
  3199.   for (nfa_state = df->present->contents;
  3200.        nfa_state->car;
  3201.        nfa_state = nfa_state->cdr)
  3202.     {
  3203.       struct rx_nfa_edge *e;
  3204.       /* Iterate over all edges of each NFA state. */
  3205.       for (e = nfa_state->car->edges; e; e = e->next)
  3206.         /* If we find an edge that is labeled with 
  3207.  * the characters we are solving for.....
  3208.  */
  3209. if (rx_bitset_is_subset (rx->local_cset_size,
  3210.  tc->cset, e->params.cset))
  3211.   {
  3212.     struct rx_nfa_state *n = e->dest;
  3213.     struct rx_possible_future *pf;
  3214.     /* ....search the partial epsilon closures of the destination
  3215.      * of that edge for a path that involves the same set of
  3216.      * side effects we are solving for.
  3217.      * If we find such a RX_POSSIBLE_FUTURE, we add members to the
  3218.      * stateset we are computing.
  3219.      */
  3220.     for (pf = n->futures; pf; pf = pf->next)
  3221.       if (pf->effects == df->effects)
  3222. {
  3223.   struct rx_superset * old_sol;
  3224.   old_sol = solution;
  3225.   solution = rx_superstate_eclosure_union (rx, solution,
  3226.    pf->destset);
  3227.   if (!solution)
  3228.     return 0;
  3229.   rx_protect_superset (rx, solution);
  3230.   rx_release_superset (rx, old_sol);
  3231. }
  3232.   }
  3233.     }
  3234.   /* It is possible that the RX_DISTINCT_FUTURE we are working on has 
  3235.    * the empty set of NFA states as its definition.  In that case, this
  3236.    * is a failure point.
  3237.    */
  3238.   if (solution == nil_set)
  3239.     {
  3240.       df->future_frame.inx = (void *) rx_backtrack;
  3241.       df->future_frame.data = 0;
  3242.       df->future_frame.data_2 = 0;