add offsets, new fields
[unix-history] / usr / src / usr.bin / struct / beautify / lextab.l
CommitLineData
51733553
RH
1%{
2
3#ifndef lint
4static char sccsid[] = "@(#)lextab.l 4.1 (Berkeley) %G%";
5#endif not lint
6
7#include "y.tab.h"
8#include "b.h"
9#undef input
10#define input() ninput()
11#undef unput
12#define unput(c) nunput(c)
13extern int yylval;
14#define xxbpmax 1700
15char xxbuf[xxbpmax + 2];
16int xxbp = -1;
17#define xxunmax 200
18char xxunbuf[xxunmax + 2];
19int xxunbp = -1;
20
21
22int blflag;
23%}
24
25D [0-9]
26A [0-9a-z]
27L [a-z]
28SP [^0-9a-z]
29
30%%
31
32%{
33char *xxtbuff;
34int xxj, xxn, xxk;
35char *xxp;
36%}
37[=/,(]{D}+[h] {
38 blflag = 1;
39 sscanf(&yytext[1],"%d",&xxn);
40 xxtbuff = malloc(2*xxn+3);
41 for (xxj = xxk = 1; xxj <= xxn; ++xxj)
42 {
43 xxtbuff[xxk] = ninput();
44 if (xxtbuff[xxk] == '"')
45 xxtbuff[++xxk] = '"';
46 ++xxk;
47 }
48 xxtbuff[0] = xxtbuff[xxk++] = '"';
49 xxtbuff[xxk] = '\0';
50 putback(xxtbuff);
51 free(xxtbuff);
52
53 backup(yytext[0]);
54 blflag = 0;
55 xxbp = -1;
56 }
57IF {fixval(); xxbp = -1; return(xxif);}
58ELSE {fixval(); xxbp = -1; return(xxelse);}
59REPEAT {fixval(); xxbp = -1; return(xxrept); }
60WHILE {fixval(); xxbp = -1; return(xxwhile); }
61UNTIL { fixval(); xxbp = -1; return(xxuntil); }
62DO {fixval(); xxbp = -1; return(xxdo); }
63SWITCH {fixval(); xxbp = -1; return(xxswitch); }
64CASE {fixval(); xxbp = -1; return(xxcase); }
65DEFAULT {fixval(); xxbp = -1; return(xxdefault); }
66END {fixval(); xxbp = -1; return(xxend); }
67
68".true." |
69".false." |
70
71{L}{A}* {fixval(); xxbp = -1; return(xxident); }
72~{D}+ {xxbuf[0] = ' '; fixval(); xxbp = -1; return(xxnum); }
73{D}+/"."(ge|gt|le|lt|eq|ne|not|or|and)"." |
74{D}+\.? |
75{D}+\.?[de][+-]?{D}+ |
76{D}*\.{D}+[de][+-]?{D}+ |
77{D}*\.{D}+ {fixval(); xxbp = -1; return(xxnum); }
78
79".gt." { putback(">"); xxbp = -1; }
80".ge." { putback(">=");xxbp = -1; }
81".lt." { putback("<"); xxbp = -1; }
82".le." { putback("<="); xxbp = -1; }
83".eq." { putback("=="); xxbp = -1; }
84".ne." { putback("!="); xxbp = -1; }
85".not." { putback("!"); xxbp = -1; }
86".or." { putback("||"); xxbp = -1; }
87".and." { putback("&&"); xxbp = -1; }
88">=" {fixval(); xxbp = -1; return(xxge); }
89"<=" {fixval(); xxbp = -1; return(xxle); }
90== {fixval(); xxbp = -1; return(xxeq); }
91!= {fixval(); xxbp = -1; return(xxne); }
92"||" {fixval(); xxbp = -1; return('|'); }
93"&&" {fixval(); xxbp = -1; return('&'); }
94"**" {fixval(); xxbp = -1; return('^'); }
95
96#.* {fixval(); xxbp = -1; return(xxcom); }
97\"([^"]|\"\")*\" {fixval(); xxbp = -1; return(xxstring); }
98'([^']|'')*' {
99 fixval();
100 xxp = yylval;
101 xxn = slength(xxp);
102 xxtbuff = malloc(2*xxn+1);
103 xxtbuff[0] = '"';
104 for (xxj = xxk = 1; xxj < xxn-1; ++xxj)
105 {
106 if (xxp[xxj] == '\'' && xxp[++xxj] == '\'')
107 xxtbuff[xxk++] = '\'';
108 else if (xxp[xxj] == '"')
109 {
110 xxtbuff[xxk++] = '"';
111 xxtbuff[xxk++] = '"';
112 }
113 else
114 xxtbuff[xxk++] = xxp[xxj];
115 }
116 xxtbuff[xxk++] = '"';
117 xxtbuff[xxk] = '\0';
118 free(xxp);
119 yylval = xxtbuff;
120 xxbp = -1;
121 return(xxstring);
122 }
123
124^\n xxbp = -1;
125\n {xxbp = -1; if (newflag) {fixval(); return('\n'); } }
126{SP} {fixval(); xxbp = -1; return(yytext[0]); }
127
128%%
129
130rdchar()
131 {
132 int c;
133 if (xxunbp >= 0)
134 return(xxunbuf[xxunbp--]);
135 c = getchar();
136 if (c == EOF) return('\0');
137 else return((char)c);
138 }
139
140backup(c)
141char c;
142 {
143 if (++xxunbp > xxunmax)
144 {
145 xxunbuf[xxunmax + 1] = '\0';
146 error("RATFOR beautifying; input backed up too far during lex:\n",
147 xxunbuf,"\n");
148 }
149 xxunbuf[xxunbp] = c;
150 }
151
152nunput(c)
153char c;
154 {
155 backup(c);
156 if (xxbp < 0) return;
157 if (c != xxbuf[xxbp])
158 {
159 xxbuf[xxbp + 1] = '\0';
160 error("RATFOR beautifying; lex call of nunput with wrong char:\n",
161 xxbuf,"\n");
162 }
163 for ( --xxbp; xxbp >= 0 && (xxbuf[xxbp] == ' ' || xxbuf[xxbp] == '\t'); --xxbp)
164 backup(xxbuf[xxbp]);
165 xxbuf[xxbp+1] = '\0';
166 }
167
168ninput()
169 {
170 char c,d;
171 if (blflag) c = rdchar();
172 else
173 while ( (c = rdchar()) == ' ' || c == '\t')
174 addbuf(c);
175 if (c != '\n')
176 return(addbuf(c));
177 while ( (d = rdchar()) == ' ' || d == '\t');
178 if (d == '&')
179 return(ninput());
180 backup(d);
181 return(addbuf('\n'));
182 }
183
184addbuf(c)
185char c;
186 {
187 if (++xxbp > xxbpmax)
188 {
189 xxbuf[xxbpmax +1] = '\0';
190 error("RATFOR beautifying; buffer xxbuf too small for token beginning:\n",
191 xxbuf,"\n");
192 }
193 xxbuf[xxbp] = c;
194 xxbuf[xxbp + 1] = '\0';
195 return(c);
196 }
197
198
199fixval()
200 {
201 int i, j, k;
202 for (j = 0; xxbuf[j] == ' ' || xxbuf[j] == '\t'; ++j);
203 for (k = j; xxbuf[k] != '\0'; ++k);
204 for (--k; k > j && xxbuf[k] == ' ' || xxbuf[k] == '\t'; --k);
205 xxbuf[k+1] = '\0';
206 i = slength(&xxbuf[j]) + 1;
207 yylval = malloc(i);
208 str_copy(&xxbuf[j],yylval,i);
209 }
210
211
212
213putback(str)
214char *str;
215 {
216 int i;
217 for (i = 0; str[i] != '\0'; ++i);
218 for (--i; i >= 0; --i)
219 backup(str[i]);
220 }
221