3 #include "silcruntime.h"
5 int main(int argc, char **argv)
7 SilcBool success = FALSE;
9 SilcRegexMatchStruct match[20];
10 int i, num_match = 20;
11 char *regex, *string, *sub;
12 SilcBufferStruct bmatch;
14 if (argc > 1 && !strcmp(argv[1], "-d")) {
17 silc_log_debug_hexdump(TRUE);
18 silc_log_set_debug_string("*regex*,*errno*,*buffmt*");
21 string = silc_strdup("foobar");
22 SILC_LOG_DEBUG(("Replace %s", string));
23 silc_buffer_set(&bmatch, string, strlen(string));
24 if (!silc_subst(&bmatch, "s/foo/bar/"))
26 silc_buffer_printf(&bmatch, TRUE);
27 if (!silc_buffer_memcmp(&bmatch, "barbar", 6))
29 silc_buffer_purge(&bmatch);
31 string = silc_strdup("foobar foobar");
32 SILC_LOG_DEBUG(("Replace %s", string));
33 silc_buffer_set(&bmatch, string, strlen(string));
34 if (!silc_subst(&bmatch, "s/foo/bar/g"))
36 silc_buffer_printf(&bmatch, TRUE);
37 if (!silc_buffer_memcmp(&bmatch, "barbar barbar", 13))
39 silc_buffer_purge(&bmatch);
41 string = silc_strdup("foobar foobar");
42 SILC_LOG_DEBUG(("Replace %s", string));
43 silc_buffer_set(&bmatch, string, strlen(string));
44 if (!silc_subst(&bmatch, "s/foo/bar/"))
46 silc_buffer_printf(&bmatch, TRUE);
47 if (!silc_buffer_memcmp(&bmatch, "barbar foobar", 13))
49 silc_buffer_purge(&bmatch);
51 string = silc_strdup("foobar\nfoobar foobar\nfoobar");
52 SILC_LOG_DEBUG(("Replace %s", string));
53 silc_buffer_set(&bmatch, string, strlen(string));
54 if (!silc_subst(&bmatch, "s/foo/BARBAR/g"))
56 silc_buffer_printf(&bmatch, TRUE);
57 if (!silc_buffer_memcmp(&bmatch, "BARBARbar\nBARBARbar BARBARbar\nBARBARbar",
60 silc_buffer_purge(&bmatch);
62 string = silc_strdup("foobar\nfoobar foobar\nfoobar");
63 SILC_LOG_DEBUG(("Replace %s", string));
64 silc_buffer_set(&bmatch, string, strlen(string));
65 if (!silc_subst(&bmatch, "s/foo/BARBAR/"))
67 silc_buffer_printf(&bmatch, TRUE);
68 if (!silc_buffer_memcmp(&bmatch, "BARBARbar\nBARBARbar foobar\nBARBARbar",
71 silc_buffer_purge(&bmatch);
73 string = silc_strdup("foobar\nfoobar foobar\nfoobar");
74 SILC_LOG_DEBUG(("Replace %s", string));
75 silc_buffer_set(&bmatch, string, strlen(string));
76 if (!silc_subst(&bmatch, "s/foo//"))
78 silc_buffer_printf(&bmatch, TRUE);
79 if (!silc_buffer_memcmp(&bmatch, "bar\nbar foobar\nbar",
82 silc_buffer_purge(&bmatch);
84 string = silc_strdup("foobar\nfoobar foobar\nfoobar");
85 SILC_LOG_DEBUG(("Replace %s", string));
86 silc_buffer_set(&bmatch, string, strlen(string));
87 if (!silc_subst(&bmatch, "s/foo/B/g"))
89 silc_buffer_printf(&bmatch, TRUE);
90 if (!silc_buffer_memcmp(&bmatch, "Bbar\nBbar Bbar\nBbar",
93 silc_buffer_purge(&bmatch);
95 string = silc_strdup("foobar\nfoobar foobar\nfoobar");
96 SILC_LOG_DEBUG(("Replace %s", string));
97 silc_buffer_set(&bmatch, string, strlen(string));
98 if (!silc_subst(&bmatch, "s/foo/B/"))
100 silc_buffer_printf(&bmatch, TRUE);
101 if (!silc_buffer_memcmp(&bmatch, "Bbar\nBbar foobar\nBbar",
104 silc_buffer_purge(&bmatch);
106 string = silc_strdup("foobar\nBfoobar foobar\nBfoobar\nfoo");
107 SILC_LOG_DEBUG(("Replace %s", string));
108 silc_buffer_set(&bmatch, string, strlen(string));
109 if (!silc_subst(&bmatch, "/^B/s/foo/B/g"))
111 silc_buffer_printf(&bmatch, TRUE);
112 if (!silc_buffer_memcmp(&bmatch, "foobar\nBBbar Bbar\nBBbar\nfoo",
115 silc_buffer_purge(&bmatch);
117 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
118 SILC_LOG_DEBUG(("Replace %s", string));
119 silc_buffer_set(&bmatch, string, strlen(string));
120 if (!silc_subst(&bmatch, "/baz/s/foo/BARBAR/g"))
122 silc_buffer_printf(&bmatch, TRUE);
123 if (!silc_buffer_memcmp(&bmatch,
124 "foobar\nBARBARbar baz BARBARbar\nbazBARBARbar\nfoo",
127 silc_buffer_purge(&bmatch);
129 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
130 SILC_LOG_DEBUG(("Replace %s", string));
131 silc_buffer_set(&bmatch, string, strlen(string));
132 if (!silc_subst(&bmatch, "/baz/s/foo/BARBAR/"))
134 silc_buffer_printf(&bmatch, TRUE);
135 if (!silc_buffer_memcmp(&bmatch,
136 "foobar\nBARBARbar baz foobar\nbazBARBARbar\nfoo",
139 silc_buffer_purge(&bmatch);
141 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
142 SILC_LOG_DEBUG(("Replace %s", string));
143 silc_buffer_set(&bmatch, string, strlen(string));
144 if (!silc_subst(&bmatch, "/baz/!s/foo/BARBAR/"))
146 silc_buffer_printf(&bmatch, TRUE);
147 if (!silc_buffer_memcmp(&bmatch,
148 "BARBARbar\nfoobar baz foobar\nbazfoobar\nBARBAR",
151 silc_buffer_purge(&bmatch);
153 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
154 SILC_LOG_DEBUG(("Replace %s", string));
155 silc_buffer_set(&bmatch, string, strlen(string));
156 if (!silc_subst(&bmatch, "2s/foo/BARBAR/"))
158 silc_buffer_printf(&bmatch, TRUE);
159 if (!silc_buffer_memcmp(&bmatch,
160 "foobar\nBARBARbar baz foobar\nbazfoobar\nfoo",
163 silc_buffer_purge(&bmatch);
165 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
166 SILC_LOG_DEBUG(("Replace %s", string));
167 silc_buffer_set(&bmatch, string, strlen(string));
168 if (!silc_subst(&bmatch, "2s/foo/BARBAR/g"))
170 silc_buffer_printf(&bmatch, TRUE);
171 if (!silc_buffer_memcmp(&bmatch,
172 "foobar\nBARBARbar baz BARBARbar\nbazfoobar\nfoo",
175 silc_buffer_purge(&bmatch);
177 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
178 SILC_LOG_DEBUG(("Replace %s", string));
179 silc_buffer_set(&bmatch, string, strlen(string));
180 if (!silc_subst(&bmatch, "200s/foo/BARBAR/g"))
182 silc_buffer_printf(&bmatch, TRUE);
183 if (!silc_buffer_memcmp(&bmatch,
184 "foobar\nfoobar baz foobar\nbazfoobar\nfoo",
187 silc_buffer_purge(&bmatch);
189 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
190 SILC_LOG_DEBUG(("Replace %s", string));
191 silc_buffer_set(&bmatch, string, strlen(string));
192 if (!silc_subst(&bmatch, "2!s/foo/BARBAR/g"))
194 silc_buffer_printf(&bmatch, TRUE);
195 if (!silc_buffer_memcmp(&bmatch,
196 "BARBARbar\nfoobar baz foobar\nbazBARBARbar\nBARBAR",
199 silc_buffer_purge(&bmatch);
201 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
202 SILC_LOG_DEBUG(("Replace %s", string));
203 silc_buffer_set(&bmatch, string, strlen(string));
204 if (!silc_subst(&bmatch, "/xxx/s/foo/BARBAR/g"))
206 silc_buffer_printf(&bmatch, TRUE);
207 if (!silc_buffer_memcmp(&bmatch,
208 "foobar\nfoobar baz foobar\nbazfoobar\nfoo",
211 silc_buffer_purge(&bmatch);
213 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
214 SILC_LOG_DEBUG(("Replace %s", string));
215 silc_buffer_set(&bmatch, string, strlen(string));
216 if (!silc_subst(&bmatch, "!s/foo/BARBAR/g"))
218 silc_buffer_printf(&bmatch, TRUE);
219 if (!silc_buffer_memcmp(&bmatch,
220 "foobar\nfoobar baz foobar\nbazfoobar\nfoo",
223 silc_buffer_purge(&bmatch);
225 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
226 SILC_LOG_DEBUG(("Replace %s", string));
227 silc_buffer_set(&bmatch, string, strlen(string));
228 if (!silc_subst(&bmatch, "$s/foo/BARBAR/g"))
230 silc_buffer_printf(&bmatch, TRUE);
231 if (!silc_buffer_memcmp(&bmatch,
232 "foobar\nfoobar baz foobar\nbazfoobar\nBARBAR",
235 silc_buffer_purge(&bmatch);
237 string = silc_strdup("foobar\nfoobar baz foobar\nbazfoobar\nfoo");
238 SILC_LOG_DEBUG(("Replace %s", string));
239 silc_buffer_set(&bmatch, string, strlen(string));
240 if (!silc_subst(&bmatch, "$!s/foo/BARBAR/g"))
242 silc_buffer_printf(&bmatch, TRUE);
243 if (!silc_buffer_memcmp(&bmatch,
244 "BARBARbar\nBARBARbar baz BARBARbar\nbazBARBARbar\nfoo",
247 silc_buffer_purge(&bmatch);
249 string = silc_strdup("foobar\nfoobar /baz/ foobar\nbazfoobar\nfoo");
250 SILC_LOG_DEBUG(("Replace %s", string));
251 silc_buffer_set(&bmatch, string, strlen(string));
252 if (!silc_subst(&bmatch, "s/\\//BARBAR/g"))
254 silc_buffer_printf(&bmatch, TRUE);
255 if (!silc_buffer_memcmp(&bmatch,
256 "foobar\nfoobar BARBARbazBARBAR foobar\nbazfoobar\nfoo",
259 silc_buffer_purge(&bmatch);
261 string = silc_strdup("foobar\nfoobar /baz/ foobar\nbazfoobar\nfoo");
262 SILC_LOG_DEBUG(("Replace %s", string));
263 silc_buffer_set(&bmatch, string, strlen(string));
264 if (!silc_subst(&bmatch, "s/\\//\\/\\//g"))
266 silc_buffer_printf(&bmatch, TRUE);
267 if (!silc_buffer_memcmp(&bmatch,
268 "foobar\nfoobar //baz// foobar\nbazfoobar\nfoo",
271 silc_buffer_purge(&bmatch);
274 SILC_LOG_DEBUG(("Regex %s", regex));
275 string = "abcdefghijklmn";
276 SILC_LOG_DEBUG(("Match %s", string));
277 if (!silc_regex(string, regex, &bmatch, NULL))
279 silc_buffer_printf(&bmatch, TRUE);
282 SILC_LOG_DEBUG(("Regex %s", regex));
283 string = "abcdefghijklmn";
284 SILC_LOG_DEBUG(("Match %s", string));
285 if (!silc_regex(string, regex, &bmatch, NULL))
287 silc_buffer_printf(&bmatch, TRUE);
290 SILC_LOG_DEBUG(("Regex %s", regex));
292 SILC_LOG_DEBUG(("Match %s", string));
293 if (!silc_regex(string, regex, &bmatch, NULL))
295 silc_buffer_printf(&bmatch, TRUE);
298 SILC_LOG_DEBUG(("Regex %s", regex));
300 SILC_LOG_DEBUG(("Match %s", string));
301 if (!silc_regex(string, regex, &bmatch, NULL))
303 silc_buffer_printf(&bmatch, TRUE);
306 SILC_LOG_DEBUG(("Regex %s", regex));
307 string = "aaaaaaaaa";
308 SILC_LOG_DEBUG(("Match %s", string));
309 if (!silc_regex(string, regex, &bmatch, NULL))
311 silc_buffer_printf(&bmatch, TRUE);
314 SILC_LOG_DEBUG(("Regex %s", regex));
316 SILC_LOG_DEBUG(("DO NOT Match %s", string));
317 if (silc_regex(string, regex, &bmatch, NULL))
321 SILC_LOG_DEBUG(("Regex %s", regex));
323 SILC_LOG_DEBUG(("Match %s", string));
324 if (!silc_regex(string, regex, &bmatch, NULL))
326 silc_buffer_printf(&bmatch, TRUE);
329 SILC_LOG_DEBUG(("Regex %s", regex));
331 SILC_LOG_DEBUG(("DO NOT Match %s", string));
332 if (silc_regex(string, regex, &bmatch, NULL))
336 SILC_LOG_DEBUG(("Regex %s", regex));
338 SILC_LOG_DEBUG(("Match %s", string));
339 if (!silc_regex(string, regex, &bmatch, NULL))
341 silc_buffer_printf(&bmatch, TRUE);
344 SILC_LOG_DEBUG(("Regex %s", regex));
346 SILC_LOG_DEBUG(("Match %s", string));
347 if (!silc_regex(string, regex, &bmatch, NULL))
349 silc_buffer_printf(&bmatch, TRUE);
352 SILC_LOG_DEBUG(("Regex %s", regex));
354 SILC_LOG_DEBUG(("DO NOT Match %s", string));
355 if (silc_regex(string, regex, &bmatch, NULL))
359 SILC_LOG_DEBUG(("Regex %s", regex));
361 SILC_LOG_DEBUG(("Match %s", string));
362 if (!silc_regex(string, regex, &bmatch, NULL))
364 silc_buffer_printf(&bmatch, TRUE);
367 SILC_LOG_DEBUG(("Regex %s", regex));
368 string = "aaaaaaaaaaaaa";
369 SILC_LOG_DEBUG(("Match %s", string));
370 if (!silc_regex(string, regex, &bmatch, NULL))
372 silc_buffer_printf(&bmatch, TRUE);
375 SILC_LOG_DEBUG(("Regex %s", regex));
377 SILC_LOG_DEBUG(("DO NOT Match %s", string));
378 if (silc_regex(string, regex, &bmatch, NULL))
383 SILC_LOG_DEBUG(("Regex %s", regex));
385 SILC_LOG_DEBUG(("Match %s", string));
386 if (!silc_regex(string, regex, &bmatch, NULL))
388 silc_buffer_printf(&bmatch, TRUE);
391 SILC_LOG_DEBUG(("Regex %s", regex));
393 SILC_LOG_DEBUG(("Match %s", string));
394 if (!silc_regex(string, regex, &bmatch, NULL))
396 silc_buffer_printf(&bmatch, TRUE);
399 SILC_LOG_DEBUG(("Regex %s", regex));
401 SILC_LOG_DEBUG(("Match %s", string));
402 if (!silc_regex(string, regex, &bmatch, NULL))
404 silc_buffer_printf(&bmatch, TRUE);
408 SILC_LOG_DEBUG(("Regex %s", regex));
410 SILC_LOG_DEBUG(("Match %s", string));
411 if (!silc_regex(string, regex, &bmatch, NULL))
413 silc_buffer_printf(&bmatch, TRUE);
416 SILC_LOG_DEBUG(("Regex %s", regex));
418 SILC_LOG_DEBUG(("Match %s", string));
419 if (!silc_regex(string, regex, &bmatch, NULL))
421 silc_buffer_printf(&bmatch, TRUE);
424 SILC_LOG_DEBUG(("Regex %s", regex));
426 SILC_LOG_DEBUG(("DO NOT Match %s", string));
427 if (silc_regex(string, regex, &bmatch, NULL))
432 SILC_LOG_DEBUG(("Regex %s", regex));
434 SILC_LOG_DEBUG(("Match %s", string));
435 if (!silc_regex(string, regex, &bmatch, NULL))
437 silc_buffer_printf(&bmatch, TRUE);
440 SILC_LOG_DEBUG(("Regex %s", regex));
442 SILC_LOG_DEBUG(("Match %s", string));
443 if (!silc_regex(string, regex, &bmatch, NULL))
445 silc_buffer_printf(&bmatch, TRUE);
448 SILC_LOG_DEBUG(("Regex %s", regex));
450 SILC_LOG_DEBUG(("DO NOT Match %s", string));
451 if (silc_regex(string, regex, &bmatch, NULL))
454 regex = "(H..).(o..)";
455 SILC_LOG_DEBUG(("Regex %s", regex));
456 if (!silc_regex_compile(®, regex, 0))
459 string = "Hello World";
460 SILC_LOG_DEBUG(("Match %s", string));
461 if (!silc_regex_match(®, string, strlen(string), num_match, match, 0))
463 for (i = 0; i < num_match; i++) {
464 if (match[i].start != -1) {
465 SILC_LOG_DEBUG(("Match start %d, end %d", match[i].start,
467 sub = silc_memdup(string + match[i].start, match[i].end -
469 SILC_LOG_DEBUG(("Match substring '%s'", sub));
474 silc_regex_free(®);
477 SILC_LOG_DEBUG(("Regex %s", regex));
478 if (!silc_regex_compile(®, regex, 0))
482 SILC_LOG_DEBUG(("Match %s", string));
483 if (!silc_regex_match(®, string, strlen(string), 0, NULL, 0))
487 SILC_LOG_DEBUG(("Match %s", string));
488 if (!silc_regex_match(®, string, strlen(string), 0, NULL, 0))
491 string = "foo20, bar, foo100, foo";
492 SILC_LOG_DEBUG(("Match all substrings in %s", string));
493 while (silc_regex_match(®, string, strlen(string), 1, match, 0)) {
494 SILC_LOG_DEBUG(("Match start %d", match[0].start));
495 sub = silc_memdup(string + match[0].start, match[0].end - match[0].start);
496 SILC_LOG_DEBUG(("Match substring '%s'", sub));
498 string += match[0].end;
501 string = "foo20, bar, foo100, Foo, foo0";
502 SILC_LOG_DEBUG(("Match all substrings at once in %s", string));
503 if (!silc_regex_match(®, string, strlen(string), num_match, match, 0))
506 for (i = 0; i < num_match; i++) {
507 if (match[i].start != -1) {
508 SILC_LOG_DEBUG(("Match start %d", match[i].start));
509 sub = silc_memdup(string + match[i].start, match[i].end -
511 SILC_LOG_DEBUG(("Match substring '%s'", sub));
516 silc_regex_free(®);
518 regex = "^(([^:]+)://)?([^:/]+)(:([0-9]+))?(/.*)";
519 SILC_LOG_DEBUG(("Regex %s", regex));
520 if (!silc_regex_compile(®, regex, 0))
523 string = "http://silcnet.org:443/foobar/pelle.html";
524 SILC_LOG_DEBUG(("Parse URI"));
525 if (!silc_regex_match(®, string, strlen(string), num_match, match, 0))
528 for (i = 0; i < num_match; i++) {
529 if (match[i].start != -1) {
530 SILC_LOG_DEBUG(("Match start %d", match[i].start));
531 sub = silc_memdup(string + match[i].start, match[i].end -
533 SILC_LOG_DEBUG(("Match substring '%s'", sub));
538 string = "http://silcnet.org/";
539 SILC_LOG_DEBUG(("Parse URI"));
540 if (!silc_regex_match(®, string, strlen(string), num_match, match, 0))
543 for (i = 0; i < num_match; i++) {
544 if (match[i].start != -1) {
545 SILC_LOG_DEBUG(("Match start %d", match[i].start));
546 sub = silc_memdup(string + match[i].start, match[i].end -
548 SILC_LOG_DEBUG(("Match substring '%s'", sub));
553 silc_regex_free(®);
556 SILC_LOG_DEBUG(("Regex %s", regex));
557 if (!silc_regex_compile(®, regex, 0))
561 SILC_LOG_DEBUG(("Match all substrings at once in %s", string));
562 if (!silc_regex_match(®, string, strlen(string), num_match, match, 0))
565 for (i = 0; i < num_match; i++) {
566 if (match[i].start != -1) {
567 SILC_LOG_DEBUG(("Match start %d", match[i].start));
568 sub = silc_memdup(string + match[i].start, match[i].end -
570 SILC_LOG_DEBUG(("Match substring '%s'", sub));
575 silc_regex_free(®);
578 SILC_LOG_DEBUG(("Regex %s", regex));
579 if (!silc_regex_compile(®, regex, 0))
583 SILC_LOG_DEBUG(("Test NOTBOL flag", string));
584 if (silc_regex_match(®, string, strlen(string), 0, NULL,
587 if (silc_errno != SILC_ERR_NOT_FOUND)
589 SILC_LOG_DEBUG(("Did not match (OK)"));
591 silc_regex_free(®);
594 SILC_LOG_DEBUG(("Regex %s", regex));
595 if (!silc_regex_compile(®, regex, 0))
599 SILC_LOG_DEBUG(("Test NOTEOL flag", string));
600 if (silc_regex_match(®, string, strlen(string), 0, NULL,
603 if (silc_errno != SILC_ERR_NOT_FOUND)
605 SILC_LOG_DEBUG(("Did not match (OK)"));
607 silc_regex_free(®);
612 SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
613 fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");