Blame


1 ad9e6848 2005-08-12 devnull #include <u.h>
2 ad9e6848 2005-08-12 devnull #include <libc.h>
3 ad9e6848 2005-08-12 devnull #include <bio.h>
4 ad9e6848 2005-08-12 devnull #include "cb.h"
5 ad9e6848 2005-08-12 devnull #include "cbtype.h"
6 ad9e6848 2005-08-12 devnull
7 ad9e6848 2005-08-12 devnull void
8 ad9e6848 2005-08-12 devnull main(int argc, char *argv[])
9 ad9e6848 2005-08-12 devnull {
10 ad9e6848 2005-08-12 devnull Biobuf stdin, stdout;
11 ad9e6848 2005-08-12 devnull
12 ad9e6848 2005-08-12 devnull while (--argc > 0 && (*++argv)[0] == '-'){
13 ad9e6848 2005-08-12 devnull switch ((*argv)[1]){
14 ad9e6848 2005-08-12 devnull case 's':
15 ad9e6848 2005-08-12 devnull strict = 1;
16 ad9e6848 2005-08-12 devnull continue;
17 ad9e6848 2005-08-12 devnull case 'j':
18 ad9e6848 2005-08-12 devnull join = 1;
19 ad9e6848 2005-08-12 devnull continue;
20 ad9e6848 2005-08-12 devnull case 'l':
21 ad9e6848 2005-08-12 devnull if((*argv)[2] != '\0'){
22 ad9e6848 2005-08-12 devnull maxleng = atoi( &((*argv)[2]) );
23 ad9e6848 2005-08-12 devnull }
24 ad9e6848 2005-08-12 devnull else{
25 ad9e6848 2005-08-12 devnull maxleng = atoi(*++argv);
26 ad9e6848 2005-08-12 devnull argc--;
27 ad9e6848 2005-08-12 devnull }
28 ad9e6848 2005-08-12 devnull maxtabs = maxleng/TABLENG - 2;
29 ad9e6848 2005-08-12 devnull maxleng -= (maxleng + 5)/10;
30 ad9e6848 2005-08-12 devnull continue;
31 ad9e6848 2005-08-12 devnull default:
32 ab6f1aea 2020-01-02 0intro fprint(2, "cb: illegal option %c\n", (*argv)[1]);
33 ad9e6848 2005-08-12 devnull exits("boom");
34 ad9e6848 2005-08-12 devnull }
35 ad9e6848 2005-08-12 devnull }
36 ad9e6848 2005-08-12 devnull Binit(&stdout, 1, OWRITE);
37 ad9e6848 2005-08-12 devnull output = &stdout;
38 ad9e6848 2005-08-12 devnull if (argc <= 0){
39 ad9e6848 2005-08-12 devnull Binit(&stdin, 0, OREAD);
40 ad9e6848 2005-08-12 devnull input = &stdin;
41 ad9e6848 2005-08-12 devnull work();
42 ad9e6848 2005-08-12 devnull } else {
43 ad9e6848 2005-08-12 devnull while (argc-- > 0){
44 ad9e6848 2005-08-12 devnull if ((input = Bopen( *argv, OREAD)) == 0){
45 ad9e6848 2005-08-12 devnull fprint(2, "cb: cannot open input file %s\n", *argv);
46 ad9e6848 2005-08-12 devnull exits("boom");
47 ad9e6848 2005-08-12 devnull }
48 ad9e6848 2005-08-12 devnull work();
49 ad9e6848 2005-08-12 devnull argv++;
50 ad9e6848 2005-08-12 devnull }
51 ad9e6848 2005-08-12 devnull }
52 ad9e6848 2005-08-12 devnull exits(0);
53 ad9e6848 2005-08-12 devnull }
54 ad9e6848 2005-08-12 devnull void
55 ad9e6848 2005-08-12 devnull work(void){
56 ad9e6848 2005-08-12 devnull int c;
57 ad9e6848 2005-08-12 devnull struct keyw *lptr;
58 ad9e6848 2005-08-12 devnull char *pt;
59 a47fbb16 2005-10-31 devnull int cc;
60 ad9e6848 2005-08-12 devnull int ct;
61 ad9e6848 2005-08-12 devnull
62 ad9e6848 2005-08-12 devnull while ((c = getch()) != Beof){
63 ad9e6848 2005-08-12 devnull switch (c){
64 ad9e6848 2005-08-12 devnull case '{':
65 ad9e6848 2005-08-12 devnull if ((lptr = lookup(lastlook,p)) != 0){
66 ad9e6848 2005-08-12 devnull if (lptr->type == ELSE)gotelse();
67 ad9e6848 2005-08-12 devnull else if(lptr->type == DO)gotdo();
68 ad9e6848 2005-08-12 devnull else if(lptr->type == STRUCT)structlev++;
69 ad9e6848 2005-08-12 devnull }
70 ad9e6848 2005-08-12 devnull if(++clev >= &ind[CLEVEL-1]){
71 ad9e6848 2005-08-12 devnull fprint(2,"too many levels of curly brackets\n");
72 ad9e6848 2005-08-12 devnull clev = &ind[CLEVEL-1];
73 ad9e6848 2005-08-12 devnull }
74 ad9e6848 2005-08-12 devnull clev->pdepth = 0;
75 ad9e6848 2005-08-12 devnull clev->tabs = (clev-1)->tabs;
76 ad9e6848 2005-08-12 devnull clearif(clev);
77 ad9e6848 2005-08-12 devnull if(strict && clev->tabs > 0)
78 ad9e6848 2005-08-12 devnull putspace(' ',NO);
79 ad9e6848 2005-08-12 devnull putch(c,NO);
80 ad9e6848 2005-08-12 devnull getnl();
81 ad9e6848 2005-08-12 devnull if(keyflag == DATADEF){
82 ad9e6848 2005-08-12 devnull OUT;
83 ad9e6848 2005-08-12 devnull }
84 ad9e6848 2005-08-12 devnull else {
85 ad9e6848 2005-08-12 devnull OUTK;
86 ad9e6848 2005-08-12 devnull }
87 ad9e6848 2005-08-12 devnull clev->tabs++;
88 ad9e6848 2005-08-12 devnull pt = getnext(0); /* to handle initialized structures */
89 ad9e6848 2005-08-12 devnull if(*pt == '{'){ /* hide one level of {} */
90 ad9e6848 2005-08-12 devnull while((c=getch()) != '{')
91 ad9e6848 2005-08-12 devnull if(c == Beof)error("{");
92 ad9e6848 2005-08-12 devnull putch(c,NO);
93 ad9e6848 2005-08-12 devnull if(strict){
94 ad9e6848 2005-08-12 devnull putch(' ',NO);
95 ad9e6848 2005-08-12 devnull eatspace();
96 ad9e6848 2005-08-12 devnull }
97 ad9e6848 2005-08-12 devnull keyflag = SINIT;
98 ad9e6848 2005-08-12 devnull }
99 ad9e6848 2005-08-12 devnull continue;
100 ad9e6848 2005-08-12 devnull case '}':
101 ad9e6848 2005-08-12 devnull pt = getnext(0); /* to handle initialized structures */
102 ad9e6848 2005-08-12 devnull if(*pt == ','){
103 ad9e6848 2005-08-12 devnull if(strict){
104 ad9e6848 2005-08-12 devnull putspace(' ',NO);
105 ad9e6848 2005-08-12 devnull eatspace();
106 ad9e6848 2005-08-12 devnull }
107 ad9e6848 2005-08-12 devnull putch(c,NO);
108 ad9e6848 2005-08-12 devnull putch(*pt,NO);
109 ad9e6848 2005-08-12 devnull *pt = '\0';
110 ad9e6848 2005-08-12 devnull ct = getnl();
111 ad9e6848 2005-08-12 devnull pt = getnext(0);
112 ad9e6848 2005-08-12 devnull if(*pt == '{'){
113 ad9e6848 2005-08-12 devnull OUT;
114 ad9e6848 2005-08-12 devnull while((cc = getch()) != '{')
115 ad9e6848 2005-08-12 devnull if(cc == Beof)error("}");
116 ad9e6848 2005-08-12 devnull putch(cc,NO);
117 ad9e6848 2005-08-12 devnull if(strict){
118 ad9e6848 2005-08-12 devnull putch(' ',NO);
119 ad9e6848 2005-08-12 devnull eatspace();
120 ad9e6848 2005-08-12 devnull }
121 ad9e6848 2005-08-12 devnull getnext(0);
122 ad9e6848 2005-08-12 devnull continue;
123 ad9e6848 2005-08-12 devnull }
124 ad9e6848 2005-08-12 devnull else if(strict || ct){
125 ad9e6848 2005-08-12 devnull OUT;
126 ad9e6848 2005-08-12 devnull }
127 ad9e6848 2005-08-12 devnull continue;
128 ad9e6848 2005-08-12 devnull }
129 ad9e6848 2005-08-12 devnull else if(keyflag == SINIT && *pt == '}'){
130 ad9e6848 2005-08-12 devnull if(strict)
131 ad9e6848 2005-08-12 devnull putspace(' ',NO);
132 ad9e6848 2005-08-12 devnull putch(c,NO);
133 ad9e6848 2005-08-12 devnull getnl();
134 ad9e6848 2005-08-12 devnull OUT;
135 ad9e6848 2005-08-12 devnull keyflag = DATADEF;
136 ad9e6848 2005-08-12 devnull *pt = '\0';
137 ad9e6848 2005-08-12 devnull pt = getnext(0);
138 ad9e6848 2005-08-12 devnull }
139 ad9e6848 2005-08-12 devnull outs(clev->tabs);
140 ad9e6848 2005-08-12 devnull if(--clev < ind)clev = ind;
141 ad9e6848 2005-08-12 devnull ptabs(clev->tabs);
142 ad9e6848 2005-08-12 devnull putch(c,NO);
143 ad9e6848 2005-08-12 devnull lbegin = 0;
144 ad9e6848 2005-08-12 devnull lptr=lookup(pt,lastplace+1);
145 ad9e6848 2005-08-12 devnull c = *pt;
146 ad9e6848 2005-08-12 devnull if(*pt == ';' || *pt == ','){
147 ad9e6848 2005-08-12 devnull putch(*pt,NO);
148 ad9e6848 2005-08-12 devnull *pt = '\0';
149 ad9e6848 2005-08-12 devnull lastplace=pt;
150 ad9e6848 2005-08-12 devnull }
151 ad9e6848 2005-08-12 devnull ct = getnl();
152 ad9e6848 2005-08-12 devnull if((dolevel && clev->tabs <= dotabs[dolevel]) || (structlev )
153 ad9e6848 2005-08-12 devnull || (lptr != 0 &&lptr->type == ELSE&& clev->pdepth == 0)){
154 ad9e6848 2005-08-12 devnull if(c == ';'){
155 ad9e6848 2005-08-12 devnull OUTK;
156 ad9e6848 2005-08-12 devnull }
157 ad9e6848 2005-08-12 devnull else if(strict || (lptr != 0 && lptr->type == ELSE && ct == 0)){
158 ad9e6848 2005-08-12 devnull putspace(' ',NO);
159 ad9e6848 2005-08-12 devnull eatspace();
160 ad9e6848 2005-08-12 devnull }
161 ad9e6848 2005-08-12 devnull else if(lptr != 0 && lptr->type == ELSE){
162 ad9e6848 2005-08-12 devnull OUTK;
163 ad9e6848 2005-08-12 devnull }
164 ad9e6848 2005-08-12 devnull if(structlev){
165 ad9e6848 2005-08-12 devnull structlev--;
166 ad9e6848 2005-08-12 devnull keyflag = DATADEF;
167 ad9e6848 2005-08-12 devnull }
168 ad9e6848 2005-08-12 devnull }
169 ad9e6848 2005-08-12 devnull else {
170 ad9e6848 2005-08-12 devnull OUTK;
171 ad9e6848 2005-08-12 devnull if(strict && clev->tabs == 0){
172 ad9e6848 2005-08-12 devnull if((c=getch()) != '\n'){
173 ad9e6848 2005-08-12 devnull Bputc(output, '\n');
174 ad9e6848 2005-08-12 devnull Bputc(output, '\n');
175 ad9e6848 2005-08-12 devnull unget(c);
176 ad9e6848 2005-08-12 devnull }
177 ad9e6848 2005-08-12 devnull else {
178 ad9e6848 2005-08-12 devnull lineno++;
179 ad9e6848 2005-08-12 devnull Bputc(output, '\n');
180 ad9e6848 2005-08-12 devnull if((c=getch()) != '\n')unget(c);
181 ad9e6848 2005-08-12 devnull else lineno++;
182 ad9e6848 2005-08-12 devnull Bputc(output, '\n');
183 ad9e6848 2005-08-12 devnull }
184 ad9e6848 2005-08-12 devnull }
185 ad9e6848 2005-08-12 devnull }
186 ad9e6848 2005-08-12 devnull if(lptr != 0 && lptr->type == ELSE && clev->pdepth != 0){
187 ad9e6848 2005-08-12 devnull UNBUMP;
188 ad9e6848 2005-08-12 devnull }
189 ad9e6848 2005-08-12 devnull if(lptr == 0 || lptr->type != ELSE){
190 ad9e6848 2005-08-12 devnull clev->iflev = 0;
191 ad9e6848 2005-08-12 devnull if(dolevel && docurly[dolevel] == NO && clev->tabs == dotabs[dolevel]+1)
192 ad9e6848 2005-08-12 devnull clev->tabs--;
193 ad9e6848 2005-08-12 devnull else if(clev->pdepth != 0){
194 ad9e6848 2005-08-12 devnull UNBUMP;
195 ad9e6848 2005-08-12 devnull }
196 ad9e6848 2005-08-12 devnull }
197 ad9e6848 2005-08-12 devnull continue;
198 ad9e6848 2005-08-12 devnull case '(':
199 ad9e6848 2005-08-12 devnull paren++;
200 ad9e6848 2005-08-12 devnull if ((lptr = lookup(lastlook,p)) != 0){
201 ad9e6848 2005-08-12 devnull if(!(lptr->type == TYPE || lptr->type == STRUCT))keyflag=KEYWORD;
202 ad9e6848 2005-08-12 devnull if (strict){
203 ad9e6848 2005-08-12 devnull putspace(lptr->punc,NO);
204 ad9e6848 2005-08-12 devnull opflag = 1;
205 ad9e6848 2005-08-12 devnull }
206 ad9e6848 2005-08-12 devnull putch(c,NO);
207 ad9e6848 2005-08-12 devnull if (lptr->type == IF)gotif();
208 ad9e6848 2005-08-12 devnull }
209 ad9e6848 2005-08-12 devnull else {
210 ad9e6848 2005-08-12 devnull putch(c,NO);
211 ad9e6848 2005-08-12 devnull lastlook = p;
212 ad9e6848 2005-08-12 devnull opflag = 1;
213 ad9e6848 2005-08-12 devnull }
214 ad9e6848 2005-08-12 devnull continue;
215 ad9e6848 2005-08-12 devnull case ')':
216 ad9e6848 2005-08-12 devnull if(--paren < 0)paren = 0;
217 ad9e6848 2005-08-12 devnull putch(c,NO);
218 ad9e6848 2005-08-12 devnull if((lptr = lookup(lastlook,p)) != 0){
219 ad9e6848 2005-08-12 devnull if(lptr->type == TYPE || lptr->type == STRUCT)
220 ad9e6848 2005-08-12 devnull opflag = 1;
221 ad9e6848 2005-08-12 devnull }
222 ad9e6848 2005-08-12 devnull else if(keyflag == DATADEF)opflag = 1;
223 ad9e6848 2005-08-12 devnull else opflag = 0;
224 ad9e6848 2005-08-12 devnull outs(clev->tabs);
225 ad9e6848 2005-08-12 devnull pt = getnext(1);
226 ad9e6848 2005-08-12 devnull if ((ct = getnl()) == 1 && !strict){
227 ad9e6848 2005-08-12 devnull if(dolevel && clev->tabs <= dotabs[dolevel])
228 ad9e6848 2005-08-12 devnull resetdo();
229 ad9e6848 2005-08-12 devnull if(clev->tabs > 0 && (paren != 0 || keyflag == 0)){
230 ad9e6848 2005-08-12 devnull if(join){
231 ad9e6848 2005-08-12 devnull eatspace();
232 ad9e6848 2005-08-12 devnull putch(' ',YES);
233 ad9e6848 2005-08-12 devnull continue;
234 ad9e6848 2005-08-12 devnull } else {
235 ad9e6848 2005-08-12 devnull OUT;
236 ad9e6848 2005-08-12 devnull split = 1;
237 ad9e6848 2005-08-12 devnull continue;
238 ad9e6848 2005-08-12 devnull }
239 ad9e6848 2005-08-12 devnull }
240 ad9e6848 2005-08-12 devnull else if(clev->tabs > 0 && *pt != '{'){
241 ad9e6848 2005-08-12 devnull BUMP;
242 ad9e6848 2005-08-12 devnull }
243 ad9e6848 2005-08-12 devnull OUTK;
244 ad9e6848 2005-08-12 devnull }
245 ad9e6848 2005-08-12 devnull else if(strict){
246 ad9e6848 2005-08-12 devnull if(clev->tabs == 0){
247 ad9e6848 2005-08-12 devnull if(*pt != ';' && *pt != ',' && *pt != '(' && *pt != '['){
248 ad9e6848 2005-08-12 devnull OUTK;
249 ad9e6848 2005-08-12 devnull }
250 ad9e6848 2005-08-12 devnull }
251 ad9e6848 2005-08-12 devnull else {
252 ad9e6848 2005-08-12 devnull if(keyflag == KEYWORD && paren == 0){
253 ad9e6848 2005-08-12 devnull if(dolevel && clev->tabs <= dotabs[dolevel]){
254 ad9e6848 2005-08-12 devnull resetdo();
255 ad9e6848 2005-08-12 devnull eatspace();
256 ad9e6848 2005-08-12 devnull continue;
257 ad9e6848 2005-08-12 devnull }
258 ad9e6848 2005-08-12 devnull if(*pt != '{'){
259 ad9e6848 2005-08-12 devnull BUMP;
260 ad9e6848 2005-08-12 devnull OUTK;
261 ad9e6848 2005-08-12 devnull }
262 ad9e6848 2005-08-12 devnull else {
263 ad9e6848 2005-08-12 devnull *pt='\0';
264 ad9e6848 2005-08-12 devnull eatspace();
265 ad9e6848 2005-08-12 devnull unget('{');
266 ad9e6848 2005-08-12 devnull }
267 ad9e6848 2005-08-12 devnull }
268 ad9e6848 2005-08-12 devnull else if(ct){
269 ad9e6848 2005-08-12 devnull if(paren){
270 ad9e6848 2005-08-12 devnull if(join){
271 ad9e6848 2005-08-12 devnull eatspace();
272 ad9e6848 2005-08-12 devnull } else {
273 ad9e6848 2005-08-12 devnull split = 1;
274 ad9e6848 2005-08-12 devnull OUT;
275 ad9e6848 2005-08-12 devnull }
276 ad9e6848 2005-08-12 devnull }
277 ad9e6848 2005-08-12 devnull else {
278 ad9e6848 2005-08-12 devnull OUTK;
279 ad9e6848 2005-08-12 devnull }
280 ad9e6848 2005-08-12 devnull }
281 ad9e6848 2005-08-12 devnull }
282 ad9e6848 2005-08-12 devnull }
283 ad9e6848 2005-08-12 devnull else if(dolevel && clev->tabs <= dotabs[dolevel])
284 ad9e6848 2005-08-12 devnull resetdo();
285 ad9e6848 2005-08-12 devnull continue;
286 ad9e6848 2005-08-12 devnull case ' ':
287 ad9e6848 2005-08-12 devnull case '\t':
288 ad9e6848 2005-08-12 devnull if ((lptr = lookup(lastlook,p)) != 0){
289 ad9e6848 2005-08-12 devnull if(!(lptr->type==TYPE||lptr->type==STRUCT))
290 ad9e6848 2005-08-12 devnull keyflag = KEYWORD;
291 ad9e6848 2005-08-12 devnull else if(paren == 0)keyflag = DATADEF;
292 ad9e6848 2005-08-12 devnull if(strict){
293 ad9e6848 2005-08-12 devnull if(lptr->type != ELSE){
294 ad9e6848 2005-08-12 devnull if(lptr->type == TYPE){
295 ad9e6848 2005-08-12 devnull if(paren != 0)putch(' ',YES);
296 ad9e6848 2005-08-12 devnull }
297 ad9e6848 2005-08-12 devnull else
298 ad9e6848 2005-08-12 devnull putch(lptr->punc,NO);
299 ad9e6848 2005-08-12 devnull eatspace();
300 ad9e6848 2005-08-12 devnull }
301 ad9e6848 2005-08-12 devnull }
302 ad9e6848 2005-08-12 devnull else putch(c,YES);
303 ad9e6848 2005-08-12 devnull switch(lptr->type){
304 ad9e6848 2005-08-12 devnull case CASE:
305 ad9e6848 2005-08-12 devnull outs(clev->tabs-1);
306 ad9e6848 2005-08-12 devnull continue;
307 ad9e6848 2005-08-12 devnull case ELSE:
308 ad9e6848 2005-08-12 devnull pt = getnext(1);
309 ad9e6848 2005-08-12 devnull eatspace();
310 ad9e6848 2005-08-12 devnull if((cc = getch()) == '\n' && !strict){
311 ad9e6848 2005-08-12 devnull unget(cc);
312 ad9e6848 2005-08-12 devnull }
313 ad9e6848 2005-08-12 devnull else {
314 ad9e6848 2005-08-12 devnull unget(cc);
315 ad9e6848 2005-08-12 devnull if(checkif(pt))continue;
316 ad9e6848 2005-08-12 devnull }
317 ad9e6848 2005-08-12 devnull gotelse();
318 ad9e6848 2005-08-12 devnull if(strict) unget(c);
319 ad9e6848 2005-08-12 devnull if(getnl() == 1 && !strict){
320 ad9e6848 2005-08-12 devnull OUTK;
321 ad9e6848 2005-08-12 devnull if(*pt != '{'){
322 ad9e6848 2005-08-12 devnull BUMP;
323 ad9e6848 2005-08-12 devnull }
324 ad9e6848 2005-08-12 devnull }
325 ad9e6848 2005-08-12 devnull else if(strict){
326 ad9e6848 2005-08-12 devnull if(*pt != '{'){
327 ad9e6848 2005-08-12 devnull OUTK;
328 ad9e6848 2005-08-12 devnull BUMP;
329 ad9e6848 2005-08-12 devnull }
330 ad9e6848 2005-08-12 devnull }
331 ad9e6848 2005-08-12 devnull continue;
332 ad9e6848 2005-08-12 devnull case IF:
333 ad9e6848 2005-08-12 devnull gotif();
334 ad9e6848 2005-08-12 devnull continue;
335 ad9e6848 2005-08-12 devnull case DO:
336 ad9e6848 2005-08-12 devnull gotdo();
337 ad9e6848 2005-08-12 devnull pt = getnext(1);
338 ad9e6848 2005-08-12 devnull if(*pt != '{'){
339 ad9e6848 2005-08-12 devnull eatallsp();
340 ad9e6848 2005-08-12 devnull OUTK;
341 ad9e6848 2005-08-12 devnull docurly[dolevel] = NO;
342 ad9e6848 2005-08-12 devnull dopdepth[dolevel] = clev->pdepth;
343 ad9e6848 2005-08-12 devnull clev->pdepth = 0;
344 ad9e6848 2005-08-12 devnull clev->tabs++;
345 ad9e6848 2005-08-12 devnull }
346 ad9e6848 2005-08-12 devnull continue;
347 ad9e6848 2005-08-12 devnull case TYPE:
348 ad9e6848 2005-08-12 devnull if(paren)continue;
349 ad9e6848 2005-08-12 devnull if(!strict)continue;
350 ad9e6848 2005-08-12 devnull gottype(lptr);
351 ad9e6848 2005-08-12 devnull continue;
352 ad9e6848 2005-08-12 devnull case STRUCT:
353 ad9e6848 2005-08-12 devnull gotstruct();
354 ad9e6848 2005-08-12 devnull continue;
355 ad9e6848 2005-08-12 devnull }
356 ad9e6848 2005-08-12 devnull }
357 ab6f1aea 2020-01-02 0intro else if (lbegin == 0 || p > string)
358 ad9e6848 2005-08-12 devnull if(strict)
359 ad9e6848 2005-08-12 devnull putch(c,NO);
360 ad9e6848 2005-08-12 devnull else putch(c,YES);
361 ad9e6848 2005-08-12 devnull continue;
362 ad9e6848 2005-08-12 devnull case ';':
363 ad9e6848 2005-08-12 devnull putch(c,NO);
364 ad9e6848 2005-08-12 devnull if(paren != 0){
365 ad9e6848 2005-08-12 devnull if(strict){
366 ad9e6848 2005-08-12 devnull putch(' ',YES);
367 ad9e6848 2005-08-12 devnull eatspace();
368 ad9e6848 2005-08-12 devnull }
369 ad9e6848 2005-08-12 devnull opflag = 1;
370 ad9e6848 2005-08-12 devnull continue;
371 ad9e6848 2005-08-12 devnull }
372 ad9e6848 2005-08-12 devnull outs(clev->tabs);
373 ad9e6848 2005-08-12 devnull pt = getnext(0);
374 ad9e6848 2005-08-12 devnull lptr=lookup(pt,lastplace+1);
375 ad9e6848 2005-08-12 devnull if(lptr == 0 || lptr->type != ELSE){
376 ad9e6848 2005-08-12 devnull clev->iflev = 0;
377 ad9e6848 2005-08-12 devnull if(clev->pdepth != 0){
378 ad9e6848 2005-08-12 devnull UNBUMP;
379 ad9e6848 2005-08-12 devnull }
380 ad9e6848 2005-08-12 devnull if(dolevel && docurly[dolevel] == NO && clev->tabs <= dotabs[dolevel]+1)
381 ad9e6848 2005-08-12 devnull clev->tabs--;
382 ad9e6848 2005-08-12 devnull /*
383 ad9e6848 2005-08-12 devnull else if(clev->pdepth != 0){
384 ad9e6848 2005-08-12 devnull UNBUMP;
385 ad9e6848 2005-08-12 devnull }
386 ad9e6848 2005-08-12 devnull */
387 ad9e6848 2005-08-12 devnull }
388 ad9e6848 2005-08-12 devnull getnl();
389 ad9e6848 2005-08-12 devnull OUTK;
390 ad9e6848 2005-08-12 devnull continue;
391 ad9e6848 2005-08-12 devnull case '\n':
392 ad9e6848 2005-08-12 devnull if ((lptr = lookup(lastlook,p)) != 0){
393 ad9e6848 2005-08-12 devnull pt = getnext(1);
394 ad9e6848 2005-08-12 devnull if (lptr->type == ELSE){
395 ad9e6848 2005-08-12 devnull if(strict)
396 ad9e6848 2005-08-12 devnull if(checkif(pt))continue;
397 ad9e6848 2005-08-12 devnull gotelse();
398 ad9e6848 2005-08-12 devnull OUTK;
399 ad9e6848 2005-08-12 devnull if(*pt != '{'){
400 ad9e6848 2005-08-12 devnull BUMP;
401 ad9e6848 2005-08-12 devnull }
402 ad9e6848 2005-08-12 devnull }
403 ad9e6848 2005-08-12 devnull else if(lptr->type == DO){
404 ad9e6848 2005-08-12 devnull OUTK;
405 ad9e6848 2005-08-12 devnull gotdo();
406 ad9e6848 2005-08-12 devnull if(*pt != '{'){
407 ad9e6848 2005-08-12 devnull docurly[dolevel] = NO;
408 ad9e6848 2005-08-12 devnull dopdepth[dolevel] = clev->pdepth;
409 ad9e6848 2005-08-12 devnull clev->pdepth = 0;
410 ad9e6848 2005-08-12 devnull clev->tabs++;
411 ad9e6848 2005-08-12 devnull }
412 ad9e6848 2005-08-12 devnull }
413 ad9e6848 2005-08-12 devnull else {
414 ad9e6848 2005-08-12 devnull OUTK;
415 ad9e6848 2005-08-12 devnull if(lptr->type == STRUCT)gotstruct();
416 ad9e6848 2005-08-12 devnull }
417 ad9e6848 2005-08-12 devnull }
418 ad9e6848 2005-08-12 devnull else if(p == string)Bputc(output, '\n');
419 ad9e6848 2005-08-12 devnull else {
420 ad9e6848 2005-08-12 devnull if(clev->tabs > 0 &&(paren != 0 || keyflag == 0)){
421 ad9e6848 2005-08-12 devnull if(join){
422 ad9e6848 2005-08-12 devnull putch(' ',YES);
423 ad9e6848 2005-08-12 devnull eatspace();
424 ad9e6848 2005-08-12 devnull continue;
425 ad9e6848 2005-08-12 devnull } else {
426 ad9e6848 2005-08-12 devnull OUT;
427 ad9e6848 2005-08-12 devnull split = 1;
428 ad9e6848 2005-08-12 devnull continue;
429 ad9e6848 2005-08-12 devnull }
430 ad9e6848 2005-08-12 devnull }
431 ad9e6848 2005-08-12 devnull else if(keyflag == KEYWORD){
432 ad9e6848 2005-08-12 devnull OUTK;
433 ad9e6848 2005-08-12 devnull continue;
434 ad9e6848 2005-08-12 devnull }
435 ad9e6848 2005-08-12 devnull OUT;
436 ad9e6848 2005-08-12 devnull }
437 ad9e6848 2005-08-12 devnull continue;
438 ad9e6848 2005-08-12 devnull case '"':
439 ad9e6848 2005-08-12 devnull case '\'':
440 ad9e6848 2005-08-12 devnull putch(c,NO);
441 ad9e6848 2005-08-12 devnull while ((cc = getch()) != c){
442 ad9e6848 2005-08-12 devnull if(cc == Beof)
443 ad9e6848 2005-08-12 devnull error("\" or '");
444 ad9e6848 2005-08-12 devnull putch(cc,NO);
445 ad9e6848 2005-08-12 devnull if (cc == '\\'){
446 ad9e6848 2005-08-12 devnull putch(getch(),NO);
447 ad9e6848 2005-08-12 devnull }
448 ad9e6848 2005-08-12 devnull if (cc == '\n'){
449 ad9e6848 2005-08-12 devnull outs(clev->tabs);
450 ad9e6848 2005-08-12 devnull lbegin = 1;
451 ad9e6848 2005-08-12 devnull count = 0;
452 ad9e6848 2005-08-12 devnull }
453 ad9e6848 2005-08-12 devnull }
454 ad9e6848 2005-08-12 devnull putch(cc,NO);
455 ad9e6848 2005-08-12 devnull opflag=0;
456 ad9e6848 2005-08-12 devnull if (getnl() == 1){
457 ad9e6848 2005-08-12 devnull unget('\n');
458 ad9e6848 2005-08-12 devnull }
459 ad9e6848 2005-08-12 devnull continue;
460 ad9e6848 2005-08-12 devnull case '\\':
461 ad9e6848 2005-08-12 devnull putch(c,NO);
462 ad9e6848 2005-08-12 devnull putch(getch(),NO);
463 ad9e6848 2005-08-12 devnull continue;
464 ad9e6848 2005-08-12 devnull case '?':
465 ad9e6848 2005-08-12 devnull question = 1;
466 ad9e6848 2005-08-12 devnull gotop(c);
467 ad9e6848 2005-08-12 devnull continue;
468 ad9e6848 2005-08-12 devnull case ':':
469 ad9e6848 2005-08-12 devnull if (question == 1){
470 ad9e6848 2005-08-12 devnull question = 0;
471 ad9e6848 2005-08-12 devnull gotop(c);
472 ad9e6848 2005-08-12 devnull continue;
473 ad9e6848 2005-08-12 devnull }
474 ad9e6848 2005-08-12 devnull putch(c,NO);
475 ad9e6848 2005-08-12 devnull if(structlev)continue;
476 ad9e6848 2005-08-12 devnull if ((lptr = lookup(lastlook,p)) != 0){
477 ad9e6848 2005-08-12 devnull if (lptr->type == CASE)outs(clev->tabs - 1);
478 ad9e6848 2005-08-12 devnull }
479 ad9e6848 2005-08-12 devnull else {
480 ad9e6848 2005-08-12 devnull lbegin = 0;
481 ad9e6848 2005-08-12 devnull outs(clev->tabs);
482 ad9e6848 2005-08-12 devnull }
483 ad9e6848 2005-08-12 devnull getnl();
484 ad9e6848 2005-08-12 devnull OUTK;
485 ad9e6848 2005-08-12 devnull continue;
486 ad9e6848 2005-08-12 devnull case '/':
487 ad9e6848 2005-08-12 devnull if ((cc = getch()) == '/') {
488 ad9e6848 2005-08-12 devnull putch(c,NO);
489 ad9e6848 2005-08-12 devnull putch(cc,NO);
490 ad9e6848 2005-08-12 devnull cpp_comment(YES);
491 ad9e6848 2005-08-12 devnull OUT;
492 ad9e6848 2005-08-12 devnull lastlook = 0;
493 ad9e6848 2005-08-12 devnull continue;
494 ad9e6848 2005-08-12 devnull }
495 ad9e6848 2005-08-12 devnull else if (cc != '*') {
496 ad9e6848 2005-08-12 devnull unget(cc);
497 ad9e6848 2005-08-12 devnull gotop(c);
498 ad9e6848 2005-08-12 devnull continue;
499 ad9e6848 2005-08-12 devnull }
500 ad9e6848 2005-08-12 devnull putch(c,NO);
501 ad9e6848 2005-08-12 devnull putch(cc,NO);
502 ad9e6848 2005-08-12 devnull cc = comment(YES);
503 ad9e6848 2005-08-12 devnull if(getnl() == 1){
504 ad9e6848 2005-08-12 devnull if(cc == 0){
505 ad9e6848 2005-08-12 devnull OUT;
506 ad9e6848 2005-08-12 devnull }
507 ad9e6848 2005-08-12 devnull else {
508 ad9e6848 2005-08-12 devnull outs(0);
509 ad9e6848 2005-08-12 devnull Bputc(output, '\n');
510 ad9e6848 2005-08-12 devnull lbegin = 1;
511 ad9e6848 2005-08-12 devnull count = 0;
512 ad9e6848 2005-08-12 devnull }
513 ad9e6848 2005-08-12 devnull lastlook = 0;
514 ad9e6848 2005-08-12 devnull }
515 ad9e6848 2005-08-12 devnull continue;
516 ad9e6848 2005-08-12 devnull case '[':
517 ad9e6848 2005-08-12 devnull putch(c,NO);
518 ad9e6848 2005-08-12 devnull ct = 0;
519 ad9e6848 2005-08-12 devnull while((c = getch()) != ']' || ct > 0){
520 ad9e6848 2005-08-12 devnull if(c == Beof)error("]");
521 ad9e6848 2005-08-12 devnull putch(c,NO);
522 ad9e6848 2005-08-12 devnull if(c == '[')ct++;
523 ad9e6848 2005-08-12 devnull if(c == ']')ct--;
524 ad9e6848 2005-08-12 devnull }
525 ad9e6848 2005-08-12 devnull putch(c,NO);
526 ad9e6848 2005-08-12 devnull continue;
527 ad9e6848 2005-08-12 devnull case '#':
528 ad9e6848 2005-08-12 devnull putch(c,NO);
529 ad9e6848 2005-08-12 devnull while ((cc = getch()) != '\n'){
530 ad9e6848 2005-08-12 devnull if(cc == Beof)error("newline");
531 ad9e6848 2005-08-12 devnull if (cc == '\\'){
532 ad9e6848 2005-08-12 devnull putch(cc,NO);
533 ad9e6848 2005-08-12 devnull cc = getch();
534 ad9e6848 2005-08-12 devnull }
535 ad9e6848 2005-08-12 devnull putch(cc,NO);
536 ad9e6848 2005-08-12 devnull }
537 ad9e6848 2005-08-12 devnull putch(cc,NO);
538 ad9e6848 2005-08-12 devnull lbegin = 0;
539 ad9e6848 2005-08-12 devnull outs(clev->tabs);
540 ad9e6848 2005-08-12 devnull lbegin = 1;
541 ad9e6848 2005-08-12 devnull count = 0;
542 ad9e6848 2005-08-12 devnull continue;
543 ad9e6848 2005-08-12 devnull default:
544 ad9e6848 2005-08-12 devnull if (c == ','){
545 ad9e6848 2005-08-12 devnull opflag = 1;
546 ad9e6848 2005-08-12 devnull putch(c,YES);
547 ad9e6848 2005-08-12 devnull if (strict){
548 ad9e6848 2005-08-12 devnull if ((cc = getch()) != ' ')unget(cc);
549 ad9e6848 2005-08-12 devnull if(cc != '\n')putch(' ',YES);
550 ad9e6848 2005-08-12 devnull }
551 ad9e6848 2005-08-12 devnull }
552 ad9e6848 2005-08-12 devnull else if(isop(c))gotop(c);
553 ad9e6848 2005-08-12 devnull else {
554 ad9e6848 2005-08-12 devnull if(isalnum(c) && lastlook == 0)lastlook = p;
555 ad9e6848 2005-08-12 devnull if(isdigit(c)){
556 ad9e6848 2005-08-12 devnull putch(c,NO);
557 ad9e6848 2005-08-12 devnull while(isdigit(c=Bgetc(input))||c == '.')putch(c,NO);
558 ad9e6848 2005-08-12 devnull if(c == 'e'){
559 ad9e6848 2005-08-12 devnull putch(c,NO);
560 ad9e6848 2005-08-12 devnull c = Bgetc(input);
561 ad9e6848 2005-08-12 devnull putch(c, NO);
562 ad9e6848 2005-08-12 devnull while(isdigit(c=Bgetc(input)))putch(c,NO);
563 ad9e6848 2005-08-12 devnull }
564 ad9e6848 2005-08-12 devnull Bungetc(input);
565 ad9e6848 2005-08-12 devnull }
566 ad9e6848 2005-08-12 devnull else putch(c,NO);
567 ad9e6848 2005-08-12 devnull if(keyflag != DATADEF)opflag = 0;
568 ad9e6848 2005-08-12 devnull }
569 ad9e6848 2005-08-12 devnull }
570 ad9e6848 2005-08-12 devnull }
571 ad9e6848 2005-08-12 devnull }
572 ad9e6848 2005-08-12 devnull void
573 ad9e6848 2005-08-12 devnull gotif(void){
574 ad9e6848 2005-08-12 devnull outs(clev->tabs);
575 ad9e6848 2005-08-12 devnull if(++clev->iflev >= IFLEVEL-1){
576 ad9e6848 2005-08-12 devnull fprint(2,"too many levels of if %d\n",clev->iflev );
577 ad9e6848 2005-08-12 devnull clev->iflev = IFLEVEL-1;
578 ad9e6848 2005-08-12 devnull }
579 ad9e6848 2005-08-12 devnull clev->ifc[clev->iflev] = clev->tabs;
580 ad9e6848 2005-08-12 devnull clev->spdepth[clev->iflev] = clev->pdepth;
581 ad9e6848 2005-08-12 devnull }
582 ad9e6848 2005-08-12 devnull void
583 ad9e6848 2005-08-12 devnull gotelse(void){
584 ad9e6848 2005-08-12 devnull clev->tabs = clev->ifc[clev->iflev];
585 ad9e6848 2005-08-12 devnull clev->pdepth = clev->spdepth[clev->iflev];
586 ad9e6848 2005-08-12 devnull if(--(clev->iflev) < 0)clev->iflev = 0;
587 ad9e6848 2005-08-12 devnull }
588 ad9e6848 2005-08-12 devnull int
589 ad9e6848 2005-08-12 devnull checkif(char *pt)
590 ad9e6848 2005-08-12 devnull {
591 ad9e6848 2005-08-12 devnull struct keyw *lptr;
592 ad9e6848 2005-08-12 devnull int cc;
593 ad9e6848 2005-08-12 devnull if((lptr=lookup(pt,lastplace+1))!= 0){
594 ad9e6848 2005-08-12 devnull if(lptr->type == IF){
595 ad9e6848 2005-08-12 devnull if(strict)putch(' ',YES);
596 ad9e6848 2005-08-12 devnull copy(lptr->name);
597 ad9e6848 2005-08-12 devnull *pt='\0';
598 ad9e6848 2005-08-12 devnull lastplace = pt;
599 ad9e6848 2005-08-12 devnull if(strict){
600 ad9e6848 2005-08-12 devnull putch(lptr->punc,NO);
601 ad9e6848 2005-08-12 devnull eatallsp();
602 ad9e6848 2005-08-12 devnull }
603 ad9e6848 2005-08-12 devnull clev->tabs = clev->ifc[clev->iflev];
604 ad9e6848 2005-08-12 devnull clev->pdepth = clev->spdepth[clev->iflev];
605 ad9e6848 2005-08-12 devnull keyflag = KEYWORD;
606 ad9e6848 2005-08-12 devnull return(1);
607 ad9e6848 2005-08-12 devnull }
608 ad9e6848 2005-08-12 devnull }
609 ad9e6848 2005-08-12 devnull return(0);
610 ad9e6848 2005-08-12 devnull }
611 ad9e6848 2005-08-12 devnull void
612 ad9e6848 2005-08-12 devnull gotdo(void){
613 ad9e6848 2005-08-12 devnull if(++dolevel >= DOLEVEL-1){
614 ad9e6848 2005-08-12 devnull fprint(2,"too many levels of do %d\n",dolevel);
615 ad9e6848 2005-08-12 devnull dolevel = DOLEVEL-1;
616 ad9e6848 2005-08-12 devnull }
617 ad9e6848 2005-08-12 devnull dotabs[dolevel] = clev->tabs;
618 ad9e6848 2005-08-12 devnull docurly[dolevel] = YES;
619 ad9e6848 2005-08-12 devnull }
620 ad9e6848 2005-08-12 devnull void
621 ad9e6848 2005-08-12 devnull resetdo(void){
622 ad9e6848 2005-08-12 devnull if(docurly[dolevel] == NO)
623 ad9e6848 2005-08-12 devnull clev->pdepth = dopdepth[dolevel];
624 ad9e6848 2005-08-12 devnull if(--dolevel < 0)dolevel = 0;
625 ad9e6848 2005-08-12 devnull }
626 ad9e6848 2005-08-12 devnull void
627 ad9e6848 2005-08-12 devnull gottype(struct keyw *lptr)
628 ad9e6848 2005-08-12 devnull {
629 ad9e6848 2005-08-12 devnull char *pt;
630 ad9e6848 2005-08-12 devnull struct keyw *tlptr;
631 ad9e6848 2005-08-12 devnull int c;
632 ad9e6848 2005-08-12 devnull while(1){
633 ad9e6848 2005-08-12 devnull pt = getnext(1);
634 ad9e6848 2005-08-12 devnull if((tlptr=lookup(pt,lastplace+1))!=0){
635 ad9e6848 2005-08-12 devnull putch(' ',YES);
636 ad9e6848 2005-08-12 devnull copy(tlptr->name);
637 ad9e6848 2005-08-12 devnull *pt='\0';
638 ad9e6848 2005-08-12 devnull lastplace = pt;
639 ad9e6848 2005-08-12 devnull if(tlptr->type == STRUCT){
640 ad9e6848 2005-08-12 devnull putch(tlptr->punc,YES);
641 ad9e6848 2005-08-12 devnull gotstruct();
642 ad9e6848 2005-08-12 devnull break;
643 ad9e6848 2005-08-12 devnull }
644 ad9e6848 2005-08-12 devnull lptr=tlptr;
645 ad9e6848 2005-08-12 devnull continue;
646 ad9e6848 2005-08-12 devnull }
647 ad9e6848 2005-08-12 devnull else{
648 ad9e6848 2005-08-12 devnull putch(lptr->punc,NO);
649 ad9e6848 2005-08-12 devnull while((c=getch())== ' ' || c == '\t');
650 ad9e6848 2005-08-12 devnull unget(c);
651 ad9e6848 2005-08-12 devnull break;
652 ad9e6848 2005-08-12 devnull }
653 ad9e6848 2005-08-12 devnull }
654 ad9e6848 2005-08-12 devnull }
655 ad9e6848 2005-08-12 devnull void
656 ad9e6848 2005-08-12 devnull gotstruct(void){
657 ad9e6848 2005-08-12 devnull int c;
658 ad9e6848 2005-08-12 devnull int cc;
659 ad9e6848 2005-08-12 devnull char *pt;
660 ad9e6848 2005-08-12 devnull while((c=getch()) == ' ' || c == '\t')
661 ad9e6848 2005-08-12 devnull if(!strict)putch(c,NO);
662 ad9e6848 2005-08-12 devnull if(c == '{'){
663 ad9e6848 2005-08-12 devnull structlev++;
664 ad9e6848 2005-08-12 devnull unget(c);
665 ad9e6848 2005-08-12 devnull return;
666 ad9e6848 2005-08-12 devnull }
667 ad9e6848 2005-08-12 devnull if(isalpha(c)){
668 ad9e6848 2005-08-12 devnull putch(c,NO);
669 ad9e6848 2005-08-12 devnull while(isalnum(c=getch()))putch(c,NO);
670 ad9e6848 2005-08-12 devnull }
671 ad9e6848 2005-08-12 devnull unget(c);
672 ad9e6848 2005-08-12 devnull pt = getnext(1);
673 ad9e6848 2005-08-12 devnull if(*pt == '{')structlev++;
674 ad9e6848 2005-08-12 devnull if(strict){
675 ad9e6848 2005-08-12 devnull eatallsp();
676 ad9e6848 2005-08-12 devnull putch(' ',NO);
677 ad9e6848 2005-08-12 devnull }
678 ad9e6848 2005-08-12 devnull }
679 ad9e6848 2005-08-12 devnull void
680 ad9e6848 2005-08-12 devnull gotop(int c)
681 ad9e6848 2005-08-12 devnull {
682 ad9e6848 2005-08-12 devnull char optmp[OPLENGTH];
683 ad9e6848 2005-08-12 devnull char *op_ptr;
684 ad9e6848 2005-08-12 devnull struct op *s_op;
685 ad9e6848 2005-08-12 devnull char *a, *b;
686 ad9e6848 2005-08-12 devnull op_ptr = optmp;
687 ad9e6848 2005-08-12 devnull *op_ptr++ = c;
688 79049567 2007-03-25 devnull while (isop((uchar)( *op_ptr = getch())))op_ptr++;
689 ad9e6848 2005-08-12 devnull if(!strict)unget(*op_ptr);
690 ad9e6848 2005-08-12 devnull else if (*op_ptr != ' ')unget( *op_ptr);
691 ad9e6848 2005-08-12 devnull *op_ptr = '\0';
692 ad9e6848 2005-08-12 devnull s_op = op;
693 ad9e6848 2005-08-12 devnull b = optmp;
694 ad9e6848 2005-08-12 devnull while ((a = s_op->name) != 0){
695 ad9e6848 2005-08-12 devnull op_ptr = b;
696 ad9e6848 2005-08-12 devnull while ((*op_ptr == *a) && (*op_ptr != '\0')){
697 ad9e6848 2005-08-12 devnull a++;
698 ad9e6848 2005-08-12 devnull op_ptr++;
699 ad9e6848 2005-08-12 devnull }
700 ad9e6848 2005-08-12 devnull if (*a == '\0'){
701 ad9e6848 2005-08-12 devnull keep(s_op);
702 ad9e6848 2005-08-12 devnull opflag = s_op->setop;
703 ad9e6848 2005-08-12 devnull if (*op_ptr != '\0'){
704 ad9e6848 2005-08-12 devnull b = op_ptr;
705 ad9e6848 2005-08-12 devnull s_op = op;
706 ad9e6848 2005-08-12 devnull continue;
707 ad9e6848 2005-08-12 devnull }
708 ad9e6848 2005-08-12 devnull else break;
709 ad9e6848 2005-08-12 devnull }
710 ad9e6848 2005-08-12 devnull else s_op++;
711 ad9e6848 2005-08-12 devnull }
712 ad9e6848 2005-08-12 devnull }
713 ad9e6848 2005-08-12 devnull void
714 ad9e6848 2005-08-12 devnull keep(struct op *o)
715 ad9e6848 2005-08-12 devnull {
716 ad9e6848 2005-08-12 devnull char *s;
717 ad9e6848 2005-08-12 devnull int ok;
718 ad9e6848 2005-08-12 devnull if(o->blanks == NEVER)ok = NO;
719 ad9e6848 2005-08-12 devnull else ok = YES;
720 ad9e6848 2005-08-12 devnull if (strict && ((o->blanks & ALWAYS)
721 ad9e6848 2005-08-12 devnull || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0)))
722 ad9e6848 2005-08-12 devnull putspace(' ',YES);
723 ad9e6848 2005-08-12 devnull for(s=o->name; *s != '\0'; s++){
724 ad9e6848 2005-08-12 devnull if(*(s+1) == '\0')putch(*s,ok);
725 ad9e6848 2005-08-12 devnull else
726 ad9e6848 2005-08-12 devnull putch(*s,NO);
727 ad9e6848 2005-08-12 devnull }
728 ad9e6848 2005-08-12 devnull if (strict && ((o->blanks & ALWAYS)
729 ad9e6848 2005-08-12 devnull || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0))) putch(' ',YES);
730 ad9e6848 2005-08-12 devnull }
731 ad9e6848 2005-08-12 devnull int
732 ad9e6848 2005-08-12 devnull getnl(void){
733 ad9e6848 2005-08-12 devnull int ch;
734 ad9e6848 2005-08-12 devnull char *savp;
735 ad9e6848 2005-08-12 devnull int gotcmt;
736 ad9e6848 2005-08-12 devnull gotcmt = 0;
737 ad9e6848 2005-08-12 devnull savp = p;
738 ad9e6848 2005-08-12 devnull while ((ch = getch()) == '\t' || ch == ' ')putch(ch,NO);
739 ad9e6848 2005-08-12 devnull if (ch == '/'){
740 ad9e6848 2005-08-12 devnull if ((ch = getch()) == '*'){
741 ad9e6848 2005-08-12 devnull putch('/',NO);
742 ad9e6848 2005-08-12 devnull putch('*',NO);
743 ad9e6848 2005-08-12 devnull comment(NO);
744 ad9e6848 2005-08-12 devnull ch = getch();
745 ad9e6848 2005-08-12 devnull gotcmt=1;
746 ad9e6848 2005-08-12 devnull }
747 ad9e6848 2005-08-12 devnull else if (ch == '/') {
748 ad9e6848 2005-08-12 devnull putch('/',NO);
749 ad9e6848 2005-08-12 devnull putch('/',NO);
750 ad9e6848 2005-08-12 devnull cpp_comment(NO);
751 ad9e6848 2005-08-12 devnull ch = getch();
752 ad9e6848 2005-08-12 devnull gotcmt = 1;
753 ad9e6848 2005-08-12 devnull }
754 ad9e6848 2005-08-12 devnull else {
755 ad9e6848 2005-08-12 devnull if(inswitch)*(++lastplace) = ch;
756 ad9e6848 2005-08-12 devnull else {
757 ad9e6848 2005-08-12 devnull inswitch = 1;
758 ad9e6848 2005-08-12 devnull *lastplace = ch;
759 ad9e6848 2005-08-12 devnull }
760 ad9e6848 2005-08-12 devnull unget('/');
761 ad9e6848 2005-08-12 devnull return(0);
762 ad9e6848 2005-08-12 devnull }
763 ad9e6848 2005-08-12 devnull }
764 ad9e6848 2005-08-12 devnull if(ch == '\n'){
765 ad9e6848 2005-08-12 devnull if(gotcmt == 0)p=savp;
766 ad9e6848 2005-08-12 devnull return(1);
767 ad9e6848 2005-08-12 devnull }
768 ad9e6848 2005-08-12 devnull unget(ch);
769 ad9e6848 2005-08-12 devnull return(0);
770 ad9e6848 2005-08-12 devnull }
771 ad9e6848 2005-08-12 devnull void
772 ad9e6848 2005-08-12 devnull ptabs(int n){
773 ad9e6848 2005-08-12 devnull int i;
774 ad9e6848 2005-08-12 devnull int num;
775 ad9e6848 2005-08-12 devnull if(n > maxtabs){
776 ad9e6848 2005-08-12 devnull if(!folded){
777 ad9e6848 2005-08-12 devnull Bprint(output, "/* code folded from here */\n");
778 ad9e6848 2005-08-12 devnull folded = 1;
779 ad9e6848 2005-08-12 devnull }
780 ad9e6848 2005-08-12 devnull num = n-maxtabs;
781 ad9e6848 2005-08-12 devnull }
782 ad9e6848 2005-08-12 devnull else {
783 ad9e6848 2005-08-12 devnull num = n;
784 ad9e6848 2005-08-12 devnull if(folded){
785 ad9e6848 2005-08-12 devnull folded = 0;
786 ad9e6848 2005-08-12 devnull Bprint(output, "/* unfolding */\n");
787 ad9e6848 2005-08-12 devnull }
788 ad9e6848 2005-08-12 devnull }
789 ad9e6848 2005-08-12 devnull for (i = 0; i < num; i++)Bputc(output, '\t');
790 ad9e6848 2005-08-12 devnull }
791 ad9e6848 2005-08-12 devnull void
792 ad9e6848 2005-08-12 devnull outs(int n){
793 ad9e6848 2005-08-12 devnull if (p > string){
794 ad9e6848 2005-08-12 devnull if (lbegin){
795 ad9e6848 2005-08-12 devnull ptabs(n);
796 ad9e6848 2005-08-12 devnull lbegin = 0;
797 ad9e6848 2005-08-12 devnull if (split == 1){
798 ad9e6848 2005-08-12 devnull split = 0;
799 ad9e6848 2005-08-12 devnull if (clev->tabs > 0)Bprint(output, " ");
800 ad9e6848 2005-08-12 devnull }
801 ad9e6848 2005-08-12 devnull }
802 ad9e6848 2005-08-12 devnull *p = '\0';
803 ad9e6848 2005-08-12 devnull Bprint(output, "%s", string);
804 ad9e6848 2005-08-12 devnull lastlook = p = string;
805 ad9e6848 2005-08-12 devnull }
806 ad9e6848 2005-08-12 devnull else {
807 ad9e6848 2005-08-12 devnull if (lbegin != 0){
808 ad9e6848 2005-08-12 devnull lbegin = 0;
809 ad9e6848 2005-08-12 devnull split = 0;
810 ad9e6848 2005-08-12 devnull }
811 ad9e6848 2005-08-12 devnull }
812 ad9e6848 2005-08-12 devnull }
813 ad9e6848 2005-08-12 devnull void
814 ad9e6848 2005-08-12 devnull putch(char c,int ok)
815 ad9e6848 2005-08-12 devnull {
816 ad9e6848 2005-08-12 devnull int cc;
817 ad9e6848 2005-08-12 devnull if(p < &string[LINE-1]){
818 ad9e6848 2005-08-12 devnull if(count+TABLENG*clev->tabs >= maxleng && ok && !folded){
819 ad9e6848 2005-08-12 devnull if(c != ' ')*p++ = c;
820 ad9e6848 2005-08-12 devnull OUT;
821 ad9e6848 2005-08-12 devnull split = 1;
822 ad9e6848 2005-08-12 devnull if((cc=getch()) != '\n')unget(cc);
823 ad9e6848 2005-08-12 devnull }
824 ad9e6848 2005-08-12 devnull else {
825 ad9e6848 2005-08-12 devnull *p++ = c;
826 ad9e6848 2005-08-12 devnull count++;
827 ad9e6848 2005-08-12 devnull }
828 ad9e6848 2005-08-12 devnull }
829 ad9e6848 2005-08-12 devnull else {
830 ad9e6848 2005-08-12 devnull outs(clev->tabs);
831 ad9e6848 2005-08-12 devnull *p++ = c;
832 ad9e6848 2005-08-12 devnull count = 0;
833 ad9e6848 2005-08-12 devnull }
834 ad9e6848 2005-08-12 devnull }
835 ad9e6848 2005-08-12 devnull struct keyw *
836 ad9e6848 2005-08-12 devnull lookup(char *first, char *last)
837 ad9e6848 2005-08-12 devnull {
838 ad9e6848 2005-08-12 devnull struct keyw *ptr;
839 ad9e6848 2005-08-12 devnull char *cptr, *ckey, *k;
840 ad9e6848 2005-08-12 devnull
841 ad9e6848 2005-08-12 devnull if(first == last || first == 0)return(0);
842 ad9e6848 2005-08-12 devnull cptr = first;
843 ad9e6848 2005-08-12 devnull while (*cptr == ' ' || *cptr == '\t')cptr++;
844 ad9e6848 2005-08-12 devnull if(cptr >= last)return(0);
845 ad9e6848 2005-08-12 devnull ptr = key;
846 ad9e6848 2005-08-12 devnull while ((ckey = ptr->name) != 0){
847 ad9e6848 2005-08-12 devnull for (k = cptr; (*ckey == *k && *ckey != '\0'); k++, ckey++);
848 79049567 2007-03-25 devnull if(*ckey=='\0' && (k==last|| (k<last && !isalnum((uchar)*k)))){
849 ad9e6848 2005-08-12 devnull opflag = 1;
850 ad9e6848 2005-08-12 devnull lastlook = 0;
851 ad9e6848 2005-08-12 devnull return(ptr);
852 ad9e6848 2005-08-12 devnull }
853 ad9e6848 2005-08-12 devnull ptr++;
854 ad9e6848 2005-08-12 devnull }
855 ad9e6848 2005-08-12 devnull return(0);
856 ad9e6848 2005-08-12 devnull }
857 ad9e6848 2005-08-12 devnull int
858 ad9e6848 2005-08-12 devnull comment(int ok)
859 ad9e6848 2005-08-12 devnull {
860 ad9e6848 2005-08-12 devnull int ch;
861 ad9e6848 2005-08-12 devnull int hitnl;
862 ad9e6848 2005-08-12 devnull
863 ad9e6848 2005-08-12 devnull hitnl = 0;
864 ad9e6848 2005-08-12 devnull while ((ch = getch()) != Beof){
865 ad9e6848 2005-08-12 devnull putch(ch, NO);
866 ad9e6848 2005-08-12 devnull if (ch == '*'){
867 ad9e6848 2005-08-12 devnull gotstar:
868 ad9e6848 2005-08-12 devnull if ((ch = getch()) == '/'){
869 ad9e6848 2005-08-12 devnull putch(ch,NO);
870 ad9e6848 2005-08-12 devnull return(hitnl);
871 ad9e6848 2005-08-12 devnull }
872 ad9e6848 2005-08-12 devnull putch(ch,NO);
873 ad9e6848 2005-08-12 devnull if (ch == '*')goto gotstar;
874 ad9e6848 2005-08-12 devnull }
875 ad9e6848 2005-08-12 devnull if (ch == '\n'){
876 ad9e6848 2005-08-12 devnull if(ok && !hitnl){
877 ad9e6848 2005-08-12 devnull outs(clev->tabs);
878 ad9e6848 2005-08-12 devnull }
879 ad9e6848 2005-08-12 devnull else {
880 ad9e6848 2005-08-12 devnull outs(0);
881 ad9e6848 2005-08-12 devnull }
882 ad9e6848 2005-08-12 devnull lbegin = 1;
883 ad9e6848 2005-08-12 devnull count = 0;
884 ad9e6848 2005-08-12 devnull hitnl = 1;
885 ad9e6848 2005-08-12 devnull }
886 ad9e6848 2005-08-12 devnull }
887 ad9e6848 2005-08-12 devnull return(hitnl);
888 ad9e6848 2005-08-12 devnull }
889 ad9e6848 2005-08-12 devnull int
890 ad9e6848 2005-08-12 devnull cpp_comment(int ok)
891 ad9e6848 2005-08-12 devnull {
892 ad9e6848 2005-08-12 devnull int ch;
893 ad9e6848 2005-08-12 devnull int hitnl;
894 ad9e6848 2005-08-12 devnull
895 ad9e6848 2005-08-12 devnull hitnl = 0;
896 ad9e6848 2005-08-12 devnull while ((ch = getch()) != -1) {
897 ad9e6848 2005-08-12 devnull if (ch == '\n') {
898 ad9e6848 2005-08-12 devnull if (ok && !hitnl)
899 ad9e6848 2005-08-12 devnull outs(clev->tabs);
900 ad9e6848 2005-08-12 devnull else
901 ad9e6848 2005-08-12 devnull outs(0);
902 ad9e6848 2005-08-12 devnull lbegin = 1;
903 ad9e6848 2005-08-12 devnull count = 0;
904 ad9e6848 2005-08-12 devnull hitnl = 1;
905 ad9e6848 2005-08-12 devnull break;
906 ad9e6848 2005-08-12 devnull }
907 ad9e6848 2005-08-12 devnull putch(ch, NO);
908 ad9e6848 2005-08-12 devnull }
909 ad9e6848 2005-08-12 devnull return hitnl;
910 ad9e6848 2005-08-12 devnull }
911 ad9e6848 2005-08-12 devnull void
912 ad9e6848 2005-08-12 devnull putspace(char ch, int ok)
913 ad9e6848 2005-08-12 devnull {
914 ad9e6848 2005-08-12 devnull if(p == string)putch(ch,ok);
915 ad9e6848 2005-08-12 devnull else if (*(p - 1) != ch) putch(ch,ok);
916 ad9e6848 2005-08-12 devnull }
917 ad9e6848 2005-08-12 devnull int
918 ad9e6848 2005-08-12 devnull getch(void){
919 ad9e6848 2005-08-12 devnull char c;
920 ad9e6848 2005-08-12 devnull if(inswitch){
921 ad9e6848 2005-08-12 devnull if(next != '\0'){
922 ad9e6848 2005-08-12 devnull c=next;
923 ad9e6848 2005-08-12 devnull next = '\0';
924 ad9e6848 2005-08-12 devnull return(c);
925 ad9e6848 2005-08-12 devnull }
926 ad9e6848 2005-08-12 devnull if(tptr <= lastplace){
927 ad9e6848 2005-08-12 devnull if(*tptr != '\0')return(*tptr++);
928 ad9e6848 2005-08-12 devnull else if(++tptr <= lastplace)return(*tptr++);
929 ad9e6848 2005-08-12 devnull }
930 ad9e6848 2005-08-12 devnull inswitch=0;
931 ad9e6848 2005-08-12 devnull lastplace = tptr = temp;
932 ad9e6848 2005-08-12 devnull }
933 ad9e6848 2005-08-12 devnull return(Bgetc(input));
934 ad9e6848 2005-08-12 devnull }
935 ad9e6848 2005-08-12 devnull void
936 ad9e6848 2005-08-12 devnull unget(char c)
937 ad9e6848 2005-08-12 devnull {
938 ad9e6848 2005-08-12 devnull if(inswitch){
939 ad9e6848 2005-08-12 devnull if(tptr != temp)
940 ad9e6848 2005-08-12 devnull *(--tptr) = c;
941 ad9e6848 2005-08-12 devnull else next = c;
942 ad9e6848 2005-08-12 devnull }
943 ad9e6848 2005-08-12 devnull else Bungetc(input);
944 ad9e6848 2005-08-12 devnull }
945 ad9e6848 2005-08-12 devnull char *
946 ad9e6848 2005-08-12 devnull getnext(int must){
947 ad9e6848 2005-08-12 devnull int c;
948 ad9e6848 2005-08-12 devnull char *beg;
949 ad9e6848 2005-08-12 devnull int prect,nlct;
950 ad9e6848 2005-08-12 devnull prect = nlct = 0;
951 ad9e6848 2005-08-12 devnull if(tptr > lastplace){
952 ad9e6848 2005-08-12 devnull tptr = lastplace = temp;
953 ad9e6848 2005-08-12 devnull err = 0;
954 ad9e6848 2005-08-12 devnull inswitch = 0;
955 ad9e6848 2005-08-12 devnull }
956 ad9e6848 2005-08-12 devnull tp = lastplace;
957 ad9e6848 2005-08-12 devnull if(inswitch && tptr <= lastplace)
958 79049567 2007-03-25 devnull if (isalnum((uchar)*lastplace)||ispunct((uchar)*lastplace)||isop((uchar)*lastplace))return(lastplace);
959 ad9e6848 2005-08-12 devnull space:
960 ad9e6848 2005-08-12 devnull while(isspace(c=Bgetc(input)))puttmp(c,1);
961 ad9e6848 2005-08-12 devnull beg = tp;
962 ad9e6848 2005-08-12 devnull puttmp(c,1);
963 ad9e6848 2005-08-12 devnull if(c == '/'){
964 ad9e6848 2005-08-12 devnull if(puttmp(Bgetc(input),1) == '*'){
965 ad9e6848 2005-08-12 devnull cont:
966 ad9e6848 2005-08-12 devnull while((c=Bgetc(input)) != '*'){
967 ad9e6848 2005-08-12 devnull puttmp(c,0);
968 ad9e6848 2005-08-12 devnull if(must == 0 && c == '\n')
969 ad9e6848 2005-08-12 devnull if(nlct++ > 2)goto done;
970 ad9e6848 2005-08-12 devnull }
971 ad9e6848 2005-08-12 devnull puttmp(c,1);
972 ab6f1aea 2020-01-02 0intro star:
973 ad9e6848 2005-08-12 devnull if(puttmp((c=Bgetc(input)),1) == '/'){
974 ad9e6848 2005-08-12 devnull beg = tp;
975 ad9e6848 2005-08-12 devnull puttmp((c=Bgetc(input)),1);
976 ad9e6848 2005-08-12 devnull }
977 ad9e6848 2005-08-12 devnull else if(c == '*')goto star;
978 ad9e6848 2005-08-12 devnull else goto cont;
979 ad9e6848 2005-08-12 devnull }
980 ad9e6848 2005-08-12 devnull else goto done;
981 ad9e6848 2005-08-12 devnull }
982 ad9e6848 2005-08-12 devnull if(isspace(c))goto space;
983 ad9e6848 2005-08-12 devnull if(c == '#' && tp > temp+1 && *(tp-2) == '\n'){
984 ad9e6848 2005-08-12 devnull if(prect++ > 2)goto done;
985 ad9e6848 2005-08-12 devnull while(puttmp((c=Bgetc(input)),1) != '\n')
986 ad9e6848 2005-08-12 devnull if(c == '\\')puttmp(Bgetc(input),1);
987 ad9e6848 2005-08-12 devnull goto space;
988 ad9e6848 2005-08-12 devnull }
989 ad9e6848 2005-08-12 devnull if(isalnum(c)){
990 ad9e6848 2005-08-12 devnull while(isalnum(c = Bgetc(input)))puttmp(c,1);
991 ad9e6848 2005-08-12 devnull Bungetc(input);
992 ad9e6848 2005-08-12 devnull }
993 ad9e6848 2005-08-12 devnull done:
994 ad9e6848 2005-08-12 devnull puttmp('\0',1);
995 ad9e6848 2005-08-12 devnull lastplace = tp-1;
996 ad9e6848 2005-08-12 devnull inswitch = 1;
997 ad9e6848 2005-08-12 devnull return(beg);
998 ad9e6848 2005-08-12 devnull }
999 ad9e6848 2005-08-12 devnull void
1000 ad9e6848 2005-08-12 devnull copy(char *s)
1001 ad9e6848 2005-08-12 devnull {
1002 ad9e6848 2005-08-12 devnull while(*s != '\0')putch(*s++,NO);
1003 ad9e6848 2005-08-12 devnull }
1004 ad9e6848 2005-08-12 devnull void
1005 ad9e6848 2005-08-12 devnull clearif(struct indent *cl)
1006 ad9e6848 2005-08-12 devnull {
1007 ad9e6848 2005-08-12 devnull int i;
1008 ad9e6848 2005-08-12 devnull for(i=0;i<IFLEVEL-1;i++)cl->ifc[i] = 0;
1009 ad9e6848 2005-08-12 devnull }
1010 fa325e9b 2020-01-10 cross char
1011 ad9e6848 2005-08-12 devnull puttmp(char c, int keep)
1012 ad9e6848 2005-08-12 devnull {
1013 ad9e6848 2005-08-12 devnull if(tp < &temp[TEMP-120])
1014 ad9e6848 2005-08-12 devnull *tp++ = c;
1015 ad9e6848 2005-08-12 devnull else {
1016 ad9e6848 2005-08-12 devnull if(keep){
1017 ad9e6848 2005-08-12 devnull if(tp >= &temp[TEMP-1]){
1018 ad9e6848 2005-08-12 devnull fprint(2,"can't look past huge comment - quiting\n");
1019 ad9e6848 2005-08-12 devnull exits("boom");
1020 ad9e6848 2005-08-12 devnull }
1021 ad9e6848 2005-08-12 devnull *tp++ = c;
1022 ad9e6848 2005-08-12 devnull }
1023 ad9e6848 2005-08-12 devnull else if(err == 0){
1024 ad9e6848 2005-08-12 devnull err++;
1025 ad9e6848 2005-08-12 devnull fprint(2,"truncating long comment\n");
1026 ad9e6848 2005-08-12 devnull }
1027 ad9e6848 2005-08-12 devnull }
1028 ad9e6848 2005-08-12 devnull return(c);
1029 ad9e6848 2005-08-12 devnull }
1030 ad9e6848 2005-08-12 devnull void
1031 ad9e6848 2005-08-12 devnull error(char *s)
1032 ad9e6848 2005-08-12 devnull {
1033 ad9e6848 2005-08-12 devnull fprint(2,"saw EOF while looking for %s\n",s);
1034 ad9e6848 2005-08-12 devnull exits("boom");
1035 ad9e6848 2005-08-12 devnull }