1 b2cfc4e2 2003-09-30 devnull #include "lib9.h"
2 b2cfc4e2 2003-09-30 devnull #include "regexp9.h"
3 b2cfc4e2 2003-09-30 devnull #include "regcomp.h"
7 b2cfc4e2 2003-09-30 devnull * save a new match in mp
9 b2cfc4e2 2003-09-30 devnull extern void
10 b2cfc4e2 2003-09-30 devnull _renewmatch(Resub *mp, int ms, Resublist *sp)
14 b2cfc4e2 2003-09-30 devnull if(mp==0 || ms<=0)
16 b2cfc4e2 2003-09-30 devnull if(mp[0].s.sp==0 || sp->m[0].s.sp<mp[0].s.sp ||
17 b2cfc4e2 2003-09-30 devnull (sp->m[0].s.sp==mp[0].s.sp && sp->m[0].e.ep>mp[0].e.ep)){
18 b2cfc4e2 2003-09-30 devnull for(i=0; i<ms && i<NSUBEXP; i++)
19 b2cfc4e2 2003-09-30 devnull mp[i] = sp->m[i];
20 b2cfc4e2 2003-09-30 devnull for(; i<ms; i++)
21 b2cfc4e2 2003-09-30 devnull mp[i].s.sp = mp[i].e.ep = 0;
26 b2cfc4e2 2003-09-30 devnull * Note optimization in _renewthread:
27 b2cfc4e2 2003-09-30 devnull * *lp must be pending when _renewthread called; if *l has been looked
28 b2cfc4e2 2003-09-30 devnull * at already, the optimization is a bug.
30 b2cfc4e2 2003-09-30 devnull extern Relist*
31 b2cfc4e2 2003-09-30 devnull _renewthread(Relist *lp, /* _relist to add to */
32 b2cfc4e2 2003-09-30 devnull Reinst *ip, /* instruction to add */
33 b2cfc4e2 2003-09-30 devnull Resublist *sep) /* pointers to subexpressions */
35 b2cfc4e2 2003-09-30 devnull Relist *p;
37 b2cfc4e2 2003-09-30 devnull for(p=lp; p->inst; p++){
38 b2cfc4e2 2003-09-30 devnull if(p->inst == ip){
39 b2cfc4e2 2003-09-30 devnull if((sep)->m[0].s.sp < p->se.m[0].s.sp)
40 b2cfc4e2 2003-09-30 devnull p->se = *sep;
41 b2cfc4e2 2003-09-30 devnull return 0;
44 b2cfc4e2 2003-09-30 devnull p->inst = ip;
45 b2cfc4e2 2003-09-30 devnull p->se = *sep;
46 b2cfc4e2 2003-09-30 devnull (++p)->inst = 0;
47 b2cfc4e2 2003-09-30 devnull return p;
51 b2cfc4e2 2003-09-30 devnull * same as renewthread, but called with
52 b2cfc4e2 2003-09-30 devnull * initial empty start pointer.
54 b2cfc4e2 2003-09-30 devnull extern Relist*
55 b2cfc4e2 2003-09-30 devnull _renewemptythread(Relist *lp, /* _relist to add to */
56 b2cfc4e2 2003-09-30 devnull Reinst *ip, /* instruction to add */
57 b2cfc4e2 2003-09-30 devnull char *sp) /* pointers to subexpressions */
59 b2cfc4e2 2003-09-30 devnull Relist *p;
61 b2cfc4e2 2003-09-30 devnull for(p=lp; p->inst; p++){
62 b2cfc4e2 2003-09-30 devnull if(p->inst == ip){
63 b2cfc4e2 2003-09-30 devnull if(sp < p->se.m[0].s.sp) {
64 b2cfc4e2 2003-09-30 devnull memset((void *)&p->se, 0, sizeof(p->se));
65 b2cfc4e2 2003-09-30 devnull p->se.m[0].s.sp = sp;
67 b2cfc4e2 2003-09-30 devnull return 0;
70 b2cfc4e2 2003-09-30 devnull p->inst = ip;
71 b2cfc4e2 2003-09-30 devnull memset((void *)&p->se, 0, sizeof(p->se));
72 b2cfc4e2 2003-09-30 devnull p->se.m[0].s.sp = sp;
73 b2cfc4e2 2003-09-30 devnull (++p)->inst = 0;
74 b2cfc4e2 2003-09-30 devnull return p;