xref: /plan9/sys/include/regexp.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1219b2ee8SDavid du Colombier #pragma	src	"/sys/src/libregexp"
23e12c5d1SDavid du Colombier #pragma	lib	"libregexp.a"
33e12c5d1SDavid du Colombier 
43e12c5d1SDavid du Colombier typedef struct Resub		Resub;
53e12c5d1SDavid du Colombier typedef struct Reclass		Reclass;
63e12c5d1SDavid du Colombier typedef struct Reinst		Reinst;
73e12c5d1SDavid du Colombier typedef struct Reprog		Reprog;
83e12c5d1SDavid du Colombier 
93e12c5d1SDavid du Colombier /*
103e12c5d1SDavid du Colombier  *	Sub expression matches
113e12c5d1SDavid du Colombier  */
123e12c5d1SDavid du Colombier struct Resub{
133e12c5d1SDavid du Colombier 	union
143e12c5d1SDavid du Colombier 	{
153e12c5d1SDavid du Colombier 		char *sp;
163e12c5d1SDavid du Colombier 		Rune *rsp;
173e12c5d1SDavid du Colombier 	};
183e12c5d1SDavid du Colombier 	union
193e12c5d1SDavid du Colombier 	{
203e12c5d1SDavid du Colombier 		char *ep;
213e12c5d1SDavid du Colombier 		Rune *rep;
223e12c5d1SDavid du Colombier 	};
233e12c5d1SDavid du Colombier };
243e12c5d1SDavid du Colombier 
253e12c5d1SDavid du Colombier /*
263e12c5d1SDavid du Colombier  *	character class, each pair of rune's defines a range
273e12c5d1SDavid du Colombier  */
283e12c5d1SDavid du Colombier struct Reclass{
293e12c5d1SDavid du Colombier 	Rune	*end;
303e12c5d1SDavid du Colombier 	Rune	spans[64];
313e12c5d1SDavid du Colombier };
323e12c5d1SDavid du Colombier 
333e12c5d1SDavid du Colombier /*
343e12c5d1SDavid du Colombier  *	Machine instructions
353e12c5d1SDavid du Colombier  */
363e12c5d1SDavid du Colombier struct Reinst{
37219b2ee8SDavid du Colombier 	int	type;
383e12c5d1SDavid du Colombier 	union	{
393e12c5d1SDavid du Colombier 		Reclass	*cp;		/* class pointer */
403e12c5d1SDavid du Colombier 		Rune	r;		/* character */
413e12c5d1SDavid du Colombier 		int	subid;		/* sub-expression id for RBRA and LBRA */
423e12c5d1SDavid du Colombier 		Reinst	*right;		/* right child of OR */
433e12c5d1SDavid du Colombier 	};
443e12c5d1SDavid du Colombier 	union {	/* regexp relies on these two being in the same union */
453e12c5d1SDavid du Colombier 		Reinst *left;		/* left child of OR */
463e12c5d1SDavid du Colombier 		Reinst *next;		/* next instruction for CAT & LBRA */
473e12c5d1SDavid du Colombier 	};
483e12c5d1SDavid du Colombier };
493e12c5d1SDavid du Colombier 
503e12c5d1SDavid du Colombier /*
513e12c5d1SDavid du Colombier  *	Reprogram definition
523e12c5d1SDavid du Colombier  */
533e12c5d1SDavid du Colombier struct Reprog{
543e12c5d1SDavid du Colombier 	Reinst	*startinst;	/* start pc */
553e12c5d1SDavid du Colombier 	Reclass	class[16];	/* .data */
563e12c5d1SDavid du Colombier 	Reinst	firstinst[5];	/* .text */
573e12c5d1SDavid du Colombier };
583e12c5d1SDavid du Colombier 
593e12c5d1SDavid du Colombier extern Reprog	*regcomp(char*);
603e12c5d1SDavid du Colombier extern Reprog	*regcomplit(char*);
613e12c5d1SDavid du Colombier extern Reprog	*regcompnl(char*);
623e12c5d1SDavid du Colombier extern void	regerror(char*);
633e12c5d1SDavid du Colombier extern int	regexec(Reprog*, char*, Resub*, int);
64*9a747e4fSDavid du Colombier extern void	regsub(char*, char*, int, Resub*, int);
653e12c5d1SDavid du Colombier extern int	rregexec(Reprog*, Rune*, Resub*, int);
66*9a747e4fSDavid du Colombier extern void	rregsub(Rune*, Rune*, int, Resub*, int);
67