]> git.saurik.com Git - apple/libc.git/blame_incremental - regex/TRE/lib/tre.h
Libc-1439.100.3.tar.gz
[apple/libc.git] / regex / TRE / lib / tre.h
... / ...
CommitLineData
1/*
2 tre.h - TRE public API definitions
3
4 This software is released under a BSD-style license.
5 See the file LICENSE for details and copyright.
6
7*/
8
9#ifndef TRE_H
10#define TRE_H 1
11
12#include "tre-config.h"
13
14#ifdef HAVE_SYS_TYPES_H
15#include <sys/types.h>
16#endif /* HAVE_SYS_TYPES_H */
17
18#ifdef HAVE_LIBUTF8_H
19#include <libutf8.h>
20#endif /* HAVE_LIBUTF8_H */
21
22#ifdef TRE_USE_SYSTEM_REGEX_H
23/* Include the system regex.h to make TRE ABI compatible with the
24 system regex. */
25#include TRE_SYSTEM_REGEX_H_PATH
26#define tre_regcomp regcomp
27#define tre_regexec regexec
28#define tre_regerror regerror
29#define tre_regfree regfree
30
31#ifdef TRE_APPROX
32#define tre_regaexec regaexec
33#define tre_reganexec reganexec
34#define tre_regawexec regawexec
35#define tre_regawnexec regawnexec
36#endif /* TRE_APPROX */
37#define tre_regncomp regncomp
38#define tre_regnexec regnexec
39#define tre_regwcomp regwcomp
40#define tre_regwexec regwexec
41#define tre_regwncomp regwncomp
42#define tre_regwnexec regwnexec
43
44#define tre_regcomp_l regcomp_l
45#define tre_regncomp_l regncomp_l
46#define tre_regwcomp_l regwcomp_l
47#define tre_regwncomp_l regwncomp_l
48#endif /* TRE_USE_SYSTEM_REGEX_H */
49
50#ifdef __cplusplus
51extern "C" {
52#endif
53
54#ifdef TRE_USE_SYSTEM_REGEX_H
55
56#ifndef REG_OK
57#define REG_OK 0
58#endif /* !REG_OK */
59
60#ifndef HAVE_REG_ERRCODE_T
61typedef int reg_errcode_t;
62#endif /* !HAVE_REG_ERRCODE_T */
63
64#if !defined(REG_NOSPEC) && !defined(REG_LITERAL)
65#define REG_LITERAL 0x1000
66#endif
67
68/* Extra tre_regcomp() flags. */
69#ifndef REG_BASIC
70#define REG_BASIC 0
71#endif /* !REG_BASIC */
72#if 0
73#define REG_LEFT_ASSOC (REG_LITERAL << 1)
74#define REG_UNGREEDY (REG_LEFT_ASSOC << 1)
75
76/* Extra tre_regexec() flags. */
77#define REG_APPROX_MATCHER 0x1000
78#define REG_BACKTRACKING_MATCHER (REG_APPROX_MATCHER << 1)
79#endif
80
81#define RE_MAGIC ((('r'^0200)<<8) | 'e')
82
83#else /* !TRE_USE_SYSTEM_REGEX_H */
84
85/* If the we're not using system regex.h, we need to define the
86 structs and enums ourselves. */
87
88typedef int regoff_t;
89typedef struct {
90 size_t re_nsub; /* Number of parenthesized subexpressions. */
91 const void *re_endp; /* regex string end pointer (REG_PEND) */
92 void *value; /* For internal use only. */
93} regex_t;
94
95typedef struct {
96 regoff_t rm_so;
97 regoff_t rm_eo;
98} regmatch_t;
99
100
101typedef enum {
102 REG_OK = 0, /* No error. */
103 /* POSIX tre_regcomp() return error codes. (In the order listed in the
104 standard.) */
105 REG_NOMATCH, /* No match. */
106 REG_BADPAT, /* Invalid regexp. */
107 REG_ECOLLATE, /* Unknown collating element. */
108 REG_ECTYPE, /* Unknown character class name. */
109 REG_EESCAPE, /* Trailing backslash. */
110 REG_ESUBREG, /* Invalid back reference. */
111 REG_EBRACK, /* "[]" imbalance */
112 REG_EPAREN, /* "\(\)" or "()" imbalance */
113 REG_EBRACE, /* "\{\}" or "{}" imbalance */
114 REG_BADBR, /* Invalid content of {} */
115 REG_ERANGE, /* Invalid use of range operator */
116 REG_ESPACE, /* Out of memory. */
117 REG_BADRPT, /* Invalid use of repetition operators. */
118 REG_INVARG, /* Invalid argument, e.g. negative-length string */
119 REG_ILLSEQ, /* illegal byte sequence (bad multibyte character) */
120} reg_errcode_t;
121
122/* POSIX tre_regcomp() flags. */
123#define REG_EXTENDED 1
124#define REG_ICASE (REG_EXTENDED << 1)
125#define REG_NEWLINE (REG_ICASE << 1)
126#define REG_NOSUB (REG_NEWLINE << 1)
127
128/* Extra tre_regcomp() flags. */
129#define REG_BASIC 0
130#define REG_LITERAL (REG_NOSUB << 1)
131#define REG_LEFT_ASSOC (REG_LITERAL << 1)
132#define REG_UNGREEDY (REG_LEFT_ASSOC << 1)
133#define REG_PEND (REG_UNGREEDY << 1)
134
135/* POSIX tre_regexec() flags. */
136#define REG_NOTBOL 1
137#define REG_NOTEOL (REG_NOTBOL << 1)
138
139/* Extra tre_regexec() flags. */
140#define REG_APPROX_MATCHER (REG_NOTEOL << 1)
141#define REG_BACKTRACKING_MATCHER (REG_APPROX_MATCHER << 1)
142#define REG_STARTEND (REG_BACKTRACKING_MATCHER << 1)
143
144#endif /* !TRE_USE_SYSTEM_REGEX_H */
145
146/* REG_NOSPEC and REG_LITERAL mean the same thing. */
147#if defined(REG_LITERAL) && !defined(REG_NOSPEC)
148#define REG_NOSPEC REG_LITERAL
149#elif defined(REG_NOSPEC) && !defined(REG_LITERAL)
150#define REG_LITERAL REG_NOSPEC
151#endif /* defined(REG_NOSPEC) */
152
153/* The maximum number of iterations in a bound expression. */
154#undef RE_DUP_MAX
155#define RE_DUP_MAX 255
156
157/* The POSIX.2 regexp functions */
158extern int
159tre_regcomp(regex_t * __restrict preg, const char * __restrict regex, int cflags);
160
161extern int
162tre_regexec(const regex_t * __restrict preg, const char * __restrict string, size_t nmatch,
163 regmatch_t pmatch[ __restrict ], int eflags);
164
165extern size_t
166tre_regerror(int errcode, const regex_t * __restrict preg, char * __restrict errbuf,
167 size_t errbuf_size);
168
169extern void
170tre_regfree(regex_t *preg);
171
172#ifdef TRE_WCHAR
173#ifdef HAVE_WCHAR_H
174#include <wchar.h>
175#endif /* HAVE_WCHAR_H */
176
177/* Wide character versions (not in POSIX.2). */
178extern int
179tre_regwcomp(regex_t * __restrict preg, const wchar_t * __restrict regex, int cflags);
180
181extern int
182tre_regwexec(const regex_t * __restrict preg, const wchar_t * __restrict string,
183 size_t nmatch, regmatch_t pmatch[ __restrict ], int eflags);
184#endif /* TRE_WCHAR */
185
186/* Versions with a maximum length argument and therefore the capability to
187 handle null characters in the middle of the strings (not in POSIX.2). */
188extern int
189tre_regncomp(regex_t * __restrict preg, const char * __restrict regex, size_t len, int cflags);
190
191extern int
192tre_regnexec(const regex_t * __restrict preg, const char * __restrict string, size_t len,
193 size_t nmatch, regmatch_t pmatch[ __restrict ], int eflags);
194
195#ifdef TRE_WCHAR
196extern int
197tre_regwncomp(regex_t * __restrict preg, const wchar_t * __restrict regex, size_t len, int cflags);
198
199extern int
200tre_regwnexec(const regex_t * __restrict preg, const wchar_t * __restrict string, size_t len,
201 size_t nmatch, regmatch_t pmatch[ __restrict ], int eflags);
202#endif /* TRE_WCHAR */
203
204/* Extended locale versions */
205#include <xlocale.h>
206
207extern int
208tre_regcomp_l(regex_t * __restrict preg, const char * __restrict regex, int cflags, locale_t __restrict loc);
209
210#ifdef TRE_WCHAR
211extern int
212tre_regwcomp_l(regex_t * __restrict preg, const wchar_t * __restrict regex, int cflags, locale_t __restrict loc);
213#endif /* TRE_WCHAR */
214
215extern int
216tre_regncomp_l(regex_t * __restrict preg, const char * __restrict regex, size_t len, int cflags, locale_t __restrict loc);
217
218#ifdef TRE_WCHAR
219extern int
220tre_regwncomp_l(regex_t * __restrict preg, const wchar_t * __restrict regex, size_t len, int cflags, locale_t __restrict loc);
221#endif /* TRE_WCHAR */
222
223#ifdef TRE_APPROX
224
225/* Approximate matching parameter struct. */
226typedef struct {
227 int cost_ins; /* Default cost of an inserted character. */
228 int cost_del; /* Default cost of a deleted character. */
229 int cost_subst; /* Default cost of a substituted character. */
230 int max_cost; /* Maximum allowed cost of a match. */
231
232 int max_ins; /* Maximum allowed number of inserts. */
233 int max_del; /* Maximum allowed number of deletes. */
234 int max_subst; /* Maximum allowed number of substitutes. */
235 int max_err; /* Maximum allowed number of errors total. */
236} regaparams_t;
237
238/* Approximate matching result struct. */
239typedef struct {
240 size_t nmatch; /* Length of pmatch[] array. */
241 regmatch_t *pmatch; /* Submatch data. */
242 int cost; /* Cost of the match. */
243 int num_ins; /* Number of inserts in the match. */
244 int num_del; /* Number of deletes in the match. */
245 int num_subst; /* Number of substitutes in the match. */
246} regamatch_t;
247
248
249/* Approximate matching functions. */
250extern int
251tre_regaexec(const regex_t * __restrict preg, const char * __restrict string,
252 regamatch_t * __restrict match, regaparams_t params, int eflags);
253
254extern int
255tre_reganexec(const regex_t * __restrict preg, const char * __restrict string, size_t len,
256 regamatch_t * __restrict match, regaparams_t params, int eflags);
257#ifdef TRE_WCHAR
258/* Wide character approximate matching. */
259extern int
260tre_regawexec(const regex_t * __restrict preg, const wchar_t * __restrict string,
261 regamatch_t * __restrict match, regaparams_t params, int eflags);
262
263extern int
264tre_regawnexec(const regex_t * __restrict preg, const wchar_t * __restrict string, size_t len,
265 regamatch_t * __restrict match, regaparams_t params, int eflags);
266#endif /* TRE_WCHAR */
267
268/* Sets the parameters to default values. */
269extern void
270tre_regaparams_default(regaparams_t *params);
271#endif /* TRE_APPROX */
272
273#ifdef TRE_WCHAR
274typedef wchar_t tre_char_t;
275#else /* !TRE_WCHAR */
276typedef unsigned char tre_char_t;
277#endif /* !TRE_WCHAR */
278
279#ifdef TRE_STR_USER
280typedef struct {
281 int (*get_next_char)(tre_char_t *c, unsigned int *pos_add, void *context);
282 void (*rewind)(size_t pos, void *context);
283 int (*compare)(size_t pos1, size_t pos2, size_t len, void *context);
284 void *context;
285} tre_str_source;
286
287extern int
288tre_reguexec(const regex_t * __restrict preg, const tre_str_source * __restrict string,
289 size_t nmatch, regmatch_t pmatch[ __restrict ], int eflags);
290#endif /* TRE_STR_USER */
291
292#ifndef __LIBC__
293/* Returns the version string. The returned string is static. */
294extern char *
295tre_version(void);
296
297/* Returns the value for a config parameter. The type to which `result'
298 must point to depends of the value of `query', see documentation for
299 more details. */
300extern int
301tre_config(int query, void *result);
302
303enum {
304 TRE_CONFIG_APPROX,
305 TRE_CONFIG_WCHAR,
306 TRE_CONFIG_MULTIBYTE,
307 TRE_CONFIG_SYSTEM_ABI,
308 TRE_CONFIG_VERSION
309};
310
311/* Returns 1 if the compiled pattern has back references, 0 if not. */
312extern int
313tre_have_backrefs(const regex_t *preg);
314
315#ifdef TRE_APPROX
316/* Returns 1 if the compiled pattern uses approximate matching features,
317 0 if not. */
318extern int
319tre_have_approx(const regex_t *preg);
320#endif /* TRE_APPROX */
321#endif /* !__LIBC__ */
322
323#ifdef __cplusplus
324}
325#endif
326#endif /* TRE_H */
327
328/* EOF */