xref: /plan9/sys/src/libregexp/regcomp.h (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  *  substitution list
33e12c5d1SDavid du Colombier  */
4*219b2ee8SDavid du Colombier #define NSUBEXP 32
53e12c5d1SDavid du Colombier typedef struct Resublist	Resublist;
63e12c5d1SDavid du Colombier struct	Resublist
73e12c5d1SDavid du Colombier {
8*219b2ee8SDavid du Colombier 	Resub	m[NSUBEXP];
93e12c5d1SDavid du Colombier };
103e12c5d1SDavid du Colombier 
113e12c5d1SDavid du Colombier /* max character classes per program */
123e12c5d1SDavid du Colombier Reprog	RePrOg;
133e12c5d1SDavid du Colombier #define	NCLASS	(sizeof(RePrOg.class)/sizeof(Reclass))
143e12c5d1SDavid du Colombier 
153e12c5d1SDavid du Colombier /* max rune ranges per character class */
163e12c5d1SDavid du Colombier #define NCCRUNE	(sizeof(Reclass)/sizeof(Rune))
173e12c5d1SDavid du Colombier 
183e12c5d1SDavid du Colombier /*
193e12c5d1SDavid du Colombier  * Actions and Tokens (Reinst types)
203e12c5d1SDavid du Colombier  *
213e12c5d1SDavid du Colombier  *	02xx are operators, value == precedence
223e12c5d1SDavid du Colombier  *	03xx are tokens, i.e. operands for operators
233e12c5d1SDavid du Colombier  */
243e12c5d1SDavid du Colombier #define RUNE		0177
253e12c5d1SDavid du Colombier #define	OPERATOR	0200	/* Bitmask of all operators */
263e12c5d1SDavid du Colombier #define	START		0200	/* Start, used for marker on stack */
273e12c5d1SDavid du Colombier #define	RBRA		0201	/* Right bracket, ) */
283e12c5d1SDavid du Colombier #define	LBRA		0202	/* Left bracket, ( */
293e12c5d1SDavid du Colombier #define	OR		0203	/* Alternation, | */
303e12c5d1SDavid du Colombier #define	CAT		0204	/* Concatentation, implicit operator */
313e12c5d1SDavid du Colombier #define	STAR		0205	/* Closure, * */
323e12c5d1SDavid du Colombier #define	PLUS		0206	/* a+ == aa* */
333e12c5d1SDavid du Colombier #define	QUEST		0207	/* a? == a|nothing, i.e. 0 or 1 a's */
343e12c5d1SDavid du Colombier #define	ANY		0300	/* Any character except newline, . */
353e12c5d1SDavid du Colombier #define	ANYNL		0301	/* Any character including newline, . */
363e12c5d1SDavid du Colombier #define	NOP		0302	/* No operation, internal use only */
373e12c5d1SDavid du Colombier #define	BOL		0303	/* Beginning of line, ^ */
383e12c5d1SDavid du Colombier #define	EOL		0304	/* End of line, $ */
393e12c5d1SDavid du Colombier #define	CCLASS		0305	/* Character class, [] */
403e12c5d1SDavid du Colombier #define	NCCLASS		0306	/* Negated character class, [] */
413e12c5d1SDavid du Colombier #define	END		0377	/* Terminate: match found */
423e12c5d1SDavid du Colombier 
433e12c5d1SDavid du Colombier /*
443e12c5d1SDavid du Colombier  *  regexec execution lists
453e12c5d1SDavid du Colombier  */
46*219b2ee8SDavid du Colombier #define LISTSIZE	10
47*219b2ee8SDavid du Colombier #define BIGLISTSIZE	(10*LISTSIZE)
483e12c5d1SDavid du Colombier typedef struct Relist	Relist;
493e12c5d1SDavid du Colombier struct Relist
503e12c5d1SDavid du Colombier {
513e12c5d1SDavid du Colombier 	Reinst*		inst;		/* Reinstruction of the thread */
523e12c5d1SDavid du Colombier 	Resublist	se;		/* matched subexpressions in this thread */
533e12c5d1SDavid du Colombier };
54*219b2ee8SDavid du Colombier typedef struct Reljunk	Reljunk;
55*219b2ee8SDavid du Colombier struct	Reljunk
56*219b2ee8SDavid du Colombier {
57*219b2ee8SDavid du Colombier 	Relist*	relist[2];
58*219b2ee8SDavid du Colombier 	Relist*	reliste[2];
59*219b2ee8SDavid du Colombier 	int	starttype;
60*219b2ee8SDavid du Colombier 	Rune	startchar;
61*219b2ee8SDavid du Colombier 	char*	starts;
62*219b2ee8SDavid du Colombier 	char*	eol;
63*219b2ee8SDavid du Colombier 	Rune*	rstarts;
64*219b2ee8SDavid du Colombier 	Rune*	reol;
65*219b2ee8SDavid du Colombier };
663e12c5d1SDavid du Colombier 
673e12c5d1SDavid du Colombier extern Relist*	_renewthread(Relist*, Reinst*, Resublist*);
683e12c5d1SDavid du Colombier extern void	_renewmatch(Resub*, int, Resublist*);
69*219b2ee8SDavid du Colombier extern Relist*	_renewemptythread(Relist*, Reinst*, char*);
70*219b2ee8SDavid du Colombier extern Relist*	_rrenewemptythread(Relist*, Reinst*, Rune*);
71