1 | /*********************************************************** |
2 | |
3 | Copyright 1995 by Tom Lord |
4 | |
5 | All Rights Reserved |
6 | |
7 | Permission to use, copy, modify, and distribute this software and its |
8 | documentation for any purpose and without fee is hereby granted, |
9 | provided that the above copyright notice appear in all copies and that |
10 | both that copyright notice and this permission notice appear in |
11 | supporting documentation, and that the name of the copyright holder not be |
12 | used in advertising or publicity pertaining to distribution of the |
13 | software without specific, written prior permission. |
14 | |
15 | Tom Lord DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, |
16 | INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO |
17 | EVENT SHALL TOM LORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR |
18 | CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF |
19 | USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR |
20 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
21 | PERFORMANCE OF THIS SOFTWARE. |
22 | |
23 | ******************************************************************/ |
24 | |
25 | |
26 | |
27 | #include <sys/types.h> |
28 | #include <regex.h> |
29 | #include <stdio.h> |
30 | #include <stdlib.h> |
31 | #include <string.h> |
32 | |
33 | |
34 | |
35 | struct a_test |
36 | { |
37 | int expected; |
38 | const char * pattern; |
39 | const char * data; |
40 | }; |
41 | |
42 | static const struct a_test the_tests[] = |
43 | { |
44 | #include "testcases.h" |
45 | {-1, 0, 0} |
46 | }; |
47 | |
48 | |
49 | |
50 | |
51 | static int |
52 | run_a_test (int id, const struct a_test * t) |
53 | { |
54 | static const char * last_pattern = 0; |
55 | static regex_t r; |
56 | int err; |
57 | char errmsg[100]; |
58 | int x; |
59 | regmatch_t regs[10]; |
60 | |
61 | if (!last_pattern || strcmp (last_pattern, t->pattern)) |
62 | { |
63 | if (last_pattern) |
64 | regfree (preg: &r); |
65 | last_pattern = t->pattern; |
66 | err = regcomp (preg: &r, pattern: t->pattern, REG_EXTENDED); |
67 | if (err) |
68 | { |
69 | if (t->expected == 2) |
70 | { |
71 | puts (s: " OK." ); |
72 | return 0; |
73 | } |
74 | if (last_pattern) |
75 | regfree (preg: &r); |
76 | last_pattern = NULL; |
77 | regerror (errcode: err, preg: &r, errbuf: errmsg, errbuf_size: 100); |
78 | printf (format: " FAIL: %s.\n" , errmsg); |
79 | return 1; |
80 | } |
81 | else if (t->expected == 2) |
82 | { |
83 | printf (format: "test %d\n" , id); |
84 | printf (format: "pattern \"%s\" successfull compilation not expected\n" , |
85 | t->pattern); |
86 | return 1; |
87 | } |
88 | } |
89 | |
90 | err = regexec (preg: &r, String: t->data, nmatch: 10, pmatch: regs, eflags: 0); |
91 | |
92 | if (err != t->expected) |
93 | { |
94 | printf (format: "test %d\n" , id); |
95 | printf (format: "pattern \"%s\" data \"%s\" wanted %d got %d\n" , |
96 | t->pattern, t->data, t->expected, err); |
97 | for (x = 0; x < 10; ++x) |
98 | printf (format: "reg %d == (%d, %d) %.*s\n" , |
99 | x, |
100 | regs[x].rm_so, |
101 | regs[x].rm_eo, |
102 | regs[x].rm_eo - regs[x].rm_so, |
103 | t->data + regs[x].rm_so); |
104 | return 1; |
105 | } |
106 | puts (s: " OK." ); |
107 | return 0; |
108 | } |
109 | |
110 | |
111 | |
112 | int |
113 | main (int argc, char * argv[]) |
114 | { |
115 | int x; |
116 | int lo; |
117 | int hi; |
118 | int res = 0; |
119 | |
120 | lo = 0; |
121 | hi = (sizeof (the_tests) / sizeof (the_tests[0])) - 1; |
122 | |
123 | if (argc > 1) |
124 | { |
125 | lo = atoi (argv[1]); |
126 | hi = lo + 1; |
127 | |
128 | if (argc > 2) |
129 | hi = atoi (argv[2]); |
130 | } |
131 | |
132 | for (x = lo; x < hi; ++x) |
133 | { |
134 | printf (format: "#%d:" , x); |
135 | res |= run_a_test (id: x, t: &the_tests[x]); |
136 | } |
137 | return res != 0; |
138 | } |
139 | |