xref: /plan9-contrib/sys/src/libregexp/regaux.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
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