]>
Commit | Line | Data |
---|---|---|
1f2f436a A |
1 | --- engine.c.bsdnew 2009-11-11 11:29:04.000000000 -0800 |
2 | +++ engine.c 2009-11-11 11:30:28.000000000 -0800 | |
3 | @@ -272,7 +272,7 @@ matcher(struct re_guts *g, | |
3d9156a7 A |
4 | break; |
5 | assert(m->coldp < m->endp); | |
6 | m->coldp += XMBRTOWC(NULL, m->coldp, | |
7 | - m->endp - m->coldp, &m->mbs, 0); | |
8 | + m->endp - m->coldp, &m->mbs, 0, g->loc); | |
9 | } | |
10 | if (nmatch == 1 && !g->backrefs) | |
11 | break; /* no further info needed */ | |
1f2f436a | 12 | @@ -333,7 +333,7 @@ matcher(struct re_guts *g, |
3d9156a7 A |
13 | NOTE("false alarm"); |
14 | /* recycle starting later */ | |
15 | start = m->coldp + XMBRTOWC(NULL, m->coldp, | |
1f2f436a A |
16 | - stop - m->coldp, &m->mbs, 0); |
17 | + stop - m->coldp, &m->mbs, 0, g->loc); | |
3d9156a7 A |
18 | assert(start <= stop); |
19 | } | |
20 | ||
1f2f436a | 21 | @@ -410,7 +410,7 @@ dissect(struct match *m, |
3d9156a7 A |
22 | assert(nope); |
23 | break; | |
24 | case OCHAR: | |
25 | - sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0); | |
26 | + sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0, m->g->loc); | |
27 | break; | |
28 | case OBOL: | |
29 | case OEOL: | |
1f2f436a | 30 | @@ -419,7 +419,7 @@ dissect(struct match *m, |
3d9156a7 A |
31 | break; |
32 | case OANY: | |
33 | case OANYOF: | |
34 | - sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0); | |
35 | + sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0, m->g->loc); | |
36 | break; | |
37 | case OBACK_: | |
38 | case O_BACK: | |
1f2f436a | 39 | @@ -480,6 +480,10 @@ dissect(struct match *m, |
224c7076 A |
40 | sep = ssp; |
41 | ssp = oldssp; | |
42 | } | |
43 | + else if (tail==rest) { | |
44 | + /* Fix for test expr 105 */ | |
45 | + ssp = oldssp; | |
46 | + } | |
47 | assert(sep == rest); /* must exhaust substring */ | |
48 | assert(slow(m, ssp, sep, ssub, esub) == rest); | |
49 | dp = dissect(m, ssp, sep, ssub, esub); | |
1f2f436a | 50 | @@ -532,6 +536,14 @@ dissect(struct match *m, |
224c7076 A |
51 | i = OPND(m->g->strip[ss]); |
52 | assert(0 < i && i <= m->g->nsub); | |
53 | m->pmatch[i].rm_so = sp - m->offp; | |
54 | + /* fix for T.regcomp 43: don't remember previous | |
55 | + subexpression matches beyond the current one (i) */ | |
56 | + i++; | |
57 | + while (i<= m->g->nsub) { | |
58 | + m->pmatch[i].rm_so = -1; | |
59 | + m->pmatch[i].rm_eo = -1; | |
60 | + i++; | |
61 | + } | |
62 | break; | |
63 | case ORPAREN: | |
64 | i = OPND(m->g->strip[ss]); | |
1f2f436a | 65 | @@ -586,14 +598,14 @@ backref(struct match *m, |
3d9156a7 A |
66 | case OCHAR: |
67 | if (sp == stop) | |
68 | return(NULL); | |
69 | - sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR); | |
70 | + sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR, m->g->loc); | |
71 | if (wc != OPND(s)) | |
72 | return(NULL); | |
73 | break; | |
74 | case OANY: | |
75 | if (sp == stop) | |
76 | return(NULL); | |
77 | - sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR); | |
78 | + sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR, m->g->loc); | |
79 | if (wc == BADCHAR) | |
80 | return (NULL); | |
81 | break; | |
1f2f436a | 82 | @@ -601,8 +613,8 @@ backref(struct match *m, |
3d9156a7 A |
83 | if (sp == stop) |
84 | return (NULL); | |
85 | cs = &m->g->sets[OPND(s)]; | |
86 | - sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR); | |
87 | - if (wc == BADCHAR || !CHIN(cs, wc)) | |
88 | + sp += XMBRTOWC(&wc, sp, stop - sp, &m->mbs, BADCHAR, m->g->loc); | |
89 | + if (wc == BADCHAR || !CHIN(cs, wc, m->g->loc)) | |
90 | return(NULL); | |
91 | break; | |
92 | case OBOL: | |
1f2f436a | 93 | @@ -626,8 +638,8 @@ backref(struct match *m, |
3d9156a7 A |
94 | (sp < m->endp && *(sp-1) == '\n' && |
95 | (m->g->cflags®_NEWLINE)) || | |
96 | (sp > m->beginp && | |
97 | - !ISWORD(*(sp-1))) ) && | |
98 | - (sp < m->endp && ISWORD(*sp)) ) | |
99 | + !ISWORD(*(sp-1), m->g->loc)) ) && | |
100 | + (sp < m->endp && ISWORD(*sp, m->g->loc)) ) | |
101 | { /* yes */ } | |
102 | else | |
103 | return(NULL); | |
1f2f436a | 104 | @@ -636,8 +648,8 @@ backref(struct match *m, |
3d9156a7 A |
105 | if (( (sp == m->endp && !(m->eflags®_NOTEOL)) || |
106 | (sp < m->endp && *sp == '\n' && | |
107 | (m->g->cflags®_NEWLINE)) || | |
108 | - (sp < m->endp && !ISWORD(*sp)) ) && | |
109 | - (sp > m->beginp && ISWORD(*(sp-1))) ) | |
110 | + (sp < m->endp && !ISWORD(*sp, m->g->loc)) ) && | |
111 | + (sp > m->beginp && ISWORD(*(sp-1), m->g->loc)) ) | |
112 | { /* yes */ } | |
113 | else | |
114 | return(NULL); | |
1f2f436a A |
115 | @@ -811,7 +823,7 @@ fast( struct match *m, |
116 | clen = 0; | |
3d9156a7 | 117 | c = OUT; |
1f2f436a | 118 | } else |
3d9156a7 A |
119 | - clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR); |
120 | + clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR, m->g->loc); | |
121 | if (EQ(st, fresh)) | |
122 | coldp = p; | |
123 | ||
1f2f436a | 124 | @@ -835,12 +847,12 @@ fast( struct match *m, |
3d9156a7 A |
125 | } |
126 | ||
127 | /* how about a word boundary? */ | |
128 | - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && | |
129 | - (c != OUT && ISWORD(c)) ) { | |
130 | + if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc, m->g->loc))) && | |
131 | + (c != OUT && ISWORD(c, m->g->loc)) ) { | |
132 | flagch = BOW; | |
133 | } | |
134 | - if ( (lastc != OUT && ISWORD(lastc)) && | |
135 | - (flagch == EOL || (c != OUT && !ISWORD(c))) ) { | |
136 | + if ( (lastc != OUT && ISWORD(lastc, m->g->loc)) && | |
137 | + (flagch == EOL || (c != OUT && !ISWORD(c, m->g->loc))) ) { | |
138 | flagch = EOW; | |
139 | } | |
140 | if (flagch == BOW || flagch == EOW) { | |
1f2f436a | 141 | @@ -865,7 +877,7 @@ fast( struct match *m, |
3d9156a7 A |
142 | assert(coldp != NULL); |
143 | m->coldp = coldp; | |
144 | if (ISSET(st, stopst)) | |
1f2f436a A |
145 | - return(p+XMBRTOWC(NULL, p, stop - p, &m->mbs, 0)); |
146 | + return(p+XMBRTOWC(NULL, p, stop - p, &m->mbs, 0, m->g->loc)); | |
3d9156a7 A |
147 | else |
148 | return(NULL); | |
149 | } | |
1f2f436a | 150 | @@ -916,7 +928,7 @@ slow( struct match *m, |
3d9156a7 A |
151 | c = OUT; |
152 | clen = 0; | |
153 | } else | |
154 | - clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR); | |
155 | + clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR, m->g->loc); | |
156 | ||
157 | /* is there an EOL and/or BOL between lastc and c? */ | |
158 | flagch = '\0'; | |
1f2f436a | 159 | @@ -938,12 +950,12 @@ slow( struct match *m, |
3d9156a7 A |
160 | } |
161 | ||
162 | /* how about a word boundary? */ | |
163 | - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && | |
164 | - (c != OUT && ISWORD(c)) ) { | |
165 | + if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc, m->g->loc))) && | |
166 | + (c != OUT && ISWORD(c, m->g->loc)) ) { | |
167 | flagch = BOW; | |
168 | } | |
169 | - if ( (lastc != OUT && ISWORD(lastc)) && | |
170 | - (flagch == EOL || (c != OUT && !ISWORD(c))) ) { | |
171 | + if ( (lastc != OUT && ISWORD(lastc, m->g->loc)) && | |
172 | + (flagch == EOL || (c != OUT && !ISWORD(c, m->g->loc))) ) { | |
173 | flagch = EOW; | |
174 | } | |
175 | if (flagch == BOW || flagch == EOW) { | |
1f2f436a | 176 | @@ -1033,7 +1045,7 @@ step(struct re_guts *g, |
3d9156a7 A |
177 | break; |
178 | case OANYOF: | |
179 | cs = &g->sets[OPND(s)]; | |
180 | - if (!NONCHAR(ch) && CHIN(cs, ch)) | |
181 | + if (!NONCHAR(ch) && CHIN(cs, ch, g->loc)) | |
182 | FWD(aft, bef, 1); | |
183 | break; | |
184 | case OBACK_: /* ignored here */ |