BSD 4 release
[unix-history] / usr / src / cmd / pc0 / yyprint.c
CommitLineData
89c20a2a
PK
1/* Copyright (c) 1979 Regents of the University of California */
2
31cef89c 3static char sccsid[] = "@(#)yyprint.c 1.1 8/27/80";
89c20a2a
PK
4
5#include "whoami.h"
6#include "0.h"
7#include "yy.h"
8
9char *tokname();
10
11STATIC 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 */
20char *
21charname(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 */
36char *
37tokname(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}