xref: /csrg-svn/old/lex/ncform (revision 14496)
1*14496Ssam/*	ncform	4.1	83/08/11	*/
2*14496Ssam
3*14496Ssamint yylineno =1;
4*14496Ssam# define YYU(x) x
5*14496Ssam# define NLSTATE yyprevious=YYNEWLINE
6*14496Ssamchar yytext[YYLMAX];
7*14496Ssamstruct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp;
8*14496Ssamchar yysbuf[YYLMAX];
9*14496Ssamchar *yysptr = yysbuf;
10*14496Ssamint *yyfnd;
11*14496Ssamextern struct yysvf *yyestate;
12*14496Ssamint yyprevious = YYNEWLINE;
13*14496Ssamyylook(){
14*14496Ssam	register struct yysvf *yystate, **lsp;
15*14496Ssam	register struct yywork *yyt;
16*14496Ssam	struct yysvf *yyz;
17*14496Ssam	int yych;
18*14496Ssam	struct yywork *yyr;
19*14496Ssam# ifdef LEXDEBUG
20*14496Ssam	int debug;
21*14496Ssam# endif
22*14496Ssam	char *yylastch;
23*14496Ssam	/* start off machines */
24*14496Ssam# ifdef LEXDEBUG
25*14496Ssam	debug = 0;
26*14496Ssam# endif
27*14496Ssam	if (!yymorfg)
28*14496Ssam		yylastch = yytext;
29*14496Ssam	else {
30*14496Ssam		yymorfg=0;
31*14496Ssam		yylastch = yytext+yyleng;
32*14496Ssam		}
33*14496Ssam	for(;;){
34*14496Ssam		lsp = yylstate;
35*14496Ssam		yyestate = yystate = yybgin;
36*14496Ssam		if (yyprevious==YYNEWLINE) yystate++;
37*14496Ssam		for (;;){
38*14496Ssam# ifdef LEXDEBUG
39*14496Ssam			if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1);
40*14496Ssam# endif
41*14496Ssam			yyt = yystate->yystoff;
42*14496Ssam			if(yyt == yycrank){		/* may not be any transitions */
43*14496Ssam				yyz = yystate->yyother;
44*14496Ssam				if(yyz == 0)break;
45*14496Ssam				if(yyz->yystoff == yycrank)break;
46*14496Ssam				}
47*14496Ssam			*yylastch++ = yych = input();
48*14496Ssam		tryagain:
49*14496Ssam# ifdef LEXDEBUG
50*14496Ssam			if(debug){
51*14496Ssam				fprintf(yyout,"char ");
52*14496Ssam				allprint(yych);
53*14496Ssam				putchar('\n');
54*14496Ssam				}
55*14496Ssam# endif
56*14496Ssam			yyr = yyt;
57*14496Ssam			if ( (int)yyt > (int)yycrank){
58*14496Ssam				yyt = yyr + yych;
59*14496Ssam				if (yyt <= yytop && yyt->verify+yysvec == yystate){
60*14496Ssam					if(yyt->advance+yysvec == YYLERR)	/* error transitions */
61*14496Ssam						{unput(*--yylastch);break;}
62*14496Ssam					*lsp++ = yystate = yyt->advance+yysvec;
63*14496Ssam					goto contin;
64*14496Ssam					}
65*14496Ssam				}
66*14496Ssam# ifdef YYOPTIM
67*14496Ssam			else if((int)yyt < (int)yycrank) {		/* r < yycrank */
68*14496Ssam				yyt = yyr = yycrank+(yycrank-yyt);
69*14496Ssam# ifdef LEXDEBUG
70*14496Ssam				if(debug)fprintf(yyout,"compressed state\n");
71*14496Ssam# endif
72*14496Ssam				yyt = yyt + yych;
73*14496Ssam				if(yyt <= yytop && yyt->verify+yysvec == yystate){
74*14496Ssam					if(yyt->advance+yysvec == YYLERR)	/* error transitions */
75*14496Ssam						{unput(*--yylastch);break;}
76*14496Ssam					*lsp++ = yystate = yyt->advance+yysvec;
77*14496Ssam					goto contin;
78*14496Ssam					}
79*14496Ssam				yyt = yyr + YYU(yymatch[yych]);
80*14496Ssam# ifdef LEXDEBUG
81*14496Ssam				if(debug){
82*14496Ssam					fprintf(yyout,"try fall back character ");
83*14496Ssam					allprint(YYU(yymatch[yych]));
84*14496Ssam					putchar('\n');
85*14496Ssam					}
86*14496Ssam# endif
87*14496Ssam				if(yyt <= yytop && yyt->verify+yysvec == yystate){
88*14496Ssam					if(yyt->advance+yysvec == YYLERR)	/* error transition */
89*14496Ssam						{unput(*--yylastch);break;}
90*14496Ssam					*lsp++ = yystate = yyt->advance+yysvec;
91*14496Ssam					goto contin;
92*14496Ssam					}
93*14496Ssam				}
94*14496Ssam			if ((yystate = yystate->yyother) && (yyt= yystate->yystoff) != yycrank){
95*14496Ssam# ifdef LEXDEBUG
96*14496Ssam				if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1);
97*14496Ssam# endif
98*14496Ssam				goto tryagain;
99*14496Ssam				}
100*14496Ssam# endif
101*14496Ssam			else
102*14496Ssam				{unput(*--yylastch);break;}
103*14496Ssam		contin:
104*14496Ssam# ifdef LEXDEBUG
105*14496Ssam			if(debug){
106*14496Ssam				fprintf(yyout,"state %d char ",yystate-yysvec-1);
107*14496Ssam				allprint(yych);
108*14496Ssam				putchar('\n');
109*14496Ssam				}
110*14496Ssam# endif
111*14496Ssam			;
112*14496Ssam			}
113*14496Ssam# ifdef LEXDEBUG
114*14496Ssam		if(debug){
115*14496Ssam			fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1);
116*14496Ssam			allprint(yych);
117*14496Ssam			putchar('\n');
118*14496Ssam			}
119*14496Ssam# endif
120*14496Ssam		while (lsp-- > yylstate){
121*14496Ssam			*yylastch-- = 0;
122*14496Ssam			if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){
123*14496Ssam				yyolsp = lsp;
124*14496Ssam				if(yyextra[*yyfnd]){		/* must backup */
125*14496Ssam					while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){
126*14496Ssam						lsp--;
127*14496Ssam						unput(*yylastch--);
128*14496Ssam						}
129*14496Ssam					}
130*14496Ssam				yyprevious = YYU(*yylastch);
131*14496Ssam				yylsp = lsp;
132*14496Ssam				yyleng = yylastch-yytext+1;
133*14496Ssam				yytext[yyleng] = 0;
134*14496Ssam# ifdef LEXDEBUG
135*14496Ssam				if(debug){
136*14496Ssam					fprintf(yyout,"\nmatch ");
137*14496Ssam					sprint(yytext);
138*14496Ssam					fprintf(yyout," action %d\n",*yyfnd);
139*14496Ssam					}
140*14496Ssam# endif
141*14496Ssam				return(*yyfnd++);
142*14496Ssam				}
143*14496Ssam			unput(*yylastch);
144*14496Ssam			}
145*14496Ssam		if (yytext[0] == 0  /* && feof(yyin) */)
146*14496Ssam			{
147*14496Ssam			yysptr=yysbuf;
148*14496Ssam			return(0);
149*14496Ssam			}
150*14496Ssam		yyprevious = yytext[0] = input();
151*14496Ssam		if (yyprevious>0)
152*14496Ssam			output(yyprevious);
153*14496Ssam		yylastch=yytext;
154*14496Ssam# ifdef LEXDEBUG
155*14496Ssam		if(debug)putchar('\n');
156*14496Ssam# endif
157*14496Ssam		}
158*14496Ssam	}
159*14496Ssamyyback(p, m)
160*14496Ssam	int *p;
161*14496Ssam{
162*14496Ssamif (p==0) return(0);
163*14496Ssamwhile (*p)
164*14496Ssam	{
165*14496Ssam	if (*p++ == m)
166*14496Ssam		return(1);
167*14496Ssam	}
168*14496Ssamreturn(0);
169*14496Ssam}
170*14496Ssam	/* the following are only used in the lex library */
171*14496Ssamyyinput(){
172*14496Ssam	return(input());
173*14496Ssam	}
174*14496Ssamyyoutput(c)
175*14496Ssam  int c; {
176*14496Ssam	output(c);
177*14496Ssam	}
178*14496Ssamyyunput(c)
179*14496Ssam   int c; {
180*14496Ssam	unput(c);
181*14496Ssam	}
182