|
|
1.1 ! root 1: /* ! 2: From pegasus.ATT.COM!hansen Tue Oct 9 00:34 EDT 1990 ! 3: Received: by pyxis; Tue Oct 9 00:34 EDT 1990 ! 4: FROM: [email protected] (t.l.hansen) ! 5: TO: research!andrew ! 6: DATE: 9 Oct 1990 0:27 EDT ! 7: SUBJECT: bug in re_reexec()! ! 8: ! 9: Compile and link the following program. The expected output is: ! 10: ! 11: parens = 2 ! 12: matched ! 13: 0: 0x80881430 - 0x80881445 ! 14: "!nosuchsystem!testing" ! 15: 1: 0x80886334 - 0xc0020c1c ! 16: "nosuchsystem" ! 17: 2: 0xc0020a78 - 0x80883924 ! 18: "testing" ! 19: ! 20: Instead, I get this. (Note the strings after 1: and 2:.) ! 21: ! 22: parens = 2 ! 23: matched ! 24: 0: 0x80881430 - 0x80881445 ! 25: "!nosuchsystem!testing" ! 26: 1: 0x80886334 - 0xc0020c1c ! 27: "" ! 28: 2: 0xc0020a78 - 0x80883924 ! 29: "" ! 30: ! 31: Can you please look into this soon? If not, let me know so that I can hunt ! 32: for it. I probably won't be able to find it as quickly as you, though. This ! 33: showed up within mail and I have an MR haunting me. Thanks. ! 34: ! 35: Tony ! 36: ! 37: ---------------------------------------------------------------- ! 38: */ ! 39: #include <stdio.h> ! 40: #include <ctype.h> ! 41: #include "re.h" ! 42: #include "lre.h" ! 43: ! 44: void prc(c) ! 45: unsigned char c; ! 46: { ! 47: if (c >= 0200) ! 48: { ! 49: (void) printf("M-"); ! 50: c -= 0200; ! 51: } ! 52: if (isprint(c)) putchar(c); ! 53: else ! 54: { ! 55: putchar('^'); ! 56: putchar(c ^ 0100); ! 57: } ! 58: } ! 59: ! 60: void pr(i, mb, me) ! 61: int i; ! 62: char *mb; ! 63: char *me; ! 64: { ! 65: (void) printf("%d: %#x - %#x\n", i, mb, me); ! 66: putchar('"'); ! 67: for (; mb < me; mb++) ! 68: { ! 69: if (!*mb) ! 70: break; ! 71: prc(*mb); ! 72: } ! 73: putchar('"'); ! 74: putchar('\n'); ! 75: } ! 76: ! 77: main() ! 78: { ! 79: re_re *regex; ! 80: int i; ! 81: unsigned char re_map[256]; ! 82: static char lname[] = "!nosuchsystem!testing"; ! 83: static char pat[] = "!([^!]+)!(.+)"; ! 84: char *match[10][2]; ! 85: int parens; ! 86: ! 87: for (i = 0; i < 256; i++) ! 88: re_map[i] = i; ! 89: regex = re_recomp(pat, pat+strlen(pat), re_map); ! 90: parens = re_paren(regex); ! 91: (void) printf("parens = %d\n", parens); ! 92: if (parens != 2) ! 93: return 0; ! 94: if (!re_reexec(regex, lname, lname+strlen(lname), match)) ! 95: { ! 96: (void) printf("no match\n"); ! 97: return 0; ! 98: } ! 99: ! 100: (void) printf("matched\n"); ! 101: for (i = 0; i <= parens; i++) ! 102: pr(i, match[i][0], match[i][1]); ! 103: return 0; ! 104: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.