xref: /plan9-contrib/sys/src/liblex/reject.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include	<u.h>
2*3e12c5d1SDavid du Colombier #include	<libc.h>
3*3e12c5d1SDavid du Colombier #include	<stdio.h>
4*3e12c5d1SDavid du Colombier 
5*3e12c5d1SDavid du Colombier extern	FILE*	yyout;
6*3e12c5d1SDavid du Colombier extern	FILE*	yyin;
7*3e12c5d1SDavid du Colombier extern	int	yyprevious, *yyfnd;
8*3e12c5d1SDavid du Colombier extern	char	yyextra[];
9*3e12c5d1SDavid du Colombier extern	char	yytext[];
10*3e12c5d1SDavid du Colombier extern	int	yyleng;
11*3e12c5d1SDavid du Colombier 
12*3e12c5d1SDavid du Colombier extern
13*3e12c5d1SDavid du Colombier struct
14*3e12c5d1SDavid du Colombier {
15*3e12c5d1SDavid du Colombier 	int *yyaa, *yybb;
16*3e12c5d1SDavid du Colombier 	int *yystops;
17*3e12c5d1SDavid du Colombier } *yylstate [], **yylsp, **yyolsp;
18*3e12c5d1SDavid du Colombier 
19*3e12c5d1SDavid du Colombier int	yyback(int *p, int m);
20*3e12c5d1SDavid du Colombier int	yyinput(void);
21*3e12c5d1SDavid du Colombier void	yyoutput(int c);
22*3e12c5d1SDavid du Colombier void	yyunput(int c);
23*3e12c5d1SDavid du Colombier 
24*3e12c5d1SDavid du Colombier int
yyracc(int m)25*3e12c5d1SDavid du Colombier yyracc(int m)
26*3e12c5d1SDavid du Colombier {
27*3e12c5d1SDavid du Colombier 
28*3e12c5d1SDavid du Colombier 	yyolsp = yylsp;
29*3e12c5d1SDavid du Colombier 	if(yyextra[m]) {
30*3e12c5d1SDavid du Colombier 		while(yyback((*yylsp)->yystops, -m) != 1 && yylsp > yylstate) {
31*3e12c5d1SDavid du Colombier 			yylsp--;
32*3e12c5d1SDavid du Colombier 			yyunput(yytext[--yyleng]);
33*3e12c5d1SDavid du Colombier 		}
34*3e12c5d1SDavid du Colombier 	}
35*3e12c5d1SDavid du Colombier 	yyprevious = yytext[yyleng-1];
36*3e12c5d1SDavid du Colombier 	yytext[yyleng] = 0;
37*3e12c5d1SDavid du Colombier 	return m;
38*3e12c5d1SDavid du Colombier }
39*3e12c5d1SDavid du Colombier 
40*3e12c5d1SDavid du Colombier int
yyreject(void)41*3e12c5d1SDavid du Colombier yyreject(void)
42*3e12c5d1SDavid du Colombier {
43*3e12c5d1SDavid du Colombier 	for(; yylsp < yyolsp; yylsp++)
44*3e12c5d1SDavid du Colombier 		yytext[yyleng++] = yyinput();
45*3e12c5d1SDavid du Colombier 	if(*yyfnd > 0)
46*3e12c5d1SDavid du Colombier 		return yyracc(*yyfnd++);
47*3e12c5d1SDavid du Colombier 	while(yylsp-- > yylstate) {
48*3e12c5d1SDavid du Colombier 		yyunput(yytext[yyleng-1]);
49*3e12c5d1SDavid du Colombier 		yytext[--yyleng] = 0;
50*3e12c5d1SDavid du Colombier 		if(*yylsp != 0 && (yyfnd = (*yylsp)->yystops) && *yyfnd > 0)
51*3e12c5d1SDavid du Colombier 			return yyracc(*yyfnd++);
52*3e12c5d1SDavid du Colombier 	}
53*3e12c5d1SDavid du Colombier 	if(yytext[0] == 0)
54*3e12c5d1SDavid du Colombier 		return 0;
55*3e12c5d1SDavid du Colombier 	yyoutput(yyprevious = yyinput());
56*3e12c5d1SDavid du Colombier 	yyleng = 0;
57*3e12c5d1SDavid du Colombier 	return -1;
58*3e12c5d1SDavid du Colombier }
59