]> jfr.im git - irc/evilnet/x3.git/blob - rx/rxbasic.c
Rewrote PHP X3 DB parser function sample code as a class and faster code
[irc/evilnet/x3.git] / rx / rxbasic.c
1 /* Copyright (C) 1995, 1996 Tom Lord
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under 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 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Library General Public License for more details.
12 *
13 * You should have received a copy of the GNU Library General Public License
14 * along with this software; see the file COPYING. If not, write to
15 * the Free Software Foundation, 59 Temple Place - Suite 330,
16 * Boston, MA 02111-1307, USA.
17 */
18
19
20 \f
21 #include "rxall.h"
22 #include "rxbasic.h"
23 #include "rxstr.h"
24
25
26 \f
27
28 int rx_basic_unfaniverse_delay = RX_DEFAULT_NFA_DELAY;
29 static struct rx_unfaniverse * rx_basic_uv = 0;
30
31 \f
32
33 static int
34 init_basic_once ()
35 {
36 if (rx_basic_uv)
37 return 0;
38 rx_basic_uv = rx_make_unfaniverse (rx_basic_unfaniverse_delay);
39 return (rx_basic_uv ? 0 : -1);
40 }
41
42 \f
43 #ifdef __STDC__
44 struct rx_unfaniverse *
45 rx_basic_unfaniverse (void)
46 #else
47 struct rx_unfaniverse *
48 rx_basic_unfaniverse ()
49 #endif
50 {
51 if (init_basic_once ())
52 return 0;
53 return rx_basic_uv;
54 }
55 \f
56
57 static char * silly_hack = 0;
58
59 #ifdef __STDC__
60 struct rx_solutions *
61 rx_basic_make_solutions (struct rx_registers * regs, struct rexp_node * expression, struct rexp_node ** subexps, int start, int end, struct rx_context_rules * rules, const unsigned char * str)
62 #else
63 struct rx_solutions *
64 rx_basic_make_solutions (regs, expression, subexps, start, end, rules, str)
65 struct rx_registers * regs;
66 struct rexp_node * expression;
67 struct rexp_node ** subexps;
68 int start;
69 int end;
70 struct rx_context_rules * rules;
71 const unsigned char * str;
72 #endif
73 {
74 struct rx_str_closure * closure;
75 if (init_basic_once ())
76 return 0; /* bogus but rare */
77 if ( expression
78 && (expression->len >= 0)
79 && (expression->len != (end - start)))
80 return &rx_no_solutions;
81 if (silly_hack)
82 {
83 closure = (struct rx_str_closure *)silly_hack;
84 silly_hack = 0;
85 }
86 else
87 closure = (struct rx_str_closure *)malloc (sizeof (*closure));
88 if (!closure)
89 return 0;
90 closure->str = str;
91 closure->len = end;
92 closure->rules = *rules;
93 return rx_make_solutions (regs, rx_basic_uv, expression, subexps, 256,
94 start, end, rx_str_vmfn, rx_str_contextfn,
95 (void *)closure);
96 }
97
98
99
100 #ifdef __STDC__
101 void
102 rx_basic_free_solutions (struct rx_solutions * solns)
103 #else
104 void
105 rx_basic_free_solutions (solns)
106 struct rx_solutions * solns;
107 #endif
108 {
109 if (solns == &rx_no_solutions)
110 return;
111
112 if (!silly_hack)
113 silly_hack = (char *)solns->closure;
114 else
115 free (solns->closure);
116 solns->closure = 0;
117 rx_free_solutions (solns);
118 }