1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: #include <sys/types.h>
22: #include <mcheck.h>
23: #include <regex.h>
24: #include <stdio.h>
25: #include <stdlib.h>
26:
27:
28: static const char text[] = "#! /bin/sh";
29:
30: int
31: main (void)
32: {
33: regex_t re;
34: regmatch_t rm[2];
35: int n;
36:
37: mtrace ();
38:
39: n = regcomp (&re, "^#! */.*/(k|ba||pdk|z)sh", REG_EXTENDED);
40: if (n != 0)
41: {
42: char buf[500];
43: regerror (n, &re, buf, sizeof (buf));
44: printf ("regcomp failed: %s\n", buf);
45: exit (1);
46: }
47:
48: for (n = 0; n < 20; ++n)
49: {
50: if (regexec (&re, text, 2, rm, 0))
51: {
52: puts ("regexec failed");
53: exit (2);
54: }
55: if (rm[0].rm_so != 0 || rm[0].rm_eo != 10
56: || rm[1].rm_so != 8 || rm[1].rm_eo != 8)
57: {
58: printf ("regexec match failure: %d %d %d %d\n",
59: rm[0].rm_so, rm[0].rm_eo, rm[1].rm_so, rm[1].rm_eo);
60: exit (3);
61: }
62: }
63:
64: regfree (&re);
65:
66: return 0;
67: }