aboutsummaryrefslogtreecommitdiff
path: root/src/libregexp/rregexec.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libregexp/rregexec.c')
-rw-r--r--src/libregexp/rregexec.c61
1 files changed, 26 insertions, 35 deletions
diff --git a/src/libregexp/rregexec.c b/src/libregexp/rregexec.c
index 907ddef3..ec7907da 100644
--- a/src/libregexp/rregexec.c
+++ b/src/libregexp/rregexec.c
@@ -9,9 +9,9 @@
*/
static int
rregexec1(Reprog *progp, /* program to run */
- Rune *bol, /* string to run machine on */
- Resub *mp, /* subexpression elements */
- int ms, /* number of elements at mp */
+ Rune *bol, /* string to run machine on */
+ Resub *mp, /* subexpression elements */
+ int ms, /* number of elements at mp */
Reljunk *j)
{
int flag=0;
@@ -28,7 +28,7 @@ rregexec1(Reprog *progp, /* program to run */
Rune *p;
match = 0;
- checkstart = j->starttype;
+ checkstart = j->startchar;
if(mp)
for(i=0; i<ms; i++) {
mp[i].s.rsp = 0;
@@ -46,7 +46,7 @@ rregexec1(Reprog *progp, /* program to run */
switch(j->starttype) {
case RUNE:
p = runestrchr(s, j->startchar);
- if(p == 0 || (j->reol && p >= j->reol))
+ if(p == 0 || p == j->reol)
return match;
s = p;
break;
@@ -54,7 +54,7 @@ rregexec1(Reprog *progp, /* program to run */
if(s == bol)
break;
p = runestrchr(s, '\n');
- if(p == 0 || (j->reol && p+1 >= j->reol))
+ if(p == 0 || s == j->reol)
return match;
s = p+1;
break;
@@ -71,16 +71,15 @@ rregexec1(Reprog *progp, /* program to run */
nl->inst = 0;
/* Add first instruction to current list */
- if(match == 0)
- _rrenewemptythread(tl, tle, progp->startinst, ms, s);
+ _rrenewemptythread(tl, progp->startinst, ms, s);
/* Execute machine until current list is empty */
for(tlp=tl; tlp->inst; tlp++){
- for(inst = tlp->inst; ; inst = inst->u2.next){
+ for(inst=tlp->inst; ; inst = inst->u2.next){
switch(inst->type){
case RUNE: /* regular character */
if(inst->u1.r == r)
- if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+ if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
return -1;
break;
case LBRA:
@@ -91,11 +90,11 @@ rregexec1(Reprog *progp, /* program to run */
continue;
case ANY:
if(r != '\n')
- if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+ if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
return -1;
break;
case ANYNL:
- if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+ if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
return -1;
break;
case BOL:
@@ -110,7 +109,7 @@ rregexec1(Reprog *progp, /* program to run */
ep = inst->u1.cp->end;
for(rp = inst->u1.cp->spans; rp < ep; rp += 2)
if(r >= rp[0] && r <= rp[1]){
- if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+ if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
return -1;
break;
}
@@ -121,12 +120,15 @@ rregexec1(Reprog *progp, /* program to run */
if(r >= rp[0] && r <= rp[1])
break;
if(rp == ep)
- if(_renewthread(nl, nle, inst->u2.next, ms, &tlp->se) < 0)
+ if(_renewthread(nl, inst->u2.next, ms, &tlp->se)==nle)
return -1;
break;
case OR:
- /* expanded during renewthread; just a place holder */
- break;
+ /* evaluate right choice later */
+ if(_renewthread(tl, inst->u1.right, ms, &tlp->se) == tle)
+ return -1;
+ /* efficiency: advance and re-evaluate */
+ continue;
case END: /* Match! */
match = 1;
tlp->se.m[0].e.rep = s;
@@ -139,7 +141,7 @@ rregexec1(Reprog *progp, /* program to run */
}
if(s == j->reol)
break;
- checkstart = j->starttype && nl->inst==0;
+ checkstart = j->startchar && nl->inst==0;
s++;
}while(r);
return match;
@@ -153,26 +155,15 @@ rregexec2(Reprog *progp, /* program to run */
Reljunk *j
)
{
- int rv;
- Relist *relist0, *relist1;
+ Relist relist0[5*LISTSIZE], relist1[5*LISTSIZE];
- relist0 = malloc((progp->proglen+1)*sizeof(Relist));
- if(relist0 == nil)
- return -1;
- relist1 = malloc((progp->proglen+1)*sizeof(Relist));
- if(relist1 == nil){
- free(relist1);
- return -1;
- }
+ /* mark space */
j->relist[0] = relist0;
j->relist[1] = relist1;
- j->reliste[0] = relist0 + progp->proglen;
- j->reliste[1] = relist1 + progp->proglen;
+ j->reliste[0] = relist0 + nelem(relist0) - 2;
+ j->reliste[1] = relist1 + nelem(relist1) - 2;
- rv = rregexec1(progp, bol, mp, ms, j);
- free(relist0);
- free(relist1);
- return rv;
+ return rregexec1(progp, bol, mp, ms, j);
}
extern int
@@ -208,8 +199,8 @@ rregexec(Reprog *progp, /* program to run */
/* mark space */
j.relist[0] = relist0;
j.relist[1] = relist1;
- j.reliste[0] = relist0 + nelem(relist0) - 1;
- j.reliste[1] = relist1 + nelem(relist1) - 1;
+ j.reliste[0] = relist0 + nelem(relist0) - 2;
+ j.reliste[1] = relist1 + nelem(relist1) - 2;
rv = rregexec1(progp, bol, mp, ms, &j);
if(rv >= 0)