1 /* 2 * Simple test program for regexp(3) stuff. Knows about debugging hooks. 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: try re [string [output [-]]] 22 * The re is compiled and dumped, regexeced against the string, the result 23 * is applied to output using regsub(). The - triggers a running narrative 24 * from regexec(). Dumping and narrative don't happen unless DEBUG. 25 * 26 * If there are no arguments, stdin is assumed to be a stream of lines with 27 * five fields: a r.e., a string to match it against, a result code, a 28 * source string for regsub, and the proper result. Result codes are 'c' 29 * for compile failure, 'y' for match success, 'n' for match failure. 30 * Field separator is tab. 31 */ 32 #include <stdio.h> 33 #include <regexp.h> 34 35 #ifdef ERRAVAIL 36 char *progname; 37 extern char *mkprogname(); 38 #endif 39 40 #ifdef DEBUG 41 extern int regnarrate; 42 #endif 43 44 char buf[BUFSIZ]; 45 46 int errreport = 0; /* Report errors via errseen? */ 47 char *errseen = NULL; /* Error message. */ 48 int status = 0; /* Exit status. */ 49 50 /* ARGSUSED */ 51 main(argc, argv) 52 int argc; 53 char *argv[]; 54 { 55 regexp *r; 56 int i; 57 58 #ifdef ERRAVAIL 59 progname = mkprogname(argv[0]); 60 #endif 61 62 if (argc == 1) { 63 multiple(); 64 exit(status); 65 } 66 67 r = regcomp(argv[1]); 68 if (r == NULL) 69 error("regcomp failure", ""); 70 #ifdef DEBUG 71 regdump(r); 72 if (argc > 4) 73 regnarrate++; 74 #endif 75 if (argc > 2) { 76 i = regexec(r, argv[2]); 77 printf("%d", i); 78 for (i = 1; i < NSUBEXP; i++) 79 if (r->startp[i] != NULL && r->endp[i] != NULL) 80 printf(" \\%d", i); 81 printf("\n"); 82 } 83 if (argc > 3) { 84 regsub(r, argv[3], buf); 85 printf("%s\n", buf); 86 } 87 exit(status); 88 } 89 90 void 91 regerror(s) 92 char *s; 93 { 94 if (errreport) 95 errseen = s; 96 else 97 error(s, ""); 98 } 99 100 #ifndef ERRAVAIL 101 error(s1, s2) 102 char *s1; 103 char *s2; 104 { 105 fprintf(stderr, "regexp: "); 106 fprintf(stderr, s1, s2); 107 fprintf(stderr, "\n"); 108 exit(1); 109 } 110 #endif 111 112 int lineno; 113 114 regexp badregexp; /* Implicit init to 0. */ 115 116 multiple() 117 { 118 char rbuf[BUFSIZ]; 119 char *field[5]; 120 char *scan; 121 int i; 122 regexp *r; 123 extern char *strchr(); 124 125 errreport = 1; 126 lineno = 0; 127 while (fgets(rbuf, sizeof(rbuf), stdin) != NULL) { 128 rbuf[strlen(rbuf)-1] = '\0'; /* Dispense with \n. */ 129 lineno++; 130 scan = rbuf; 131 for (i = 0; i < 5; i++) { 132 field[i] = scan; 133 if (field[i] == NULL) { 134 complain("bad testfile format", ""); 135 exit(1); 136 } 137 scan = strchr(scan, '\t'); 138 if (scan != NULL) 139 *scan++ = '\0'; 140 } 141 try(field); 142 } 143 144 /* And finish up with some internal testing... */ 145 lineno = 9990; 146 errseen = NULL; 147 if (regcomp((char *)NULL) != NULL || errseen == NULL) 148 complain("regcomp(NULL) doesn't complain", ""); 149 lineno = 9991; 150 errseen = NULL; 151 if (regexec((regexp *)NULL, "foo") || errseen == NULL) 152 complain("regexec(NULL, ...) doesn't complain", ""); 153 lineno = 9992; 154 r = regcomp("foo"); 155 if (r == NULL) { 156 complain("regcomp(\"foo\") fails", ""); 157 return; 158 } 159 lineno = 9993; 160 errseen = NULL; 161 if (regexec(r, (char *)NULL) || errseen == NULL) 162 complain("regexec(..., NULL) doesn't complain", ""); 163 lineno = 9994; 164 errseen = NULL; 165 regsub((regexp *)NULL, "foo", rbuf); 166 if (errseen == NULL) 167 complain("regsub(NULL, ..., ...) doesn't complain", ""); 168 lineno = 9995; 169 errseen = NULL; 170 regsub(r, (char *)NULL, rbuf); 171 if (errseen == NULL) 172 complain("regsub(..., NULL, ...) doesn't complain", ""); 173 lineno = 9996; 174 errseen = NULL; 175 regsub(r, "foo", (char *)NULL); 176 if (errseen == NULL) 177 complain("regsub(..., ..., NULL) doesn't complain", ""); 178 lineno = 9997; 179 errseen = NULL; 180 if (regexec(&badregexp, "foo") || errseen == NULL) 181 complain("regexec(nonsense, ...) doesn't complain", ""); 182 lineno = 9998; 183 errseen = NULL; 184 regsub(&badregexp, "foo", rbuf); 185 if (errseen == NULL) 186 complain("regsub(nonsense, ..., ...) doesn't complain", ""); 187 } 188 189 try(fields) 190 char **fields; 191 { 192 regexp *r; 193 char dbuf[BUFSIZ]; 194 195 errseen = NULL; 196 r = regcomp(fields[0]); 197 if (r == NULL) { 198 if (*fields[2] != 'c') 199 complain("regcomp failure in `%s'", fields[0]); 200 return; 201 } 202 if (*fields[2] == 'c') { 203 complain("unexpected regcomp success in `%s'", fields[0]); 204 free((char *)r); 205 return; 206 } 207 if (!regexec(r, fields[1])) { 208 if (*fields[2] != 'n') 209 complain("regexec failure in `%s'", ""); 210 free((char *)r); 211 return; 212 } 213 if (*fields[2] == 'n') { 214 complain("unexpected regexec success", ""); 215 free((char *)r); 216 return; 217 } 218 errseen = NULL; 219 regsub(r, fields[3], dbuf); 220 if (errseen != NULL) { 221 complain("regsub complaint", ""); 222 free((char *)r); 223 return; 224 } 225 if (strcmp(dbuf, fields[4]) != 0) 226 complain("regsub result `%s' wrong", dbuf); 227 free((char *)r); 228 } 229 230 complain(s1, s2) 231 char *s1; 232 char *s2; 233 { 234 fprintf(stderr, "try: %d: ", lineno); 235 fprintf(stderr, s1, s2); 236 fprintf(stderr, " (%s)\n", (errseen != NULL) ? errseen : ""); 237 status = 1; 238 } 239