Blame


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"
4 b2cfc4e2 2003-09-30 devnull
5 b2cfc4e2 2003-09-30 devnull
6 b2cfc4e2 2003-09-30 devnull /*
7 b2cfc4e2 2003-09-30 devnull * save a new match in mp
8 b2cfc4e2 2003-09-30 devnull */
9 b2cfc4e2 2003-09-30 devnull extern void
10 b2cfc4e2 2003-09-30 devnull _renewmatch(Resub *mp, int ms, Resublist *sp)
11 b2cfc4e2 2003-09-30 devnull {
12 b2cfc4e2 2003-09-30 devnull int i;
13 b2cfc4e2 2003-09-30 devnull
14 b2cfc4e2 2003-09-30 devnull if(mp==0 || ms<=0)
15 b2cfc4e2 2003-09-30 devnull return;
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;
22 b2cfc4e2 2003-09-30 devnull }
23 b2cfc4e2 2003-09-30 devnull }
24 b2cfc4e2 2003-09-30 devnull
25 b2cfc4e2 2003-09-30 devnull /*
26 6d08a0f5 2007-12-07 rsc * Note optimization in _renewthread:
27 6d08a0f5 2007-12-07 rsc * *lp must be pending when _renewthread called; if *l has been looked
28 6d08a0f5 2007-12-07 rsc * at already, the optimization is a bug.
29 b2cfc4e2 2003-09-30 devnull */
30 6d08a0f5 2007-12-07 rsc extern Relist*
31 6d08a0f5 2007-12-07 rsc _renewthread(Relist *lp, /* _relist to add to */
32 b2cfc4e2 2003-09-30 devnull Reinst *ip, /* instruction to add */
33 62390091 2004-03-05 devnull int ms,
34 b2cfc4e2 2003-09-30 devnull Resublist *sep) /* pointers to subexpressions */
35 b2cfc4e2 2003-09-30 devnull {
36 b2cfc4e2 2003-09-30 devnull Relist *p;
37 b2cfc4e2 2003-09-30 devnull
38 6d08a0f5 2007-12-07 rsc for(p=lp; p->inst; p++){
39 6d08a0f5 2007-12-07 rsc if(p->inst == ip){
40 6d08a0f5 2007-12-07 rsc if(sep->m[0].s.sp < p->se.m[0].s.sp){
41 6d08a0f5 2007-12-07 rsc if(ms > 1)
42 6d08a0f5 2007-12-07 rsc p->se = *sep;
43 6d08a0f5 2007-12-07 rsc else
44 6d08a0f5 2007-12-07 rsc p->se.m[0] = sep->m[0];
45 6d08a0f5 2007-12-07 rsc }
46 b2cfc4e2 2003-09-30 devnull return 0;
47 6d08a0f5 2007-12-07 rsc }
48 6d08a0f5 2007-12-07 rsc }
49 b2cfc4e2 2003-09-30 devnull p->inst = ip;
50 62390091 2004-03-05 devnull if(ms > 1)
51 62390091 2004-03-05 devnull p->se = *sep;
52 62390091 2004-03-05 devnull else
53 62390091 2004-03-05 devnull p->se.m[0] = sep->m[0];
54 6d08a0f5 2007-12-07 rsc (++p)->inst = 0;
55 b2cfc4e2 2003-09-30 devnull return p;
56 b2cfc4e2 2003-09-30 devnull }
57 b2cfc4e2 2003-09-30 devnull
58 b2cfc4e2 2003-09-30 devnull /*
59 b2cfc4e2 2003-09-30 devnull * same as renewthread, but called with
60 b2cfc4e2 2003-09-30 devnull * initial empty start pointer.
61 b2cfc4e2 2003-09-30 devnull */
62 6d08a0f5 2007-12-07 rsc extern Relist*
63 b2cfc4e2 2003-09-30 devnull _renewemptythread(Relist *lp, /* _relist to add to */
64 b2cfc4e2 2003-09-30 devnull Reinst *ip, /* instruction to add */
65 62390091 2004-03-05 devnull int ms,
66 b2cfc4e2 2003-09-30 devnull char *sp) /* pointers to subexpressions */
67 b2cfc4e2 2003-09-30 devnull {
68 6d08a0f5 2007-12-07 rsc Relist *p;
69 6d08a0f5 2007-12-07 rsc
70 6d08a0f5 2007-12-07 rsc for(p=lp; p->inst; p++){
71 6d08a0f5 2007-12-07 rsc if(p->inst == ip){
72 6d08a0f5 2007-12-07 rsc if(sp < p->se.m[0].s.sp) {
73 6d08a0f5 2007-12-07 rsc if(ms > 1)
74 6d08a0f5 2007-12-07 rsc memset(&p->se, 0, sizeof(p->se));
75 6d08a0f5 2007-12-07 rsc p->se.m[0].s.sp = sp;
76 6d08a0f5 2007-12-07 rsc }
77 6d08a0f5 2007-12-07 rsc return 0;
78 6d08a0f5 2007-12-07 rsc }
79 6d08a0f5 2007-12-07 rsc }
80 6d08a0f5 2007-12-07 rsc p->inst = ip;
81 62390091 2004-03-05 devnull if(ms > 1)
82 6d08a0f5 2007-12-07 rsc memset(&p->se, 0, sizeof(p->se));
83 6d08a0f5 2007-12-07 rsc p->se.m[0].s.sp = sp;
84 6d08a0f5 2007-12-07 rsc (++p)->inst = 0;
85 6d08a0f5 2007-12-07 rsc return p;
86 b2cfc4e2 2003-09-30 devnull }
87 b2cfc4e2 2003-09-30 devnull
88 6d08a0f5 2007-12-07 rsc extern Relist*
89 62390091 2004-03-05 devnull _rrenewemptythread(Relist *lp, /* _relist to add to */
90 62390091 2004-03-05 devnull Reinst *ip, /* instruction to add */
91 62390091 2004-03-05 devnull int ms,
92 62390091 2004-03-05 devnull Rune *rsp) /* pointers to subexpressions */
93 62390091 2004-03-05 devnull {
94 6d08a0f5 2007-12-07 rsc Relist *p;
95 6d08a0f5 2007-12-07 rsc
96 6d08a0f5 2007-12-07 rsc for(p=lp; p->inst; p++){
97 6d08a0f5 2007-12-07 rsc if(p->inst == ip){
98 6d08a0f5 2007-12-07 rsc if(rsp < p->se.m[0].s.rsp) {
99 6d08a0f5 2007-12-07 rsc if(ms > 1)
100 6d08a0f5 2007-12-07 rsc memset(&p->se, 0, sizeof(p->se));
101 6d08a0f5 2007-12-07 rsc p->se.m[0].s.rsp = rsp;
102 6d08a0f5 2007-12-07 rsc }
103 6d08a0f5 2007-12-07 rsc return 0;
104 6d08a0f5 2007-12-07 rsc }
105 6d08a0f5 2007-12-07 rsc }
106 6d08a0f5 2007-12-07 rsc p->inst = ip;
107 6d08a0f5 2007-12-07 rsc if(ms > 1)
108 6d08a0f5 2007-12-07 rsc memset(&p->se, 0, sizeof(p->se));
109 6d08a0f5 2007-12-07 rsc p->se.m[0].s.rsp = rsp;
110 6d08a0f5 2007-12-07 rsc (++p)->inst = 0;
111 6d08a0f5 2007-12-07 rsc return p;
112 62390091 2004-03-05 devnull }