13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include "regexp.h" 43e12c5d1SDavid du Colombier #include "regcomp.h" 53e12c5d1SDavid du Colombier 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier /* 83e12c5d1SDavid du Colombier * save a new match in mp 93e12c5d1SDavid du Colombier */ 103e12c5d1SDavid du Colombier extern void 113e12c5d1SDavid du Colombier _renewmatch(Resub *mp, int ms, Resublist *sp) 123e12c5d1SDavid du Colombier { 133e12c5d1SDavid du Colombier int i; 143e12c5d1SDavid du Colombier 153e12c5d1SDavid du Colombier if(mp==0 || ms<=0) 163e12c5d1SDavid du Colombier return; 173e12c5d1SDavid du Colombier if(mp[0].sp==0 || sp->m[0].sp<mp[0].sp || 183e12c5d1SDavid du Colombier (sp->m[0].sp==mp[0].sp && sp->m[0].ep>mp[0].ep)){ 193e12c5d1SDavid du Colombier for(i=0; i<ms && i<NSUBEXP; i++) 203e12c5d1SDavid du Colombier mp[i] = sp->m[i]; 213e12c5d1SDavid du Colombier for(; i<ms; i++) 223e12c5d1SDavid du Colombier mp[i].sp = mp[i].ep = 0; 233e12c5d1SDavid du Colombier } 243e12c5d1SDavid du Colombier } 253e12c5d1SDavid du Colombier 263e12c5d1SDavid du Colombier /* 273e12c5d1SDavid du Colombier * Note optimization in _renewthread: 283e12c5d1SDavid du Colombier * *lp must be pending when _renewthread called; if *l has been looked 293e12c5d1SDavid du Colombier * at already, the optimization is a bug. 303e12c5d1SDavid du Colombier */ 313e12c5d1SDavid du Colombier extern Relist* 323e12c5d1SDavid du Colombier _renewthread(Relist *lp, /* _relist to add to */ 333e12c5d1SDavid du Colombier Reinst *ip, /* instruction to add */ 343e12c5d1SDavid du Colombier Resublist *sep) /* pointers to subexpressions */ 353e12c5d1SDavid du Colombier { 363e12c5d1SDavid du Colombier Relist *p; 373e12c5d1SDavid du Colombier 383e12c5d1SDavid du Colombier for(p=lp; p->inst; p++){ 393e12c5d1SDavid du Colombier if(p->inst == ip){ 403e12c5d1SDavid du Colombier if((sep)->m[0].sp < p->se.m[0].sp) 413e12c5d1SDavid du Colombier p->se = *sep; 423e12c5d1SDavid du Colombier return 0; 433e12c5d1SDavid du Colombier } 443e12c5d1SDavid du Colombier } 453e12c5d1SDavid du Colombier p->inst = ip; 463e12c5d1SDavid du Colombier p->se = *sep; 473e12c5d1SDavid du Colombier (++p)->inst = 0; 483e12c5d1SDavid du Colombier return p; 493e12c5d1SDavid du Colombier } 503e12c5d1SDavid du Colombier 51*219b2ee8SDavid du Colombier /* 52*219b2ee8SDavid du Colombier * same as renewthread, but called with 53*219b2ee8SDavid du Colombier * initial empty start pointer. 54*219b2ee8SDavid du Colombier */ 55*219b2ee8SDavid du Colombier extern Relist* 56*219b2ee8SDavid du Colombier _renewemptythread(Relist *lp, /* _relist to add to */ 57*219b2ee8SDavid du Colombier Reinst *ip, /* instruction to add */ 58*219b2ee8SDavid du Colombier char *sp) /* pointers to subexpressions */ 59*219b2ee8SDavid du Colombier { 60*219b2ee8SDavid du Colombier Relist *p; 61*219b2ee8SDavid du Colombier 62*219b2ee8SDavid du Colombier for(p=lp; p->inst; p++){ 63*219b2ee8SDavid du Colombier if(p->inst == ip){ 64*219b2ee8SDavid du Colombier if(sp < p->se.m[0].sp) { 65*219b2ee8SDavid du Colombier memset(&p->se, 0, sizeof(p->se)); 66*219b2ee8SDavid du Colombier p->se.m[0].sp = sp; 67*219b2ee8SDavid du Colombier } 68*219b2ee8SDavid du Colombier return 0; 69*219b2ee8SDavid du Colombier } 70*219b2ee8SDavid du Colombier } 71*219b2ee8SDavid du Colombier p->inst = ip; 72*219b2ee8SDavid du Colombier memset(&p->se, 0, sizeof(p->se)); 73*219b2ee8SDavid du Colombier p->se.m[0].sp = sp; 74*219b2ee8SDavid du Colombier (++p)->inst = 0; 75*219b2ee8SDavid du Colombier return p; 76*219b2ee8SDavid du Colombier } 77*219b2ee8SDavid du Colombier 78*219b2ee8SDavid du Colombier extern Relist* 79*219b2ee8SDavid du Colombier _rrenewemptythread(Relist *lp, /* _relist to add to */ 80*219b2ee8SDavid du Colombier Reinst *ip, /* instruction to add */ 81*219b2ee8SDavid du Colombier Rune *rsp) /* pointers to subexpressions */ 82*219b2ee8SDavid du Colombier { 83*219b2ee8SDavid du Colombier Relist *p; 84*219b2ee8SDavid du Colombier 85*219b2ee8SDavid du Colombier for(p=lp; p->inst; p++){ 86*219b2ee8SDavid du Colombier if(p->inst == ip){ 87*219b2ee8SDavid du Colombier if(rsp < p->se.m[0].rsp) { 88*219b2ee8SDavid du Colombier memset(&p->se, 0, sizeof(p->se)); 89*219b2ee8SDavid du Colombier p->se.m[0].rsp = rsp; 90*219b2ee8SDavid du Colombier } 91*219b2ee8SDavid du Colombier return 0; 92*219b2ee8SDavid du Colombier } 93*219b2ee8SDavid du Colombier } 94*219b2ee8SDavid du Colombier p->inst = ip; 95*219b2ee8SDavid du Colombier memset(&p->se, 0, sizeof(p->se)); 96*219b2ee8SDavid du Colombier p->se.m[0].rsp = rsp; 97*219b2ee8SDavid du Colombier (++p)->inst = 0; 98*219b2ee8SDavid du Colombier return p; 99*219b2ee8SDavid du Colombier } 100