Blob


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