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