xref: /plan9/sys/src/ape/lib/regexp/regaux.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include <stdlib.h>
2*3e12c5d1SDavid du Colombier #include <stdio.h>
3*3e12c5d1SDavid du Colombier #include "regexp.h"
4*3e12c5d1SDavid du Colombier #include "regcomp.h"
5*3e12c5d1SDavid du Colombier 
6*3e12c5d1SDavid du Colombier /*
7*3e12c5d1SDavid du Colombier  *	Machine state
8*3e12c5d1SDavid du Colombier  */
9*3e12c5d1SDavid du Colombier Relist*	_relist[2];
10*3e12c5d1SDavid du Colombier Relist*	_reliste[2];
11*3e12c5d1SDavid du Colombier int	_relistsize = LISTINCREMENT;
12*3e12c5d1SDavid du Colombier 
13*3e12c5d1SDavid du Colombier /*
14*3e12c5d1SDavid du Colombier  *  save a new match in mp
15*3e12c5d1SDavid du Colombier  */
16*3e12c5d1SDavid du Colombier extern void
_renewmatch(Resub * mp,int ms,Resublist * sp)17*3e12c5d1SDavid du Colombier _renewmatch(Resub *mp, int ms, Resublist *sp)
18*3e12c5d1SDavid du Colombier {
19*3e12c5d1SDavid du Colombier 	int i;
20*3e12c5d1SDavid du Colombier 
21*3e12c5d1SDavid du Colombier 	if(mp==0 || ms<=0)
22*3e12c5d1SDavid du Colombier 		return;
23*3e12c5d1SDavid du Colombier 	if(mp[0].s.sp==0 || sp->m[0].s.sp<mp[0].s.sp ||
24*3e12c5d1SDavid du Colombier 	   (sp->m[0].s.sp==mp[0].s.sp && sp->m[0].e.ep>mp[0].e.ep)){
25*3e12c5d1SDavid du Colombier 		for(i=0; i<ms && i<NSUBEXP; i++)
26*3e12c5d1SDavid du Colombier 			mp[i] = sp->m[i];
27*3e12c5d1SDavid du Colombier 		for(; i<ms; i++)
28*3e12c5d1SDavid du Colombier 			mp[i].s.sp = mp[i].e.ep = 0;
29*3e12c5d1SDavid du Colombier 	}
30*3e12c5d1SDavid du Colombier }
31*3e12c5d1SDavid du Colombier 
32*3e12c5d1SDavid du Colombier /*
33*3e12c5d1SDavid du Colombier  * Note optimization in _renewthread:
34*3e12c5d1SDavid du Colombier  * 	*lp must be pending when _renewthread called; if *l has been looked
35*3e12c5d1SDavid du Colombier  *		at already, the optimization is a bug.
36*3e12c5d1SDavid du Colombier  */
37*3e12c5d1SDavid du Colombier extern Relist*
_renewthread(Relist * lp,Reinst * ip,Resublist * sep)38*3e12c5d1SDavid du Colombier _renewthread(Relist *lp,	/* _relist to add to */
39*3e12c5d1SDavid du Colombier 	Reinst *ip,	/* instruction to add */
40*3e12c5d1SDavid du Colombier 	Resublist *sep)	/* pointers to subexpressions */
41*3e12c5d1SDavid du Colombier {
42*3e12c5d1SDavid du Colombier 	Relist *p;
43*3e12c5d1SDavid du Colombier 
44*3e12c5d1SDavid du Colombier 	for(p=lp; p->inst; p++){
45*3e12c5d1SDavid du Colombier 		if(p->inst == ip){
46*3e12c5d1SDavid du Colombier 			if((sep)->m[0].s.sp < p->se.m[0].s.sp)
47*3e12c5d1SDavid du Colombier 				p->se = *sep;
48*3e12c5d1SDavid du Colombier 			return 0;
49*3e12c5d1SDavid du Colombier 		}
50*3e12c5d1SDavid du Colombier 	}
51*3e12c5d1SDavid du Colombier 	p->inst = ip;
52*3e12c5d1SDavid du Colombier 	p->se = *sep;
53*3e12c5d1SDavid du Colombier 	(++p)->inst = 0;
54*3e12c5d1SDavid du Colombier 	return p;
55*3e12c5d1SDavid du Colombier }
56*3e12c5d1SDavid du Colombier 
57