]> jfr.im git - irc/evilnet/x3.git/blame - rx/rxbasic.c
Rewrote PHP X3 DB parser function sample code as a class and faster code
[irc/evilnet/x3.git] / rx / rxbasic.c
CommitLineData
d76ed9a9 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
28int rx_basic_unfaniverse_delay = RX_DEFAULT_NFA_DELAY;
29static struct rx_unfaniverse * rx_basic_uv = 0;
30
31\f
32
33static int
34init_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__
44struct rx_unfaniverse *
45rx_basic_unfaniverse (void)
46#else
47struct rx_unfaniverse *
48rx_basic_unfaniverse ()
49#endif
50{
51 if (init_basic_once ())
52 return 0;
53 return rx_basic_uv;
54}
55\f
56
57static char * silly_hack = 0;
58
59#ifdef __STDC__
60struct rx_solutions *
61rx_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
63struct rx_solutions *
64rx_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__
101void
102rx_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}