1*792Speter /* Copyright (c) 1979 Regents of the University of California */
2*792Speter 
3*792Speter static	char sccsid[] = "@(#)yyprint.c 1.1 08/27/80";
4*792Speter 
5*792Speter #include "whoami.h"
6*792Speter #include "0.h"
7*792Speter #include "yy.h"
8*792Speter 
9*792Speter char	*tokname();
10*792Speter 
11*792Speter STATIC	bool bounce;
12*792Speter 
13*792Speter /*
14*792Speter  * Printing representation of a
15*792Speter  * "character" - a lexical token
16*792Speter  * not in a yytok structure.
17*792Speter  * 'which' indicates which char * you want
18*792Speter  * should always be called as "charname(...,0),charname(...,1)"
19*792Speter  */
20*792Speter char *
21*792Speter charname(ch , which )
22*792Speter 	int ch;
23*792Speter 	int which;
24*792Speter {
25*792Speter 	struct yytok Ych;
26*792Speter 
27*792Speter 	Ych.Yychar = ch;
28*792Speter 	Ych.Yylval = nullsem(ch);
29*792Speter 	return (tokname(&Ych , which ));
30*792Speter }
31*792Speter 
32*792Speter /*
33*792Speter  * Printing representation of a token
34*792Speter  * 'which' as above.
35*792Speter  */
36*792Speter char *
37*792Speter tokname(tp , which )
38*792Speter 	register struct yytok *tp;
39*792Speter 	int	 	      which;
40*792Speter {
41*792Speter 	register char *cp;
42*792Speter 	register struct kwtab *kp;
43*792Speter 	char	*cp2;
44*792Speter 
45*792Speter 	cp2 = "";
46*792Speter 	switch (tp->Yychar) {
47*792Speter 		case YCASELAB:
48*792Speter 			cp = "case-label";
49*792Speter 			break;
50*792Speter 		case YEOF:
51*792Speter 			cp = "end-of-file";
52*792Speter 			break;
53*792Speter 		case YILLCH:
54*792Speter 			cp = "illegal character";
55*792Speter 			break;
56*792Speter 		case 256:
57*792Speter 			/* error token */
58*792Speter 			cp = "error";
59*792Speter 			break;
60*792Speter 		case YID:
61*792Speter 			cp = "identifier";
62*792Speter 			break;
63*792Speter 		case YNUMB:
64*792Speter 			cp = "real number";
65*792Speter 			break;
66*792Speter 		case YINT:
67*792Speter 		case YBINT:
68*792Speter 			cp = "number";
69*792Speter 			break;
70*792Speter 		case YSTRING:
71*792Speter 			cp = tp->Yylval;
72*792Speter 			cp = cp == NIL || cp[1] == 0 ? "character" : "string";
73*792Speter 			break;
74*792Speter 		case YDOTDOT:
75*792Speter 			cp = "'..'";
76*792Speter 			break;
77*792Speter 		default:
78*792Speter 			if (tp->Yychar < 256) {
79*792Speter 				cp = "'x'\0'x'\0'x'\0'x'";
80*792Speter 				/*
81*792Speter 				 * for four times reentrant code!
82*792Speter 				 * used to be:
83*792Speter 				 * if (bounce = ((bounce + 1) & 1))
84*792Speter 				 *	cp += 4;
85*792Speter 				 */
86*792Speter 				bounce = ( bounce + 1 ) % 4;
87*792Speter 				cp += (4 * bounce);	/* 'x'\0 is 4 chars */
88*792Speter 				cp[1] = tp->Yychar;
89*792Speter 				break;
90*792Speter 			}
91*792Speter 			for (kp = yykey; kp->kw_str != NIL && kp->kw_val != tp->Yychar; kp++)
92*792Speter 				continue;
93*792Speter 			cp = "keyword ";
94*792Speter 			cp2 = kp->kw_str;
95*792Speter 	}
96*792Speter 	return ( which ? cp2 : cp );
97*792Speter }
98