|
|
1.1 ! root 1: /* ! 2: From pegasus.ATT.COM!hansen Sun Oct 14 23:38 EDT 1990 ! 3: Received: by pyxis; Sun Oct 14 23:38 EDT 1990 ! 4: FROM: [email protected] (t.l.hansen) ! 5: TO: research!andrew ! 6: DATE: 14 Oct 1990 23:35 EDT ! 7: SUBJECT: regex bug take 2 ! 8: ! 9: Something's getting lost when writing or reading the compiled expression ! 10: to/from a file. The following program displays the problem. It is similar to ! 11: the previous one except that it writes the regex to a temp file in the ! 12: middle and then reads it back in. ! 13: ! 14: Tony ! 15: */ ! 16: #include <stdio.h> ! 17: #include <ctype.h> ! 18: #define USE_STDIO ! 19: #include "re.h" ! 20: ! 21: void prc(c) ! 22: unsigned char c; ! 23: { ! 24: if (c >= 0200) ! 25: { ! 26: (void) printf("M-"); ! 27: c -= 0200; ! 28: } ! 29: if (isprint(c)) putchar(c); ! 30: else ! 31: { ! 32: putchar('^'); ! 33: putchar(c ^ 0100); ! 34: } ! 35: } ! 36: ! 37: void pr(i, mb, me) ! 38: int i; ! 39: char *mb; ! 40: char *me; ! 41: { ! 42: (void) printf("%d: %#x - %#x\n", i, mb, me); ! 43: putchar('"'); ! 44: for (; mb < me; mb++) ! 45: { ! 46: if (!*mb) ! 47: break; ! 48: prc(*mb); ! 49: } ! 50: putchar('"'); ! 51: putchar('\n'); ! 52: } ! 53: ! 54: main() ! 55: { ! 56: re_re *regex; ! 57: int i; ! 58: unsigned char re_map[256]; ! 59: static char lname[] = "!nosuchsystem!testing"; ! 60: static char pat[] = "!([^!]+)!(.+)"; ! 61: char *match[10][2]; ! 62: int parens; ! 63: FILE *fp; ! 64: ! 65: for (i = 0; i < 256; i++) ! 66: re_map[i] = i; ! 67: regex = re_recomp(pat, pat+strlen(pat), re_map); ! 68: parens = re_paren(regex); ! 69: (void) printf("parens = %d\n", parens); ! 70: if (parens != 2) ! 71: { ! 72: (void) printf("!= 2!!\n"); ! 73: return 0; ! 74: } ! 75: fp = fopen("/tmp/junk.re", "w"); ! 76: if (!fp) ! 77: { ! 78: (void) printf("error opening output file\n"); ! 79: return 0; ! 80: } ! 81: ! 82: re_refile(regex, fp); ! 83: fclose(fp); ! 84: if (ferror(fp)) ! 85: { ! 86: (void) printf("error writing\n"); ! 87: return 0; ! 88: } ! 89: ! 90: fp = fopen("/tmp/junk.re", "r"); ! 91: if (!fp) ! 92: { ! 93: (void) printf("error opening input file\n"); ! 94: return 0; ! 95: } ! 96: ! 97: regex = re_filere(fp); ! 98: if (!regex) ! 99: { ! 100: (void) printf("error reading regex\n"); ! 101: return 0; ! 102: } ! 103: ! 104: fclose(fp); ! 105: ! 106: parens = re_paren(regex); ! 107: (void) printf("parens = %d\n", parens); ! 108: if (parens != 2) ! 109: { ! 110: (void) printf("!= 2!!\n"); ! 111: return 0; ! 112: } ! 113: ! 114: if (!re_reexec(regex, lname, lname+strlen(lname), match)) ! 115: { ! 116: (void) printf("no match\n"); ! 117: return 0; ! 118: } ! 119: ! 120: (void) printf("matched\n"); ! 121: for (i = 0; i <= parens; i++) ! 122: pr(i, match[i][0], match[i][1]); ! 123: return 0; ! 124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.