|
|
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.