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