From 09526c0c55361e755e51eebb1a7fb16a508378e6 Mon Sep 17 00:00:00 2001 From: Kyryl Melekhin Date: Fri, 15 Oct 2021 21:31:01 +0000 Subject: [PATCH] count splits in rep too --- pike.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pike.c b/pike.c index ab39f33..e78dfa1 100644 --- a/pike.c +++ b/pike.c @@ -92,7 +92,6 @@ typedef struct rsub rsub; struct rsub { int ref; - rsub *freesub; const char *sub[]; }; @@ -311,19 +310,22 @@ static int _compilecode(const char **re_loc, rcode *prog, int sizecode) PC += size; } if (code) { + mincnt = 0; for (i = 0; i < size; i++) switch (code[term+i]) { + case SPLIT: + case RSPLIT: + mincnt++; case CLASS: i += code[term+i+2] * 2 + 1; case JMP: - case SPLIT: - case RSPLIT: case SAVE: case CHAR: i++; case ANY: icnt++; } + prog->splits += mincnt * icnt; prog->len += (maxcnt-1) * icnt; } break; @@ -445,13 +447,13 @@ int re_comp(rcode *prog, const char *re, int nsubs) #define newsub(init, copy) \ if (freesub) \ - { s1 = freesub; freesub = s1->freesub; copy } \ + { s1 = freesub; freesub = (rsub*)s1->sub[0]; copy } \ else \ { s1 = (rsub*)&nsubs[suboff+=rsubsize]; init } \ #define decref(csub) \ if (--csub->ref == 0) { \ - csub->freesub = freesub; \ + csub->sub[0] = (char*)freesub; \ freesub = csub; \ } \