1 #include <lib9.h> 2 #include "regexp.h" 3 #include "regcomp.h" 4 5 6 /* 7 * save a new match in mp 8 */ 9 extern void 10 _renewmatch(Resub *mp, int ms, Resublist *sp) 11 { 12 int i; 13 14 if(mp==0 || ms<=0) 15 return; 16 if(mp[0].s.sp==0 || sp->m[0].s.sp<mp[0].s.sp || 17 (sp->m[0].s.sp==mp[0].s.sp && sp->m[0].e.ep>mp[0].e.ep)){ 18 for(i=0; i<ms && i<NSUBEXP; i++) 19 mp[i] = sp->m[i]; 20 for(; i<ms; i++) 21 mp[i].s.sp = mp[i].e.ep = 0; 22 } 23 } 24 25 /* 26 * Note optimization in _renewthread: 27 * *lp must be pending when _renewthread called; if *l has been looked 28 * at already, the optimization is a bug. 29 */ 30 extern Relist* 31 _renewthread(Relist *lp, /* _relist to add to */ 32 Reinst *ip, /* instruction to add */ 33 Resublist *sep) /* pointers to subexpressions */ 34 { 35 Relist *p; 36 37 for(p=lp; p->inst; p++){ 38 if(p->inst == ip){ 39 if((sep)->m[0].s.sp < p->se.m[0].s.sp) 40 p->se = *sep; 41 return 0; 42 } 43 } 44 p->inst = ip; 45 p->se = *sep; 46 (++p)->inst = 0; 47 return p; 48 } 49 50 /* 51 * same as renewthread, but called with 52 * initial empty start pointer. 53 */ 54 extern Relist* 55 _renewemptythread(Relist *lp, /* _relist to add to */ 56 Reinst *ip, /* instruction to add */ 57 char *sp) /* pointers to subexpressions */ 58 { 59 Relist *p; 60 61 for(p=lp; p->inst; p++){ 62 if(p->inst == ip){ 63 if(sp < p->se.m[0].s.sp) { 64 memset((void *)&p->se, 0, sizeof(p->se)); 65 p->se.m[0].s.sp = sp; 66 } 67 return 0; 68 } 69 } 70 p->inst = ip; 71 memset((void *)&p->se, 0, sizeof(p->se)); 72 p->se.m[0].s.sp = sp; 73 (++p)->inst = 0; 74 return p; 75 } 76 77 extern Relist* 78 _rrenewemptythread(Relist *lp, /* _relist to add to */ 79 Reinst *ip, /* instruction to add */ 80 Rune *rsp) /* pointers to subexpressions */ 81 { 82 Relist *p; 83 84 for(p=lp; p->inst; p++){ 85 if(p->inst == ip){ 86 if(rsp < p->se.m[0].s.rsp) { 87 memset((void *)&p->se, 0, sizeof(p->se)); 88 p->se.m[0].s.rsp = rsp; 89 } 90 return 0; 91 } 92 } 93 p->inst = ip; 94 memset((void *)&p->se, 0, sizeof(p->se)); 95 p->se.m[0].s.rsp = rsp; 96 (++p)->inst = 0; 97 return p; 98 } 99