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