1*63d4abf0Sagc /*
2*63d4abf0Sagc retest.c - TRE regression test program
3*63d4abf0Sagc
4*63d4abf0Sagc This software is released under a BSD-style license.
5*63d4abf0Sagc See the file LICENSE for details and copyright.
6*63d4abf0Sagc
7*63d4abf0Sagc */
8*63d4abf0Sagc
9*63d4abf0Sagc /*
10*63d4abf0Sagc This is just a simple test application containing various hands-written
11*63d4abf0Sagc tests for regression testing TRE. I've tried to surround TRE specific
12*63d4abf0Sagc tests inside ifdefs, so this can be used to test any POSIX compatible
13*63d4abf0Sagc regexp implementation.
14*63d4abf0Sagc */
15*63d4abf0Sagc
16*63d4abf0Sagc #ifdef HAVE_CONFIG_H
17*63d4abf0Sagc #include <config.h>
18*63d4abf0Sagc #endif /* HAVE_CONFIG_H */
19*63d4abf0Sagc
20*63d4abf0Sagc #include <stdlib.h>
21*63d4abf0Sagc #include <stdio.h>
22*63d4abf0Sagc #include <stdarg.h>
23*63d4abf0Sagc #include <string.h>
24*63d4abf0Sagc #include <sys/types.h>
25*63d4abf0Sagc #include <locale.h>
26*63d4abf0Sagc #ifdef HAVE_MALLOC_H
27*63d4abf0Sagc #include <malloc.h>
28*63d4abf0Sagc #endif /* HAVE_MALLOC_H */
29*63d4abf0Sagc #include <regex.h>
30*63d4abf0Sagc
31*63d4abf0Sagc #ifdef TRE_VERSION
32*63d4abf0Sagc #define HAVE_REGNEXEC 1
33*63d4abf0Sagc #define HAVE_REGNCOMP 1
34*63d4abf0Sagc #include "xmalloc.h"
35*63d4abf0Sagc #else /* !TRE_VERSION */
36*63d4abf0Sagc #define xmalloc malloc
37*63d4abf0Sagc #define xfree free
38*63d4abf0Sagc #endif /* !TRE_VERSION */
39*63d4abf0Sagc #include "tre-internal.h"
40*63d4abf0Sagc
41*63d4abf0Sagc #ifdef WRETEST
42*63d4abf0Sagc #include <wchar.h>
43*63d4abf0Sagc #define CHAR_T wchar_t
44*63d4abf0Sagc #define L(x) (L ## x)
45*63d4abf0Sagc
46*63d4abf0Sagc #define MAXSTRSIZE 1024
47*63d4abf0Sagc static wchar_t wstr[MAXSTRSIZE];
48*63d4abf0Sagc static wchar_t wregex[MAXSTRSIZE];
49*63d4abf0Sagc static int woffs[MAXSTRSIZE];
50*63d4abf0Sagc
51*63d4abf0Sagc #define tre_regexec tre_regwexec
52*63d4abf0Sagc #define tre_regnexec tre_regwnexec
53*63d4abf0Sagc #define tre_regcomp tre_regwcomp
54*63d4abf0Sagc #define tre_regncomp tre_regwncomp
55*63d4abf0Sagc
56*63d4abf0Sagc /* Iterate mbrtowc over the multi-byte sequence STR of length LEN,
57*63d4abf0Sagc store the result in BUF and memoize the successive byte offsets
58*63d4abf0Sagc in OFF. */
59*63d4abf0Sagc
60*63d4abf0Sagc static int
mbntowc(wchar_t * buf,const char * str,size_t len,int * off)61*63d4abf0Sagc mbntowc (wchar_t *buf, const char *str, size_t len, int *off)
62*63d4abf0Sagc {
63*63d4abf0Sagc int n, wlen;
64*63d4abf0Sagc #ifdef HAVE_MBSTATE_T
65*63d4abf0Sagc mbstate_t cst;
66*63d4abf0Sagc memset(&cst, 0, sizeof(cst));
67*63d4abf0Sagc #endif
68*63d4abf0Sagc
69*63d4abf0Sagc if (len >= MAXSTRSIZE)
70*63d4abf0Sagc {
71*63d4abf0Sagc fprintf(stderr, "Increase MAXSTRSIZE to %ld or more and recompile!\n",
72*63d4abf0Sagc (long)len + 1);
73*63d4abf0Sagc exit(EXIT_FAILURE);
74*63d4abf0Sagc }
75*63d4abf0Sagc
76*63d4abf0Sagc if (off)
77*63d4abf0Sagc {
78*63d4abf0Sagc memset(off + 1, -1, len * sizeof(int));
79*63d4abf0Sagc *off = 0;
80*63d4abf0Sagc }
81*63d4abf0Sagc
82*63d4abf0Sagc wlen = 0;
83*63d4abf0Sagc while (len > 0)
84*63d4abf0Sagc {
85*63d4abf0Sagc n = tre_mbrtowc(buf ? buf++ : NULL, str, len, &cst);
86*63d4abf0Sagc if (n < 0)
87*63d4abf0Sagc return n;
88*63d4abf0Sagc if (n == 0)
89*63d4abf0Sagc n = 1;
90*63d4abf0Sagc str += n;
91*63d4abf0Sagc len -= n;
92*63d4abf0Sagc wlen += 1;
93*63d4abf0Sagc if (off)
94*63d4abf0Sagc *(off += n) = wlen;
95*63d4abf0Sagc }
96*63d4abf0Sagc
97*63d4abf0Sagc return(wlen);
98*63d4abf0Sagc }
99*63d4abf0Sagc
100*63d4abf0Sagc #else /* !WRETEST */
101*63d4abf0Sagc #define CHAR_T char
102*63d4abf0Sagc #define L(x) (x)
103*63d4abf0Sagc #endif /* !WRETEST */
104*63d4abf0Sagc
105*63d4abf0Sagc static int valid_reobj = 0;
106*63d4abf0Sagc static regex_t reobj;
107*63d4abf0Sagc static regmatch_t pmatch_global[32];
108*63d4abf0Sagc static const CHAR_T *regex_pattern;
109*63d4abf0Sagc static int cflags_global;
110*63d4abf0Sagc static int use_regnexec = 0;
111*63d4abf0Sagc static int use_regncomp = 0;
112*63d4abf0Sagc static int avoid_eflags = 0;
113*63d4abf0Sagc
114*63d4abf0Sagc static int comp_tests = 0;
115*63d4abf0Sagc static int exec_tests = 0;
116*63d4abf0Sagc static int comp_errors = 0;
117*63d4abf0Sagc static int exec_errors = 0;
118*63d4abf0Sagc
119*63d4abf0Sagc #ifndef REG_OK
120*63d4abf0Sagc #define REG_OK 0
121*63d4abf0Sagc #endif /* REG_OK */
122*63d4abf0Sagc
123*63d4abf0Sagc #define END -2
124*63d4abf0Sagc
125*63d4abf0Sagc static void
test_status(char c)126*63d4abf0Sagc test_status(char c)
127*63d4abf0Sagc {
128*63d4abf0Sagc static int k = 0;
129*63d4abf0Sagc printf("%c", c);
130*63d4abf0Sagc if (++k % 79 == 0)
131*63d4abf0Sagc printf("\n");
132*63d4abf0Sagc fflush(stdout);
133*63d4abf0Sagc }
134*63d4abf0Sagc
135*63d4abf0Sagc
136*63d4abf0Sagc static int
wrap_regexec(const CHAR_T * data,size_t len,size_t pmatch_len,regmatch_t * pmatch,int eflags)137*63d4abf0Sagc wrap_regexec(const CHAR_T *data, size_t len,
138*63d4abf0Sagc size_t pmatch_len, regmatch_t *pmatch, int eflags)
139*63d4abf0Sagc {
140*63d4abf0Sagc CHAR_T *buf = NULL;
141*63d4abf0Sagc int result;
142*63d4abf0Sagc
143*63d4abf0Sagc if (len == 0 && use_regnexec)
144*63d4abf0Sagc {
145*63d4abf0Sagc /* Zero length string and using tre_regnexec(), the pointer we give
146*63d4abf0Sagc should not be dereferenced at all. */
147*63d4abf0Sagc buf = NULL;
148*63d4abf0Sagc }
149*63d4abf0Sagc else
150*63d4abf0Sagc {
151*63d4abf0Sagc /* Copy the data to a separate buffer to make a better test for
152*63d4abf0Sagc tre_regexec() and tre_regnexec(). */
153*63d4abf0Sagc buf = xmalloc((len + !use_regnexec) * sizeof(CHAR_T));
154*63d4abf0Sagc if (!buf)
155*63d4abf0Sagc return REG_ESPACE;
156*63d4abf0Sagc memcpy(buf, data, len * sizeof(CHAR_T));
157*63d4abf0Sagc test_status('#');
158*63d4abf0Sagc }
159*63d4abf0Sagc
160*63d4abf0Sagc #ifdef HAVE_REGNEXEC
161*63d4abf0Sagc if (use_regnexec)
162*63d4abf0Sagc {
163*63d4abf0Sagc if (len == 0)
164*63d4abf0Sagc result = tre_regnexec(&reobj, NULL, len, pmatch_len, pmatch, eflags);
165*63d4abf0Sagc else
166*63d4abf0Sagc result = tre_regnexec(&reobj, buf, len, pmatch_len, pmatch, eflags);
167*63d4abf0Sagc }
168*63d4abf0Sagc else
169*63d4abf0Sagc #endif /* HAVE_REGNEXEC */
170*63d4abf0Sagc {
171*63d4abf0Sagc buf[len] = L('\0');
172*63d4abf0Sagc result = tre_regexec(&reobj, buf, pmatch_len, pmatch, eflags);
173*63d4abf0Sagc }
174*63d4abf0Sagc
175*63d4abf0Sagc xfree(buf);
176*63d4abf0Sagc return result;
177*63d4abf0Sagc }
178*63d4abf0Sagc
179*63d4abf0Sagc static int
wrap_regcomp(regex_t * preg,const CHAR_T * data,size_t len,int cflags)180*63d4abf0Sagc wrap_regcomp(regex_t *preg, const CHAR_T *data, size_t len, int cflags)
181*63d4abf0Sagc {
182*63d4abf0Sagc #ifdef HAVE_REGNCOMP
183*63d4abf0Sagc if (use_regncomp)
184*63d4abf0Sagc return tre_regncomp(preg, data, len, cflags);
185*63d4abf0Sagc else
186*63d4abf0Sagc return tre_regcomp(preg, data, cflags);
187*63d4abf0Sagc #else /* !HAVE_REGNCOMP */
188*63d4abf0Sagc fprintf(stderr, "%s\n", data);
189*63d4abf0Sagc return tre_regcomp(preg, data, cflags);
190*63d4abf0Sagc #endif /* !HAVE_REGNCOMP */
191*63d4abf0Sagc }
192*63d4abf0Sagc
193*63d4abf0Sagc static int
execute(const CHAR_T * data,int len,size_t pmatch_len,regmatch_t * pmatch,int eflags)194*63d4abf0Sagc execute(const CHAR_T *data, int len, size_t pmatch_len, regmatch_t *pmatch,
195*63d4abf0Sagc int eflags)
196*63d4abf0Sagc {
197*63d4abf0Sagc #ifdef MALLOC_DEBUGGING
198*63d4abf0Sagc int i = 0;
199*63d4abf0Sagc int ret;
200*63d4abf0Sagc
201*63d4abf0Sagc while (1)
202*63d4abf0Sagc {
203*63d4abf0Sagc xmalloc_configure(i);
204*63d4abf0Sagc comp_tests++;
205*63d4abf0Sagc ret = wrap_regexec(data, len, pmatch_len, pmatch, eflags);
206*63d4abf0Sagc if (ret != REG_ESPACE)
207*63d4abf0Sagc {
208*63d4abf0Sagc break;
209*63d4abf0Sagc }
210*63d4abf0Sagc #ifdef REGEX_DEBUG
211*63d4abf0Sagc xmalloc_dump_leaks();
212*63d4abf0Sagc #endif /* REGEX_DEBUG */
213*63d4abf0Sagc i++;
214*63d4abf0Sagc }
215*63d4abf0Sagc return ret;
216*63d4abf0Sagc #else /* !MALLOC_DEBUGGING */
217*63d4abf0Sagc return wrap_regexec(data, len, pmatch_len, pmatch, eflags);
218*63d4abf0Sagc #endif /* !MALLOC_DEBUGGING */
219*63d4abf0Sagc }
220*63d4abf0Sagc
221*63d4abf0Sagc static int
check(va_list ap,int ret,const CHAR_T * str,size_t pmatch_len,regmatch_t * pmatch,int eflags)222*63d4abf0Sagc check(va_list ap, int ret, const CHAR_T *str,
223*63d4abf0Sagc size_t pmatch_len, regmatch_t *pmatch, int eflags)
224*63d4abf0Sagc {
225*63d4abf0Sagc int fail = 0;
226*63d4abf0Sagc
227*63d4abf0Sagc if (ret != va_arg(ap, int))
228*63d4abf0Sagc {
229*63d4abf0Sagc #ifndef WRETEST
230*63d4abf0Sagc printf("Exec error, regex: \"%s\", cflags %d, "
231*63d4abf0Sagc "string: \"%s\", eflags %d\n", regex_pattern, cflags_global,
232*63d4abf0Sagc str, eflags);
233*63d4abf0Sagc #else /* WRETEST */
234*63d4abf0Sagc printf("Exec error, regex: \"%ls\", cflags %d, "
235*63d4abf0Sagc "string: \"%ls\", eflags %d\n", regex_pattern, cflags_global,
236*63d4abf0Sagc str, eflags);
237*63d4abf0Sagc #endif /* WRETEST */
238*63d4abf0Sagc printf(" got %smatch (tre_regexec returned %d)\n", ret ? "no " : "", ret);
239*63d4abf0Sagc return 1;
240*63d4abf0Sagc }
241*63d4abf0Sagc
242*63d4abf0Sagc if (ret == 0)
243*63d4abf0Sagc {
244*63d4abf0Sagc unsigned int i;
245*63d4abf0Sagc
246*63d4abf0Sagc for (i = 0; i < pmatch_len; i++)
247*63d4abf0Sagc {
248*63d4abf0Sagc int rm_so, rm_eo;
249*63d4abf0Sagc rm_so = va_arg(ap, int);
250*63d4abf0Sagc if (rm_so == END)
251*63d4abf0Sagc break;
252*63d4abf0Sagc rm_eo = va_arg(ap, int);
253*63d4abf0Sagc #ifdef WRETEST
254*63d4abf0Sagc if (rm_so >= 0)
255*63d4abf0Sagc {
256*63d4abf0Sagc int n = rm_so;
257*63d4abf0Sagc
258*63d4abf0Sagc if ((rm_so = woffs[rm_so]) < 0 ||
259*63d4abf0Sagc (n = rm_eo, rm_eo = woffs[rm_eo]) < 0)
260*63d4abf0Sagc {
261*63d4abf0Sagc printf("Invalid or incomplete multi-byte sequence "
262*63d4abf0Sagc "in string %ls before byte offset %d\n", str, n);
263*63d4abf0Sagc return 1;
264*63d4abf0Sagc }
265*63d4abf0Sagc }
266*63d4abf0Sagc #endif /* WRETEST */
267*63d4abf0Sagc if (pmatch[i].rm_so != rm_so
268*63d4abf0Sagc || pmatch[i].rm_eo != rm_eo)
269*63d4abf0Sagc {
270*63d4abf0Sagc #ifndef WRETEST
271*63d4abf0Sagc printf("Exec error, regex: \"%s\", string: \"%s\"\n",
272*63d4abf0Sagc regex_pattern, str);
273*63d4abf0Sagc printf(" group %d: expected (%d, %d) \"%.*s\", "
274*63d4abf0Sagc "got (%d, %d) \"%.*s\"\n",
275*63d4abf0Sagc #else /* WRETEST */
276*63d4abf0Sagc printf("Exec error, regex: \"%ls\", string: \"%ls\"\n",
277*63d4abf0Sagc regex_pattern, str);
278*63d4abf0Sagc printf(" group %d: expected (%d, %d) \"%.*ls\", "
279*63d4abf0Sagc "got (%d, %d) \"%.*ls\"\n",
280*63d4abf0Sagc #endif /* WRETEST */
281*63d4abf0Sagc i, rm_so, rm_eo, rm_eo - rm_so, str + rm_so,
282*63d4abf0Sagc (int)pmatch[i].rm_so, (int)pmatch[i].rm_eo,
283*63d4abf0Sagc (int)(pmatch[i].rm_eo - pmatch[i].rm_so),
284*63d4abf0Sagc str + pmatch[i].rm_so);
285*63d4abf0Sagc fail = 1;
286*63d4abf0Sagc }
287*63d4abf0Sagc }
288*63d4abf0Sagc
289*63d4abf0Sagc if (!(cflags_global & REG_NOSUB) && reobj.re_nsub != i - 1
290*63d4abf0Sagc && reobj.re_nsub <= pmatch_len && pmatch)
291*63d4abf0Sagc {
292*63d4abf0Sagc #ifndef WRETEST
293*63d4abf0Sagc printf("Comp error, regex: \"%s\"\n", regex_pattern);
294*63d4abf0Sagc #else /* WRETEST */
295*63d4abf0Sagc printf("Comp error, regex: \"%ls\"\n", regex_pattern);
296*63d4abf0Sagc #endif /* WRETEST */
297*63d4abf0Sagc printf(" re_nsub is %d, should be %d\n", (int)reobj.re_nsub, i - 1);
298*63d4abf0Sagc fail = 1;
299*63d4abf0Sagc }
300*63d4abf0Sagc
301*63d4abf0Sagc
302*63d4abf0Sagc for (; i < pmatch_len; i++)
303*63d4abf0Sagc if (pmatch[i].rm_so != -1 || pmatch[i].rm_eo != -1)
304*63d4abf0Sagc {
305*63d4abf0Sagc if (!fail)
306*63d4abf0Sagc #ifndef WRETEST
307*63d4abf0Sagc printf("Exec error, regex: \"%s\", string: \"%s\"\n",
308*63d4abf0Sagc regex_pattern, str);
309*63d4abf0Sagc #else /* WRETEST */
310*63d4abf0Sagc printf("Exec error, regex: \"%ls\", string: \"%ls\"\n",
311*63d4abf0Sagc regex_pattern, str);
312*63d4abf0Sagc #endif /* WRETEST */
313*63d4abf0Sagc printf(" group %d: expected (-1, -1), got (%d, %d)\n",
314*63d4abf0Sagc i, (int)pmatch[i].rm_so, (int)pmatch[i].rm_eo);
315*63d4abf0Sagc fail = 1;
316*63d4abf0Sagc }
317*63d4abf0Sagc }
318*63d4abf0Sagc
319*63d4abf0Sagc return fail;
320*63d4abf0Sagc }
321*63d4abf0Sagc
322*63d4abf0Sagc
323*63d4abf0Sagc static void
test_nexec(const char * data,size_t len,int eflags,...)324*63d4abf0Sagc test_nexec(const char *data, size_t len, int eflags, ...)
325*63d4abf0Sagc {
326*63d4abf0Sagc int m;
327*63d4abf0Sagc int fail = 0;
328*63d4abf0Sagc int extra_flags[] = {0, REG_BACKTRACKING_MATCHER, REG_APPROX_MATCHER};
329*63d4abf0Sagc size_t i;
330*63d4abf0Sagc va_list ap;
331*63d4abf0Sagc
332*63d4abf0Sagc if (!valid_reobj)
333*63d4abf0Sagc {
334*63d4abf0Sagc exec_errors++;
335*63d4abf0Sagc return;
336*63d4abf0Sagc }
337*63d4abf0Sagc
338*63d4abf0Sagc #ifdef WRETEST
339*63d4abf0Sagc {
340*63d4abf0Sagc int wlen = mbntowc(wstr, data, len, woffs);
341*63d4abf0Sagc if (wlen < 0)
342*63d4abf0Sagc {
343*63d4abf0Sagc exec_errors++;
344*63d4abf0Sagc printf("Invalid or incomplete multi-byte sequence in %s\n", data);
345*63d4abf0Sagc return;
346*63d4abf0Sagc }
347*63d4abf0Sagc wstr[wlen] = L'\0';
348*63d4abf0Sagc len = wlen;
349*63d4abf0Sagc }
350*63d4abf0Sagc #define data wstr
351*63d4abf0Sagc #endif /* WRETEST */
352*63d4abf0Sagc
353*63d4abf0Sagc use_regnexec = 1;
354*63d4abf0Sagc
355*63d4abf0Sagc for (i = 0; i < elementsof(extra_flags); i++)
356*63d4abf0Sagc {
357*63d4abf0Sagc int final_flags = eflags | extra_flags[i];
358*63d4abf0Sagc
359*63d4abf0Sagc if ((final_flags & REG_BACKTRACKING_MATCHER
360*63d4abf0Sagc && tre_have_approx(&reobj))
361*63d4abf0Sagc || (final_flags & REG_APPROX_MATCHER
362*63d4abf0Sagc && tre_have_backrefs(&reobj))
363*63d4abf0Sagc || (final_flags & avoid_eflags))
364*63d4abf0Sagc continue;
365*63d4abf0Sagc
366*63d4abf0Sagc /* Test with a pmatch array. */
367*63d4abf0Sagc exec_tests++;
368*63d4abf0Sagc m = execute(data, len, elementsof(pmatch_global), pmatch_global,
369*63d4abf0Sagc final_flags);
370*63d4abf0Sagc va_start(ap, eflags);
371*63d4abf0Sagc fail |= check(ap, m, data, elementsof(pmatch_global), pmatch_global,
372*63d4abf0Sagc final_flags);
373*63d4abf0Sagc va_end(ap);
374*63d4abf0Sagc
375*63d4abf0Sagc /* Same test with a NULL pmatch. */
376*63d4abf0Sagc exec_tests++;
377*63d4abf0Sagc m = execute(data, len, 0, NULL, final_flags);
378*63d4abf0Sagc va_start(ap, eflags);
379*63d4abf0Sagc fail |= check(ap, m, data, 0, NULL, final_flags);
380*63d4abf0Sagc va_end(ap);
381*63d4abf0Sagc }
382*63d4abf0Sagc
383*63d4abf0Sagc #ifdef WRETEST
384*63d4abf0Sagc #undef data
385*63d4abf0Sagc #endif /* WRETEST */
386*63d4abf0Sagc
387*63d4abf0Sagc if (fail)
388*63d4abf0Sagc exec_errors++;
389*63d4abf0Sagc }
390*63d4abf0Sagc
391*63d4abf0Sagc
392*63d4abf0Sagc
393*63d4abf0Sagc static void
test_exec(const char * str,int eflags,...)394*63d4abf0Sagc test_exec(const char *str, int eflags, ...)
395*63d4abf0Sagc {
396*63d4abf0Sagc int m;
397*63d4abf0Sagc int fail = 0;
398*63d4abf0Sagc size_t len = strlen(str);
399*63d4abf0Sagc int extra_flags[] = {0,
400*63d4abf0Sagc REG_BACKTRACKING_MATCHER,
401*63d4abf0Sagc REG_APPROX_MATCHER,
402*63d4abf0Sagc REG_BACKTRACKING_MATCHER | REG_APPROX_MATCHER};
403*63d4abf0Sagc size_t i;
404*63d4abf0Sagc va_list ap;
405*63d4abf0Sagc
406*63d4abf0Sagc if (!valid_reobj)
407*63d4abf0Sagc {
408*63d4abf0Sagc exec_errors++;
409*63d4abf0Sagc return;
410*63d4abf0Sagc }
411*63d4abf0Sagc
412*63d4abf0Sagc #ifdef WRETEST
413*63d4abf0Sagc {
414*63d4abf0Sagc int wlen = mbntowc(wstr, str, len, woffs);
415*63d4abf0Sagc if (wlen < 0)
416*63d4abf0Sagc {
417*63d4abf0Sagc exec_errors++;
418*63d4abf0Sagc printf("Invalid or incomplete multi-byte sequence in %s\n", str);
419*63d4abf0Sagc return;
420*63d4abf0Sagc }
421*63d4abf0Sagc wstr[wlen] = L'\0';
422*63d4abf0Sagc len = wlen;
423*63d4abf0Sagc }
424*63d4abf0Sagc #define str wstr
425*63d4abf0Sagc #endif /* WRETEST */
426*63d4abf0Sagc
427*63d4abf0Sagc for (use_regnexec = 0; use_regnexec < 2; use_regnexec++)
428*63d4abf0Sagc {
429*63d4abf0Sagc for (i = 0; i < elementsof(extra_flags); i++)
430*63d4abf0Sagc {
431*63d4abf0Sagc int final_flags = eflags | extra_flags[i];
432*63d4abf0Sagc
433*63d4abf0Sagc if ((final_flags & REG_BACKTRACKING_MATCHER
434*63d4abf0Sagc && tre_have_approx(&reobj))
435*63d4abf0Sagc || (final_flags & REG_APPROX_MATCHER
436*63d4abf0Sagc && tre_have_backrefs(&reobj))
437*63d4abf0Sagc || (final_flags & avoid_eflags))
438*63d4abf0Sagc continue;
439*63d4abf0Sagc
440*63d4abf0Sagc /* Test with a pmatch array. */
441*63d4abf0Sagc exec_tests++;
442*63d4abf0Sagc m = execute(str, len, elementsof(pmatch_global), pmatch_global,
443*63d4abf0Sagc final_flags);
444*63d4abf0Sagc va_start(ap, eflags);
445*63d4abf0Sagc fail |= check(ap, m, str, elementsof(pmatch_global), pmatch_global,
446*63d4abf0Sagc final_flags);
447*63d4abf0Sagc va_end(ap);
448*63d4abf0Sagc
449*63d4abf0Sagc /* Same test with a NULL pmatch. */
450*63d4abf0Sagc exec_tests++;
451*63d4abf0Sagc m = execute(str, len, 0, NULL, final_flags);
452*63d4abf0Sagc va_start(ap, eflags);
453*63d4abf0Sagc fail |= check(ap, m, str, 0, NULL, final_flags);
454*63d4abf0Sagc va_end(ap);
455*63d4abf0Sagc }
456*63d4abf0Sagc }
457*63d4abf0Sagc
458*63d4abf0Sagc #ifdef WRETEST
459*63d4abf0Sagc #undef str
460*63d4abf0Sagc #endif /* WRETEST */
461*63d4abf0Sagc
462*63d4abf0Sagc if (fail)
463*63d4abf0Sagc exec_errors++;
464*63d4abf0Sagc }
465*63d4abf0Sagc
466*63d4abf0Sagc
467*63d4abf0Sagc static void
test_comp(const char * re,int flags,int ret)468*63d4abf0Sagc test_comp(const char *re, int flags, int ret)
469*63d4abf0Sagc {
470*63d4abf0Sagc int errcode = 0;
471*63d4abf0Sagc int len = strlen(re);
472*63d4abf0Sagc
473*63d4abf0Sagc if (valid_reobj)
474*63d4abf0Sagc {
475*63d4abf0Sagc tre_regfree(&reobj);
476*63d4abf0Sagc valid_reobj = 0;
477*63d4abf0Sagc }
478*63d4abf0Sagc
479*63d4abf0Sagc comp_tests++;
480*63d4abf0Sagc
481*63d4abf0Sagc #ifdef WRETEST
482*63d4abf0Sagc {
483*63d4abf0Sagc int wlen = mbntowc(wregex, re, len, NULL);
484*63d4abf0Sagc
485*63d4abf0Sagc if (wlen < 0)
486*63d4abf0Sagc {
487*63d4abf0Sagc comp_errors++;
488*63d4abf0Sagc printf("Invalid or incomplete multi-byte sequence in %s\n", re);
489*63d4abf0Sagc return;
490*63d4abf0Sagc }
491*63d4abf0Sagc wregex[wlen] = L'\0';
492*63d4abf0Sagc len = wlen;
493*63d4abf0Sagc }
494*63d4abf0Sagc #define re wregex
495*63d4abf0Sagc #endif /* WRETEST */
496*63d4abf0Sagc regex_pattern = re;
497*63d4abf0Sagc cflags_global = flags;
498*63d4abf0Sagc
499*63d4abf0Sagc #ifdef MALLOC_DEBUGGING
500*63d4abf0Sagc {
501*63d4abf0Sagc static int j = 0;
502*63d4abf0Sagc int i = 0;
503*63d4abf0Sagc while (1)
504*63d4abf0Sagc {
505*63d4abf0Sagc xmalloc_configure(i);
506*63d4abf0Sagc comp_tests++;
507*63d4abf0Sagc if (j++ % 20 == 0)
508*63d4abf0Sagc test_status('.');
509*63d4abf0Sagc errcode = wrap_regcomp(&reobj, re, len, flags);
510*63d4abf0Sagc if (errcode != REG_ESPACE)
511*63d4abf0Sagc {
512*63d4abf0Sagc test_status('*');
513*63d4abf0Sagc break;
514*63d4abf0Sagc }
515*63d4abf0Sagc #ifdef REGEX_DEBUG
516*63d4abf0Sagc xmalloc_dump_leaks();
517*63d4abf0Sagc #endif /* REGEX_DEBUG */
518*63d4abf0Sagc i++;
519*63d4abf0Sagc }
520*63d4abf0Sagc }
521*63d4abf0Sagc #else /* !MALLOC_DEBUGGING */
522*63d4abf0Sagc errcode = wrap_regcomp(&reobj, re, len, flags);
523*63d4abf0Sagc #endif /* !MALLOC_DEBUGGING */
524*63d4abf0Sagc
525*63d4abf0Sagc #ifdef WRETEST
526*63d4abf0Sagc #undef re
527*63d4abf0Sagc #endif /* WRETEST */
528*63d4abf0Sagc
529*63d4abf0Sagc if (errcode != ret)
530*63d4abf0Sagc {
531*63d4abf0Sagc #ifndef WRETEST
532*63d4abf0Sagc printf("Comp error, regex: \"%s\"\n", regex_pattern);
533*63d4abf0Sagc #else /* WRETEST */
534*63d4abf0Sagc printf("Comp error, regex: \"%ls\"\n", regex_pattern);
535*63d4abf0Sagc #endif /* WRETEST */
536*63d4abf0Sagc printf(" expected return code %d, got %d.\n",
537*63d4abf0Sagc ret, errcode);
538*63d4abf0Sagc comp_errors++;
539*63d4abf0Sagc }
540*63d4abf0Sagc
541*63d4abf0Sagc if (errcode == 0)
542*63d4abf0Sagc valid_reobj = 1;
543*63d4abf0Sagc }
544*63d4abf0Sagc
545*63d4abf0Sagc
546*63d4abf0Sagc
547*63d4abf0Sagc /* To enable tests for known bugs, set this to 1. */
548*63d4abf0Sagc #define KNOWN_BUG 0
549*63d4abf0Sagc
550*63d4abf0Sagc int
main(int argc,char ** argv)551*63d4abf0Sagc main(int argc, char **argv)
552*63d4abf0Sagc {
553*63d4abf0Sagc
554*63d4abf0Sagc #ifdef WRETEST
555*63d4abf0Sagc /* Need an 8-bit locale. Or move the two tests with non-ascii
556*63d4abf0Sagc characters to the localized internationalization tests. */
557*63d4abf0Sagc if (setlocale(LC_CTYPE, "en_US.ISO-8859-1") == NULL)
558*63d4abf0Sagc fprintf(stderr, "Could not set locale en_US.ISO-8859-1. Expect some\n"
559*63d4abf0Sagc "`Invalid or incomplete multi-byte sequence' errors.\n");
560*63d4abf0Sagc #endif /* WRETEST */
561*63d4abf0Sagc /* Large number of macros in one regexp. */
562*63d4abf0Sagc test_comp("[A-Z]\\d\\s?\\d[A-Z]{2}|[A-Z]\\d{2}\\s?\\d[A-Z]{2}|[A-Z]{2}\\d"
563*63d4abf0Sagc "\\s?\\d[A-Z]{2}|[A-Z]{2}\\d{2}\\s?\\d[A-Z]{2}|[A-Z]\\d[A-Z]\\s?"
564*63d4abf0Sagc "\\d[A-Z]{2}|[A-Z]{2}\\d[A-Z]\\s?\\d[A-Z]{2}|[A-Z]{3}\\s?\\d[A-Z]"
565*63d4abf0Sagc "{2}", REG_EXTENDED, 0);
566*63d4abf0Sagc
567*63d4abf0Sagc test_comp("a{11}(b{2}c){2}", REG_EXTENDED, 0);
568*63d4abf0Sagc test_comp("a{2}{2}xb+xc*xd?x", REG_EXTENDED, 0);
569*63d4abf0Sagc test_comp("^!packet [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3} [0-9]+",
570*63d4abf0Sagc REG_EXTENDED, 0);
571*63d4abf0Sagc test_comp("^!pfast [0-9]{1,15} ([0-9]{1,3}\\.){3}[0-9]{1,3}[0-9]{1,5}$",
572*63d4abf0Sagc REG_EXTENDED, 0);
573*63d4abf0Sagc
574*63d4abf0Sagc #if KNOWN_BUG
575*63d4abf0Sagc /* Should these match or not? */
576*63d4abf0Sagc test_comp("(a)*-\\1b", REG_EXTENDED, 0);
577*63d4abf0Sagc test_exec("aaa-b", 0, REG_NOMATCH);
578*63d4abf0Sagc test_comp("((.*)\\1)+", REG_EXTENDED, 0);
579*63d4abf0Sagc test_exec("xxxxxx", 0, REG_NOMATCH);
580*63d4abf0Sagc #endif
581*63d4abf0Sagc
582*63d4abf0Sagc #ifdef TRE_APPROX
583*63d4abf0Sagc /*
584*63d4abf0Sagc * Approximate matching tests.
585*63d4abf0Sagc *
586*63d4abf0Sagc * The approximate matcher always searches for the best match, and returns
587*63d4abf0Sagc * the leftmost and longest one if there are several best matches.
588*63d4abf0Sagc */
589*63d4abf0Sagc
590*63d4abf0Sagc test_comp("(fou){# ~1}", REG_EXTENDED, 0);
591*63d4abf0Sagc test_comp("(fuu){#}", REG_EXTENDED, 0);
592*63d4abf0Sagc test_comp("(fuu){# ~}", REG_EXTENDED, 0);
593*63d4abf0Sagc test_comp("(anaconda){ 1i + 1d < 1, #1}", REG_EXTENDED, 0);
594*63d4abf0Sagc test_comp("(anaconda){ 1i + 1d < 1 #1 ~10 }", REG_EXTENDED, 0);
595*63d4abf0Sagc test_comp("(anaconda){ #1, ~1, 1i + 1d < 1 }", REG_EXTENDED, 0);
596*63d4abf0Sagc
597*63d4abf0Sagc test_comp("(znacnda){ #1 ~3 1i + 1d < 1 }", REG_EXTENDED, 0);
598*63d4abf0Sagc test_exec("molasses anaconda foo bar baz smith anderson ",
599*63d4abf0Sagc 0, REG_NOMATCH);
600*63d4abf0Sagc test_comp("(znacnda){ #1 ~3 1i + 1d < 2 }", REG_EXTENDED, 0);
601*63d4abf0Sagc test_exec("molasses anaconda foo bar baz smith anderson ",
602*63d4abf0Sagc 0, REG_OK, 9, 17, 9, 17, END);
603*63d4abf0Sagc test_comp("(ananda){ 1i + 1d < 2 }", REG_EXTENDED, 0);
604*63d4abf0Sagc test_exec("molasses anaconda foo bar baz smith anderson ",
605*63d4abf0Sagc 0, REG_NOMATCH);
606*63d4abf0Sagc
607*63d4abf0Sagc test_comp("(fuu){ +3 -3 ~5}", REG_EXTENDED, 0);
608*63d4abf0Sagc test_exec("anaconda foo bar baz smith anderson",
609*63d4abf0Sagc 0, REG_OK, 9, 10, 9, 10, END);
610*63d4abf0Sagc test_comp("(fuu){ +2 -2 ~5}", REG_EXTENDED, 0);
611*63d4abf0Sagc test_exec("anaconda foo bar baz smith anderson",
612*63d4abf0Sagc 0, REG_OK, 9, 10, 9, 10, END);
613*63d4abf0Sagc test_comp("(fuu){ +3 -3 ~}", REG_EXTENDED, 0);
614*63d4abf0Sagc test_exec("anaconda foo bar baz smith anderson",
615*63d4abf0Sagc 0, REG_OK, 9, 10, 9, 10, END);
616*63d4abf0Sagc
617*63d4abf0Sagc test_comp("(laurikari){ #3, 1i + 1d < 3 }", REG_EXTENDED, 0);
618*63d4abf0Sagc
619*63d4abf0Sagc /* No cost limit. */
620*63d4abf0Sagc test_comp("(foobar){~}", REG_EXTENDED, 0);
621*63d4abf0Sagc test_exec("xirefoabralfobarxie", 0, REG_OK, 11, 16, 11, 16, END);
622*63d4abf0Sagc
623*63d4abf0Sagc /* At most two errors. */
624*63d4abf0Sagc test_comp("(foobar){~2}", REG_EXTENDED, 0);
625*63d4abf0Sagc test_exec("xirefoabrzlfd", 0, REG_OK, 4, 9, 4, 9, END);
626*63d4abf0Sagc test_exec("xirefoabzlfd", 0, REG_NOMATCH);
627*63d4abf0Sagc
628*63d4abf0Sagc /* At most two inserts or substitutions and max two errors total. */
629*63d4abf0Sagc test_comp("(foobar){+2#2~2}", REG_EXTENDED, 0);
630*63d4abf0Sagc test_exec("oobargoobaploowap", 0, REG_OK, 5, 11, 5, 11, END);
631*63d4abf0Sagc
632*63d4abf0Sagc /* Find best whole word match for "foobar". */
633*63d4abf0Sagc test_comp("\\<(foobar){~}\\>", REG_EXTENDED, 0);
634*63d4abf0Sagc test_exec("zfoobarz", 0, REG_OK, 0, 8, 0, 8, END);
635*63d4abf0Sagc test_exec("boing zfoobarz goobar woop", 0, REG_OK, 15, 21, 15, 21, END);
636*63d4abf0Sagc
637*63d4abf0Sagc /* Match whole string, allow only 1 error. */
638*63d4abf0Sagc test_comp("^(foobar){~1}$", REG_EXTENDED, 0);
639*63d4abf0Sagc test_exec("foobar", 0, REG_OK, 0, 6, 0, 6, END);
640*63d4abf0Sagc test_exec("xfoobar", 0, REG_OK, 0, 7, 0, 7, END);
641*63d4abf0Sagc /*
642*63d4abf0Sagc This currently fails.
643*63d4abf0Sagc test_exec("foobarx", 0, REG_OK, 0, 7, 0, 7, END);
644*63d4abf0Sagc */
645*63d4abf0Sagc test_exec("fooxbar", 0, REG_OK, 0, 7, 0, 7, END);
646*63d4abf0Sagc test_exec("foxbar", 0, REG_OK, 0, 6, 0, 6, END);
647*63d4abf0Sagc test_exec("xoobar", 0, REG_OK, 0, 6, 0, 6, END);
648*63d4abf0Sagc test_exec("foobax", 0, REG_OK, 0, 6, 0, 6, END);
649*63d4abf0Sagc test_exec("oobar", 0, REG_OK, 0, 5, 0, 5, END);
650*63d4abf0Sagc test_exec("fobar", 0, REG_OK, 0, 5, 0, 5, END);
651*63d4abf0Sagc test_exec("fooba", 0, REG_OK, 0, 5, 0, 5, END);
652*63d4abf0Sagc test_exec("xfoobarx", 0, REG_NOMATCH);
653*63d4abf0Sagc test_exec("foobarxx", 0, REG_NOMATCH);
654*63d4abf0Sagc test_exec("xxfoobar", 0, REG_NOMATCH);
655*63d4abf0Sagc test_exec("xfoxbar", 0, REG_NOMATCH);
656*63d4abf0Sagc test_exec("foxbarx", 0, REG_NOMATCH);
657*63d4abf0Sagc
658*63d4abf0Sagc /* At most one insert, two deletes, and three substitutions.
659*63d4abf0Sagc Additionally, deletes cost two and substitutes one, and total
660*63d4abf0Sagc cost must be less than 4. */
661*63d4abf0Sagc test_comp("(foobar){+1 -2 #3, 2d + 1s < 4}", REG_EXTENDED, 0);
662*63d4abf0Sagc test_exec("3oifaowefbaoraofuiebofasebfaobfaorfeoaro",
663*63d4abf0Sagc 0, REG_OK, 26, 33, 26, 33, END);
664*63d4abf0Sagc
665*63d4abf0Sagc /* Partially approximate matches. */
666*63d4abf0Sagc test_comp("foo(bar){~1}zap", REG_EXTENDED, 0);
667*63d4abf0Sagc test_exec("foobarzap", 0, REG_OK, 0, 9, 3, 6, END);
668*63d4abf0Sagc test_exec("fobarzap", 0, REG_NOMATCH);
669*63d4abf0Sagc test_exec("foobrzap", 0, REG_OK, 0, 8, 3, 5, END);
670*63d4abf0Sagc test_comp("^.*(dot.org){~}.*$", REG_EXTENDED, 0);
671*63d4abf0Sagc test_exec("www.cnn.com 64.236.16.20\n"
672*63d4abf0Sagc "www.slashdot.org 66.35.250.150\n"
673*63d4abf0Sagc "For useful information, use www.slashdot.org\n"
674*63d4abf0Sagc "this is demo data!\n",
675*63d4abf0Sagc 0, REG_OK, 0, 120, 93, 100, END);
676*63d4abf0Sagc
677*63d4abf0Sagc /* Approximate matching and back referencing cannot be used together. */
678*63d4abf0Sagc test_comp("(foo{~})\\1", REG_EXTENDED, REG_BADPAT);
679*63d4abf0Sagc
680*63d4abf0Sagc #endif /* TRE_APPROX */
681*63d4abf0Sagc
682*63d4abf0Sagc /*
683*63d4abf0Sagc * Basic tests with pure regular expressions
684*63d4abf0Sagc */
685*63d4abf0Sagc
686*63d4abf0Sagc /* Basic string matching. */
687*63d4abf0Sagc test_comp("foobar", REG_EXTENDED, 0);
688*63d4abf0Sagc test_exec("foobar", 0, REG_OK, 0, 6, END);
689*63d4abf0Sagc test_exec("xxxfoobarzapzot", 0, REG_OK, 3, 9, END);
690*63d4abf0Sagc test_comp("foobar", REG_EXTENDED | REG_NOSUB, 0);
691*63d4abf0Sagc test_exec("foobar", 0, REG_OK, END);
692*63d4abf0Sagc test_comp("aaaa", REG_EXTENDED, 0);
693*63d4abf0Sagc test_exec("xxaaaaaaaaaaaaaaaaa", 0, REG_OK, 2, 6, END);
694*63d4abf0Sagc
695*63d4abf0Sagc /* Test zero length matches. */
696*63d4abf0Sagc test_comp("(a*)", REG_EXTENDED, 0);
697*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, 0, 0, END);
698*63d4abf0Sagc
699*63d4abf0Sagc test_comp("(a*)*", REG_EXTENDED, 0);
700*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, 0, 0, END);
701*63d4abf0Sagc
702*63d4abf0Sagc test_comp("((a*)*)*", REG_EXTENDED, 0);
703*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, 0, 0, 0, 0, END);
704*63d4abf0Sagc test_comp("(a*bcd)*", REG_EXTENDED, 0);
705*63d4abf0Sagc test_exec("aaaaaaaaaaaabcxbcxbcxaabcxaabcx", 0, REG_OK, 0, 0, -1, -1, END);
706*63d4abf0Sagc test_exec("aaaaaaaaaaaabcxbcxbcxaabcxaabc", 0, REG_OK, 0, 0, -1, -1, END);
707*63d4abf0Sagc test_exec("aaaaaaaaaaaabcxbcdbcxaabcxaabc", 0, REG_OK, 0, 0, -1, -1, END);
708*63d4abf0Sagc test_exec("aaaaaaaaaaaabcdbcdbcxaabcxaabc", 0, REG_OK, 0, 18, 15, 18, END);
709*63d4abf0Sagc
710*63d4abf0Sagc test_comp("(a*)+", REG_EXTENDED, 0);
711*63d4abf0Sagc test_exec("-", 0, REG_OK, 0, 0, 0, 0, END);
712*63d4abf0Sagc
713*63d4abf0Sagc /* This test blows up the backtracking matcher. */
714*63d4abf0Sagc avoid_eflags = REG_BACKTRACKING_MATCHER;
715*63d4abf0Sagc test_comp("((a*)*b)*b", REG_EXTENDED, 0);
716*63d4abf0Sagc test_exec("aaaaaaaaaaaaaaaaaaaaaaaaab", 0, REG_OK,
717*63d4abf0Sagc 25, 26, -1, -1, -1, -1, END);
718*63d4abf0Sagc avoid_eflags = 0;
719*63d4abf0Sagc
720*63d4abf0Sagc test_comp("", 0, 0);
721*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, END);
722*63d4abf0Sagc test_exec("foo", 0, REG_OK, 0, 0, END);
723*63d4abf0Sagc
724*63d4abf0Sagc /* Test for submatch addressing which requires arbitrary lookahead. */
725*63d4abf0Sagc test_comp("(a*)aaaaaa", REG_EXTENDED, 0);
726*63d4abf0Sagc test_exec("aaaaaaaaaaaaaaax", 0, REG_OK, 0, 15, 0, 9, END);
727*63d4abf0Sagc
728*63d4abf0Sagc /* Test leftmost and longest matching and some tricky submatches. */
729*63d4abf0Sagc test_comp("(a*)(a*)", REG_EXTENDED, 0);
730*63d4abf0Sagc test_exec("aaaa", 0, REG_OK, 0, 4, 0, 4, 4, 4, END);
731*63d4abf0Sagc test_comp("(abcd|abc)(d?)", REG_EXTENDED, 0);
732*63d4abf0Sagc test_exec("abcd", 0, REG_OK, 0, 4, 0, 4, 4, 4, END);
733*63d4abf0Sagc test_comp("(abc|abcd)(d?)", REG_EXTENDED, 0);
734*63d4abf0Sagc test_exec("abcd", 0, REG_OK, 0, 4, 0, 4, 4, 4, END);
735*63d4abf0Sagc test_comp("(abc|abcd)(d?)e", REG_EXTENDED, 0);
736*63d4abf0Sagc test_exec("abcde", 0, REG_OK, 0, 5, 0, 4, 4, 4, END);
737*63d4abf0Sagc test_comp("(abcd|abc)(d?)e", REG_EXTENDED, 0);
738*63d4abf0Sagc test_exec("abcde", 0, REG_OK, 0, 5, 0, 4, 4, 4, END);
739*63d4abf0Sagc test_comp("a(bc|bcd)(d?)", REG_EXTENDED, 0);
740*63d4abf0Sagc test_exec("abcd", 0, REG_OK, 0, 4, 1, 4, 4, 4, END);
741*63d4abf0Sagc test_comp("a(bcd|bc)(d?)", REG_EXTENDED, 0);
742*63d4abf0Sagc test_exec("abcd", 0, REG_OK, 0, 4, 1, 4, 4, 4, END);
743*63d4abf0Sagc test_comp("a*(a?bc|bcd)(d?)", REG_EXTENDED, 0);
744*63d4abf0Sagc test_exec("aaabcd", 0, REG_OK, 0, 6, 3, 6, 6, 6, END);
745*63d4abf0Sagc test_comp("a*(bcd|a?bc)(d?)", REG_EXTENDED, 0);
746*63d4abf0Sagc test_exec("aaabcd", 0, REG_OK, 0, 6, 3, 6, 6, 6, END);
747*63d4abf0Sagc test_comp("(a|(a*b*))*", REG_EXTENDED, 0);
748*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, 0, 0, 0, 0, END);
749*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, 0, 1, -1, -1, END);
750*63d4abf0Sagc test_exec("aa", 0, REG_OK, 0, 2, 0, 2, 0, 2, END);
751*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 3, 0, 3, 0, 3, END);
752*63d4abf0Sagc test_exec("bbb", 0, REG_OK, 0, 3, 0, 3, 0, 3, END);
753*63d4abf0Sagc test_exec("aaabbb", 0, REG_OK, 0, 6, 0, 6, 0, 6, END);
754*63d4abf0Sagc test_exec("bbbaaa", 0, REG_OK, 0, 6, 3, 6, 3, 6, END);
755*63d4abf0Sagc test_comp("((a*b*)|a)*", REG_EXTENDED, 0);
756*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, 0, 0, 0, 0, END);
757*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, 0, 1, 0, 1, END);
758*63d4abf0Sagc test_exec("aa", 0, REG_OK, 0, 2, 0, 2, 0, 2, END);
759*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 3, 0, 3, 0, 3, END);
760*63d4abf0Sagc test_exec("bbb", 0, REG_OK, 0, 3, 0, 3, 0, 3, END);
761*63d4abf0Sagc test_exec("aaabbb", 0, REG_OK, 0, 6, 0, 6, 0, 6, END);
762*63d4abf0Sagc test_exec("bbbaaa", 0, REG_OK, 0, 6, 3, 6, 3, 6, END);
763*63d4abf0Sagc test_comp("a.*(.*b.*(.*c.*).*d.*).*e.*(.*f.*).*g", REG_EXTENDED, 0);
764*63d4abf0Sagc test_exec("aabbccddeeffgg", 0, REG_OK, 0, 14, 3, 9, 5, 7, 11, 13, END);
765*63d4abf0Sagc test_comp("(wee|week)(night|knights)s*", REG_EXTENDED, 0);
766*63d4abf0Sagc test_exec("weeknights", 0, REG_OK, 0, 10, 0, 3, 3, 10, END);
767*63d4abf0Sagc test_exec("weeknightss", 0, REG_OK, 0, 11, 0, 3, 3, 10, END);
768*63d4abf0Sagc test_comp("a*", REG_EXTENDED, 0);
769*63d4abf0Sagc test_exec("aaaaaaaaaa", 0, REG_OK, 0, 10, END);
770*63d4abf0Sagc test_comp("aa*", REG_EXTENDED, 0);
771*63d4abf0Sagc test_exec("aaaaaaaaaa", 0, REG_OK, 0, 10, END);
772*63d4abf0Sagc test_comp("aaa*", REG_EXTENDED, 0);
773*63d4abf0Sagc test_exec("aaaaaaaaaa", 0, REG_OK, 0, 10, END);
774*63d4abf0Sagc test_comp("aaaa*", REG_EXTENDED, 0);
775*63d4abf0Sagc test_exec("aaaaaaaaaa", 0, REG_OK, 0, 10, END);
776*63d4abf0Sagc
777*63d4abf0Sagc /* Test clearing old submatch data with nesting parentheses
778*63d4abf0Sagc and iteration. */
779*63d4abf0Sagc test_comp("((a)|(b))*c", REG_EXTENDED, 0);
780*63d4abf0Sagc test_exec("aaabc", 0, REG_OK, 0, 5, 3, 4, -1, -1, 3, 4, END);
781*63d4abf0Sagc test_exec("aaaac", 0, REG_OK, 0, 5, 3, 4, 3, 4, -1, -1, END);
782*63d4abf0Sagc test_comp("foo((bar)*)*zot", REG_EXTENDED, 0);
783*63d4abf0Sagc test_exec("foozot", 0, REG_OK, 0, 6, 3, 3, -1, -1, END);
784*63d4abf0Sagc test_exec("foobarzot", 0, REG_OK, 0, 9, 3, 6, 3, 6, END);
785*63d4abf0Sagc test_exec("foobarbarzot", 0, REG_OK, 0, 12, 3, 9, 6, 9, END);
786*63d4abf0Sagc
787*63d4abf0Sagc test_comp("foo((zup)*|(bar)*|(zap)*)*zot", REG_EXTENDED, 0);
788*63d4abf0Sagc test_exec("foobarzapzot", 0, REG_OK,
789*63d4abf0Sagc 0, 12, 6, 9, -1, -1, -1, -1, 6, 9, END);
790*63d4abf0Sagc test_exec("foobarbarzapzot", 0, REG_OK,
791*63d4abf0Sagc 0, 15, 9, 12, -1, -1, -1, -1, 9, 12, END);
792*63d4abf0Sagc test_exec("foozupzot", 0, REG_OK,
793*63d4abf0Sagc 0, 9, 3, 6, 3, 6, -1, -1, -1, -1, END);
794*63d4abf0Sagc test_exec("foobarzot", 0, REG_OK,
795*63d4abf0Sagc 0, 9, 3, 6, -1, -1, 3, 6, -1, -1, END);
796*63d4abf0Sagc test_exec("foozapzot", 0, REG_OK,
797*63d4abf0Sagc 0, 9, 3, 6, -1, -1, -1, -1, 3, 6, END);
798*63d4abf0Sagc test_exec("foozot", 0, REG_OK,
799*63d4abf0Sagc 0, 6, 3, 3, -1, -1, -1, -1, -1, -1, END);
800*63d4abf0Sagc
801*63d4abf0Sagc
802*63d4abf0Sagc /* Test case where, e.g., Perl and Python regexp functions, and many
803*63d4abf0Sagc other backtracking matchers, fail to produce the longest match.
804*63d4abf0Sagc It is not exactly a bug since Perl does not claim to find the
805*63d4abf0Sagc longest match, but a confusing feature and, in my opinion, a bad
806*63d4abf0Sagc design choice because the union operator is traditionally defined
807*63d4abf0Sagc to be commutative (with respect to the language denoted by the RE). */
808*63d4abf0Sagc test_comp("(a|ab)(blip)?", REG_EXTENDED, 0);
809*63d4abf0Sagc test_exec("ablip", 0, REG_OK, 0, 5, 0, 1, 1, 5, END);
810*63d4abf0Sagc test_exec("ab", 0, REG_OK, 0, 2, 0, 2, -1, -1, END);
811*63d4abf0Sagc test_comp("(ab|a)(blip)?", REG_EXTENDED, 0);
812*63d4abf0Sagc test_exec("ablip", 0, REG_OK, 0, 5, 0, 1, 1, 5, END);
813*63d4abf0Sagc test_exec("ab", 0, REG_OK, 0, 2, 0, 2, -1, -1, END);
814*63d4abf0Sagc
815*63d4abf0Sagc /* Test more submatch addressing. */
816*63d4abf0Sagc test_comp("((a|b)*)a(a|b)*", REG_EXTENDED, 0);
817*63d4abf0Sagc test_exec("aaaaabaaaba", 0, REG_OK, 0, 11, 0, 10, 9, 10, -1, -1, END);
818*63d4abf0Sagc test_exec("aaaaabaaab", 0, REG_OK, 0, 10, 0, 8, 7, 8, 9, 10, END);
819*63d4abf0Sagc test_exec("caa", 0, REG_OK, 1, 3, 1, 2, 1, 2, -1, -1, END);
820*63d4abf0Sagc test_comp("((a|aba)*)(ababbaba)((a|b)*)", REG_EXTENDED, 0);
821*63d4abf0Sagc test_exec("aabaababbabaaababbab", 0, REG_OK,
822*63d4abf0Sagc 0, 20, 0, 4, 1, 4, 4, 12, 12, 20, 19, 20, END);
823*63d4abf0Sagc test_exec("aaaaababbaba", 0, REG_OK,
824*63d4abf0Sagc 0, 12, 0, 4, 3, 4, 4, 12, 12, 12, -1, -1, END);
825*63d4abf0Sagc test_comp("((a|aba|abb|bba|bab)*)(ababbababbabbbabbbbbbabbaba)((a|b)*)",
826*63d4abf0Sagc REG_EXTENDED, 0);
827*63d4abf0Sagc test_exec("aabaabbbbabababaababbababbabbbabbbbbbabbabababbababababbabababa",
828*63d4abf0Sagc 0, REG_OK, 0, 63, 0, 16, 13, 16, 16, 43, 43, 63, 62, 63, END);
829*63d4abf0Sagc
830*63d4abf0Sagc /* Test for empty subexpressions. */
831*63d4abf0Sagc test_comp("", 0, 0);
832*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, END);
833*63d4abf0Sagc test_exec("foo", 0, REG_OK, 0, 0, END);
834*63d4abf0Sagc test_comp("(a|)", REG_EXTENDED, 0);
835*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, 0, 1, END);
836*63d4abf0Sagc test_exec("b", 0, REG_OK, 0, 0, 0, 0, END);
837*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, 0, 0, END);
838*63d4abf0Sagc test_comp("a|", REG_EXTENDED, 0);
839*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, END);
840*63d4abf0Sagc test_exec("b", 0, REG_OK, 0, 0, END);
841*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, END);
842*63d4abf0Sagc test_comp("|a", REG_EXTENDED, 0);
843*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, END);
844*63d4abf0Sagc test_exec("b", 0, REG_OK, 0, 0, END);
845*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, END);
846*63d4abf0Sagc
847*63d4abf0Sagc /* Miscellaneous tests. */
848*63d4abf0Sagc test_comp("(a*)b(c*)", REG_EXTENDED, 0);
849*63d4abf0Sagc test_exec("abc", 0, REG_OK, 0, 3, 0, 1, 2, 3, END);
850*63d4abf0Sagc test_exec("***abc***", 0, REG_OK, 3, 6, 3, 4, 5, 6, END);
851*63d4abf0Sagc test_comp("(a)", REG_EXTENDED, 0);
852*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, 0, 1, END);
853*63d4abf0Sagc test_comp("((a))", REG_EXTENDED, 0);
854*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, 0, 1, 0, 1, END);
855*63d4abf0Sagc test_comp("(((a)))", REG_EXTENDED, 0);
856*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, 0, 1, 0, 1, 0, 1, END);
857*63d4abf0Sagc test_comp("((((((((((((((((((((a))))))))))))))))))))", REG_EXTENDED, 0);
858*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
859*63d4abf0Sagc 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
860*63d4abf0Sagc 0, 1, 0, 1, 0, 1, END);
861*63d4abf0Sagc
862*63d4abf0Sagc test_comp("ksntoeaiksntoeaikstneoaiksnteoaiksntoeaiskntoeaiskntoekainstoei"
863*63d4abf0Sagc "askntoeakisntoeksaitnokesantiksoentaikosentaiksoentaiksnoeaiskn"
864*63d4abf0Sagc "teoaksintoekasitnoeksaitkosetniaksoetnaisknoetakistoeksintokesa"
865*63d4abf0Sagc "nitksoentaisknoetaisknoetiaksotneaikstoekasitoeskatioksentaikso"
866*63d4abf0Sagc "enatiksoetnaiksonateiksoteaeskanotisknetaiskntoeasknitoskenatis"
867*63d4abf0Sagc "konetaisknoteai", 0, 0);
868*63d4abf0Sagc
869*63d4abf0Sagc test_comp("((aab)|(aac)|(aa*))c", REG_EXTENDED, 0);
870*63d4abf0Sagc test_exec("aabc", 0, REG_OK, 0, 4, 0, 3, 0, 3, -1, -1, -1, -1, END);
871*63d4abf0Sagc test_exec("aacc", 0, REG_OK, 0, 4, 0, 3, -1, -1, 0, 3, -1, -1, END);
872*63d4abf0Sagc test_exec("aaac", 0, REG_OK, 0, 4, 0, 3, -1, -1, -1, -1, 0, 3, END);
873*63d4abf0Sagc
874*63d4abf0Sagc test_comp("^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$",
875*63d4abf0Sagc REG_EXTENDED, 0);
876*63d4abf0Sagc test_exec("foo!bar!bas", 0, REG_OK,
877*63d4abf0Sagc 0, 11, 0, 11, -1, -1, -1, -1, 4, 8, 8, 11, END);
878*63d4abf0Sagc test_comp("^([^!]+!)?([^!]+)$|^.+!([^!]+!)([^!]+)$",
879*63d4abf0Sagc REG_EXTENDED, 0);
880*63d4abf0Sagc test_exec("foo!bar!bas", 0, REG_OK,
881*63d4abf0Sagc 0, 11, -1, -1, -1, -1, 4, 8, 8, 11, END);
882*63d4abf0Sagc test_comp("^(([^!]+!)?([^!]+)|.+!([^!]+!)([^!]+))$",
883*63d4abf0Sagc REG_EXTENDED, 0);
884*63d4abf0Sagc test_exec("foo!bar!bas", 0, REG_OK,
885*63d4abf0Sagc 0, 11, 0, 11, -1, -1, -1, -1, 4, 8, 8, 11, END);
886*63d4abf0Sagc
887*63d4abf0Sagc test_comp("M[ou]'?am+[ae]r .*([AEae]l[- ])?[GKQ]h?[aeu]+([dtz][dhz]?)+af[iy]",
888*63d4abf0Sagc REG_EXTENDED, 0);
889*63d4abf0Sagc test_exec("Muammar Quathafi", 0, REG_OK, 0, 16, -1, -1, 11, 13, END);
890*63d4abf0Sagc
891*63d4abf0Sagc test_comp("(Ab|cD)*", REG_EXTENDED | REG_ICASE, 0);
892*63d4abf0Sagc test_exec("aBcD", 0, REG_OK, 0, 4, 2, 4, END);
893*63d4abf0Sagc
894*63d4abf0Sagc test_comp("a**", REG_EXTENDED, REG_BADRPT);
895*63d4abf0Sagc test_comp("a*+", REG_EXTENDED, REG_BADRPT);
896*63d4abf0Sagc test_comp("a+*", REG_EXTENDED, REG_BADRPT);
897*63d4abf0Sagc test_comp("a++", REG_EXTENDED, REG_BADRPT);
898*63d4abf0Sagc test_comp("a?+", REG_EXTENDED, REG_BADRPT);
899*63d4abf0Sagc test_comp("a?*", REG_EXTENDED, REG_BADRPT);
900*63d4abf0Sagc test_comp("a{1,2}*", REG_EXTENDED, REG_BADRPT);
901*63d4abf0Sagc test_comp("a{1,2}+", REG_EXTENDED, REG_BADRPT);
902*63d4abf0Sagc
903*63d4abf0Sagc /*
904*63d4abf0Sagc * Many of the following tests were mostly inspired by (or copied from) the
905*63d4abf0Sagc * libhackerlab posix test suite by Tom Lord.
906*63d4abf0Sagc */
907*63d4abf0Sagc
908*63d4abf0Sagc test_comp("a", 0, 0);
909*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, END);
910*63d4abf0Sagc test_comp("\\.", 0, 0);
911*63d4abf0Sagc test_exec(".", 0, REG_OK, 0, 1, END);
912*63d4abf0Sagc test_comp("\\[", 0, 0);
913*63d4abf0Sagc test_exec("[", 0, REG_OK, 0, 1, END);
914*63d4abf0Sagc test_comp("\\\\", 0, 0);
915*63d4abf0Sagc test_exec("\\", 0, REG_OK, 0, 1, END);
916*63d4abf0Sagc test_comp("\\*", 0, 0);
917*63d4abf0Sagc test_exec("*", 0, REG_OK, 0, 1, END);
918*63d4abf0Sagc test_comp("\\^", 0, 0);
919*63d4abf0Sagc test_exec("^", 0, REG_OK, 0, 1, END);
920*63d4abf0Sagc test_comp("\\$", 0, 0);
921*63d4abf0Sagc test_exec("$", 0, REG_OK, 0, 1, END);
922*63d4abf0Sagc
923*63d4abf0Sagc test_comp("\\", 0, REG_EESCAPE);
924*63d4abf0Sagc
925*63d4abf0Sagc test_comp("x\\.", 0, 0);
926*63d4abf0Sagc test_exec("x.", 0, REG_OK, 0, 2, END);
927*63d4abf0Sagc test_comp("x\\[", 0, 0);
928*63d4abf0Sagc test_exec("x[", 0, REG_OK, 0, 2, END);
929*63d4abf0Sagc test_comp("x\\\\", 0, 0);
930*63d4abf0Sagc test_exec("x\\", 0, REG_OK, 0, 2, END);
931*63d4abf0Sagc test_comp("x\\*", 0, 0);
932*63d4abf0Sagc test_exec("x*", 0, REG_OK, 0, 2, END);
933*63d4abf0Sagc test_comp("x\\^", 0, 0);
934*63d4abf0Sagc test_exec("x^", 0, REG_OK, 0, 2, END);
935*63d4abf0Sagc test_comp("x\\$", 0, 0);
936*63d4abf0Sagc test_exec("x$", 0, REG_OK, 0, 2, END);
937*63d4abf0Sagc
938*63d4abf0Sagc test_comp("x\\", 0, REG_EESCAPE);
939*63d4abf0Sagc
940*63d4abf0Sagc test_comp(".", 0, 0);
941*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, END);
942*63d4abf0Sagc test_exec("\n", 0, REG_OK, 0, 1, END);
943*63d4abf0Sagc
944*63d4abf0Sagc test_comp("(+|?)", 0, 0);
945*63d4abf0Sagc test_exec("(+|?)", 0, REG_OK, 0, 5, END);
946*63d4abf0Sagc test_exec("+|?", 0, REG_NOMATCH);
947*63d4abf0Sagc test_exec("(+)", 0, REG_NOMATCH);
948*63d4abf0Sagc test_exec("+", 0, REG_NOMATCH);
949*63d4abf0Sagc
950*63d4abf0Sagc
951*63d4abf0Sagc /*
952*63d4abf0Sagc * Test bracket expressions.
953*63d4abf0Sagc */
954*63d4abf0Sagc
955*63d4abf0Sagc test_comp("[", 0, REG_EBRACK);
956*63d4abf0Sagc test_comp("[]", 0, REG_EBRACK);
957*63d4abf0Sagc test_comp("[^]", 0, REG_EBRACK);
958*63d4abf0Sagc
959*63d4abf0Sagc test_comp("[]x]", 0, 0);
960*63d4abf0Sagc test_exec("]", 0, REG_OK, 0, 1, END);
961*63d4abf0Sagc test_exec("x", 0, REG_OK, 0, 1, END);
962*63d4abf0Sagc
963*63d4abf0Sagc test_comp("[.]", 0, 0);
964*63d4abf0Sagc test_exec(".", 0, REG_OK, 0, 1, END);
965*63d4abf0Sagc test_exec("a", 0, REG_NOMATCH);
966*63d4abf0Sagc
967*63d4abf0Sagc test_comp("[*]", 0, 0);
968*63d4abf0Sagc test_exec("*", 0, REG_OK, 0, 1, END);
969*63d4abf0Sagc
970*63d4abf0Sagc test_comp("[[]", 0, 0);
971*63d4abf0Sagc test_exec("[", 0, REG_OK, 0, 1, END);
972*63d4abf0Sagc
973*63d4abf0Sagc test_comp("[\\]", 0, 0);
974*63d4abf0Sagc test_exec("\\", 0, REG_OK, 0, 1, END);
975*63d4abf0Sagc
976*63d4abf0Sagc test_comp("[-x]", 0, 0);
977*63d4abf0Sagc test_exec("-", 0, REG_OK, 0, 1, END);
978*63d4abf0Sagc test_exec("x", 0, REG_OK, 0, 1, END);
979*63d4abf0Sagc test_comp("[x-]", 0, 0);
980*63d4abf0Sagc test_exec("-", 0, REG_OK, 0, 1, END);
981*63d4abf0Sagc test_exec("x", 0, REG_OK, 0, 1, END);
982*63d4abf0Sagc test_comp("[-]", 0, 0);
983*63d4abf0Sagc test_exec("-", 0, REG_OK, 0, 1, END);
984*63d4abf0Sagc
985*63d4abf0Sagc test_comp("[abc]", 0, 0);
986*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, END);
987*63d4abf0Sagc test_exec("b", 0, REG_OK, 0, 1, END);
988*63d4abf0Sagc test_exec("c", 0, REG_OK, 0, 1, END);
989*63d4abf0Sagc test_exec("d", 0, REG_NOMATCH);
990*63d4abf0Sagc test_exec("xa", 0, REG_OK, 1, 2, END);
991*63d4abf0Sagc test_exec("xb", 0, REG_OK, 1, 2, END);
992*63d4abf0Sagc test_exec("xc", 0, REG_OK, 1, 2, END);
993*63d4abf0Sagc test_exec("xd", 0, REG_NOMATCH);
994*63d4abf0Sagc test_comp("x[abc]", 0, 0);
995*63d4abf0Sagc test_exec("xa", 0, REG_OK, 0, 2, END);
996*63d4abf0Sagc test_exec("xb", 0, REG_OK, 0, 2, END);
997*63d4abf0Sagc test_exec("xc", 0, REG_OK, 0, 2, END);
998*63d4abf0Sagc test_exec("xd", 0, REG_NOMATCH);
999*63d4abf0Sagc test_comp("[^abc]", 0, 0);
1000*63d4abf0Sagc test_exec("a", 0, REG_NOMATCH);
1001*63d4abf0Sagc test_exec("b", 0, REG_NOMATCH);
1002*63d4abf0Sagc test_exec("c", 0, REG_NOMATCH);
1003*63d4abf0Sagc test_exec("d", 0, REG_OK, 0, 1, END);
1004*63d4abf0Sagc test_exec("xa", 0, REG_OK, 0, 1, END);
1005*63d4abf0Sagc test_exec("xb", 0, REG_OK, 0, 1, END);
1006*63d4abf0Sagc test_exec("xc", 0, REG_OK, 0, 1, END);
1007*63d4abf0Sagc test_exec("xd", 0, REG_OK, 0, 1, END);
1008*63d4abf0Sagc test_comp("x[^abc]", 0, 0);
1009*63d4abf0Sagc test_exec("xa", 0, REG_NOMATCH);
1010*63d4abf0Sagc test_exec("xb", 0, REG_NOMATCH);
1011*63d4abf0Sagc test_exec("xc", 0, REG_NOMATCH);
1012*63d4abf0Sagc test_exec("xd", 0, REG_OK, 0, 2, END);
1013*63d4abf0Sagc
1014*63d4abf0Sagc test_comp("[()+?*\\]+", REG_EXTENDED, 0);
1015*63d4abf0Sagc test_exec("x\\*?+()x", 0, REG_OK, 1, 7, END);
1016*63d4abf0Sagc
1017*63d4abf0Sagc /* Standard character classes. */
1018*63d4abf0Sagc test_comp("[[:alnum:]]+", REG_EXTENDED, 0);
1019*63d4abf0Sagc test_exec("%abc123890XYZ=", 0, REG_OK, 1, 13, END);
1020*63d4abf0Sagc test_comp("[[:cntrl:]]+", REG_EXTENDED, 0);
1021*63d4abf0Sagc test_exec("%\n\t\015\f ", 0, REG_OK, 1, 5, END);
1022*63d4abf0Sagc test_comp("[[:lower:]]+", REG_EXTENDED, 0);
1023*63d4abf0Sagc test_exec("AbcdE", 0, REG_OK, 1, 4, END);
1024*63d4abf0Sagc test_comp("[[:lower:]]+", REG_EXTENDED | REG_ICASE, 0);
1025*63d4abf0Sagc test_exec("AbcdE", 0, REG_OK, 0, 5, END);
1026*63d4abf0Sagc test_comp("[[:space:]]+", REG_EXTENDED, 0);
1027*63d4abf0Sagc test_exec("x \t\f\nx", 0, REG_OK, 1, 5, END);
1028*63d4abf0Sagc test_comp("[[:alpha:]]+", REG_EXTENDED, 0);
1029*63d4abf0Sagc test_exec("%abC123890xyz=", 0, REG_OK, 1, 4, END);
1030*63d4abf0Sagc test_comp("[[:digit:]]+", REG_EXTENDED, 0);
1031*63d4abf0Sagc test_exec("%abC123890xyz=", 0, REG_OK, 4, 10, END);
1032*63d4abf0Sagc test_comp("[^[:digit:]]+", REG_EXTENDED, 0);
1033*63d4abf0Sagc test_exec("%abC123890xyz=", 0, REG_OK, 0, 4, END);
1034*63d4abf0Sagc test_comp("[[:print:]]+", REG_EXTENDED, 0);
1035*63d4abf0Sagc test_exec("\n %abC12\f", 0, REG_OK, 1, 8, END);
1036*63d4abf0Sagc test_comp("[[:upper:]]+", REG_EXTENDED, 0);
1037*63d4abf0Sagc test_exec("\n aBCDEFGHIJKLMNOPQRSTUVWXYz", 0, REG_OK, 3, 27, END);
1038*63d4abf0Sagc test_comp("[[:upper:]]+", REG_EXTENDED | REG_ICASE, 0);
1039*63d4abf0Sagc test_exec("\n aBCDEFGHIJKLMNOPQRSTUVWXYz", 0, REG_OK, 2, 28, END);
1040*63d4abf0Sagc #ifdef HAVE_ISWBLANK
1041*63d4abf0Sagc #ifdef HAVE_ISBLANK
1042*63d4abf0Sagc test_comp("[[:blank:]]+", REG_EXTENDED, 0);
1043*63d4abf0Sagc test_exec("\na \t b", 0, REG_OK, 2, 5, END);
1044*63d4abf0Sagc #endif /* HAVE_ISBLANK */
1045*63d4abf0Sagc #endif /* HAVE_ISWBLANK */
1046*63d4abf0Sagc test_comp("[[:graph:]]+", REG_EXTENDED, 0);
1047*63d4abf0Sagc test_exec("\n %abC12\f", 0, REG_OK, 2, 8, END);
1048*63d4abf0Sagc test_comp("[[:punct:]]+", REG_EXTENDED, 0);
1049*63d4abf0Sagc test_exec("a~!@#$%^&*()_+=-`[]{};':\"|\\,./?>< ",
1050*63d4abf0Sagc 0, REG_OK, 1, 33, END);
1051*63d4abf0Sagc test_comp("[[:xdigit:]]+", REG_EXTENDED, 0);
1052*63d4abf0Sagc test_exec("-0123456789ABCDEFabcdef", 0, REG_OK, 1, 23, END);
1053*63d4abf0Sagc test_comp("[[:bogus-character-class-name:]", REG_EXTENDED, REG_ECTYPE);
1054*63d4abf0Sagc
1055*63d4abf0Sagc
1056*63d4abf0Sagc /* Range expressions (assuming that the C locale is being used). */
1057*63d4abf0Sagc test_comp("[a-z]+", REG_EXTENDED, 0);
1058*63d4abf0Sagc test_exec("ABCabcxyzABC", 0, REG_OK, 3, 9, END);
1059*63d4abf0Sagc test_comp("[z-a]+", REG_EXTENDED, REG_ERANGE);
1060*63d4abf0Sagc test_comp("[a-b-c]", 0, REG_ERANGE);
1061*63d4abf0Sagc test_comp("[a-a]+", REG_EXTENDED, 0);
1062*63d4abf0Sagc test_exec("zaaaaab", 0, REG_OK, 1, 6, END);
1063*63d4abf0Sagc test_comp("[--Z]+", REG_EXTENDED, 0);
1064*63d4abf0Sagc test_exec("!ABC-./XYZ~", 0, REG_OK, 1, 10, END);
1065*63d4abf0Sagc test_comp("[*--]", 0, 0);
1066*63d4abf0Sagc test_exec("-", 0, REG_OK, 0, 1, END);
1067*63d4abf0Sagc test_exec("*", 0, REG_OK, 0, 1, END);
1068*63d4abf0Sagc test_comp("[*--Z]+", REG_EXTENDED, 0);
1069*63d4abf0Sagc test_exec("!+*,---ABC", 0, REG_OK, 1, 7, END);
1070*63d4abf0Sagc test_comp("[a-]+", REG_EXTENDED, 0);
1071*63d4abf0Sagc test_exec("xa-a--a-ay", 0, REG_OK, 1, 9, END);
1072*63d4abf0Sagc
1073*63d4abf0Sagc /* REG_ICASE and character sets. */
1074*63d4abf0Sagc test_comp("[a-c]*", REG_ICASE | REG_EXTENDED, 0);
1075*63d4abf0Sagc test_exec("cABbage", 0, REG_OK, 0, 5, END);
1076*63d4abf0Sagc test_comp("[^a-c]*", REG_ICASE | REG_EXTENDED, 0);
1077*63d4abf0Sagc test_exec("tObAcCo", 0, REG_OK, 0, 2, END);
1078*63d4abf0Sagc test_comp("[A-C]*", REG_ICASE | REG_EXTENDED, 0);
1079*63d4abf0Sagc test_exec("cABbage", 0, REG_OK, 0, 5, END);
1080*63d4abf0Sagc test_comp("[^A-C]*", REG_ICASE | REG_EXTENDED, 0);
1081*63d4abf0Sagc test_exec("tObAcCo", 0, REG_OK, 0, 2, END);
1082*63d4abf0Sagc
1083*63d4abf0Sagc /* Complex character sets. */
1084*63d4abf0Sagc test_comp("[[:digit:]a-z#$%]+", REG_EXTENDED, 0);
1085*63d4abf0Sagc test_exec("__abc#lmn012$x%yz789*", 0, REG_OK, 2, 20, END);
1086*63d4abf0Sagc test_comp("[[:digit:]a-z#$%]+", REG_ICASE | REG_EXTENDED, 0);
1087*63d4abf0Sagc test_exec("__abcLMN012x%#$yz789*", 0, REG_OK, 2, 20, END);
1088*63d4abf0Sagc test_comp("[^[:digit:]a-z#$%]+", REG_EXTENDED, 0);
1089*63d4abf0Sagc test_exec("abc#lmn012$x%yz789--@*,abc", 0, REG_OK, 18, 23, END);
1090*63d4abf0Sagc test_comp("[^[:digit:]a-z#$%]+", REG_ICASE | REG_EXTENDED, 0);
1091*63d4abf0Sagc test_exec("abc#lmn012$x%yz789--@*,abc", 0, REG_OK, 18, 23, END);
1092*63d4abf0Sagc test_comp("[^[:digit:]#$%[:xdigit:]]+", REG_ICASE | REG_EXTENDED, 0);
1093*63d4abf0Sagc test_exec("abc#lmn012$x%yz789--@*,abc", 0, REG_OK, 4, 7, END);
1094*63d4abf0Sagc test_comp("[^-]+", REG_EXTENDED, 0);
1095*63d4abf0Sagc test_exec("---afd*(&,ml---", 0, REG_OK, 3, 12, END);
1096*63d4abf0Sagc test_comp("[^--Z]+", REG_EXTENDED, 0);
1097*63d4abf0Sagc test_exec("---AFD*(&,ml---", 0, REG_OK, 6, 12, END);
1098*63d4abf0Sagc test_comp("[^--Z]+", REG_ICASE | REG_EXTENDED, 0);
1099*63d4abf0Sagc test_exec("---AFD*(&,ml---", 0, REG_OK, 6, 10, END);
1100*63d4abf0Sagc
1101*63d4abf0Sagc /* Unsupported things (equivalence classes and multicharacter collating
1102*63d4abf0Sagc elements) */
1103*63d4abf0Sagc test_comp("[[.foo.]]", 0, REG_ECOLLATE);
1104*63d4abf0Sagc test_comp("[[=foo=]]", 0, REG_ECOLLATE);
1105*63d4abf0Sagc test_comp("[[..]]", 0, REG_ECOLLATE);
1106*63d4abf0Sagc test_comp("[[==]]", 0, REG_ECOLLATE);
1107*63d4abf0Sagc test_comp("[[.]]", 0, REG_ECOLLATE);
1108*63d4abf0Sagc test_comp("[[=]]", 0, REG_ECOLLATE);
1109*63d4abf0Sagc test_comp("[[.]", 0, REG_ECOLLATE);
1110*63d4abf0Sagc test_comp("[[=]", 0, REG_ECOLLATE);
1111*63d4abf0Sagc test_comp("[[.", 0, REG_ECOLLATE);
1112*63d4abf0Sagc test_comp("[[=", 0, REG_ECOLLATE);
1113*63d4abf0Sagc
1114*63d4abf0Sagc
1115*63d4abf0Sagc
1116*63d4abf0Sagc /* Miscellaneous tests. */
1117*63d4abf0Sagc test_comp("abc\\(\\(de\\)\\(fg\\)\\)hi", 0, 0);
1118*63d4abf0Sagc test_exec("xabcdefghiy", 0, REG_OK, 1, 10, 4, 8, 4, 6, 6, 8, END);
1119*63d4abf0Sagc
1120*63d4abf0Sagc test_comp("abc*def", 0, 0);
1121*63d4abf0Sagc test_exec("xabdefy", 0, REG_OK, 1, 6, END);
1122*63d4abf0Sagc test_exec("xabcdefy", 0, REG_OK, 1, 7, END);
1123*63d4abf0Sagc test_exec("xabcccccccdefy", 0, REG_OK, 1, 13, END);
1124*63d4abf0Sagc
1125*63d4abf0Sagc test_comp("abc\\(def\\)*ghi", 0, 0);
1126*63d4abf0Sagc test_exec("xabcghiy", 0, REG_OK, 1, 7, -1, -1, END);
1127*63d4abf0Sagc test_exec("xabcdefghi", 0, REG_OK, 1, 10, 4, 7, END);
1128*63d4abf0Sagc test_exec("xabcdefdefdefghi", 0, REG_OK, 1, 16, 10, 13, END);
1129*63d4abf0Sagc
1130*63d4abf0Sagc test_comp("a?", REG_EXTENDED, REG_OK);
1131*63d4abf0Sagc test_exec("aaaaa", 0, REG_OK, 0, 1, END);
1132*63d4abf0Sagc test_exec("xaaaaa", 0, REG_OK, 0, 0, END);
1133*63d4abf0Sagc test_comp("a+", REG_EXTENDED, REG_OK);
1134*63d4abf0Sagc test_exec("aaaaa", 0, REG_OK, 0, 5, END);
1135*63d4abf0Sagc test_exec("xaaaaa", 0, REG_OK, 1, 6, END);
1136*63d4abf0Sagc
1137*63d4abf0Sagc
1138*63d4abf0Sagc /*
1139*63d4abf0Sagc * Test anchors and their behaviour with the REG_NEWLINE compilation
1140*63d4abf0Sagc * flag and the REG_NOTBOL, REG_NOTEOL execution flags.
1141*63d4abf0Sagc */
1142*63d4abf0Sagc
1143*63d4abf0Sagc /* Normally, `^' matches the empty string at beginning of input.
1144*63d4abf0Sagc If REG_NOTBOL is used, `^' won't match the zero length string. */
1145*63d4abf0Sagc test_comp("^abc", 0, 0);
1146*63d4abf0Sagc test_exec("abcdef", 0, REG_OK, 0, 3, END);
1147*63d4abf0Sagc test_exec("abcdef", REG_NOTBOL, REG_NOMATCH);
1148*63d4abf0Sagc test_exec("xyzabcdef", 0, REG_NOMATCH);
1149*63d4abf0Sagc test_exec("xyzabcdef", REG_NOTBOL, REG_NOMATCH);
1150*63d4abf0Sagc test_exec("\nabcdef", 0, REG_NOMATCH);
1151*63d4abf0Sagc test_exec("\nabcdef", REG_NOTBOL, REG_NOMATCH);
1152*63d4abf0Sagc
1153*63d4abf0Sagc /* Normally, `$' matches the empty string at end of input.
1154*63d4abf0Sagc If REG_NOTEOL is used, `$' won't match the zero length string. */
1155*63d4abf0Sagc test_comp("abc$", 0, 0);
1156*63d4abf0Sagc test_exec("defabc", 0, REG_OK, 3, 6, END);
1157*63d4abf0Sagc test_exec("defabc", REG_NOTEOL, REG_NOMATCH);
1158*63d4abf0Sagc test_exec("defabcxyz", 0, REG_NOMATCH);
1159*63d4abf0Sagc test_exec("defabcxyz", REG_NOTEOL, REG_NOMATCH);
1160*63d4abf0Sagc test_exec("defabc\n", 0, REG_NOMATCH);
1161*63d4abf0Sagc test_exec("defabc\n", REG_NOTEOL, REG_NOMATCH);
1162*63d4abf0Sagc
1163*63d4abf0Sagc test_comp("^abc$", 0, 0);
1164*63d4abf0Sagc test_exec("abc", 0, REG_OK, 0, 3, END);
1165*63d4abf0Sagc test_exec("abc", REG_NOTBOL, REG_NOMATCH);
1166*63d4abf0Sagc test_exec("abc", REG_NOTEOL, REG_NOMATCH);
1167*63d4abf0Sagc test_exec("abc", REG_NOTBOL | REG_NOTEOL, REG_NOMATCH);
1168*63d4abf0Sagc test_exec("\nabc\n", 0, REG_NOMATCH);
1169*63d4abf0Sagc test_exec("defabc\n", 0, REG_NOMATCH);
1170*63d4abf0Sagc test_exec("\nabcdef", 0, REG_NOMATCH);
1171*63d4abf0Sagc test_exec("abcdef", 0, REG_NOMATCH);
1172*63d4abf0Sagc test_exec("defabc", 0, REG_NOMATCH);
1173*63d4abf0Sagc test_exec("abc\ndef", 0, REG_NOMATCH);
1174*63d4abf0Sagc test_exec("def\nabc", 0, REG_NOMATCH);
1175*63d4abf0Sagc
1176*63d4abf0Sagc /* If REG_NEWLINE is used, `^' matches the empty string immediately after
1177*63d4abf0Sagc a newline, regardless of whether execution flags contain REG_NOTBOL.
1178*63d4abf0Sagc Similarly, if REG_NEWLINE is used, `$' matches the empty string
1179*63d4abf0Sagc immediately before a newline, regardless of execution flags. */
1180*63d4abf0Sagc test_comp("^abc", REG_NEWLINE, 0);
1181*63d4abf0Sagc test_exec("abcdef", 0, REG_OK, 0, 3, END);
1182*63d4abf0Sagc test_exec("abcdef", REG_NOTBOL, REG_NOMATCH);
1183*63d4abf0Sagc test_exec("xyzabcdef", 0, REG_NOMATCH);
1184*63d4abf0Sagc test_exec("xyzabcdef", REG_NOTBOL, REG_NOMATCH);
1185*63d4abf0Sagc test_exec("\nabcdef", 0, REG_OK, 1, 4, END);
1186*63d4abf0Sagc test_exec("\nabcdef", REG_NOTBOL, 0, 1, 4, END);
1187*63d4abf0Sagc test_comp("abc$", REG_NEWLINE, 0);
1188*63d4abf0Sagc test_exec("defabc", 0, REG_OK, 3, 6, END);
1189*63d4abf0Sagc test_exec("defabc", REG_NOTEOL, REG_NOMATCH);
1190*63d4abf0Sagc test_exec("defabcxyz", 0, REG_NOMATCH);
1191*63d4abf0Sagc test_exec("defabcxyz", REG_NOTEOL, REG_NOMATCH);
1192*63d4abf0Sagc test_exec("defabc\n", 0, REG_OK, 3, 6, END);
1193*63d4abf0Sagc test_exec("defabc\n", REG_NOTEOL, 0, 3, 6, END);
1194*63d4abf0Sagc test_comp("^abc$", REG_NEWLINE, 0);
1195*63d4abf0Sagc test_exec("abc", 0, REG_OK, 0, 3, END);
1196*63d4abf0Sagc test_exec("abc", REG_NOTBOL, REG_NOMATCH);
1197*63d4abf0Sagc test_exec("abc", REG_NOTEOL, REG_NOMATCH);
1198*63d4abf0Sagc test_exec("abc", REG_NOTBOL | REG_NOTEOL, REG_NOMATCH);
1199*63d4abf0Sagc test_exec("\nabc\n", 0, REG_OK, 1, 4, END);
1200*63d4abf0Sagc test_exec("defabc\n", 0, REG_NOMATCH);
1201*63d4abf0Sagc test_exec("\nabcdef", 0, REG_NOMATCH);
1202*63d4abf0Sagc test_exec("abcdef", 0, REG_NOMATCH);
1203*63d4abf0Sagc test_exec("abcdef", REG_NOTBOL, REG_NOMATCH);
1204*63d4abf0Sagc test_exec("defabc", 0, REG_NOMATCH);
1205*63d4abf0Sagc test_exec("defabc", REG_NOTEOL, REG_NOMATCH);
1206*63d4abf0Sagc test_exec("abc\ndef", 0, REG_OK, 0, 3, END);
1207*63d4abf0Sagc test_exec("abc\ndef", REG_NOTBOL, REG_NOMATCH);
1208*63d4abf0Sagc test_exec("abc\ndef", REG_NOTEOL, 0, 0, 3, END);
1209*63d4abf0Sagc test_exec("abc\ndef", REG_NOTBOL | REG_NOTEOL, REG_NOMATCH);
1210*63d4abf0Sagc test_exec("def\nabc", 0, REG_OK, 4, 7, END);
1211*63d4abf0Sagc test_exec("def\nabc", REG_NOTBOL, 0, 4, 7, END);
1212*63d4abf0Sagc test_exec("def\nabc", REG_NOTEOL, REG_NOMATCH);
1213*63d4abf0Sagc test_exec("def\nabc", REG_NOTBOL | REG_NOTEOL, REG_NOMATCH);
1214*63d4abf0Sagc
1215*63d4abf0Sagc /* With BRE syntax, `^' has a special meaning only at the beginning of the
1216*63d4abf0Sagc RE or the beginning of a parenthesized subexpression. */
1217*63d4abf0Sagc test_comp("a\\{0,1\\}^bc", 0, 0);
1218*63d4abf0Sagc test_exec("bc", 0, REG_NOMATCH);
1219*63d4abf0Sagc test_exec("^bc", 0, REG_OK, 0, 3, END);
1220*63d4abf0Sagc test_exec("abc", 0, REG_NOMATCH);
1221*63d4abf0Sagc test_exec("a^bc", 0, REG_OK, 0, 4, END);
1222*63d4abf0Sagc test_comp("a\\{0,1\\}\\(^bc\\)", 0, 0);
1223*63d4abf0Sagc test_exec("bc", 0, REG_OK, 0, 2, 0, 2, END);
1224*63d4abf0Sagc test_exec("^bc", 0, REG_NOMATCH);
1225*63d4abf0Sagc test_exec("abc", 0, REG_NOMATCH);
1226*63d4abf0Sagc test_exec("a^bc", 0, REG_NOMATCH);
1227*63d4abf0Sagc test_comp("(^a", 0, 0);
1228*63d4abf0Sagc test_exec("(^a", 0, REG_OK, 0, 3, END);
1229*63d4abf0Sagc
1230*63d4abf0Sagc /* With BRE syntax, `$' has a special meaning only at the end of the
1231*63d4abf0Sagc RE or the end of a parenthesized subexpression. */
1232*63d4abf0Sagc test_comp("ab$c\\{0,1\\}", 0, 0);
1233*63d4abf0Sagc test_exec("ab", 0, REG_NOMATCH);
1234*63d4abf0Sagc test_exec("ab$", 0, REG_OK, 0, 3, END);
1235*63d4abf0Sagc test_exec("abc", 0, REG_NOMATCH);
1236*63d4abf0Sagc test_exec("ab$c", 0, REG_OK, 0, 4, END);
1237*63d4abf0Sagc test_comp("\\(ab$\\)c\\{0,1\\}", 0, 0);
1238*63d4abf0Sagc test_exec("ab", 0, REG_OK, 0, 2, 0, 2, END);
1239*63d4abf0Sagc test_exec("ab$", 0, REG_NOMATCH);
1240*63d4abf0Sagc test_exec("abc", 0, REG_NOMATCH);
1241*63d4abf0Sagc test_exec("ab$c", 0, REG_NOMATCH);
1242*63d4abf0Sagc test_comp("a$)", 0, 0);
1243*63d4abf0Sagc test_exec("a$)", 0, REG_OK, 0, 3, END);
1244*63d4abf0Sagc
1245*63d4abf0Sagc /* Miscellaneous tests for `^' and `$'. */
1246*63d4abf0Sagc test_comp("foo^$", REG_EXTENDED, 0);
1247*63d4abf0Sagc test_exec("foo", 0, REG_NOMATCH);
1248*63d4abf0Sagc test_comp("x$\n^y", REG_EXTENDED | REG_NEWLINE, 0);
1249*63d4abf0Sagc test_exec("foo\nybarx\nyes\n", 0, REG_OK, 8, 11, END);
1250*63d4abf0Sagc test_comp("^$", 0, 0);
1251*63d4abf0Sagc test_exec("x", 0, REG_NOMATCH);
1252*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, END);
1253*63d4abf0Sagc test_exec("\n", 0, REG_NOMATCH);
1254*63d4abf0Sagc test_comp("^$", REG_NEWLINE, 0);
1255*63d4abf0Sagc test_exec("x", 0, REG_NOMATCH);
1256*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, END);
1257*63d4abf0Sagc test_exec("\n", 0, REG_OK, 0, 0, END);
1258*63d4abf0Sagc
1259*63d4abf0Sagc /* REG_NEWLINE causes `.' not to match newlines. */
1260*63d4abf0Sagc test_comp(".*", 0, 0);
1261*63d4abf0Sagc test_exec("ab\ncd", 0, REG_OK, 0, 5, END);
1262*63d4abf0Sagc test_comp(".*", REG_NEWLINE, 0);
1263*63d4abf0Sagc test_exec("ab\ncd", 0, REG_OK, 0, 2, END);
1264*63d4abf0Sagc
1265*63d4abf0Sagc /*
1266*63d4abf0Sagc * Tests for nonstandard syntax extensions.
1267*63d4abf0Sagc */
1268*63d4abf0Sagc
1269*63d4abf0Sagc /* Zero width assertions. */
1270*63d4abf0Sagc test_comp("\\<x", REG_EXTENDED, 0);
1271*63d4abf0Sagc test_exec("aax xaa", 0, REG_OK, 4, 5, END);
1272*63d4abf0Sagc test_exec("xaa", 0, REG_OK, 0, 1, END);
1273*63d4abf0Sagc test_comp("x\\>", REG_EXTENDED, 0);
1274*63d4abf0Sagc test_exec("axx xaa", 0, REG_OK, 2, 3, END);
1275*63d4abf0Sagc test_exec("aax", 0, REG_OK, 2, 3, END);
1276*63d4abf0Sagc test_comp("\\bx", REG_EXTENDED, 0);
1277*63d4abf0Sagc test_exec("axx xaa", 0, REG_OK, 4, 5, END);
1278*63d4abf0Sagc test_exec("aax", 0, REG_NOMATCH);
1279*63d4abf0Sagc test_exec("xax", 0, REG_OK, 0, 1, END);
1280*63d4abf0Sagc test_comp("x\\b", REG_EXTENDED, 0);
1281*63d4abf0Sagc test_exec("axx xaa", 0, REG_OK, 2, 3, END);
1282*63d4abf0Sagc test_exec("aax", 0, REG_OK, 2, 3, END);
1283*63d4abf0Sagc test_exec("xaa", 0, REG_NOMATCH);
1284*63d4abf0Sagc test_comp("\\Bx", REG_EXTENDED, 0);
1285*63d4abf0Sagc test_exec("aax xxa", 0, REG_OK, 2, 3, END);
1286*63d4abf0Sagc test_comp("\\Bx\\b", REG_EXTENDED, 0);
1287*63d4abf0Sagc test_exec("aax xxx", 0, REG_OK, 2, 3, END);
1288*63d4abf0Sagc test_comp("\\<.", REG_EXTENDED, 0);
1289*63d4abf0Sagc test_exec(";xaa", 0, REG_OK, 1, 2, END);
1290*63d4abf0Sagc
1291*63d4abf0Sagc /* Shorthands for character classes. */
1292*63d4abf0Sagc test_comp("\\w+", REG_EXTENDED, 0);
1293*63d4abf0Sagc test_exec(",.(a23_Nt-�o)", 0, REG_OK, 3, 9, END);
1294*63d4abf0Sagc test_comp("\\d+", REG_EXTENDED, 0);
1295*63d4abf0Sagc test_exec("uR120_4=v4", 0, REG_OK, 2, 5, END);
1296*63d4abf0Sagc test_comp("\\D+", REG_EXTENDED, 0);
1297*63d4abf0Sagc test_exec("120d_=vA4s", 0, REG_OK, 3, 8, END);
1298*63d4abf0Sagc
1299*63d4abf0Sagc /* Quoted special characters. */
1300*63d4abf0Sagc test_comp("\\t", REG_EXTENDED, 0);
1301*63d4abf0Sagc test_comp("\\e", REG_EXTENDED, 0);
1302*63d4abf0Sagc
1303*63d4abf0Sagc /* Test the \x1B and \x{263a} extensions for specifying 8 bit and wide
1304*63d4abf0Sagc characters in hexadecimal. */
1305*63d4abf0Sagc test_comp("\\x41", REG_EXTENDED, 0);
1306*63d4abf0Sagc test_exec("ABC", 0, REG_OK, 0, 1, END);
1307*63d4abf0Sagc test_comp("\\x5", REG_EXTENDED, 0);
1308*63d4abf0Sagc test_exec("\005", 0, REG_OK, 0, 1, END);
1309*63d4abf0Sagc test_comp("\\x5r", REG_EXTENDED, 0);
1310*63d4abf0Sagc test_exec("\005r", 0, REG_OK, 0, 2, END);
1311*63d4abf0Sagc test_comp("\\x", REG_EXTENDED, 0);
1312*63d4abf0Sagc test_nexec("\000", 1, 0, REG_OK, 0, 1, END);
1313*63d4abf0Sagc test_comp("\\xr", REG_EXTENDED, 0);
1314*63d4abf0Sagc test_nexec("\000r", 2, 0, REG_OK, 0, 2, END);
1315*63d4abf0Sagc test_comp("\\x{41}", REG_EXTENDED, 0);
1316*63d4abf0Sagc test_exec("ABC", 0, REG_OK, 0, 1, END);
1317*63d4abf0Sagc test_comp("\\x{5}", REG_EXTENDED, 0);
1318*63d4abf0Sagc test_exec("\005", 0, REG_OK, 0, 1, END);
1319*63d4abf0Sagc test_comp("\\x{5}r", REG_EXTENDED, 0);
1320*63d4abf0Sagc test_exec("\005r", 0, REG_OK, 0, 2, END);
1321*63d4abf0Sagc test_comp("\\x{}", REG_EXTENDED, 0);
1322*63d4abf0Sagc test_nexec("\000", 1, 0, REG_OK, 0, 1, END);
1323*63d4abf0Sagc test_comp("\\x{}r", REG_EXTENDED, 0);
1324*63d4abf0Sagc test_nexec("\000r", 2, 0, REG_OK, 0, 2, END);
1325*63d4abf0Sagc
1326*63d4abf0Sagc /* Tests for (?inrU-inrU) and (?inrU-inrU:) */
1327*63d4abf0Sagc test_comp("foo(?i)bar", REG_EXTENDED, 0);
1328*63d4abf0Sagc test_exec("fooBaR", 0, REG_OK, 0, 6, END);
1329*63d4abf0Sagc test_comp("foo(?i)bar|zap", REG_EXTENDED, 0);
1330*63d4abf0Sagc test_exec("fooBaR", 0, REG_OK, 0, 6, END);
1331*63d4abf0Sagc test_exec("foozap", 0, REG_OK, 0, 6, END);
1332*63d4abf0Sagc test_exec("foozAp", 0, REG_OK, 0, 6, END);
1333*63d4abf0Sagc test_exec("zap", 0, REG_NOMATCH);
1334*63d4abf0Sagc test_comp("foo(?-i:zap)zot", REG_EXTENDED | REG_ICASE, 0);
1335*63d4abf0Sagc test_exec("FoOzapZOt", 0, REG_OK, 0, 9, END);
1336*63d4abf0Sagc test_exec("FoOzApZOt", 0, REG_NOMATCH);
1337*63d4abf0Sagc test_comp("foo(?i:bar|zap)", REG_EXTENDED, 0);
1338*63d4abf0Sagc test_exec("foozap", 0, REG_OK, 0, 6, END);
1339*63d4abf0Sagc test_exec("foobar", 0, REG_OK, 0, 6, END);
1340*63d4abf0Sagc test_exec("foobAr", 0, REG_OK, 0, 6, END);
1341*63d4abf0Sagc test_exec("fooZaP", 0, REG_OK, 0, 6, END);
1342*63d4abf0Sagc test_comp("foo(?U:o*)(o*)", REG_EXTENDED, 0);
1343*63d4abf0Sagc test_exec("foooo", 0, REG_OK, 0, 5, 3, 5, END);
1344*63d4abf0Sagc
1345*63d4abf0Sagc /* Test comment syntax. */
1346*63d4abf0Sagc test_comp("foo(?# This here is a comment. )bar", REG_EXTENDED, 0);
1347*63d4abf0Sagc test_exec("foobar", 0, REG_OK, 0, 6, END);
1348*63d4abf0Sagc
1349*63d4abf0Sagc /* Tests for \Q and \E. */
1350*63d4abf0Sagc test_comp("\\((\\Q)?:\\<[^$\\E)", REG_EXTENDED, 0);
1351*63d4abf0Sagc test_exec("()?:\\<[^$", 0, REG_OK, 0, 9, 1, 9, END);
1352*63d4abf0Sagc test_comp("\\Qabc\\E.*", REG_EXTENDED, 0);
1353*63d4abf0Sagc test_exec("abcdef", 0, REG_OK, 0, 6, END);
1354*63d4abf0Sagc test_comp("\\Qabc\\E.*|foo", REG_EXTENDED, 0);
1355*63d4abf0Sagc test_exec("parabc123wxyz", 0, REG_OK, 3, 13, END);
1356*63d4abf0Sagc test_exec("fooabc123wxyz", 0, REG_OK, 0, 3, END);
1357*63d4abf0Sagc
1358*63d4abf0Sagc /*
1359*63d4abf0Sagc * Test bounded repetitions.
1360*63d4abf0Sagc */
1361*63d4abf0Sagc
1362*63d4abf0Sagc test_comp("a{0,0}", REG_EXTENDED, REG_OK);
1363*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 0, END);
1364*63d4abf0Sagc test_comp("a{0,1}", REG_EXTENDED, REG_OK);
1365*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 1, END);
1366*63d4abf0Sagc test_comp("a{1,1}", REG_EXTENDED, REG_OK);
1367*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 1, END);
1368*63d4abf0Sagc test_comp("a{1,3}", REG_EXTENDED, REG_OK);
1369*63d4abf0Sagc test_exec("xaaaaa", 0, REG_OK, 1, 4, END);
1370*63d4abf0Sagc test_comp("a{0,3}", REG_EXTENDED, REG_OK);
1371*63d4abf0Sagc test_exec("aaaaa", 0, REG_OK, 0, 3, END);
1372*63d4abf0Sagc test_comp("a{0,}", REG_EXTENDED, REG_OK);
1373*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, END);
1374*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, END);
1375*63d4abf0Sagc test_exec("aa", 0, REG_OK, 0, 2, END);
1376*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 3, END);
1377*63d4abf0Sagc test_comp("a{1,}", REG_EXTENDED, REG_OK);
1378*63d4abf0Sagc test_exec("", 0, REG_NOMATCH);
1379*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, END);
1380*63d4abf0Sagc test_exec("aa", 0, REG_OK, 0, 2, END);
1381*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 3, END);
1382*63d4abf0Sagc test_comp("a{2,}", REG_EXTENDED, REG_OK);
1383*63d4abf0Sagc test_exec("", 0, REG_NOMATCH);
1384*63d4abf0Sagc test_exec("a", 0, REG_NOMATCH);
1385*63d4abf0Sagc test_exec("aa", 0, REG_OK, 0, 2, END);
1386*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 3, END);
1387*63d4abf0Sagc test_comp("a{3,}", REG_EXTENDED, REG_OK);
1388*63d4abf0Sagc test_exec("", 0, REG_NOMATCH);
1389*63d4abf0Sagc test_exec("a", 0, REG_NOMATCH);
1390*63d4abf0Sagc test_exec("aa", 0, REG_NOMATCH);
1391*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 3, END);
1392*63d4abf0Sagc test_exec("aaaa", 0, REG_OK, 0, 4, END);
1393*63d4abf0Sagc test_exec("aaaaa", 0, REG_OK, 0, 5, END);
1394*63d4abf0Sagc test_exec("aaaaaa", 0, REG_OK, 0, 6, END);
1395*63d4abf0Sagc test_exec("aaaaaaa", 0, REG_OK, 0, 7, END);
1396*63d4abf0Sagc
1397*63d4abf0Sagc test_comp("a{5,10}", REG_EXTENDED, REG_OK);
1398*63d4abf0Sagc test_comp("a{6,6}", REG_EXTENDED, REG_OK);
1399*63d4abf0Sagc test_exec("aaaaaaaaaaaa", 0, REG_OK, 0, 6, END);
1400*63d4abf0Sagc test_exec("xxaaaaaaaaaaaa", 0, REG_OK, 2, 8, END);
1401*63d4abf0Sagc test_exec("xxaaaaa", 0, REG_NOMATCH);
1402*63d4abf0Sagc test_comp("a{5,6}", REG_EXTENDED, REG_OK);
1403*63d4abf0Sagc test_exec("aaaaaaaaaaaa", 0, REG_OK, 0, 6, END);
1404*63d4abf0Sagc test_exec("xxaaaaaaaaaaaa", 0, REG_OK, 2, 8, END);
1405*63d4abf0Sagc test_exec("xxaaaaa", 0, REG_OK, 2, 7, END);
1406*63d4abf0Sagc test_exec("xxaaaa", 0, REG_NOMATCH);
1407*63d4abf0Sagc
1408*63d4abf0Sagc /* Trickier ones... */
1409*63d4abf0Sagc test_comp("([ab]{5,10})*b", REG_EXTENDED, REG_OK);
1410*63d4abf0Sagc test_exec("bbbbbabaaaaab", 0, REG_OK, 0, 13, 5, 12, END);
1411*63d4abf0Sagc test_exec("bbbbbbaaaaab", 0, REG_OK, 0, 12, 5, 11, END);
1412*63d4abf0Sagc test_exec("bbbbbbaaaab", 0, REG_OK, 0, 11, 0, 10, END);
1413*63d4abf0Sagc test_exec("bbbbbbaaab", 0, REG_OK, 0, 10, 0, 9, END);
1414*63d4abf0Sagc test_exec("bbbbbbaab", 0, REG_OK, 0, 9, 0, 8, END);
1415*63d4abf0Sagc test_exec("bbbbbbab", 0, REG_OK, 0, 8, 0, 7, END);
1416*63d4abf0Sagc
1417*63d4abf0Sagc test_comp("([ab]*)(ab[ab]{5,10})ba", REG_EXTENDED, REG_OK);
1418*63d4abf0Sagc test_exec("abbabbbabaabbbbbbbbbbbbbabaaaabab", 0, REG_OK,
1419*63d4abf0Sagc 0, 10, 0, 0, 0, 8, END);
1420*63d4abf0Sagc test_exec("abbabbbabaabbbbbbbbbbbbabaaaaabab", 0, REG_OK,
1421*63d4abf0Sagc 0, 32, 0, 23, 23, 30, END);
1422*63d4abf0Sagc test_exec("abbabbbabaabbbbbbbbbbbbabaaaabab", 0, REG_OK,
1423*63d4abf0Sagc 0, 24, 0, 10, 10, 22, END);
1424*63d4abf0Sagc test_exec("abbabbbabaabbbbbbbbbbbba", 0, REG_OK,
1425*63d4abf0Sagc 0, 24, 0, 10, 10, 22, END);
1426*63d4abf0Sagc
1427*63d4abf0Sagc /* Test repeating something that has submatches inside. */
1428*63d4abf0Sagc test_comp("(a){0,5}", REG_EXTENDED, 0);
1429*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, -1, -1, END);
1430*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, 0, 1, END);
1431*63d4abf0Sagc test_exec("aa", 0, REG_OK, 0, 2, 1, 2, END);
1432*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 3, 2, 3, END);
1433*63d4abf0Sagc test_exec("aaaa", 0, REG_OK, 0, 4, 3, 4, END);
1434*63d4abf0Sagc test_exec("aaaaa", 0, REG_OK, 0, 5, 4, 5, END);
1435*63d4abf0Sagc test_exec("aaaaaa", 0, REG_OK, 0, 5, 4, 5, END);
1436*63d4abf0Sagc
1437*63d4abf0Sagc test_comp("(a){2,3}", REG_EXTENDED, 0);
1438*63d4abf0Sagc test_exec("", 0, REG_NOMATCH);
1439*63d4abf0Sagc test_exec("a", 0, REG_NOMATCH);
1440*63d4abf0Sagc test_exec("aa", 0, REG_OK, 0, 2, 1, 2, END);
1441*63d4abf0Sagc test_exec("aaa", 0, REG_OK, 0, 3, 2, 3, END);
1442*63d4abf0Sagc test_exec("aaaa", 0, REG_OK, 0, 3, 2, 3, END);
1443*63d4abf0Sagc
1444*63d4abf0Sagc test_comp("\\(a\\)\\{4\\}", 0, 0);
1445*63d4abf0Sagc test_exec("aaaa", 0, REG_OK, 0, 4, 3, 4, END);
1446*63d4abf0Sagc
1447*63d4abf0Sagc test_comp("\\(a*\\)\\{2\\}", 0, 0);
1448*63d4abf0Sagc test_exec("a", 0, REG_OK, 0, 1, 1, 1, END);
1449*63d4abf0Sagc
1450*63d4abf0Sagc test_comp("((..)|(.)){2}", REG_EXTENDED, 0);
1451*63d4abf0Sagc test_exec("aa", 0, REG_OK, 0, 2, 1, 2, -1, -1, 1, 2, END);
1452*63d4abf0Sagc
1453*63d4abf0Sagc /* Nested repeats. */
1454*63d4abf0Sagc test_comp("(.){2}{3}", REG_EXTENDED, 0);
1455*63d4abf0Sagc test_exec("xxxxx", 0, REG_NOMATCH);
1456*63d4abf0Sagc test_exec("xxxxxx", 0, REG_OK, 0, 6, 5, 6, END);
1457*63d4abf0Sagc test_comp("(..){2}{3}", REG_EXTENDED, 0);
1458*63d4abf0Sagc test_exec("xxxxxxxxxxx", 0, REG_NOMATCH);
1459*63d4abf0Sagc test_exec("xxxxxxxxxxxx", 0, REG_OK, 0, 12, 10, 12, END);
1460*63d4abf0Sagc test_comp("((..){2}.){3}", REG_EXTENDED, 0);
1461*63d4abf0Sagc test_exec("xxxxxxxxxxxxxx", 0, REG_NOMATCH);
1462*63d4abf0Sagc test_exec("xxxxxxxxxxxxxxx", 0, REG_OK, 0, 15, 10, 15, 12, 14, END);
1463*63d4abf0Sagc test_comp("((..){1,2}.){3}", REG_EXTENDED, 0);
1464*63d4abf0Sagc test_exec("xxxxxxxx", 0, REG_NOMATCH);
1465*63d4abf0Sagc test_exec("xxxxxxxxx", 0, REG_OK, 0, 9, 6, 9, 6, 8, END);
1466*63d4abf0Sagc test_exec("xxxxxxxxxx", 0, REG_OK, 0, 9, 6, 9, 6, 8, END);
1467*63d4abf0Sagc test_exec("xxxxxxxxxxx", 0, REG_OK, 0, 11, 8, 11, 8, 10, END);
1468*63d4abf0Sagc test_comp("a{2}{2}x", REG_EXTENDED, 0);
1469*63d4abf0Sagc test_exec("", 0, REG_NOMATCH);
1470*63d4abf0Sagc test_exec("x", 0, REG_NOMATCH);
1471*63d4abf0Sagc test_exec("ax", 0, REG_NOMATCH);
1472*63d4abf0Sagc test_exec("aax", 0, REG_NOMATCH);
1473*63d4abf0Sagc test_exec("aaax", 0, REG_NOMATCH);
1474*63d4abf0Sagc test_exec("aaaax", 0, REG_OK, 0, 5, END);
1475*63d4abf0Sagc test_exec("aaaaax", 0, REG_OK, 1, 6, END);
1476*63d4abf0Sagc test_exec("aaaaaax", 0, REG_OK, 2, 7, END);
1477*63d4abf0Sagc test_exec("aaaaaaax", 0, REG_OK, 3, 8, END);
1478*63d4abf0Sagc test_exec("aaaaaaaax", 0, REG_OK, 4, 9, END);
1479*63d4abf0Sagc
1480*63d4abf0Sagc /* Repeats with iterations inside. */
1481*63d4abf0Sagc test_comp("([a-z]+){2,5}", REG_EXTENDED, 0);
1482*63d4abf0Sagc test_exec("a\n", 0, REG_NOMATCH);
1483*63d4abf0Sagc test_exec("aa\n", 0, REG_OK, 0, 2, 1, 2, END);
1484*63d4abf0Sagc
1485*63d4abf0Sagc /* Multiple repeats in one regexp. */
1486*63d4abf0Sagc test_comp("a{3}b{3}", REG_EXTENDED, 0);
1487*63d4abf0Sagc test_exec("aaabbb", 0, REG_OK, 0, 6, END);
1488*63d4abf0Sagc test_exec("aaabbbb", 0, REG_OK, 0, 6, END);
1489*63d4abf0Sagc test_exec("aaaabbb", 0, REG_OK, 1, 7, END);
1490*63d4abf0Sagc test_exec("aabbb", 0, REG_NOMATCH);
1491*63d4abf0Sagc test_exec("aaabb", 0, REG_NOMATCH);
1492*63d4abf0Sagc
1493*63d4abf0Sagc /* Test that different types of repetitions work correctly when used
1494*63d4abf0Sagc in the same regexp. */
1495*63d4abf0Sagc test_comp("a{2}{2}xb+xc*xd?x", REG_EXTENDED, 0);
1496*63d4abf0Sagc test_exec("aaaaxbxcxdx", 0, REG_OK, 0, 11, END);
1497*63d4abf0Sagc test_exec("aaaxbxcxdx", 0, REG_NOMATCH);
1498*63d4abf0Sagc test_exec("aabxcxdx", 0, REG_NOMATCH);
1499*63d4abf0Sagc test_exec("aaaacxdx", 0, REG_NOMATCH);
1500*63d4abf0Sagc test_exec("aaaaxbdx", 0, REG_NOMATCH);
1501*63d4abf0Sagc test_comp("^!packet [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3} [0-9]+",
1502*63d4abf0Sagc REG_EXTENDED, 0);
1503*63d4abf0Sagc test_exec("!packet 10.0.2.4 12765 ei voittoa", 0, REG_OK, 0, 22, END);
1504*63d4abf0Sagc
1505*63d4abf0Sagc /*
1506*63d4abf0Sagc * Back referencing tests.
1507*63d4abf0Sagc */
1508*63d4abf0Sagc test_comp("([a-z]*) \\1", REG_EXTENDED, 0);
1509*63d4abf0Sagc test_exec("foobar foobar", 0, REG_OK, 0, 13, 0, 6, END);
1510*63d4abf0Sagc
1511*63d4abf0Sagc /* Searching for a leftmost longest square (repeated string) */
1512*63d4abf0Sagc test_comp("(.*)\\1", REG_EXTENDED, 0);
1513*63d4abf0Sagc test_exec("foobarfoobar", 0, REG_OK, 0, 12, 0, 6, END);
1514*63d4abf0Sagc
1515*63d4abf0Sagc test_comp("a(b)*c\\1", REG_EXTENDED, 0);
1516*63d4abf0Sagc test_exec("acb", 0, REG_OK, 0, 2, -1, -1, END);
1517*63d4abf0Sagc test_exec("abbcbbb", 0, REG_OK, 0, 5, 2, 3, END);
1518*63d4abf0Sagc test_exec("abbdbd", 0, REG_NOMATCH);
1519*63d4abf0Sagc
1520*63d4abf0Sagc test_comp("([a-c]*)\\1", REG_EXTENDED, 0);
1521*63d4abf0Sagc test_exec("abcacdef", 0, REG_OK, 0, 0, 0, 0, END);
1522*63d4abf0Sagc test_exec("abcabcabcd", 0, REG_OK, 0, 6, 0, 3, END);
1523*63d4abf0Sagc
1524*63d4abf0Sagc test_comp("\\(a*\\)*\\(x\\)\\(\\1\\)", 0, 0);
1525*63d4abf0Sagc test_exec("x", 0, REG_OK, 0, 1, 0, 0, 0, 1, 1, 1, END);
1526*63d4abf0Sagc #if KNOWN_BUG
1527*63d4abf0Sagc test_exec("ax", 0, REG_OK, 0, 2, 1, 1, 1, 2, 2, 2, END);
1528*63d4abf0Sagc #endif
1529*63d4abf0Sagc
1530*63d4abf0Sagc test_comp("(a)\\1{1,2}", REG_EXTENDED, 0);
1531*63d4abf0Sagc test_exec("aabc", 0, REG_OK, 0, 2, 0, 1, END);
1532*63d4abf0Sagc
1533*63d4abf0Sagc test_comp("((.*)\\1)+", REG_EXTENDED, 0);
1534*63d4abf0Sagc test_exec("aa", 0, REG_OK, 0, 2, 0, 2, 0, 1, END);
1535*63d4abf0Sagc
1536*63d4abf0Sagc #if KNOWN_BUG
1537*63d4abf0Sagc test_comp("()(\\1\\1)*", REG_EXTENDED, 0);
1538*63d4abf0Sagc test_exec("", 0, REG_OK, 0, 0, 0, 0, 0, 0, END);
1539*63d4abf0Sagc #endif
1540*63d4abf0Sagc
1541*63d4abf0Sagc /* Check that back references work with REG_NOSUB. */
1542*63d4abf0Sagc test_comp("(o)\\1", REG_EXTENDED | REG_NOSUB, 0);
1543*63d4abf0Sagc test_exec("foobar", 0, REG_OK, END);
1544*63d4abf0Sagc test_comp("(o)\\1", REG_EXTENDED, 0);
1545*63d4abf0Sagc test_exec("foobar", 0, REG_OK, 1, 3, 1, 2, END);
1546*63d4abf0Sagc test_comp("(o)\\1", REG_EXTENDED, 0);
1547*63d4abf0Sagc test_exec("fobar", 0, REG_NOMATCH);
1548*63d4abf0Sagc
1549*63d4abf0Sagc test_comp("\\1foo", REG_EXTENDED, REG_ESUBREG);
1550*63d4abf0Sagc test_comp("\\1foo(bar)", REG_EXTENDED, 0);
1551*63d4abf0Sagc
1552*63d4abf0Sagc /* Back reference with zero-width assertion. */
1553*63d4abf0Sagc test_comp("(.)\\1$", REG_EXTENDED, 0);
1554*63d4abf0Sagc test_exec("foox", 0, REG_NOMATCH);
1555*63d4abf0Sagc test_exec("foo", 0, REG_OK, 1, 3, 1, 2, END);
1556*63d4abf0Sagc
1557*63d4abf0Sagc /* Back references together with {}. */
1558*63d4abf0Sagc test_comp("([0-9]{5})\\1", REG_EXTENDED, 0);
1559*63d4abf0Sagc test_exec("12345", 0, REG_NOMATCH);
1560*63d4abf0Sagc test_exec("1234512345", 0, REG_OK, 0, 10, 0, 5, END);
1561*63d4abf0Sagc test_comp("([0-9]{4})\\1", REG_EXTENDED, 0);
1562*63d4abf0Sagc test_exec("1234", 0, REG_NOMATCH);
1563*63d4abf0Sagc test_exec("12341234", 0, REG_OK, 0, 8, 0, 4, END);
1564*63d4abf0Sagc
1565*63d4abf0Sagc /*
1566*63d4abf0Sagc * Test minimal repetitions (non-greedy repetitions)
1567*63d4abf0Sagc */
1568*63d4abf0Sagc avoid_eflags = REG_BACKTRACKING_MATCHER | REG_APPROX_MATCHER;
1569*63d4abf0Sagc
1570*63d4abf0Sagc /* Basic .*/
1571*63d4abf0Sagc test_comp(".*?", REG_EXTENDED, 0);
1572*63d4abf0Sagc test_exec("abcd", 0, REG_OK, 0, 0, END);
1573*63d4abf0Sagc test_comp(".+?", REG_EXTENDED, 0);
1574*63d4abf0Sagc test_exec("abcd", 0, REG_OK, 0, 1, END);
1575*63d4abf0Sagc test_comp(".??", REG_EXTENDED, 0);
1576*63d4abf0Sagc test_exec("abcd", 0, REG_OK, 0, 0, END);
1577*63d4abf0Sagc test_comp(".{2,5}?", REG_EXTENDED, 0);
1578*63d4abf0Sagc test_exec("abcd", 0, REG_OK, 0, 2, END);
1579*63d4abf0Sagc
1580*63d4abf0Sagc /* More complicated. */
1581*63d4abf0Sagc test_comp("<b>(.*?)</b>", REG_EXTENDED, 0);
1582*63d4abf0Sagc test_exec("<b>text1</b><b>text2</b>", 0, REG_OK, 0, 12, 3, 8, END);
1583*63d4abf0Sagc test_comp("a(.*?)(foo|bar|zap)", REG_EXTENDED, 0);
1584*63d4abf0Sagc test_exec("hubba wooga-booga zabar gafoo wazap", 0, REG_OK,
1585*63d4abf0Sagc 4, 23, 5, 20, 20, 23, END);
1586*63d4abf0Sagc
1587*63d4abf0Sagc /* Test REG_UNGREEDY. */
1588*63d4abf0Sagc test_comp(".*", REG_EXTENDED | REG_UNGREEDY, 0);
1589*63d4abf0Sagc test_exec("abcd", 0, REG_OK, 0, 0, END);
1590*63d4abf0Sagc test_comp(".*?", REG_EXTENDED | REG_UNGREEDY, 0);
1591*63d4abf0Sagc test_exec("abcd", 0, REG_OK, 0, 4, END);
1592*63d4abf0Sagc
1593*63d4abf0Sagc avoid_eflags = 0;
1594*63d4abf0Sagc
1595*63d4abf0Sagc
1596*63d4abf0Sagc /*
1597*63d4abf0Sagc * Error reporting tests.
1598*63d4abf0Sagc */
1599*63d4abf0Sagc
1600*63d4abf0Sagc test_comp("\\", REG_EXTENDED, REG_EESCAPE);
1601*63d4abf0Sagc test_comp("\\\\", REG_EXTENDED, REG_OK);
1602*63d4abf0Sagc test_exec("\\", 0, REG_OK, 0, 1, END);
1603*63d4abf0Sagc test_comp("(", REG_EXTENDED, REG_EPAREN);
1604*63d4abf0Sagc test_comp("(aaa", REG_EXTENDED, REG_EPAREN);
1605*63d4abf0Sagc test_comp(")", REG_EXTENDED, REG_OK);
1606*63d4abf0Sagc test_exec(")", 0, REG_OK, 0, 1, END);
1607*63d4abf0Sagc test_comp("a{1", REG_EXTENDED, REG_EBRACE);
1608*63d4abf0Sagc test_comp("a{1,x}", REG_EXTENDED, REG_BADBR);
1609*63d4abf0Sagc test_comp("a{1x}", REG_EXTENDED, REG_BADBR);
1610*63d4abf0Sagc test_comp("a{1,0}", REG_EXTENDED, REG_BADBR);
1611*63d4abf0Sagc test_comp("a{x}", REG_EXTENDED, REG_BADBR);
1612*63d4abf0Sagc test_comp("a{}", REG_EXTENDED, REG_BADBR);
1613*63d4abf0Sagc
1614*63d4abf0Sagc
1615*63d4abf0Sagc test_comp("\\", 0, REG_EESCAPE);
1616*63d4abf0Sagc test_comp("\\(", 0, REG_EPAREN);
1617*63d4abf0Sagc test_comp("\\)", 0, REG_EPAREN);
1618*63d4abf0Sagc test_comp("a\\{1", 0, REG_EBRACE);
1619*63d4abf0Sagc test_comp("a\\{1,x\\}", 0, REG_BADBR);
1620*63d4abf0Sagc test_comp("a\\{1x\\}", 0, REG_BADBR);
1621*63d4abf0Sagc test_comp("a\\{1,0\\}", 0, REG_BADBR);
1622*63d4abf0Sagc test_comp("a\\{x\\}", 0, REG_BADBR);
1623*63d4abf0Sagc test_comp("a\\{\\}", 0, REG_BADBR);
1624*63d4abf0Sagc
1625*63d4abf0Sagc
1626*63d4abf0Sagc
1627*63d4abf0Sagc
1628*63d4abf0Sagc /*
1629*63d4abf0Sagc * Internationalization tests.
1630*63d4abf0Sagc */
1631*63d4abf0Sagc
1632*63d4abf0Sagc /* This same test with the correct locale is below. */
1633*63d4abf0Sagc test_comp("��+", REG_EXTENDED, 0);
1634*63d4abf0Sagc test_exec("���ξޤϡ�����������������", 0, REG_OK, 10, 13, END);
1635*63d4abf0Sagc
1636*63d4abf0Sagc #if !defined(WIN32) && !defined(__OpenBSD__)
1637*63d4abf0Sagc if (setlocale(LC_CTYPE, "en_US.ISO-8859-1") != NULL)
1638*63d4abf0Sagc {
1639*63d4abf0Sagc printf("\nTesting LC_CTYPE en_US.ISO-8859-1\n");
1640*63d4abf0Sagc test_comp("aBCdeFghiJKlmnoPQRstuvWXyZ���", REG_ICASE, 0);
1641*63d4abf0Sagc test_exec("abCDefGhiJKlmNoPqRStuVwXyz���", 0, REG_OK, 0, 29, END);
1642*63d4abf0Sagc }
1643*63d4abf0Sagc
1644*63d4abf0Sagc #ifdef TRE_MULTIBYTE
1645*63d4abf0Sagc if (setlocale(LC_CTYPE, "ja_JP.eucjp") != NULL)
1646*63d4abf0Sagc {
1647*63d4abf0Sagc printf("\nTesting LC_CTYPE ja_JP.eucjp\n");
1648*63d4abf0Sagc /* I tried to make a test where implementations not aware of multibyte
1649*63d4abf0Sagc character sets will fail. I have no idea what the japanese text here
1650*63d4abf0Sagc means, I took it from http://www.ipsec.co.jp/. */
1651*63d4abf0Sagc test_comp("��+", REG_EXTENDED, 0);
1652*63d4abf0Sagc test_exec("���ξޤϡ�����������������", 0, REG_OK, 10, 12, END);
1653*63d4abf0Sagc
1654*63d4abf0Sagc test_comp("a", REG_EXTENDED, 0);
1655*63d4abf0Sagc test_nexec("foo\000bar", 7, 0, REG_OK, 5, 6, END);
1656*63d4abf0Sagc test_comp("c$", REG_EXTENDED, 0);
1657*63d4abf0Sagc test_exec("abc", 0, REG_OK, 2, 3, END);
1658*63d4abf0Sagc }
1659*63d4abf0Sagc #endif /* TRE_MULTIBYTE */
1660*63d4abf0Sagc #endif
1661*63d4abf0Sagc
1662*63d4abf0Sagc tre_regfree(&reobj);
1663*63d4abf0Sagc
1664*63d4abf0Sagc printf("\n");
1665*63d4abf0Sagc if (comp_errors || exec_errors)
1666*63d4abf0Sagc printf("%d (%d + %d) out of %d tests FAILED!\n",
1667*63d4abf0Sagc comp_errors + exec_errors, comp_errors, exec_errors,
1668*63d4abf0Sagc comp_tests + exec_tests);
1669*63d4abf0Sagc else
1670*63d4abf0Sagc printf("All %d tests passed.\n", comp_tests + exec_tests);
1671*63d4abf0Sagc
1672*63d4abf0Sagc
1673*63d4abf0Sagc #ifdef MALLOC_DEBUGGING
1674*63d4abf0Sagc if (xmalloc_dump_leaks())
1675*63d4abf0Sagc return 1;
1676*63d4abf0Sagc #endif /* MALLOC_DEBUGGING */
1677*63d4abf0Sagc
1678*63d4abf0Sagc return comp_errors || exec_errors;
1679*63d4abf0Sagc }
1680*63d4abf0Sagc
1681*63d4abf0Sagc /* EOF */
1682