|
|
1.1 root 1: /*
2: * Simple timing program for regcomp().
3: *
4: * Copyright (c) 1986 by University of Toronto.
5: * Written by Henry Spencer. Not derived from licensed software.
6: *
7: * Permission is granted to anyone to use this software for any
8: * purpose on any computer system, and to redistribute it freely,
9: * subject to the following restrictions:
10: *
11: * 1. The author is not responsible for the consequences of use of
12: * this software, no matter how awful, even if they arise
13: * from defects in it.
14: *
15: * 2. The origin of this software must not be misrepresented, either
16: * by explicit claim or by omission.
17: *
18: * 3. Altered versions must be plainly marked as such, and must not
19: * be misrepresented as being the original software.
20: *
21: * Usage: timer ncomp nexec nsub
22: * or
23: * timer ncomp nexec nsub regexp string [ answer [ sub ] ]
24: *
25: * The second form is for timing repetitions of a single test case.
26: * The first form's test data is a compiled-in copy of the "tests" file.
27: * Ncomp, nexec, nsub are how many times to do each regcomp, regexec,
28: * and regsub. The way to time an operation individually is to do something
29: * like "timer 1 50 1".
30: */
31: #include <stdio.h>
32:
33: struct try {
34: char *re, *str, *ans, *src, *dst;
35: } tests[] = {
36: #include "timer.t.h"
37: { NULL, NULL, NULL, NULL, NULL }
38: };
39:
40: #include <regexp.h>
41:
42: int errreport = 0; /* Report errors via errseen? */
43: char *errseen = NULL; /* Error message. */
44:
45: char *progname;
46:
47: /* ARGSUSED */
48: main(argc, argv)
49: int argc;
50: char *argv[];
51: {
52: int ncomp, nexec, nsub;
53: struct try one;
54: char dummy[512];
55:
56: if (argc < 4) {
57: ncomp = 1;
58: nexec = 1;
59: nsub = 1;
60: } else {
61: ncomp = atoi(argv[1]);
62: nexec = atoi(argv[2]);
63: nsub = atoi(argv[3]);
64: }
65:
66: progname = argv[0];
67: if (argc > 5) {
68: one.re = argv[4];
69: one.str = argv[5];
70: if (argc > 6)
71: one.ans = argv[6];
72: else
73: one.ans = "y";
74: if (argc > 7) {
75: one.src = argv[7];
76: one.dst = "xxx";
77: } else {
78: one.src = "x";
79: one.dst = "x";
80: }
81: errreport = 1;
82: try(one, ncomp, nexec, nsub);
83: } else
84: multiple(ncomp, nexec, nsub);
85: exit(0);
86: }
87:
88: void
89: regerror(s)
90: char *s;
91: {
92: if (errreport)
93: errseen = s;
94: else
95: error(s, "");
96: }
97:
98: #ifndef ERRAVAIL
99: error(s1, s2)
100: char *s1;
101: char *s2;
102: {
103: fprintf(stderr, "regexp: ");
104: fprintf(stderr, s1, s2);
105: fprintf(stderr, "\n");
106: exit(1);
107: }
108: #endif
109:
110: int lineno = 0;
111:
112: multiple(ncomp, nexec, nsub)
113: int ncomp, nexec, nsub;
114: {
115: register int i;
116: extern char *strchr();
117:
118: errreport = 1;
119: for (i = 0; tests[i].re != NULL; i++) {
120: lineno++;
121: try(tests[i], ncomp, nexec, nsub);
122: }
123: }
124:
125: try(fields, ncomp, nexec, nsub)
126: struct try fields;
127: int ncomp, nexec, nsub;
128: {
129: regexp *r;
130: char dbuf[BUFSIZ];
131: register int i;
132:
133: errseen = NULL;
134: r = regcomp(fields.re);
135: if (r == NULL) {
136: if (*fields.ans != 'c')
137: complain("regcomp failure in `%s'", fields.re);
138: return;
139: }
140: if (*fields.ans == 'c') {
141: complain("unexpected regcomp success in `%s'", fields.re);
142: free((char *)r);
143: return;
144: }
145: for (i = ncomp-1; i > 0; i--) {
146: free((char *)r);
147: r = regcomp(fields.re);
148: }
149: if (!regexec(r, fields.str)) {
150: if (*fields.ans != 'n')
151: complain("regexec failure in `%s'", "");
152: free((char *)r);
153: return;
154: }
155: if (*fields.ans == 'n') {
156: complain("unexpected regexec success", "");
157: free((char *)r);
158: return;
159: }
160: for (i = nexec-1; i > 0; i--)
161: (void) regexec(r, fields.str);
162: errseen = NULL;
163: for (i = nsub; i > 0; i--)
164: regsub(r, fields.src, dbuf);
165: if (errseen != NULL) {
166: complain("regsub complaint", "");
167: free((char *)r);
168: return;
169: }
170: if (strcmp(dbuf, fields.dst) != 0)
171: complain("regsub result `%s' wrong", dbuf);
172: free((char *)r);
173: }
174:
175: complain(s1, s2)
176: char *s1;
177: char *s2;
178: {
179: fprintf(stderr, "try: %d: ", lineno);
180: fprintf(stderr, s1, s2);
181: fprintf(stderr, " (%s)\n", (errseen != NULL) ? errseen : "");
182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.