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