110 |
int so, eo; |
int so, eo; |
111 |
int refc; |
int refc; |
112 |
char **refv; |
char **refv; |
113 |
|
char *newstr = NULL; |
114 |
|
char *savep = NULL; |
115 |
|
int newlen; |
116 |
|
int off = 0; |
117 |
|
int alloc = 0; |
118 |
struct regex_vtab *vp = regex_vtab_lookup(re->flags); |
struct regex_vtab *vp = regex_vtab_lookup(re->flags); |
119 |
|
|
120 |
if (!vp) |
if (!vp) |
121 |
return NULL; |
return NULL; |
122 |
if (vp->match(re, line, &refc, &refv, &so, &eo) == 0) { |
while (vp->match(re, line + off, &refc, &refv, &so, &eo) == 0) { |
123 |
char *p = substitute(repl, refv); |
char *p; |
124 |
int plen = strlen(p); |
int plen; |
125 |
int newlen = strlen(line) - (eo - so) + plen + 1; |
|
126 |
char *newstr = xmalloc(newlen); |
if (so == -1) { |
127 |
|
char *q; |
128 |
memcpy(newstr, line, so); |
|
129 |
memcpy(newstr + so, p, strlen(p)); |
alloc = 0; |
130 |
strcpy(newstr + so + plen, line + eo); |
p = repl; |
131 |
|
plen = strlen(p); |
132 |
|
q = strstr(line + off, anubis_regex_source(re)); |
133 |
|
|
134 |
|
so = (q - (line + off)); |
135 |
|
eo = so + strlen(anubis_regex_source(re)); |
136 |
|
} else { |
137 |
|
alloc = 1; |
138 |
|
p = substitute(repl, refv); |
139 |
|
plen = strlen(p); |
140 |
|
xfree_pptr(refv); |
141 |
|
} |
142 |
|
|
143 |
xfree_pptr(refv); |
savep = newstr; |
144 |
return newstr; |
newlen = strlen(line) - (eo - so) + plen + 1; |
145 |
|
newstr = xmalloc(newlen); |
146 |
|
memcpy(newstr, line, off + so); |
147 |
|
memcpy(newstr + off + so, p, plen); |
148 |
|
strcpy(newstr + off + so + plen, line + off + eo); |
149 |
|
|
150 |
|
if (alloc) |
151 |
|
xfree(p); |
152 |
|
if (savep) |
153 |
|
xfree(savep); |
154 |
|
line = newstr; |
155 |
|
off += eo; |
156 |
} |
} |
157 |
return NULL; |
return newstr; |
158 |
} |
} |
159 |
|
|
160 |
int |
int |
259 |
} |
} |
260 |
(*refv)[i] = NULL; |
(*refv)[i] = NULL; |
261 |
*refc = re->re_nsub; |
*refc = re->re_nsub; |
262 |
} else |
} else { |
263 |
|
*eo = *so = -1; |
264 |
*refc = 0; |
*refc = 0; |
265 |
|
} |
266 |
xfree(rmp); |
xfree(rmp); |
267 |
return rc; |
return rc; |
268 |
} |
} |
345 |
*refc = count; |
*refc = count; |
346 |
*so = ovector[0]; |
*so = ovector[0]; |
347 |
*eo = ovector[1]; |
*eo = ovector[1]; |
348 |
} else |
} else { |
349 |
|
*so = *eo = -1; |
350 |
*refc = 0; |
*refc = 0; |
351 |
|
} |
352 |
xfree(ovector); |
xfree(ovector); |
353 |
return rc < 0; |
return rc < 0; |
354 |
} |
} |