xref: /plan9/sys/include/ape/regexp.h (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #ifndef __REGEXP_H
23e12c5d1SDavid du Colombier #define __REGEXP_H
33e12c5d1SDavid du Colombier #ifndef _REGEXP_EXTENSION
43e12c5d1SDavid du Colombier     This header file is an extension to ANSI/POSIX
53e12c5d1SDavid du Colombier #endif
63e12c5d1SDavid du Colombier #pragma lib "/$M/lib/ape/libregexp.a"
73e12c5d1SDavid du Colombier 
83e12c5d1SDavid du Colombier #ifdef	UTF
93e12c5d1SDavid du Colombier #define	Runeself	0xA0
103e12c5d1SDavid du Colombier #else
113e12c5d1SDavid du Colombier #define	Runeself	0
123e12c5d1SDavid du Colombier #endif
133e12c5d1SDavid du Colombier 
143e12c5d1SDavid du Colombier typedef struct Resub		Resub;
153e12c5d1SDavid du Colombier typedef struct Reclass		Reclass;
163e12c5d1SDavid du Colombier typedef struct Reinst		Reinst;
173e12c5d1SDavid du Colombier typedef struct Reprog		Reprog;
183e12c5d1SDavid du Colombier 
193e12c5d1SDavid du Colombier /*
203e12c5d1SDavid du Colombier  *	Sub expression matches
213e12c5d1SDavid du Colombier  */
223e12c5d1SDavid du Colombier struct Resub{
233e12c5d1SDavid du Colombier 	union
243e12c5d1SDavid du Colombier 	{
253e12c5d1SDavid du Colombier 		char *sp;
263e12c5d1SDavid du Colombier 		wchar_t *rsp;
273e12c5d1SDavid du Colombier 	} s;
283e12c5d1SDavid du Colombier 	union
293e12c5d1SDavid du Colombier 	{
303e12c5d1SDavid du Colombier 		char *ep;
313e12c5d1SDavid du Colombier 		wchar_t *rep;
323e12c5d1SDavid du Colombier 	} e;
333e12c5d1SDavid du Colombier };
343e12c5d1SDavid du Colombier 
353e12c5d1SDavid du Colombier /*
363e12c5d1SDavid du Colombier  *	character class, each pair of rune's defines a range
373e12c5d1SDavid du Colombier  */
383e12c5d1SDavid du Colombier struct Reclass{
393e12c5d1SDavid du Colombier 	wchar_t	*end;
403e12c5d1SDavid du Colombier 	wchar_t	spans[64];
413e12c5d1SDavid du Colombier };
423e12c5d1SDavid du Colombier 
433e12c5d1SDavid du Colombier /*
443e12c5d1SDavid du Colombier  *	Machine instructions
453e12c5d1SDavid du Colombier  */
463e12c5d1SDavid du Colombier struct Reinst{
473e12c5d1SDavid du Colombier 	int	type;			/* < 0200 ==> literal, otherwise action */
483e12c5d1SDavid du Colombier 	union	{
493e12c5d1SDavid du Colombier 		Reclass	*cp;		/* class pointer */
503e12c5d1SDavid du Colombier 		wchar_t	r;		/* character */
513e12c5d1SDavid du Colombier 		int	subid;		/* sub-expression id for RBRA and LBRA */
523e12c5d1SDavid du Colombier 		Reinst	*right;		/* right child of OR */
533e12c5d1SDavid du Colombier 	} r;
543e12c5d1SDavid du Colombier 	union {	/* regexp relies on these two being in the same union */
553e12c5d1SDavid du Colombier 		Reinst *left;		/* left child of OR */
563e12c5d1SDavid du Colombier 		Reinst *next;		/* next instruction for CAT & LBRA */
573e12c5d1SDavid du Colombier 	} l;
583e12c5d1SDavid du Colombier };
593e12c5d1SDavid du Colombier 
603e12c5d1SDavid du Colombier /*
613e12c5d1SDavid du Colombier  *	Reprogram definition
623e12c5d1SDavid du Colombier  */
633e12c5d1SDavid du Colombier struct Reprog{
643e12c5d1SDavid du Colombier 	Reinst	*startinst;	/* start pc */
653e12c5d1SDavid du Colombier 	Reclass	class[16];	/* .data */
663e12c5d1SDavid du Colombier 	Reinst	firstinst[5];	/* .text */
673e12c5d1SDavid du Colombier };
683e12c5d1SDavid du Colombier 
693e12c5d1SDavid du Colombier extern Reprog	*regcomp(char*);
703e12c5d1SDavid du Colombier extern Reprog	*regcomplit(char*);
713e12c5d1SDavid du Colombier extern Reprog	*regcompnl(char*);
723e12c5d1SDavid du Colombier extern void	regerror(char*);
733e12c5d1SDavid du Colombier extern int	regexec(Reprog*, char*, Resub*, int);
74*9a747e4fSDavid du Colombier extern void	regsub(char*, char*, int, Resub*, int);
753e12c5d1SDavid du Colombier extern int	rregexec(Reprog*, wchar_t*, Resub*, int);
76*9a747e4fSDavid du Colombier extern void	rregsub(wchar_t*, wchar_t*, int, Resub*, int);
773e12c5d1SDavid du Colombier #endif
78