]>
Commit | Line | Data |
---|---|---|
1 | /* classes: h_files */ | |
2 | ||
3 | #ifndef _RXH | |
4 | #define _RXH | |
5 | ||
6 | /* Copyright (C) 1995, 1996 Tom Lord | |
7 | * | |
8 | * This program is free software; you can redistribute it and/or modify | |
9 | * it under the terms of the GNU Library General Public License as published by | |
10 | * the Free Software Foundation; either version 2, or (at your option) | |
11 | * any later version. | |
12 | * | |
13 | * This program is distributed in the hope that it will be useful, | |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | * GNU Library General Public License for more details. | |
17 | * | |
18 | * You should have received a copy of the GNU Library General Public License | |
19 | * along with this software; see the file COPYING. If not, write to | |
20 | * the Free Software Foundation, 59 Temple Place - Suite 330, | |
21 | * Boston, MA 02111-1307, USA. | |
22 | */ | |
23 | ||
24 | \f | |
25 | ||
26 | #include <sys/types.h> | |
27 | #include "rxhash.h" | |
28 | #include "rxcset.h" | |
29 | ||
30 | \f | |
31 | ||
32 | struct rx_cache; | |
33 | struct rx_superset; | |
34 | struct rx; | |
35 | struct rx_se_list; | |
36 | ||
37 | \f | |
38 | ||
39 | /* Suppose that from some NFA state and next character, more than one | |
40 | * path through side-effect edges is possible. In what order should | |
41 | * the paths be tried? A function of type rx_se_list_order answers | |
42 | * that question. It compares two lists of side effects, and says | |
43 | * which list comes first. | |
44 | */ | |
45 | ||
46 | #ifdef __STDC__ | |
47 | typedef int (*rx_se_list_order) (struct rx *, | |
48 | struct rx_se_list *, | |
49 | struct rx_se_list *); | |
50 | #else | |
51 | typedef int (*rx_se_list_order) (); | |
52 | #endif | |
53 | ||
54 | ||
55 | ||
56 | /* Struct RX holds an NFA and cache state for the corresponding super NFA. | |
57 | */ | |
58 | struct rx | |
59 | { | |
60 | /* The compiler assigns a unique id to every pattern. | |
61 | * Like sequence numbers in X, there is a subtle bug here | |
62 | * if you use Rx in a system that runs for a long time. | |
63 | * But, because of the way the caches work out, it is almost | |
64 | * impossible to trigger the Rx version of this bug. | |
65 | * | |
66 | * The id is used to validate superstates found in a cache | |
67 | * of superstates. It isn't sufficient to let a superstate | |
68 | * point back to the rx for which it was compiled -- the caller | |
69 | * may be re-using a `struct rx' in which case the superstate | |
70 | * is not really valid. So instead, superstates are validated | |
71 | * by checking the sequence number of the pattern for which | |
72 | * they were built. | |
73 | */ | |
74 | int rx_id; | |
75 | ||
76 | /* This is memory mgt. state for superstates. This may be | |
77 | * shared by more than one struct rx. | |
78 | */ | |
79 | struct rx_cache * cache; | |
80 | ||
81 | /* Every nfa defines the size of its own character set. | |
82 | * Each superstate has an array of this size, with each element | |
83 | * a `struct rx_inx'. So, don't make this number too large. | |
84 | * In particular, don't make it 2^16. | |
85 | */ | |
86 | int local_cset_size; | |
87 | ||
88 | /* Lists of side effects as stored in the NFA are `hash consed'..meaning | |
89 | * that lists with the same elements are ==. During compilation, | |
90 | * this table facilitates hash-consing. | |
91 | */ | |
92 | struct rx_hash se_list_memo; | |
93 | ||
94 | /* Lists of NFA states are also hashed. | |
95 | */ | |
96 | struct rx_hash set_list_memo; | |
97 | ||
98 | ||
99 | ||
100 | /* The compiler and matcher must build a number of instruction frames. | |
101 | * The format of these frames is fixed (c.f. struct rx_inx). The values | |
102 | * of the instruction opcodes is not fixed. | |
103 | * | |
104 | * An enumerated type (enum rx_opcode) defines the set of instructions | |
105 | * that the compiler or matcher might generate. When filling an instruction | |
106 | * frame, the INX field is found by indexing this instruction table | |
107 | * with an opcode: | |
108 | */ | |
109 | void ** instruction_table; | |
110 | ||
111 | /* The list of all states in an NFA. | |
112 | * The NEXT field of NFA states links this list. | |
113 | */ | |
114 | struct rx_nfa_state *nfa_states; | |
115 | struct rx_nfa_state *start_nfa_states; | |
116 | struct rx_superset * start_set; | |
117 | ||
118 | /* This orders the search through super-nfa paths. | |
119 | * See the comment near the typedef of rx_se_list_order. | |
120 | */ | |
121 | rx_se_list_order se_list_cmp; | |
122 | ||
123 | int next_nfa_id; | |
124 | }; | |
125 | ||
126 | ||
127 | ||
128 | /* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, | |
129 | * `re_match_2' returns information about at least this many registers | |
130 | * the first time a `regs' structure is passed. | |
131 | * | |
132 | * Also, this is the greatest number of backreferenced subexpressions | |
133 | * allowed in a pattern being matched without caller-supplied registers. | |
134 | */ | |
135 | #ifndef RE_NREGS | |
136 | #define RE_NREGS 30 | |
137 | #endif | |
138 | ||
139 | ||
140 | #ifndef emacs | |
141 | #define CHARBITS 8 | |
142 | #define CHAR_SET_SIZE (1 << CHARBITS) | |
143 | #define Sword 1 | |
144 | #define SYNTAX(c) re_syntax_table[c] | |
145 | extern char re_syntax_table[CHAR_SET_SIZE]; | |
146 | #endif | |
147 | ||
148 | ||
149 | /* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we | |
150 | * use `alloca' instead of `malloc' for the backtracking stack. | |
151 | * | |
152 | * Emacs will die miserably if we don't do this. | |
153 | */ | |
154 | ||
155 | #ifdef REGEX_MALLOC | |
156 | #define REGEX_ALLOCATE malloc | |
157 | #else /* not REGEX_MALLOC */ | |
158 | #define REGEX_ALLOCATE alloca | |
159 | #endif /* not REGEX_MALLOC */ | |
160 | ||
161 | #undef MAX | |
162 | #undef MIN | |
163 | #define MAX(a, b) ((a) > (b) ? (a) : (b)) | |
164 | #define MIN(a, b) ((a) < (b) ? (a) : (b)) | |
165 | extern void * rx_id_instruction_table[]; | |
166 | extern struct rx_cache * rx_default_cache; | |
167 | ||
168 | \f | |
169 | #ifdef __STDC__ | |
170 | ||
171 | #else /* STDC */ | |
172 | ||
173 | #endif /* STDC */ | |
174 | ||
175 | ||
176 | #endif /* _RXH */ |