xref: /plan9/sys/src/libregexp/regaux.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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
_renewmatch(Resub * mp,int ms,Resublist * sp)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*
_renewthread(Relist * lp,Reinst * ip,int ms,Resublist * sep)323e12c5d1SDavid du Colombier _renewthread(Relist *lp,	/* _relist to add to */
333e12c5d1SDavid du Colombier 	Reinst *ip,		/* instruction to add */
34*7dd7cddfSDavid du Colombier 	int ms,
353e12c5d1SDavid du Colombier 	Resublist *sep)		/* pointers to subexpressions */
363e12c5d1SDavid du Colombier {
373e12c5d1SDavid du Colombier 	Relist *p;
383e12c5d1SDavid du Colombier 
393e12c5d1SDavid du Colombier 	for(p=lp; p->inst; p++){
403e12c5d1SDavid du Colombier 		if(p->inst == ip){
41*7dd7cddfSDavid du Colombier 			if(sep->m[0].sp < p->se.m[0].sp){
42*7dd7cddfSDavid du Colombier 				if(ms > 1)
433e12c5d1SDavid du Colombier 					p->se = *sep;
44*7dd7cddfSDavid du Colombier 				else
45*7dd7cddfSDavid du Colombier 					p->se.m[0] = sep->m[0];
46*7dd7cddfSDavid du Colombier 			}
473e12c5d1SDavid du Colombier 			return 0;
483e12c5d1SDavid du Colombier 		}
493e12c5d1SDavid du Colombier 	}
503e12c5d1SDavid du Colombier 	p->inst = ip;
51*7dd7cddfSDavid du Colombier 	if(ms > 1)
523e12c5d1SDavid du Colombier 		p->se = *sep;
53*7dd7cddfSDavid du Colombier 	else
54*7dd7cddfSDavid du Colombier 		p->se.m[0] = sep->m[0];
553e12c5d1SDavid du Colombier 	(++p)->inst = 0;
563e12c5d1SDavid du Colombier 	return p;
573e12c5d1SDavid du Colombier }
583e12c5d1SDavid du Colombier 
59219b2ee8SDavid du Colombier /*
60219b2ee8SDavid du Colombier  * same as renewthread, but called with
61219b2ee8SDavid du Colombier  * initial empty start pointer.
62219b2ee8SDavid du Colombier  */
63219b2ee8SDavid du Colombier extern Relist*
_renewemptythread(Relist * lp,Reinst * ip,int ms,char * sp)64219b2ee8SDavid du Colombier _renewemptythread(Relist *lp,	/* _relist to add to */
65219b2ee8SDavid du Colombier 	Reinst *ip,		/* instruction to add */
66*7dd7cddfSDavid du Colombier 	int ms,
67219b2ee8SDavid du Colombier 	char *sp)		/* pointers to subexpressions */
68219b2ee8SDavid du Colombier {
69219b2ee8SDavid du Colombier 	Relist *p;
70219b2ee8SDavid du Colombier 
71219b2ee8SDavid du Colombier 	for(p=lp; p->inst; p++){
72219b2ee8SDavid du Colombier 		if(p->inst == ip){
73219b2ee8SDavid du Colombier 			if(sp < p->se.m[0].sp) {
74*7dd7cddfSDavid du Colombier 				if(ms > 1)
75219b2ee8SDavid du Colombier 					memset(&p->se, 0, sizeof(p->se));
76219b2ee8SDavid du Colombier 				p->se.m[0].sp = sp;
77219b2ee8SDavid du Colombier 			}
78219b2ee8SDavid du Colombier 			return 0;
79219b2ee8SDavid du Colombier 		}
80219b2ee8SDavid du Colombier 	}
81219b2ee8SDavid du Colombier 	p->inst = ip;
82*7dd7cddfSDavid du Colombier 	if(ms > 1)
83219b2ee8SDavid du Colombier 		memset(&p->se, 0, sizeof(p->se));
84219b2ee8SDavid du Colombier 	p->se.m[0].sp = sp;
85219b2ee8SDavid du Colombier 	(++p)->inst = 0;
86219b2ee8SDavid du Colombier 	return p;
87219b2ee8SDavid du Colombier }
88219b2ee8SDavid du Colombier 
89219b2ee8SDavid du Colombier extern Relist*
_rrenewemptythread(Relist * lp,Reinst * ip,int ms,Rune * rsp)90219b2ee8SDavid du Colombier _rrenewemptythread(Relist *lp,	/* _relist to add to */
91219b2ee8SDavid du Colombier 	Reinst *ip,		/* instruction to add */
92*7dd7cddfSDavid du Colombier 	int ms,
93219b2ee8SDavid du Colombier 	Rune *rsp)		/* pointers to subexpressions */
94219b2ee8SDavid du Colombier {
95219b2ee8SDavid du Colombier 	Relist *p;
96219b2ee8SDavid du Colombier 
97219b2ee8SDavid du Colombier 	for(p=lp; p->inst; p++){
98219b2ee8SDavid du Colombier 		if(p->inst == ip){
99219b2ee8SDavid du Colombier 			if(rsp < p->se.m[0].rsp) {
100*7dd7cddfSDavid du Colombier 				if(ms > 1)
101219b2ee8SDavid du Colombier 					memset(&p->se, 0, sizeof(p->se));
102219b2ee8SDavid du Colombier 				p->se.m[0].rsp = rsp;
103219b2ee8SDavid du Colombier 			}
104219b2ee8SDavid du Colombier 			return 0;
105219b2ee8SDavid du Colombier 		}
106219b2ee8SDavid du Colombier 	}
107219b2ee8SDavid du Colombier 	p->inst = ip;
108*7dd7cddfSDavid du Colombier 	if(ms > 1)
109219b2ee8SDavid du Colombier 		memset(&p->se, 0, sizeof(p->se));
110219b2ee8SDavid du Colombier 	p->se.m[0].rsp = rsp;
111219b2ee8SDavid du Colombier 	(++p)->inst = 0;
112219b2ee8SDavid du Colombier 	return p;
113219b2ee8SDavid du Colombier }
114