xref: /plan9/sys/src/libregexp/regaux.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include "regexp.h"
43e12c5d1SDavid du Colombier #include "regcomp.h"
53e12c5d1SDavid du Colombier 
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier /*
83e12c5d1SDavid du Colombier  *  save a new match in mp
93e12c5d1SDavid du Colombier  */
103e12c5d1SDavid du Colombier extern void
113e12c5d1SDavid du Colombier _renewmatch(Resub *mp, int ms, Resublist *sp)
123e12c5d1SDavid du Colombier {
133e12c5d1SDavid du Colombier 	int i;
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier 	if(mp==0 || ms<=0)
163e12c5d1SDavid du Colombier 		return;
173e12c5d1SDavid du Colombier 	if(mp[0].sp==0 || sp->m[0].sp<mp[0].sp ||
183e12c5d1SDavid du Colombier 	   (sp->m[0].sp==mp[0].sp && sp->m[0].ep>mp[0].ep)){
193e12c5d1SDavid du Colombier 		for(i=0; i<ms && i<NSUBEXP; i++)
203e12c5d1SDavid du Colombier 			mp[i] = sp->m[i];
213e12c5d1SDavid du Colombier 		for(; i<ms; i++)
223e12c5d1SDavid du Colombier 			mp[i].sp = mp[i].ep = 0;
233e12c5d1SDavid du Colombier 	}
243e12c5d1SDavid du Colombier }
253e12c5d1SDavid du Colombier 
263e12c5d1SDavid du Colombier /*
273e12c5d1SDavid du Colombier  * Note optimization in _renewthread:
283e12c5d1SDavid du Colombier  * 	*lp must be pending when _renewthread called; if *l has been looked
293e12c5d1SDavid du Colombier  *		at already, the optimization is a bug.
303e12c5d1SDavid du Colombier  */
313e12c5d1SDavid du Colombier extern Relist*
323e12c5d1SDavid du Colombier _renewthread(Relist *lp,	/* _relist to add to */
333e12c5d1SDavid du Colombier 	Reinst *ip,		/* instruction to add */
343e12c5d1SDavid du Colombier 	Resublist *sep)		/* pointers to subexpressions */
353e12c5d1SDavid du Colombier {
363e12c5d1SDavid du Colombier 	Relist *p;
373e12c5d1SDavid du Colombier 
383e12c5d1SDavid du Colombier 	for(p=lp; p->inst; p++){
393e12c5d1SDavid du Colombier 		if(p->inst == ip){
403e12c5d1SDavid du Colombier 			if((sep)->m[0].sp < p->se.m[0].sp)
413e12c5d1SDavid du Colombier 				p->se = *sep;
423e12c5d1SDavid du Colombier 			return 0;
433e12c5d1SDavid du Colombier 		}
443e12c5d1SDavid du Colombier 	}
453e12c5d1SDavid du Colombier 	p->inst = ip;
463e12c5d1SDavid du Colombier 	p->se = *sep;
473e12c5d1SDavid du Colombier 	(++p)->inst = 0;
483e12c5d1SDavid du Colombier 	return p;
493e12c5d1SDavid du Colombier }
503e12c5d1SDavid du Colombier 
51*219b2ee8SDavid du Colombier /*
52*219b2ee8SDavid du Colombier  * same as renewthread, but called with
53*219b2ee8SDavid du Colombier  * initial empty start pointer.
54*219b2ee8SDavid du Colombier  */
55*219b2ee8SDavid du Colombier extern Relist*
56*219b2ee8SDavid du Colombier _renewemptythread(Relist *lp,	/* _relist to add to */
57*219b2ee8SDavid du Colombier 	Reinst *ip,		/* instruction to add */
58*219b2ee8SDavid du Colombier 	char *sp)		/* pointers to subexpressions */
59*219b2ee8SDavid du Colombier {
60*219b2ee8SDavid du Colombier 	Relist *p;
61*219b2ee8SDavid du Colombier 
62*219b2ee8SDavid du Colombier 	for(p=lp; p->inst; p++){
63*219b2ee8SDavid du Colombier 		if(p->inst == ip){
64*219b2ee8SDavid du Colombier 			if(sp < p->se.m[0].sp) {
65*219b2ee8SDavid du Colombier 				memset(&p->se, 0, sizeof(p->se));
66*219b2ee8SDavid du Colombier 				p->se.m[0].sp = sp;
67*219b2ee8SDavid du Colombier 			}
68*219b2ee8SDavid du Colombier 			return 0;
69*219b2ee8SDavid du Colombier 		}
70*219b2ee8SDavid du Colombier 	}
71*219b2ee8SDavid du Colombier 	p->inst = ip;
72*219b2ee8SDavid du Colombier 	memset(&p->se, 0, sizeof(p->se));
73*219b2ee8SDavid du Colombier 	p->se.m[0].sp = sp;
74*219b2ee8SDavid du Colombier 	(++p)->inst = 0;
75*219b2ee8SDavid du Colombier 	return p;
76*219b2ee8SDavid du Colombier }
77*219b2ee8SDavid du Colombier 
78*219b2ee8SDavid du Colombier extern Relist*
79*219b2ee8SDavid du Colombier _rrenewemptythread(Relist *lp,	/* _relist to add to */
80*219b2ee8SDavid du Colombier 	Reinst *ip,		/* instruction to add */
81*219b2ee8SDavid du Colombier 	Rune *rsp)		/* pointers to subexpressions */
82*219b2ee8SDavid du Colombier {
83*219b2ee8SDavid du Colombier 	Relist *p;
84*219b2ee8SDavid du Colombier 
85*219b2ee8SDavid du Colombier 	for(p=lp; p->inst; p++){
86*219b2ee8SDavid du Colombier 		if(p->inst == ip){
87*219b2ee8SDavid du Colombier 			if(rsp < p->se.m[0].rsp) {
88*219b2ee8SDavid du Colombier 				memset(&p->se, 0, sizeof(p->se));
89*219b2ee8SDavid du Colombier 				p->se.m[0].rsp = rsp;
90*219b2ee8SDavid du Colombier 			}
91*219b2ee8SDavid du Colombier 			return 0;
92*219b2ee8SDavid du Colombier 		}
93*219b2ee8SDavid du Colombier 	}
94*219b2ee8SDavid du Colombier 	p->inst = ip;
95*219b2ee8SDavid du Colombier 	memset(&p->se, 0, sizeof(p->se));
96*219b2ee8SDavid du Colombier 	p->se.m[0].rsp = rsp;
97*219b2ee8SDavid du Colombier 	(++p)->inst = 0;
98*219b2ee8SDavid du Colombier 	return p;
99*219b2ee8SDavid du Colombier }
100