8 main(int argc, char *argv[])
12 while (--argc > 0 && (*++argv)[0] == '-'){
21 if((*argv)[2] != '\0'){
22 maxleng = atoi( &((*argv)[2]) );
25 maxleng = atoi(*++argv);
28 maxtabs = maxleng/TABLENG - 2;
29 maxleng -= (maxleng + 5)/10;
32 fprint(2, "cb: illegal option %c\n", *argv[1]);
36 Binit(&stdout, 1, OWRITE);
39 Binit(&stdin, 0, OREAD);
44 if ((input = Bopen( *argv, OREAD)) == 0){
45 fprint(2, "cb: cannot open input file %s\n", *argv);
62 while ((c = getch()) != Beof){
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++;
70 if(++clev >= &ind[CLEVEL-1]){
71 fprint(2,"too many levels of curly brackets\n");
72 clev = &ind[CLEVEL-1];
75 clev->tabs = (clev-1)->tabs;
77 if(strict && clev->tabs > 0)
81 if(keyflag == DATADEF){
88 pt = getnext(0); /* to handle initialized structures */
89 if(*pt == '{'){ /* hide one level of {} */
90 while((c=getch()) != '{')
91 if(c == Beof)error("{");
101 pt = getnext(0); /* to handle initialized structures */
114 while((cc = getch()) != '{')
115 if(cc == Beof)error("}");
124 else if(strict || ct){
129 else if(keyflag == SINIT && *pt == '}'){
140 if(--clev < ind)clev = ind;
144 lptr=lookup(pt,lastplace+1);
146 if(*pt == ';' || *pt == ','){
152 if((dolevel && clev->tabs <= dotabs[dolevel]) || (structlev )
153 || (lptr != 0 &&lptr->type == ELSE&& clev->pdepth == 0)){
157 else if(strict || (lptr != 0 && lptr->type == ELSE && ct == 0)){
161 else if(lptr != 0 && lptr->type == ELSE){
171 if(strict && clev->tabs == 0){
172 if((c=getch()) != '\n'){
180 if((c=getch()) != '\n')unget(c);
186 if(lptr != 0 && lptr->type == ELSE && clev->pdepth != 0){
189 if(lptr == 0 || lptr->type != ELSE){
191 if(dolevel && docurly[dolevel] == NO && clev->tabs == dotabs[dolevel]+1)
193 else if(clev->pdepth != 0){
200 if ((lptr = lookup(lastlook,p)) != 0){
201 if(!(lptr->type == TYPE || lptr->type == STRUCT))keyflag=KEYWORD;
203 putspace(lptr->punc,NO);
207 if (lptr->type == IF)gotif();
216 if(--paren < 0)paren = 0;
218 if((lptr = lookup(lastlook,p)) != 0){
219 if(lptr->type == TYPE || lptr->type == STRUCT)
222 else if(keyflag == DATADEF)opflag = 1;
226 if ((ct = getnl()) == 1 && !strict){
227 if(dolevel && clev->tabs <= dotabs[dolevel])
229 if(clev->tabs > 0 && (paren != 0 || keyflag == 0)){
240 else if(clev->tabs > 0 && *pt != '{'){
247 if(*pt != ';' && *pt != ',' && *pt != '(' && *pt != '['){
252 if(keyflag == KEYWORD && paren == 0){
253 if(dolevel && clev->tabs <= dotabs[dolevel]){
283 else if(dolevel && clev->tabs <= dotabs[dolevel])
288 if ((lptr = lookup(lastlook,p)) != 0){
289 if(!(lptr->type==TYPE||lptr->type==STRUCT))
291 else if(paren == 0)keyflag = DATADEF;
293 if(lptr->type != ELSE){
294 if(lptr->type == TYPE){
295 if(paren != 0)putch(' ',YES);
298 putch(lptr->punc,NO);
310 if((cc = getch()) == '\n' && !strict){
315 if(checkif(pt))continue;
319 if(getnl() == 1 && !strict){
341 docurly[dolevel] = NO;
342 dopdepth[dolevel] = clev->pdepth;
357 else if (lbegin == 0 || p > string)
374 lptr=lookup(pt,lastplace+1);
375 if(lptr == 0 || lptr->type != ELSE){
377 if(clev->pdepth != 0){
380 if(dolevel && docurly[dolevel] == NO && clev->tabs <= dotabs[dolevel]+1)
383 else if(clev->pdepth != 0){
392 if ((lptr = lookup(lastlook,p)) != 0){
394 if (lptr->type == ELSE){
396 if(checkif(pt))continue;
403 else if(lptr->type == DO){
407 docurly[dolevel] = NO;
408 dopdepth[dolevel] = clev->pdepth;
415 if(lptr->type == STRUCT)gotstruct();
418 else if(p == string)Bputc(output, '\n');
420 if(clev->tabs > 0 &&(paren != 0 || keyflag == 0)){
431 else if(keyflag == KEYWORD){
441 while ((cc = getch()) != c){
469 if ((cc = getch()) == ':') {
481 if(structlev)continue;
482 if ((lptr = lookup(lastlook,p)) != 0){
483 if (lptr->type == CASE)outs(clev->tabs - 1);
493 if ((cc = getch()) == '/') {
501 else if (cc != '*') {
525 while((c = getch()) != ']' || ct > 0){
526 if(c == Beof)error("]");
535 while ((cc = getch()) != '\n'){
536 if(cc == Beof)error("newline");
554 if ((cc = getch()) != ' ')unget(cc);
555 if(cc != '\n')putch(' ',YES);
558 else if(isop(c))gotop(c);
560 if(isalnum(c) && lastlook == 0)lastlook = p;
563 while(isdigit(c=Bgetc(input))||c == '.')putch(c,NO);
568 while(isdigit(c=Bgetc(input)))putch(c,NO);
573 if(keyflag != DATADEF)opflag = 0;
581 if(++clev->iflev >= IFLEVEL-1){
582 fprint(2,"too many levels of if %d\n",clev->iflev );
583 clev->iflev = IFLEVEL-1;
585 clev->ifc[clev->iflev] = clev->tabs;
586 clev->spdepth[clev->iflev] = clev->pdepth;
590 clev->tabs = clev->ifc[clev->iflev];
591 clev->pdepth = clev->spdepth[clev->iflev];
592 if(--(clev->iflev) < 0)clev->iflev = 0;
599 if((lptr=lookup(pt,lastplace+1))!= 0){
600 if(lptr->type == IF){
601 if(strict)putch(' ',YES);
606 putch(lptr->punc,NO);
609 clev->tabs = clev->ifc[clev->iflev];
610 clev->pdepth = clev->spdepth[clev->iflev];
619 if(++dolevel >= DOLEVEL-1){
620 fprint(2,"too many levels of do %d\n",dolevel);
623 dotabs[dolevel] = clev->tabs;
624 docurly[dolevel] = YES;
628 if(docurly[dolevel] == NO)
629 clev->pdepth = dopdepth[dolevel];
630 if(--dolevel < 0)dolevel = 0;
633 gottype(struct keyw *lptr)
640 if((tlptr=lookup(pt,lastplace+1))!=0){
645 if(tlptr->type == STRUCT){
646 putch(tlptr->punc,YES);
654 putch(lptr->punc,NO);
655 while((c=getch())== ' ' || c == '\t');
666 while((c=getch()) == ' ' || c == '\t')
667 if(!strict)putch(c,NO);
675 while(isalnum(c=getch()))putch(c,NO);
679 if(*pt == '{')structlev++;
688 char optmp[OPLENGTH];
694 while (isop(( *op_ptr = getch())))op_ptr++;
695 if(!strict)unget(*op_ptr);
696 else if (*op_ptr != ' ')unget( *op_ptr);
700 while ((a = s_op->name) != 0){
702 while ((*op_ptr == *a) && (*op_ptr != '\0')){
708 opflag = s_op->setop;
709 if (*op_ptr != '\0'){
724 if(o->blanks == NEVER)ok = NO;
726 if (strict && ((o->blanks & ALWAYS)
727 || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0)))
729 for(s=o->name; *s != '\0'; s++){
730 if(*(s+1) == '\0')putch(*s,ok);
734 if (strict && ((o->blanks & ALWAYS)
735 || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0))) putch(' ',YES);
744 while ((ch = getch()) == '\t' || ch == ' ')putch(ch,NO);
746 if ((ch = getch()) == '*'){
753 else if (ch == '/') {
761 if(inswitch)*(++lastplace) = ch;
771 if(gotcmt == 0)p=savp;
783 Bprint(output, "/* code folded from here */\n");
792 Bprint(output, "/* unfolding */\n");
795 for (i = 0; i < num; i++)Bputc(output, '\t');
805 if (clev->tabs > 0)Bprint(output, "\t");
809 Bprint(output, "%s", string);
810 lastlook = p = string;
823 if(p < &string[LINE-1]){
824 if(count+TABLENG*clev->tabs >= maxleng && ok && !folded){
825 if(c != ' ')*p++ = c;
828 if((cc=getch()) != '\n')unget(cc);
842 lookup(char *first, char *last)
845 char *cptr, *ckey, *k;
847 if(first == last || first == 0)return(0);
849 while (*cptr == ' ' || *cptr == '\t')cptr++;
850 if(cptr >= last)return(0);
852 while ((ckey = ptr->name) != 0){
853 for (k = cptr; (*ckey == *k && *ckey != '\0'); k++, ckey++);
854 if(*ckey=='\0' && (k==last|| (k<last && !isalnum(*k)))){
870 while ((ch = getch()) != Beof){
874 if ((ch = getch()) == '/'){
879 if (ch == '*')goto gotstar;
902 while ((ch = getch()) != -1) {
918 putspace(char ch, int ok)
920 if(p == string)putch(ch,ok);
921 else if (*(p - 1) != ch) putch(ch,ok);
932 if(tptr <= lastplace){
933 if(*tptr != '\0')return(*tptr++);
934 else if(++tptr <= lastplace)return(*tptr++);
937 lastplace = tptr = temp;
939 return(Bgetc(input));
957 if(tptr > lastplace){
958 tptr = lastplace = temp;
963 if(inswitch && tptr <= lastplace)
964 if (isalnum(*lastplace)||ispunct(*lastplace)||isop(*lastplace))return(lastplace);
966 while(isspace(c=Bgetc(input)))puttmp(c,1);
970 if(puttmp(Bgetc(input),1) == '*'){
972 while((c=Bgetc(input)) != '*'){
974 if(must == 0 && c == '\n')
975 if(nlct++ > 2)goto done;
979 if(puttmp((c=Bgetc(input)),1) == '/'){
981 puttmp((c=Bgetc(input)),1);
983 else if(c == '*')goto star;
988 if(isspace(c))goto space;
989 if(c == '#' && tp > temp+1 && *(tp-2) == '\n'){
990 if(prect++ > 2)goto done;
991 while(puttmp((c=Bgetc(input)),1) != '\n')
992 if(c == '\\')puttmp(Bgetc(input),1);
996 while(isalnum(c = Bgetc(input)))puttmp(c,1);
1008 while(*s != '\0')putch(*s++,NO);
1011 clearif(struct indent *cl)
1014 for(i=0;i<IFLEVEL-1;i++)cl->ifc[i] = 0;
1017 puttmp(char c, int keep)
1019 if(tp < &temp[TEMP-120])
1023 if(tp >= &temp[TEMP-1]){
1024 fprint(2,"can't look past huge comment - quiting\n");
1031 fprint(2,"truncating long comment\n");
1039 fprint(2,"saw EOF while looking for %s\n",s);