]>
Commit | Line | Data |
---|---|---|
652bbafa VZ |
1 | #ifndef _REGEX_H_ |
2 | #define _REGEX_H_ /* never again */ | |
d37acbdf RN |
3 | /* |
4 | * regular expressions | |
5 | * | |
3ca4086b VS |
6 | * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. |
7 | * | |
d37acbdf RN |
8 | * Development of this software was funded, in part, by Cray Research Inc., |
9 | * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics | |
10 | * Corporation, none of whom are responsible for the results. The author | |
3ca4086b VS |
11 | * thanks all of them. |
12 | * | |
d37acbdf RN |
13 | * Redistribution and use in source and binary forms -- with or without |
14 | * modification -- are permitted for any purpose, provided that | |
15 | * redistributions in source form retain this entire copyright notice and | |
16 | * indicate the origin and nature of any modifications. | |
17 | * | |
18 | * I'd appreciate being given credit for this package in the documentation | |
19 | * of software which uses it, but that is not a requirement. | |
3ca4086b | 20 | * |
d37acbdf RN |
21 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, |
22 | * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY | |
23 | * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL | |
24 | * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
25 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
26 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | |
27 | * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | |
28 | * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | |
29 | * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |
30 | * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
31 | * | |
3ca4086b VS |
32 | * |
33 | * | |
34 | * Prototypes etc. marked with "^" within comments get gathered up (and | |
35 | * possibly edited) by the regfwd program and inserted near the bottom of | |
36 | * this file. | |
37 | * | |
38 | * We offer the option of declaring one wide-character version of the | |
39 | * RE functions as well as the char versions. To do that, define | |
40 | * __REG_WIDE_T to the type of wide characters (unfortunately, there | |
41 | * is no consensus that wchar_t is suitable) and __REG_WIDE_COMPILE and | |
42 | * __REG_WIDE_EXEC to the names to be used for the compile and execute | |
43 | * functions (suggestion: re_Xcomp and re_Xexec, where X is a letter | |
44 | * suggestive of the wide type, e.g. re_ucomp and re_uexec for Unicode). | |
45 | * For cranky old compilers, it may be necessary to do something like: | |
46 | * #define __REG_WIDE_COMPILE(a,b,c,d) re_Xcomp(a,b,c,d) | |
47 | * #define __REG_WIDE_EXEC(a,b,c,d,e,f,g) re_Xexec(a,b,c,d,e,f,g) | |
48 | * rather than just #defining the names as parameterless macros. | |
49 | * | |
50 | * For some specialized purposes, it may be desirable to suppress the | |
51 | * declarations of the "front end" functions, regcomp() and regexec(), | |
52 | * or of the char versions of the compile and execute functions. To | |
53 | * suppress the front-end functions, define __REG_NOFRONT. To suppress | |
54 | * the char versions, define __REG_NOCHAR. | |
55 | * | |
56 | * The right place to do those defines (and some others you may want, see | |
57 | * below) would be <sys/types.h>. If you don't have control of that file, | |
58 | * the right place to add your own defines to this file is marked below. | |
59 | * This is normally done automatically, by the makefile and regmkhdr, based | |
60 | * on the contents of regcustom.h. | |
d37acbdf RN |
61 | */ |
62 | ||
3ca4086b VS |
63 | |
64 | ||
d37acbdf | 65 | /* |
3ca4086b | 66 | * voodoo for C++ |
d37acbdf | 67 | */ |
652bbafa VZ |
68 | #ifdef __cplusplus |
69 | extern "C" { | |
70 | #endif | |
71 | ||
3ca4086b VS |
72 | |
73 | ||
74 | /* | |
75 | * Add your own defines, if needed, here. | |
76 | */ | |
77 | ||
78 | ||
79 | ||
80 | /* | |
81 | * Location where a chunk of regcustom.h is automatically spliced into | |
82 | * this file (working from its prototype, regproto.h). | |
83 | */ | |
84 | /* --- begin --- */ | |
85 | /* ensure certain things don't sneak in from system headers */ | |
86 | #ifdef __REG_WIDE_T | |
87 | #undef __REG_WIDE_T | |
88 | #endif | |
89 | #ifdef __REG_WIDE_COMPILE | |
90 | #undef __REG_WIDE_COMPILE | |
91 | #endif | |
92 | #ifdef __REG_WIDE_EXEC | |
93 | #undef __REG_WIDE_EXEC | |
94 | #endif | |
95 | #ifdef __REG_REGOFF_T | |
96 | #undef __REG_REGOFF_T | |
97 | #endif | |
98 | #ifdef __REG_VOID_T | |
99 | #undef __REG_VOID_T | |
100 | #endif | |
101 | #ifdef __REG_CONST | |
102 | #undef __REG_CONST | |
103 | #endif | |
104 | #ifdef __REG_NOFRONT | |
105 | #undef __REG_NOFRONT | |
106 | #endif | |
107 | #ifdef __REG_NOCHAR | |
108 | #undef __REG_NOCHAR | |
109 | #endif | |
1701c4d4 VS |
110 | #if wxUSE_UNICODE |
111 | # define __REG_WIDE_T wxChar | |
112 | # define __REG_WIDE_COMPILE re_comp | |
113 | # define __REG_WIDE_EXEC re_exec | |
114 | # define __REG_NOCHAR /* don't want the char versions */ | |
115 | #endif | |
116 | #define __REG_NOFRONT /* don't want regcomp() and regexec() */ | |
117 | #define _ANSI_ARGS_(x) x | |
fbeb9303 VZ |
118 | |
119 | /* under FreeBSD re_comp and re_exec are declared (differently) in unistd.h */ | |
120 | #ifdef __FreeBSD__ | |
121 | #define re_comp wx_re_comp | |
122 | #define re_exec wx_re_exec | |
123 | #endif | |
3ca4086b VS |
124 | /* --- end --- */ |
125 | ||
d37acbdf | 126 | |
d37acbdf RN |
127 | /* |
128 | * interface types etc. | |
129 | */ | |
130 | ||
131 | /* | |
132 | * regoff_t has to be large enough to hold either off_t or ssize_t, | |
3ca4086b VS |
133 | * and must be signed; it's only a guess that long is suitable, so we |
134 | * offer <sys/types.h> an override. | |
d37acbdf | 135 | */ |
3ca4086b VS |
136 | #ifdef __REG_REGOFF_T |
137 | typedef __REG_REGOFF_T regoff_t; | |
138 | #else | |
d37acbdf | 139 | typedef long regoff_t; |
3ca4086b VS |
140 | #endif |
141 | ||
142 | /* | |
143 | * For benefit of old compilers, we offer <sys/types.h> the option of | |
144 | * overriding the `void' type used to declare nonexistent return types. | |
145 | */ | |
146 | #ifdef __REG_VOID_T | |
147 | typedef __REG_VOID_T re_void; | |
148 | #else | |
149 | typedef void re_void; | |
150 | #endif | |
151 | ||
152 | /* | |
153 | * Also for benefit of old compilers, <sys/types.h> can supply a macro | |
154 | * which expands to a substitute for `const'. | |
155 | */ | |
156 | #ifndef __REG_CONST | |
157 | #define __REG_CONST const | |
158 | #endif | |
159 | ||
160 | ||
d37acbdf RN |
161 | |
162 | /* | |
163 | * other interface types | |
164 | */ | |
165 | ||
166 | /* the biggie, a compiled RE (or rather, a front end to same) */ | |
3ca4086b VS |
167 | typedef struct { |
168 | int re_magic; /* magic number */ | |
169 | size_t re_nsub; /* number of subexpressions */ | |
170 | long re_info; /* information about RE */ | |
171 | # define REG_UBACKREF 000001 | |
172 | # define REG_ULOOKAHEAD 000002 | |
173 | # define REG_UBOUNDS 000004 | |
174 | # define REG_UBRACES 000010 | |
175 | # define REG_UBSALNUM 000020 | |
176 | # define REG_UPBOTCH 000040 | |
177 | # define REG_UBBS 000100 | |
178 | # define REG_UNONPOSIX 000200 | |
179 | # define REG_UUNSPEC 000400 | |
180 | # define REG_UUNPORT 001000 | |
181 | # define REG_ULOCALE 002000 | |
182 | # define REG_UEMPTYMATCH 004000 | |
183 | # define REG_UIMPOSSIBLE 010000 | |
184 | # define REG_USHORTEST 020000 | |
185 | int re_csize; /* sizeof(character) */ | |
186 | char *re_endp; /* backward compatibility kludge */ | |
d37acbdf | 187 | /* the rest is opaque pointers to hidden innards */ |
3ca4086b VS |
188 | char *re_guts; /* `char *' is more portable than `void *' */ |
189 | char *re_fns; | |
652bbafa | 190 | } regex_t; |
d37acbdf RN |
191 | |
192 | /* result reporting (may acquire more fields later) */ | |
3ca4086b VS |
193 | typedef struct { |
194 | regoff_t rm_so; /* start of substring */ | |
195 | regoff_t rm_eo; /* end of substring */ | |
652bbafa VZ |
196 | } regmatch_t; |
197 | ||
d37acbdf | 198 | /* supplementary control and reporting */ |
3ca4086b VS |
199 | typedef struct { |
200 | regmatch_t rm_extend; /* see REG_EXPECT */ | |
d37acbdf | 201 | } rm_detail_t; |
652bbafa | 202 | |
652bbafa VZ |
203 | |
204 | ||
d37acbdf | 205 | /* |
3ca4086b VS |
206 | * compilation |
207 | ^ #ifndef __REG_NOCHAR | |
208 | ^ int re_comp(regex_t *, __REG_CONST char *, size_t, int); | |
209 | ^ #endif | |
210 | ^ #ifndef __REG_NOFRONT | |
211 | ^ int regcomp(regex_t *, __REG_CONST char *, int); | |
212 | ^ #endif | |
213 | ^ #ifdef __REG_WIDE_T | |
214 | ^ int __REG_WIDE_COMPILE(regex_t *, __REG_CONST __REG_WIDE_T *, size_t, int); | |
215 | ^ #endif | |
216 | */ | |
217 | #define REG_BASIC 000000 /* BREs (convenience) */ | |
218 | #define REG_EXTENDED 000001 /* EREs */ | |
219 | #define REG_ADVF 000002 /* advanced features in EREs */ | |
220 | #define REG_ADVANCED 000003 /* AREs (which are also EREs) */ | |
221 | #define REG_QUOTE 000004 /* no special characters, none */ | |
222 | #define REG_NOSPEC REG_QUOTE /* historical synonym */ | |
223 | #define REG_ICASE 000010 /* ignore case */ | |
224 | #define REG_NOSUB 000020 /* don't care about subexpressions */ | |
225 | #define REG_EXPANDED 000040 /* expanded format, white space & comments */ | |
226 | #define REG_NLSTOP 000100 /* \n doesn't match . or [^ ] */ | |
227 | #define REG_NLANCH 000200 /* ^ matches after \n, $ before */ | |
228 | #define REG_NEWLINE 000300 /* newlines are line terminators */ | |
229 | #define REG_PEND 000400 /* ugh -- backward-compatibility hack */ | |
230 | #define REG_EXPECT 001000 /* report details on partial/limited matches */ | |
231 | #define REG_BOSONLY 002000 /* temporary kludge for BOS-only matches */ | |
232 | #define REG_DUMP 004000 /* none of your business :-) */ | |
233 | #define REG_FAKE 010000 /* none of your business :-) */ | |
234 | #define REG_PROGRESS 020000 /* none of your business :-) */ | |
235 | ||
236 | ||
237 | ||
238 | /* | |
239 | * execution | |
240 | ^ #ifndef __REG_NOCHAR | |
241 | ^ int re_exec(regex_t *, __REG_CONST char *, size_t, | |
242 | ^ rm_detail_t *, size_t, regmatch_t [], int); | |
243 | ^ #endif | |
244 | ^ #ifndef __REG_NOFRONT | |
245 | ^ int regexec(regex_t *, __REG_CONST char *, size_t, regmatch_t [], int); | |
246 | ^ #endif | |
247 | ^ #ifdef __REG_WIDE_T | |
248 | ^ int __REG_WIDE_EXEC(regex_t *, __REG_CONST __REG_WIDE_T *, size_t, | |
249 | ^ rm_detail_t *, size_t, regmatch_t [], int); | |
250 | ^ #endif | |
d37acbdf | 251 | */ |
3ca4086b VS |
252 | #define REG_NOTBOL 0001 /* BOS is not BOL */ |
253 | #define REG_NOTEOL 0002 /* EOS is not EOL */ | |
254 | #define REG_STARTEND 0004 /* backward compatibility kludge */ | |
255 | #define REG_FTRACE 0010 /* none of your business */ | |
256 | #define REG_MTRACE 0020 /* none of your business */ | |
257 | #define REG_SMALL 0040 /* none of your business */ | |
652bbafa VZ |
258 | |
259 | ||
d37acbdf RN |
260 | |
261 | /* | |
3ca4086b VS |
262 | * misc generics (may be more functions here eventually) |
263 | ^ re_void regfree(regex_t *); | |
d37acbdf | 264 | */ |
3ca4086b | 265 | |
d37acbdf RN |
266 | |
267 | ||
268 | /* | |
269 | * error reporting | |
270 | * Be careful if modifying the list of error codes -- the table used by | |
271 | * regerror() is generated automatically from this file! | |
3ca4086b VS |
272 | * |
273 | * Note that there is no wide-char variant of regerror at this time; what | |
274 | * kind of character is used for error reports is independent of what kind | |
275 | * is used in matching. | |
276 | * | |
277 | ^ extern size_t regerror(int, __REG_CONST regex_t *, char *, size_t); | |
d37acbdf | 278 | */ |
3ca4086b VS |
279 | #define REG_OKAY 0 /* no errors detected */ |
280 | #define REG_NOMATCH 1 /* failed to match */ | |
281 | #define REG_BADPAT 2 /* invalid regexp */ | |
282 | #define REG_ECOLLATE 3 /* invalid collating element */ | |
283 | #define REG_ECTYPE 4 /* invalid character class */ | |
284 | #define REG_EESCAPE 5 /* invalid escape \ sequence */ | |
285 | #define REG_ESUBREG 6 /* invalid backreference number */ | |
286 | #define REG_EBRACK 7 /* brackets [] not balanced */ | |
287 | #define REG_EPAREN 8 /* parentheses () not balanced */ | |
288 | #define REG_EBRACE 9 /* braces {} not balanced */ | |
289 | #define REG_BADBR 10 /* invalid repetition count(s) */ | |
290 | #define REG_ERANGE 11 /* invalid character range */ | |
291 | #define REG_ESPACE 12 /* out of memory */ | |
292 | #define REG_BADRPT 13 /* quantifier operand invalid */ | |
293 | #define REG_ASSERT 15 /* "can't happen" -- you found a bug */ | |
294 | #define REG_INVARG 16 /* invalid argument to regex function */ | |
295 | #define REG_MIXED 17 /* character widths of regex and string differ */ | |
296 | #define REG_BADOPT 18 /* invalid embedded option */ | |
d37acbdf | 297 | /* two specials for debugging and testing */ |
3ca4086b VS |
298 | #define REG_ATOI 101 /* convert error-code name to number */ |
299 | #define REG_ITOA 102 /* convert error-code number to name */ | |
d37acbdf RN |
300 | |
301 | ||
302 | ||
303 | /* | |
3ca4086b | 304 | * the prototypes, as possibly munched by regfwd |
d37acbdf | 305 | */ |
3ca4086b VS |
306 | /* =====^!^===== begin forwards =====^!^===== */ |
307 | /* automatically gathered by fwd; do not hand-edit */ | |
308 | /* === regproto.h === */ | |
309 | #ifndef __REG_NOCHAR | |
310 | int re_comp _ANSI_ARGS_((regex_t *, __REG_CONST char *, size_t, int)); | |
311 | #endif | |
312 | #ifndef __REG_NOFRONT | |
313 | int regcomp _ANSI_ARGS_((regex_t *, __REG_CONST char *, int)); | |
314 | #endif | |
315 | #ifdef __REG_WIDE_T | |
316 | int __REG_WIDE_COMPILE _ANSI_ARGS_((regex_t *, __REG_CONST __REG_WIDE_T *, size_t, int)); | |
317 | #endif | |
318 | #ifndef __REG_NOCHAR | |
319 | int re_exec _ANSI_ARGS_((regex_t *, __REG_CONST char *, size_t, rm_detail_t *, size_t, regmatch_t [], int)); | |
320 | #endif | |
321 | #ifndef __REG_NOFRONT | |
322 | int regexec _ANSI_ARGS_((regex_t *, __REG_CONST char *, size_t, regmatch_t [], int)); | |
323 | #endif | |
324 | #ifdef __REG_WIDE_T | |
325 | int __REG_WIDE_EXEC _ANSI_ARGS_((regex_t *, __REG_CONST __REG_WIDE_T *, size_t, rm_detail_t *, size_t, regmatch_t [], int)); | |
326 | #endif | |
327 | re_void regfree _ANSI_ARGS_((regex_t *)); | |
328 | extern size_t regerror _ANSI_ARGS_((int, __REG_CONST regex_t *, char *, size_t)); | |
329 | /* automatically gathered by fwd; do not hand-edit */ | |
330 | /* =====^!^===== end forwards =====^!^===== */ | |
652bbafa | 331 | |
3ca4086b VS |
332 | |
333 | ||
334 | /* | |
335 | * more C++ voodoo | |
336 | */ | |
652bbafa VZ |
337 | #ifdef __cplusplus |
338 | } | |
339 | #endif | |
d37acbdf | 340 | |
3ca4086b VS |
341 | |
342 | ||
343 | #endif |