REG_STARTEND is not portable, but it turns out we don't actually need

it. From Evan Green, GitHub issue 1982.
This commit is contained in:
nicm 2019-11-27 20:54:30 +00:00 committed by Nicholas Marriott
parent a52fe9cf7f
commit 1b0cc4503e

View File

@ -77,10 +77,7 @@ regsub(const char *pattern, const char *with, const char *text, int flags)
end = strlen(text); end = strlen(text);
while (start <= end) { while (start <= end) {
m[0].rm_so = start; if (regexec(&r, text + start, nitems(m), m, 0) != 0) {
m[0].rm_eo = end;
if (regexec(&r, text, nitems(m), m, REG_STARTEND) != 0) {
regsub_copy(&buf, &len, text, start, end); regsub_copy(&buf, &len, text, start, end);
break; break;
} }
@ -89,22 +86,25 @@ regsub(const char *pattern, const char *with, const char *text, int flags)
* Append any text not part of this match (from the end of the * Append any text not part of this match (from the end of the
* last match). * last match).
*/ */
regsub_copy(&buf, &len, text, last, m[0].rm_so); regsub_copy(&buf, &len, text, last, m[0].rm_so + start);
/* /*
* If the last match was empty and this one isn't (it is either * If the last match was empty and this one isn't (it is either
* later or has matched text), expand this match. If it is * later or has matched text), expand this match. If it is
* empty, move on one character and try again from there. * empty, move on one character and try again from there.
*/ */
if (empty || m[0].rm_so != last || m[0].rm_so != m[0].rm_eo) { if (empty ||
regsub_expand(&buf, &len, with, text, m, nitems(m)); start + m[0].rm_so != last ||
m[0].rm_so != m[0].rm_eo) {
regsub_expand(&buf, &len, with, text + start, m,
nitems(m));
last = m[0].rm_eo; last = start + m[0].rm_eo;
start = m[0].rm_eo; start += m[0].rm_eo;
empty = 0; empty = 0;
} else { } else {
last = m[0].rm_eo; last = start + m[0].rm_eo;
start = m[0].rm_eo + 1; start += m[0].rm_eo + 1;
empty = 1; empty = 1;
} }
} }