xref: /inferno-os/utils/libregexp/regaux.c (revision 556f8a312ed1b20f8ff25c104928646828e8b05c)
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