• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Regular expression tests.
2    Copyright (C) 2003 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4    Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
5 
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10 
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15 
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19    02110-1301 USA.  */
20 
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24 
25 #include <sys/types.h>
26 #ifdef HAVE_MCHECK_H
27 #include <mcheck.h>
28 #endif
29 #include <regex.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 
34 void
frob_escapes(char * src,int pattern)35 frob_escapes (char *src, int pattern)
36 {
37   char *dst;
38 
39   for (dst = src; *src != '\0'; dst++, src++)
40     {
41       if (*src == '\\')
42 	{
43 	  switch (src[1])
44 	    {
45 	    case 't':
46 	      src++;
47 	      *dst = '\t';
48 	      continue;
49 	    case 'n':
50 	      src++;
51 	      *dst = '\n';
52 	      continue;
53 	    case 'r':
54 	      src++;
55 	      *dst = '\r';
56 	      continue;
57 	    case '\\':
58 	    case '^':
59 	    case '{':
60 	    case '|':
61 	    case '}':
62 	      if (!pattern)
63 		{
64 		  src++;
65 		  *dst = *src;
66 		  continue;
67 		}
68 	      break;
69 	    }
70 	}
71       if (src != dst)
72 	*dst = *src;
73     }
74   *dst = '\0';
75 }
76 
77 int
main(int argc,char ** argv)78 main (int argc, char **argv)
79 {
80   int ret = 0, n;
81   char *line = NULL;
82   size_t line_len = 0;
83   ssize_t len;
84   FILE *f;
85   char *pattern, *string;
86   int flags = REG_EXTENDED;
87   int eflags = 0;
88   regex_t re;
89   regmatch_t rm[20];
90 
91 #ifdef HAVE_MCHECK_H
92   mtrace ();
93 #endif
94 
95   if (argc < 2)
96     {
97       fprintf (stderr, "Missing test filename\n");
98       return 1;
99     }
100 
101   f = fopen (argv[1], "r");
102   if (f == NULL)
103     {
104       fprintf (stderr, "Couldn't open %s\n", argv[1]);
105       return 1;
106     }
107 
108   while ((len = getline (&line, &line_len, f)) > 0)
109     {
110       char *p, *q;
111       int i;
112 
113       if (line[len - 1] == '\n')
114 	line[--len] = '\0';
115 
116       puts (line);
117 
118       if (line[0] == ';')
119 	continue;
120 
121       if (line[0] == '\0')
122 	continue;
123 
124       if (line[0] == '-')
125 	{
126 	  if (strstr (line, "REG_BASIC"))
127 	    flags = 0;
128 	  else
129 	    flags = REG_EXTENDED;
130 	  if (strstr (line, "REG_ICASE"))
131 	    flags |= REG_ICASE;
132 	  if (strstr (line, "REG_NEWLINE"))
133 	    flags |= REG_NEWLINE;
134 	  eflags = 0;
135 	  if (strstr (line, "REG_NOTBOL"))
136 	    eflags |= REG_NOTBOL;
137 	  if (strstr (line, "REG_NOTEOL"))
138 	    eflags |= REG_NOTEOL;
139 	  continue;
140 	}
141 
142       pattern = line + strspn (line, " \t");
143       if (*pattern == '\0')
144 	continue;
145       p = pattern + strcspn (pattern, " \t");
146       if (*p == '\0')
147 	continue;
148       *p++ = '\0';
149 
150       string = p + strspn (p, " \t");
151       if (*string == '\0')
152 	continue;
153       if (*string == '"')
154 	{
155 	  string++;
156 	  p = strchr (string, '"');
157 	  if (p == NULL)
158 	    continue;
159 	  *p++ = '\0';
160 	}
161       else
162 	{
163 	  p = string + strcspn (string, " \t");
164 	  if (*string == '!')
165 	    string = NULL;
166 	  else if (*p == '\0')
167 	    continue;
168 	  else
169 	    *p++ = '\0';
170 	}
171 
172       frob_escapes (pattern, 1);
173       if (string != NULL)
174 	frob_escapes (string, 0);
175 
176       n = regcomp (&re, pattern, flags);
177       if (n != 0)
178 	{
179 	  if (string != NULL)
180 	    {
181 	      char buf[500];
182 	      regerror (n, &re, buf, sizeof (buf));
183 	      printf ("FAIL regcomp unexpectedly failed: %s\n",
184 		      buf);
185 	      ret = 1;
186 	    }
187 	  continue;
188 	}
189       else if (string == NULL)
190 	{
191 	  regfree (&re);
192 	  puts ("FAIL regcomp unpexpectedly succeeded");
193 	  ret = 1;
194 	  continue;
195 	}
196 
197       if (regexec (&re, string, 20, rm, eflags))
198 	{
199 	  for (i = 0; i < 20; ++i)
200 	    {
201 	      rm[i].rm_so = -1;
202 	      rm[i].rm_eo = -1;
203 	    }
204 	}
205 
206       regfree (&re);
207 
208       for (i = 0; i < 20 && *p != '\0'; ++i)
209 	{
210 	  int rm_so, rm_eo;
211 
212 	  rm_so = strtol (p, &q, 10);
213 	  if (p == q)
214 	    break;
215 	  p = q;
216 
217 	  rm_eo = strtol (p, &q, 10);
218 	  if (p == q)
219 	    break;
220 	  p = q;
221 
222 	  if (rm[i].rm_so != rm_so || rm[i].rm_eo != rm_eo)
223 	    {
224 	      printf ("FAIL rm[%d] %d..%d != expected %d..%d\n",
225 		      i, rm[i].rm_so, rm[i].rm_eo, rm_so, rm_eo);
226 	      ret = 1;
227 	      break;
228 	    }
229 	}
230     }
231 
232   free (line);
233   fclose (f);
234   return ret;
235 }
236