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 } 183