10 fprint(2, "usage: cb [-sj] [-l width]\n");
15 main(int argc, char *argv[])
24 maxleng = atoi(EARGF(usage()));
25 maxtabs = maxleng/TABLENG - 2;
26 maxleng -= (maxleng + 5)/10;
35 Binit(&stdout, 1, OWRITE);
38 Binit(&stdin, 0, OREAD);
44 if ((input = Bopen(*argv, OREAD)) == 0)
45 sysfatal("can't open input file %s: %r", *argv);
61 while ((c = getch()) != Beof){
64 if ((lptr = lookup(lastlook,p)) != 0){
65 if (lptr->type == ELSE)gotelse();
66 else if(lptr->type == DO)gotdo();
67 else if(lptr->type == STRUCT)structlev++;
69 if(++clev >= &ind[CLEVEL-1]){
70 fprint(2,"too many levels of curly brackets\n");
71 clev = &ind[CLEVEL-1];
74 clev->tabs = (clev-1)->tabs;
76 if(strict && clev->tabs > 0)
80 if(keyflag == DATADEF){
87 pt = getnext(0); /* to handle initialized structures */
88 if(*pt == '{'){ /* hide one level of {} */
89 while((c=getch()) != '{')
90 if(c == Beof)error("{");
100 pt = getnext(0); /* to handle initialized structures */
113 while((cc = getch()) != '{')
114 if(cc == Beof)error("}");
123 else if(strict || ct){
128 else if(keyflag == SINIT && *pt == '}'){
139 if(--clev < ind)clev = ind;
143 lptr=lookup(pt,lastplace+1);
145 if(*pt == ';' || *pt == ','){
151 if((dolevel && clev->tabs <= dotabs[dolevel]) || (structlev )
152 || (lptr != 0 &&lptr->type == ELSE&& clev->pdepth == 0)){
156 else if(strict || (lptr != 0 && lptr->type == ELSE && ct == 0)){
160 else if(lptr != 0 && lptr->type == ELSE){
170 if(strict && clev->tabs == 0){
171 if((c=getch()) != '\n'){
179 if((c=getch()) != '\n')unget(c);
185 if(lptr != 0 && lptr->type == ELSE && clev->pdepth != 0){
188 if(lptr == 0 || lptr->type != ELSE){
190 if(dolevel && docurly[dolevel] == NO && clev->tabs == dotabs[dolevel]+1)
192 else if(clev->pdepth != 0){
199 if ((lptr = lookup(lastlook,p)) != 0){
200 if(!(lptr->type == TYPE || lptr->type == STRUCT))keyflag=KEYWORD;
202 putspace(lptr->punc,NO);
206 if (lptr->type == IF)gotif();
215 if(--paren < 0)paren = 0;
217 if((lptr = lookup(lastlook,p)) != 0){
218 if(lptr->type == TYPE || lptr->type == STRUCT)
221 else if(keyflag == DATADEF)opflag = 1;
225 if ((ct = getnl()) == 1 && !strict){
226 if(dolevel && clev->tabs <= dotabs[dolevel])
228 if(clev->tabs > 0 && (paren != 0 || keyflag == 0)){
239 else if(clev->tabs > 0 && *pt != '{'){
246 if(*pt != ';' && *pt != ',' && *pt != '(' && *pt != '['){
251 if(keyflag == KEYWORD && paren == 0){
252 if(dolevel && clev->tabs <= dotabs[dolevel]){
282 else if(dolevel && clev->tabs <= dotabs[dolevel])
287 if ((lptr = lookup(lastlook,p)) != 0){
288 if(!(lptr->type==TYPE||lptr->type==STRUCT))
290 else if(paren == 0)keyflag = DATADEF;
292 if(lptr->type != ELSE){
293 if(lptr->type == TYPE){
294 if(paren != 0)putch(' ',YES);
297 putch(lptr->punc,NO);
309 if((cc = getch()) == '\n' && !strict){
314 if(checkif(pt))continue;
318 if(getnl() == 1 && !strict){
340 docurly[dolevel] = NO;
341 dopdepth[dolevel] = clev->pdepth;
356 else if (lbegin == 0 || p > string)
373 lptr=lookup(pt,lastplace+1);
374 if(lptr == 0 || lptr->type != ELSE){
376 if(clev->pdepth != 0){
379 if(dolevel && docurly[dolevel] == NO && clev->tabs <= dotabs[dolevel]+1)
382 else if(clev->pdepth != 0){
391 if ((lptr = lookup(lastlook,p)) != 0){
393 if (lptr->type == ELSE){
395 if(checkif(pt))continue;
402 else if(lptr->type == DO){
406 docurly[dolevel] = NO;
407 dopdepth[dolevel] = clev->pdepth;
414 if(lptr->type == STRUCT)gotstruct();
417 else if(p == string)Bputc(output, '\n');
419 if(clev->tabs > 0 &&(paren != 0 || keyflag == 0)){
430 else if(keyflag == KEYWORD){
440 while ((cc = getch()) != c){
468 if ((cc = getch()) == ':') {
480 if(structlev)continue;
481 if ((lptr = lookup(lastlook,p)) != 0){
482 if (lptr->type == CASE)outs(clev->tabs - 1);
492 if ((cc = getch()) == '/') {
500 else if (cc != '*') {
524 while((c = getch()) != ']' || ct > 0){
525 if(c == Beof)error("]");
534 while ((cc = getch()) != '\n'){
535 if(cc == Beof)error("newline");
553 if ((cc = getch()) != ' ')unget(cc);
554 if(cc != '\n')putch(' ',YES);
557 else if(isop(c))gotop(c);
559 if(isalnum(c) && lastlook == 0)lastlook = p;
562 while(isdigit(c=Bgetc(input))||c == '.')putch(c,NO);
567 while(isdigit(c=Bgetc(input)))putch(c,NO);
572 if(keyflag != DATADEF)opflag = 0;
580 if(++clev->iflev >= IFLEVEL-1){
581 fprint(2,"too many levels of if %d\n",clev->iflev );
582 clev->iflev = IFLEVEL-1;
584 clev->ifc[clev->iflev] = clev->tabs;
585 clev->spdepth[clev->iflev] = clev->pdepth;
589 clev->tabs = clev->ifc[clev->iflev];
590 clev->pdepth = clev->spdepth[clev->iflev];
591 if(--(clev->iflev) < 0)clev->iflev = 0;
598 if((lptr=lookup(pt,lastplace+1))!= 0){
599 if(lptr->type == IF){
600 if(strict)putch(' ',YES);
605 putch(lptr->punc,NO);
608 clev->tabs = clev->ifc[clev->iflev];
609 clev->pdepth = clev->spdepth[clev->iflev];
618 if(++dolevel >= DOLEVEL-1){
619 fprint(2,"too many levels of do %d\n",dolevel);
622 dotabs[dolevel] = clev->tabs;
623 docurly[dolevel] = YES;
627 if(docurly[dolevel] == NO)
628 clev->pdepth = dopdepth[dolevel];
629 if(--dolevel < 0)dolevel = 0;
632 gottype(struct keyw *lptr)
639 if((tlptr=lookup(pt,lastplace+1))!=0){
644 if(tlptr->type == STRUCT){
645 putch(tlptr->punc,YES);
653 putch(lptr->punc,NO);
654 while((c=getch())== ' ' || c == '\t');
665 while((c=getch()) == ' ' || c == '\t')
666 if(!strict)putch(c,NO);
674 while(isalnum(c=getch()))putch(c,NO);
678 if(*pt == '{')structlev++;
687 char optmp[OPLENGTH];
693 while (isop(( *op_ptr = getch())))op_ptr++;
694 if(!strict)unget(*op_ptr);
695 else if (*op_ptr != ' ')unget( *op_ptr);
699 while ((a = s_op->name) != 0){
701 while ((*op_ptr == *a) && (*op_ptr != '\0')){
707 opflag = s_op->setop;
708 if (*op_ptr != '\0'){
723 if(o->blanks == NEVER)ok = NO;
725 if (strict && ((o->blanks & ALWAYS)
726 || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0)))
728 for(s=o->name; *s != '\0'; s++){
729 if(*(s+1) == '\0')putch(*s,ok);
733 if (strict && ((o->blanks & ALWAYS)
734 || ((opflag == 0 && o->blanks & SOMETIMES) && clev->tabs != 0))) putch(' ',YES);
743 while ((ch = getch()) == '\t' || ch == ' ')putch(ch,NO);
745 if ((ch = getch()) == '*'){
752 else if (ch == '/') {
760 if(inswitch)*(++lastplace) = ch;
770 if(gotcmt == 0)p=savp;
782 Bprint(output, "/* code folded from here */\n");
791 Bprint(output, "/* unfolding */\n");
794 for (i = 0; i < num; i++)Bputc(output, '\t');
804 if (clev->tabs > 0)Bprint(output, "\t");
808 Bprint(output, "%s", string);
809 lastlook = p = string;
822 if(p < &string[LINE-1]){
823 if(count+TABLENG*clev->tabs >= maxleng && ok && !folded){
824 if(c != ' ')*p++ = c;
827 if((cc=getch()) != '\n')unget(cc);
841 lookup(char *first, char *last)
844 char *cptr, *ckey, *k;
846 if(first == last || first == 0)return(0);
848 while (*cptr == ' ' || *cptr == '\t')cptr++;
849 if(cptr >= last)return(0);
851 while ((ckey = ptr->name) != 0){
852 for (k = cptr; (*ckey == *k && *ckey != '\0'); k++, ckey++);
853 if(*ckey=='\0' && (k==last|| (k<last && !isalnum(*k)))){
869 while ((ch = getch()) != Beof){
873 if ((ch = getch()) == '/'){
878 if (ch == '*')goto gotstar;
901 while ((ch = getch()) != -1) {
917 putspace(char ch, int ok)
919 if(p == string)putch(ch,ok);
920 else if (*(p - 1) != ch) putch(ch,ok);
931 if(tptr <= lastplace){
932 if(*tptr != '\0')return(*tptr++);
933 else if(++tptr <= lastplace)return(*tptr++);
936 lastplace = tptr = temp;
938 return(Bgetc(input));
956 if(tptr > lastplace){
957 tptr = lastplace = temp;
962 if(inswitch && tptr <= lastplace)
963 if (isalnum(*lastplace)||ispunct(*lastplace)||isop(*lastplace))return(lastplace);
965 while(isspace(c=Bgetc(input)))puttmp(c,1);
969 if(puttmp(Bgetc(input),1) == '*'){
971 while((c=Bgetc(input)) != '*'){
973 if(must == 0 && c == '\n')
974 if(nlct++ > 2)goto done;
978 if(puttmp((c=Bgetc(input)),1) == '/'){
980 puttmp((c=Bgetc(input)),1);
982 else if(c == '*')goto star;
987 if(isspace(c))goto space;
988 if(c == '#' && tp > temp+1 && *(tp-2) == '\n'){
989 if(prect++ > 2)goto done;
990 while(puttmp((c=Bgetc(input)),1) != '\n')
991 if(c == '\\')puttmp(Bgetc(input),1);
995 while(isalnum(c = Bgetc(input)))puttmp(c,1);
1007 while(*s != '\0')putch(*s++,NO);
1010 clearif(struct indent *cl)
1013 for(i=0;i<IFLEVEL-1;i++)cl->ifc[i] = 0;
1016 puttmp(char c, int keep)
1018 if(tp < &temp[TEMP-120])
1022 if(tp >= &temp[TEMP-1]){
1023 fprint(2,"can't look past huge comment - quiting\n");
1030 fprint(2,"truncating long comment\n");
1038 fprint(2,"saw EOF while looking for %s\n",s);