BSD 3 development
[unix-history] / usr / src / cmd / pxp / yyprint.c
CommitLineData
7872c694
BJ
1/* Copyright (c) 1979 Regents of the University of California */
2#
3/*
4 * pi - Pascal interpreter code translator
5 *
6 * Charles Haley, Bill Joy UCB
7 * Version 1.1 February 1978
8 *
9 *
10 * pxp - Pascal execution profiler
11 *
12 * Bill Joy UCB
13 * Version 1.1 February 1978
14 */
15
16#include "0.h"
17#include "yy.h"
18
19char *tokname();
20
21int bounce;
22
23/*
24 * Printing representation of a
25 * "character" - a lexical token
26 * not in a yytok structure.
27 * 'which' indicates which char * you want
28 * should always be called as "charname(...,0),charname(...,1)"
29 */
30char *
31charname(ch , which )
32 int ch;
33 int which;
34{
35 struct yytok Ych;
36
37 Ych.Yychar = ch;
38 Ych.Yylval = nullsem(ch);
39 return (tokname(&Ych , which ));
40}
41
42/*
43 * Printing representation of a token
44 * 'which' as above.
45 */
46char *
47tokname(tp , which )
48 register struct yytok *tp;
49 int which;
50{
51 register char *cp;
52 register struct kwtab *kp;
53 char *cp2;
54
55 cp2 = "";
56 switch (tp->Yychar) {
57 case YCASELAB:
58 cp = "case-label";
59 break;
60 case YEOF:
61 cp = "end-of-file";
62 break;
63 case YILLCH:
64 cp = "illegal character";
65 break;
66 case 256:
67 /* error token */
68 cp = "error";
69 break;
70 case YID:
71 cp = "identifier";
72 break;
73 case YNUMB:
74 cp = "real number";
75 break;
76 case YINT:
77 case YBINT:
78 cp = "number";
79 break;
80 case YSTRING:
81 cp = tp->Yylval;
82 cp = cp == NIL || cp[1] == 0 ? "character" : "string";
83 break;
84 case YDOTDOT:
85 cp = "'..'";
86 break;
87 default:
88 if (tp->Yychar < 256) {
89 cp = "'x'\0'x'";
90 /*
91 * for twice reentrant code!
92 * used to be:
93 * if (bounce = ((bounce + 1) & 1))
94 * cp += 4;
95 * now: don't bounce unless 0th call
96 */
97 if ( which == 0 )
98 bounce = ((bounce + 1) & 1);
99 if (bounce)
100 cp =+ 4;
101 cp[1] = tp->Yychar;
102 break;
103 }
104 for (kp = yykey; kp->kw_str != NIL && kp->kw_val != tp->Yychar; kp++)
105 continue;
106 cp = "keyword ";
107 cp2 = kp->kw_str;
108 }
109 return ( which ? cp2 : cp );
110}