xref: /inferno-os/utils/include/regexp.h (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth #pragma	src	"/usr/inferno/libregexp"
2*74a4d8c2SCharles.Forsyth #pragma	lib	"libregexp.a"
3*74a4d8c2SCharles.Forsyth 
4*74a4d8c2SCharles.Forsyth typedef struct Resub		Resub;
5*74a4d8c2SCharles.Forsyth typedef struct Reclass		Reclass;
6*74a4d8c2SCharles.Forsyth typedef struct Reinst		Reinst;
7*74a4d8c2SCharles.Forsyth typedef struct Reprog		Reprog;
8*74a4d8c2SCharles.Forsyth 
9*74a4d8c2SCharles.Forsyth /*
10*74a4d8c2SCharles.Forsyth  *	Sub expression matches
11*74a4d8c2SCharles.Forsyth  */
12*74a4d8c2SCharles.Forsyth struct Resub{
13*74a4d8c2SCharles.Forsyth 	union
14*74a4d8c2SCharles.Forsyth 	{
15*74a4d8c2SCharles.Forsyth 		char *sp;
16*74a4d8c2SCharles.Forsyth 		Rune *rsp;
17*74a4d8c2SCharles.Forsyth 	}s;
18*74a4d8c2SCharles.Forsyth 	union
19*74a4d8c2SCharles.Forsyth 	{
20*74a4d8c2SCharles.Forsyth 		char *ep;
21*74a4d8c2SCharles.Forsyth 		Rune *rep;
22*74a4d8c2SCharles.Forsyth 	}e;
23*74a4d8c2SCharles.Forsyth };
24*74a4d8c2SCharles.Forsyth 
25*74a4d8c2SCharles.Forsyth /*
26*74a4d8c2SCharles.Forsyth  *	character class, each pair of rune's defines a range
27*74a4d8c2SCharles.Forsyth  */
28*74a4d8c2SCharles.Forsyth struct Reclass{
29*74a4d8c2SCharles.Forsyth 	Rune	*end;
30*74a4d8c2SCharles.Forsyth 	Rune	spans[64];
31*74a4d8c2SCharles.Forsyth };
32*74a4d8c2SCharles.Forsyth 
33*74a4d8c2SCharles.Forsyth /*
34*74a4d8c2SCharles.Forsyth  *	Machine instructions
35*74a4d8c2SCharles.Forsyth  */
36*74a4d8c2SCharles.Forsyth struct Reinst{
37*74a4d8c2SCharles.Forsyth 	int	type;
38*74a4d8c2SCharles.Forsyth 	union	{
39*74a4d8c2SCharles.Forsyth 		Reclass	*cp;		/* class pointer */
40*74a4d8c2SCharles.Forsyth 		Rune	r;		/* character */
41*74a4d8c2SCharles.Forsyth 		int	subid;		/* sub-expression id for RBRA and LBRA */
42*74a4d8c2SCharles.Forsyth 		Reinst	*right;		/* right child of OR */
43*74a4d8c2SCharles.Forsyth 	}u1;
44*74a4d8c2SCharles.Forsyth 	union {	/* regexp relies on these two being in the same union */
45*74a4d8c2SCharles.Forsyth 		Reinst *left;		/* left child of OR */
46*74a4d8c2SCharles.Forsyth 		Reinst *next;		/* next instruction for CAT & LBRA */
47*74a4d8c2SCharles.Forsyth 	}u2;
48*74a4d8c2SCharles.Forsyth };
49*74a4d8c2SCharles.Forsyth 
50*74a4d8c2SCharles.Forsyth /*
51*74a4d8c2SCharles.Forsyth  *	Reprogram definition
52*74a4d8c2SCharles.Forsyth  */
53*74a4d8c2SCharles.Forsyth struct Reprog{
54*74a4d8c2SCharles.Forsyth 	Reinst	*startinst;	/* start pc */
55*74a4d8c2SCharles.Forsyth 	Reclass	class[16];	/* .data */
56*74a4d8c2SCharles.Forsyth 	Reinst	firstinst[5];	/* .text */
57*74a4d8c2SCharles.Forsyth };
58*74a4d8c2SCharles.Forsyth 
59*74a4d8c2SCharles.Forsyth extern Reprog	*regcomp(char*);
60*74a4d8c2SCharles.Forsyth extern Reprog	*regcomplit(char*);
61*74a4d8c2SCharles.Forsyth extern Reprog	*regcompnl(char*);
62*74a4d8c2SCharles.Forsyth extern void	regerror(char*);
63*74a4d8c2SCharles.Forsyth extern int	regexec(Reprog*, char*, Resub*, int);
64*74a4d8c2SCharles.Forsyth extern void	regsub(char*, char*, Resub*, int);
65*74a4d8c2SCharles.Forsyth extern int	rregexec(Reprog*, Rune*, Resub*, int);
66*74a4d8c2SCharles.Forsyth extern void	rregsub(Rune*, Rune*, Resub*, int);
67