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