Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/tcl8.5.2/generic/regex.h @ 42

Last change on this file since 42 was 25, checked in by landauf, 17 years ago

added tcl to libs

File size: 10.9 KB
Line 
1#ifndef _REGEX_H_
2#define _REGEX_H_       /* never again */
3/*
4 * regular expressions
5 *
6 * Copyright (c) 1998, 1999 Henry Spencer.  All rights reserved.
7 *
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
11 * thanks all of them.
12 *
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 of
19 * software which uses it, but that is not a requirement.
20 *
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 *
32 *
33 * Prototypes etc. marked with "^" within comments get gathered up (and
34 * possibly edited) by the regfwd program and inserted near the bottom of this
35 * file.
36 *
37 * We offer the option of declaring one wide-character version of the RE
38 * functions as well as the char versions. To do that, define __REG_WIDE_T to
39 * the type of wide characters (unfortunately, there is no consensus that
40 * wchar_t is suitable) and __REG_WIDE_COMPILE and __REG_WIDE_EXEC to the
41 * names to be used for the compile and execute functions (suggestion:
42 * re_Xcomp and re_Xexec, where X is a letter suggestive of the wide type,
43 * e.g. re_ucomp and re_uexec for Unicode). For cranky old compilers, it may
44 * be necessary to do something like:
45 * #define      __REG_WIDE_COMPILE(a,b,c,d)     re_Xcomp(a,b,c,d)
46 * #define      __REG_WIDE_EXEC(a,b,c,d,e,f,g)  re_Xexec(a,b,c,d,e,f,g)
47 * rather than just #defining the names as parameterless macros.
48 *
49 * For some specialized purposes, it may be desirable to suppress the
50 * declarations of the "front end" functions, regcomp() and regexec(), or of
51 * the char versions of the compile and execute functions. To suppress the
52 * front-end functions, define __REG_NOFRONT. To suppress the char versions,
53 * define __REG_NOCHAR.
54 *
55 * The right place to do those defines (and some others you may want, see
56 * below) would be <sys/types.h>. If you don't have control of that file, the
57 * right place to add your own defines to this file is marked below. This is
58 * normally done automatically, by the makefile and regmkhdr, based on the
59 * contents of regcustom.h.
60 */
61
62/*
63 * voodoo for C++
64 */
65#ifdef __cplusplus
66extern "C" {
67#endif
68
69/*
70 * Add your own defines, if needed, here.
71 */
72
73/*
74 * Location where a chunk of regcustom.h is automatically spliced into this
75 * file (working from its prototype, regproto.h).
76 */
77
78/* --- begin --- */
79/* ensure certain things don't sneak in from system headers */
80#ifdef __REG_WIDE_T
81#undef __REG_WIDE_T
82#endif
83#ifdef __REG_WIDE_COMPILE
84#undef __REG_WIDE_COMPILE
85#endif
86#ifdef __REG_WIDE_EXEC
87#undef __REG_WIDE_EXEC
88#endif
89#ifdef __REG_REGOFF_T
90#undef __REG_REGOFF_T
91#endif
92#ifdef __REG_VOID_T
93#undef __REG_VOID_T
94#endif
95#ifdef __REG_CONST
96#undef __REG_CONST
97#endif
98#ifdef __REG_NOFRONT
99#undef __REG_NOFRONT
100#endif
101#ifdef __REG_NOCHAR
102#undef __REG_NOCHAR
103#endif
104/* interface types */
105#define __REG_WIDE_T    Tcl_UniChar
106#define __REG_REGOFF_T  long    /* not really right, but good enough... */
107#define __REG_VOID_T    VOID
108#define __REG_CONST     CONST
109/* names and declarations */
110#define __REG_WIDE_COMPILE      TclReComp
111#define __REG_WIDE_EXEC         TclReExec
112#define __REG_NOFRONT           /* don't want regcomp() and regexec() */
113#define __REG_NOCHAR            /* or the char versions */
114#define regfree         TclReFree
115#define regerror        TclReError
116/* --- end --- */
117
118/*
119 * interface types etc.
120 */
121
122/*
123 * regoff_t has to be large enough to hold either off_t or ssize_t, and must
124 * be signed; it's only a guess that long is suitable, so we offer
125 * <sys/types.h> an override.
126 */
127#ifdef __REG_REGOFF_T
128typedef __REG_REGOFF_T regoff_t;
129#else
130typedef long regoff_t;
131#endif
132
133/*
134 * For benefit of old compilers, we offer <sys/types.h> the option of
135 * overriding the `void' type used to declare nonexistent return types.
136 */
137#ifdef __REG_VOID_T
138typedef __REG_VOID_T re_void;
139#else
140typedef void re_void;
141#endif
142
143/*
144 * Also for benefit of old compilers, <sys/types.h> can supply a macro which
145 * expands to a substitute for `const'.
146 */
147#ifndef __REG_CONST
148#define __REG_CONST     const
149#endif
150
151
152
153/*
154 * other interface types
155 */
156
157/* the biggie, a compiled RE (or rather, a front end to same) */
158typedef struct {
159    int re_magic;               /* magic number */
160    size_t re_nsub;             /* number of subexpressions */
161    long re_info;               /* information about RE */
162#define REG_UBACKREF            000001
163#define REG_ULOOKAHEAD          000002
164#define REG_UBOUNDS             000004
165#define REG_UBRACES             000010
166#define REG_UBSALNUM            000020
167#define REG_UPBOTCH             000040
168#define REG_UBBS                000100
169#define REG_UNONPOSIX           000200
170#define REG_UUNSPEC             000400
171#define REG_UUNPORT             001000
172#define REG_ULOCALE             002000
173#define REG_UEMPTYMATCH         004000
174#define REG_UIMPOSSIBLE         010000
175#define REG_USHORTEST           020000
176    int re_csize;               /* sizeof(character) */
177    char *re_endp;              /* backward compatibility kludge */
178    /* the rest is opaque pointers to hidden innards */
179    char *re_guts;              /* `char *' is more portable than `void *' */
180    char *re_fns;
181} regex_t;
182
183/* result reporting (may acquire more fields later) */
184typedef struct {
185    regoff_t rm_so;             /* start of substring */
186    regoff_t rm_eo;             /* end of substring */
187} regmatch_t;
188
189/* supplementary control and reporting */
190typedef struct {
191    regmatch_t rm_extend;       /* see REG_EXPECT */
192} rm_detail_t;
193
194/*
195 * compilation
196 ^ #ifndef __REG_NOCHAR
197 ^ int re_comp(regex_t *, __REG_CONST char *, size_t, int);
198 ^ #endif
199 ^ #ifndef __REG_NOFRONT
200 ^ int regcomp(regex_t *, __REG_CONST char *, int);
201 ^ #endif
202 ^ #ifdef __REG_WIDE_T
203 ^ int __REG_WIDE_COMPILE(regex_t *, __REG_CONST __REG_WIDE_T *, size_t, int);
204 ^ #endif
205 */
206#define REG_BASIC       000000  /* BREs (convenience) */
207#define REG_EXTENDED    000001  /* EREs */
208#define REG_ADVF        000002  /* advanced features in EREs */
209#define REG_ADVANCED    000003  /* AREs (which are also EREs) */
210#define REG_QUOTE       000004  /* no special characters, none */
211#define REG_NOSPEC      REG_QUOTE       /* historical synonym */
212#define REG_ICASE       000010  /* ignore case */
213#define REG_NOSUB       000020  /* don't care about subexpressions */
214#define REG_EXPANDED    000040  /* expanded format, white space & comments */
215#define REG_NLSTOP      000100  /* \n doesn't match . or [^ ] */
216#define REG_NLANCH      000200  /* ^ matches after \n, $ before */
217#define REG_NEWLINE     000300  /* newlines are line terminators */
218#define REG_PEND        000400  /* ugh -- backward-compatibility hack */
219#define REG_EXPECT      001000  /* report details on partial/limited matches */
220#define REG_BOSONLY     002000  /* temporary kludge for BOS-only matches */
221#define REG_DUMP        004000  /* none of your business :-) */
222#define REG_FAKE        010000  /* none of your business :-) */
223#define REG_PROGRESS    020000  /* none of your business :-) */
224
225/*
226 * execution
227 ^ #ifndef __REG_NOCHAR
228 ^ int re_exec(regex_t *, __REG_CONST char *, size_t,
229 ^                              rm_detail_t *, size_t, regmatch_t [], int);
230 ^ #endif
231 ^ #ifndef __REG_NOFRONT
232 ^ int regexec(regex_t *, __REG_CONST char *, size_t, regmatch_t [], int);
233 ^ #endif
234 ^ #ifdef __REG_WIDE_T
235 ^ int __REG_WIDE_EXEC(regex_t *, __REG_CONST __REG_WIDE_T *, size_t,
236 ^                              rm_detail_t *, size_t, regmatch_t [], int);
237 ^ #endif
238 */
239#define REG_NOTBOL      0001    /* BOS is not BOL */
240#define REG_NOTEOL      0002    /* EOS is not EOL */
241#define REG_STARTEND    0004    /* backward compatibility kludge */
242#define REG_FTRACE      0010    /* none of your business */
243#define REG_MTRACE      0020    /* none of your business */
244#define REG_SMALL       0040    /* none of your business */
245
246/*
247 * misc generics (may be more functions here eventually)
248 ^ re_void regfree(regex_t *);
249 */
250
251/*
252 * error reporting
253 * Be careful if modifying the list of error codes -- the table used by
254 * regerror() is generated automatically from this file!
255 *
256 * Note that there is no wide-char variant of regerror at this time; what kind
257 * of character is used for error reports is independent of what kind is used
258 * in matching.
259 *
260 ^ extern size_t regerror(int, __REG_CONST regex_t *, char *, size_t);
261 */
262#define REG_OKAY         0      /* no errors detected */
263#define REG_NOMATCH      1      /* failed to match */
264#define REG_BADPAT       2      /* invalid regexp */
265#define REG_ECOLLATE     3      /* invalid collating element */
266#define REG_ECTYPE       4      /* invalid character class */
267#define REG_EESCAPE      5      /* invalid escape \ sequence */
268#define REG_ESUBREG      6      /* invalid backreference number */
269#define REG_EBRACK       7      /* brackets [] not balanced */
270#define REG_EPAREN       8      /* parentheses () not balanced */
271#define REG_EBRACE       9      /* braces {} not balanced */
272#define REG_BADBR       10      /* invalid repetition count(s) */
273#define REG_ERANGE      11      /* invalid character range */
274#define REG_ESPACE      12      /* out of memory */
275#define REG_BADRPT      13      /* quantifier operand invalid */
276#define REG_ASSERT      15      /* "can't happen" -- you found a bug */
277#define REG_INVARG      16      /* invalid argument to regex function */
278#define REG_MIXED       17      /* character widths of regex and string differ */
279#define REG_BADOPT      18      /* invalid embedded option */
280#define REG_ETOOBIG     19      /* nfa has too many states */
281/* two specials for debugging and testing */
282#define REG_ATOI        101     /* convert error-code name to number */
283#define REG_ITOA        102     /* convert error-code number to name */
284
285/*
286 * the prototypes, as possibly munched by regfwd
287 */
288/* =====^!^===== begin forwards =====^!^===== */
289/* automatically gathered by fwd; do not hand-edit */
290/* === regproto.h === */
291#ifndef __REG_NOCHAR
292int re_comp(regex_t *, __REG_CONST char *, size_t, int);
293#endif
294#ifndef __REG_NOFRONT
295int regcomp(regex_t *, __REG_CONST char *, int);
296#endif
297#ifdef __REG_WIDE_T
298MODULE_SCOPE int __REG_WIDE_COMPILE(regex_t *, __REG_CONST __REG_WIDE_T *, size_t, int);
299#endif
300#ifndef __REG_NOCHAR
301int re_exec(regex_t *, __REG_CONST char *, size_t, rm_detail_t *, size_t, regmatch_t [], int);
302#endif
303#ifndef __REG_NOFRONT
304int regexec(regex_t *, __REG_CONST char *, size_t, regmatch_t [], int);
305#endif
306#ifdef __REG_WIDE_T
307MODULE_SCOPE int __REG_WIDE_EXEC(regex_t *, __REG_CONST __REG_WIDE_T *, size_t, rm_detail_t *, size_t, regmatch_t [], int);
308#endif
309MODULE_SCOPE re_void regfree(regex_t *);
310MODULE_SCOPE size_t regerror(int, __REG_CONST regex_t *, char *, size_t);
311/* automatically gathered by fwd; do not hand-edit */
312/* =====^!^===== end forwards =====^!^===== */
313
314/*
315 * more C++ voodoo
316 */
317#ifdef __cplusplus
318}
319#endif
320
321#endif
Note: See TracBrowser for help on using the repository browser.