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