Save offset for subsequent invocation to reip_iter

Previously, we would only look for the first ever match.
To support multiple matches, we now save the start offset
relative to the ptr argument for the next invocation.
parent b64ab317
......@@ -515,26 +515,35 @@ reip_iter(struct re_iter_priv *reip, unsigned flush,
const void *ptr, ssize_t len)
{
VCL_STRING subject;
// where data from ptr starts in subject
ssize_t ptrsubjoff;
ov_t *ov;
int i;
CHECK_OBJ_NOTNULL(reip, RE_ITER_PRIV_MAGIC);
if (reip->s == PCRE2_ERROR_NOMATCH) {
if (reip->s > PCRE2_ERROR_NOMATCH) {
AZ(reip->buf);
AZ(reip->len);
subject = ptr;
ptrsubjoff = 0;
}
else if (reip->s == PCRE2_ERROR_NOMATCH) {
AZ(reip->startoffset);
AZ(reip->buf);
AZ(reip->len);
subject = ptr;
ptrsubjoff = 0;
}
else if (reip->s == PCRE2_ERROR_PARTIAL) {
ptrsubjoff = reip->len;
AN(reip->buf);
reip->buf = realloc(reip->buf, reip->len + len);
AN(reip->buf);
memcpy(reip->buf + reip->len, ptr, len);
reip->len += len;
len = reip->len;
memcpy(reip->buf + ptrsubjoff, ptr, len);
len += reip->len;
reip->len = len;
subject = reip->buf;
}
else {
......@@ -548,6 +557,7 @@ reip_iter(struct re_iter_priv *reip, unsigned flush,
reip->s = match(reip->ctx, reip->vre, subject, len,
reip->startoffset, reip->options, reip->task,
reip->vre_limits);
assert(reip->s != PCRE2_ERROR_BADOFFSET);
if ((reip->s < PCRE2_ERROR_NOMATCH && reip->s < reip->ret) ||
reip->s > reip->ret)
......@@ -587,6 +597,14 @@ reip_iter(struct re_iter_priv *reip, unsigned flush,
assert(reip->s > PCRE2_ERROR_NOMATCH);
// save start offset for next call, relative to ptr
if (reip->buf == NULL)
reip->startoffset = ov->ovector[1];
else if (ov->ovector[1] >= ptrsubjoff)
reip->startoffset = ov->ovector[1] - ptrsubjoff;
else
WRONG("impossible ovector[1]");
/* no buffer && no flush -> no copy needed */
if (reip->buf == NULL && (flush & OBJ_ITER_FLUSH) == 0)
return (0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment