xref: /netbsd-src/external/bsd/tre/dist/tests/retest.c (revision 63d4abf06d37aace2f9e41a494102a64fe3abddb)
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