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 int ms, 35 Resublist *sep) /* pointers to subexpressions */ 36 { 37 Relist *p; 38 39 for(p=lp; p->inst; p++){ 40 if(p->inst == ip){ 41 if(sep->m[0].sp < p->se.m[0].sp){ 42 if(ms > 1) 43 p->se = *sep; 44 else 45 p->se.m[0] = sep->m[0]; 46 } 47 return 0; 48 } 49 } 50 p->inst = ip; 51 if(ms > 1) 52 p->se = *sep; 53 else 54 p->se.m[0] = sep->m[0]; 55 (++p)->inst = 0; 56 return p; 57 } 58 59 /* 60 * same as renewthread, but called with 61 * initial empty start pointer. 62 */ 63 extern Relist* 64 _renewemptythread(Relist *lp, /* _relist to add to */ 65 Reinst *ip, /* instruction to add */ 66 int ms, 67 char *sp) /* pointers to subexpressions */ 68 { 69 Relist *p; 70 71 for(p=lp; p->inst; p++){ 72 if(p->inst == ip){ 73 if(sp < p->se.m[0].sp) { 74 if(ms > 1) 75 memset(&p->se, 0, sizeof(p->se)); 76 p->se.m[0].sp = sp; 77 } 78 return 0; 79 } 80 } 81 p->inst = ip; 82 if(ms > 1) 83 memset(&p->se, 0, sizeof(p->se)); 84 p->se.m[0].sp = sp; 85 (++p)->inst = 0; 86 return p; 87 } 88 89 extern Relist* 90 _rrenewemptythread(Relist *lp, /* _relist to add to */ 91 Reinst *ip, /* instruction to add */ 92 int ms, 93 Rune *rsp) /* pointers to subexpressions */ 94 { 95 Relist *p; 96 97 for(p=lp; p->inst; p++){ 98 if(p->inst == ip){ 99 if(rsp < p->se.m[0].rsp) { 100 if(ms > 1) 101 memset(&p->se, 0, sizeof(p->se)); 102 p->se.m[0].rsp = rsp; 103 } 104 return 0; 105 } 106 } 107 p->inst = ip; 108 if(ms > 1) 109 memset(&p->se, 0, sizeof(p->se)); 110 p->se.m[0].rsp = rsp; 111 (++p)->inst = 0; 112 return p; 113 } 114