?? cb.c
字號:
#include <u.h>#include <libc.h>#include <bio.h>#include "cb.h"#include "cbtype.h"voidmain(int argc, char *argv[]){ Biobuf stdin, stdout; while (--argc > 0 && (*++argv)[0] == '-'){ switch ((*argv)[1]){ case 's': strict = 1; continue; case 'j': join = 1; continue; case 'l': if((*argv)[2] != '\0'){ maxleng = atoi( &((*argv)[2]) ); } else{ maxleng = atoi(*++argv); argc--; } maxtabs = maxleng/TABLENG - 2; maxleng -= (maxleng + 5)/10; continue; default: fprint(2, "cb: illegal option %c\n", *argv[1]); exits("boom"); } } Binit(&stdout, 1, OWRITE); output = &stdout; if (argc <= 0){ Binit(&stdin, 0, OREAD); input = &stdin; work(); } else { while (argc-- > 0){ if ((input = Bopen( *argv, OREAD)) == 0){ fprint(2, "cb: cannot open input file %s\n", *argv); exits("boom"); } work(); argv++; } } exits(0);}voidwork(void){ int c, cc; struct keyw *lptr; char *pt; int ct; while ((c = getch()) != Beof){ switch (c){ case '{': if ((lptr = lookup(lastlook,p)) != 0){ if (lptr->type == ELSE)gotelse(); else if(lptr->type == DO)gotdo(); else if(lptr->type == STRUCT)structlev++; } if(++clev >= &ind[CLEVEL-1]){ fprint(2,"too many levels of curly brackets\n"); clev = &ind[CLEVEL-1]; } clev->pdepth = 0; clev->tabs = (clev-1)->tabs; clearif(clev); if(strict && clev->tabs > 0) putspace(' ',NO); putch(c,NO); getnl(); if(keyflag == DATADEF){ OUT; } else { OUTK; } clev->tabs++; pt = getnext(0); /* to handle initialized structures */ if(*pt == '{'){ /* hide one level of {} */ while((c=getch()) != '{') if(c == Beof)error("{"); putch(c,NO); if(strict){ putch(' ',NO); eatspace(); } keyflag = SINIT; } continue; case '}': pt = getnext(0); /* to handle initialized structures */ if(*pt == ','){ if(strict){ putspace(' ',NO); eatspace(); } putch(c,NO); putch(*pt,NO); *pt = '\0'; ct = getnl(); pt = getnext(0); if(*pt == '{'){ OUT; while((cc = getch()) != '{') if(cc == Beof)error("}"); putch(cc,NO); if(strict){ putch(' ',NO); eatspace(); } getnext(0); continue; } else if(strict || ct){ OUT; } continue; } else if(keyflag == SINIT && *pt == '}'){ if(strict) putspace(' ',NO); putch(c,NO); getnl(); OUT; keyflag = DATADEF; *pt = '\0'; pt = getnext(0); } outs(clev->tabs); if(--clev < ind)clev = ind; ptabs(clev->tabs); putch(c,NO); lbegin = 0; lptr=lookup(pt,lastplace+1); c = *pt; if(*pt == ';' || *pt == ','){ putch(*pt,NO); *pt = '\0'; lastplace=pt; } ct = getnl(); if((dolevel && clev->tabs <= dotabs[dolevel]) || (structlev ) || (lptr != 0 &&lptr->type == ELSE&& clev->pdepth == 0)){ if(c == ';'){ OUTK; } else if(strict || (lptr != 0 && lptr->type == ELSE && ct == 0)){ putspace(' ',NO); eatspace(); } else if(lptr != 0 && lptr->type == ELSE){ OUTK; } if(structlev){ structlev--; keyflag = DATADEF; } } else { if(strict && clev->tabs == 0){ if((c=getch()) != '\n'){ Bputc(output, '\n'); Bputc(output, '\n'); unget(c); } else { lineno++; Bputc(output, '\n'); if((c=getch()) != '\n')unget(c); else lineno++; Bputc(output, '\n'); } } } if(lptr != 0 && lptr->type == ELSE && clev->pdepth != 0){ UNBUMP; } if(lptr == 0 || lptr->type != ELSE){ clev->iflev = 0; if(dolevel && docurly[dolevel] == NO && clev->tabs == dotabs[dolevel]+1) clev->tabs--; else if(clev->pdepth != 0){ UNBUMP; } } continue; case '(': paren++; if ((lptr = lookup(lastlook,p)) != 0){ if(!(lptr->type == TYPE || lptr->type == STRUCT))keyflag=KEYWORD; if (strict){ putspace(lptr->punc,NO); opflag = 1; } putch(c,NO); if (lptr->type == IF)gotif(); } else { putch(c,NO); lastlook = p; opflag = 1; } continue; case ')': if(--paren < 0)paren = 0; putch(c,NO); if((lptr = lookup(lastlook,p)) != 0){ if(lptr->type == TYPE || lptr->type == STRUCT) opflag = 1; } else if(keyflag == DATADEF)opflag = 1; else opflag = 0; outs(clev->tabs); pt = getnext(1); if ((ct = getnl()) == 1 && !strict){ if(dolevel && clev->tabs <= dotabs[dolevel]) resetdo(); if(clev->tabs > 0 && (paren != 0 || keyflag == 0)){ if(join){ eatspace(); putch(' ',YES); continue; } else { OUT; split = 1; continue; } } else if(clev->tabs > 0 && *pt != '{'){ BUMP; } OUTK; } else if(strict){ if(clev->tabs == 0){ if(*pt != ';' && *pt != ',' && *pt != '(' && *pt != '['){ OUTK; } } else { if(keyflag == KEYWORD && paren == 0){ if(dolevel && clev->tabs <= dotabs[dolevel]){ resetdo(); eatspace(); continue; } if(*pt != '{'){ BUMP; OUTK; } else { *pt='\0'; eatspace(); unget('{'); } } else if(ct){ if(paren){ if(join){ eatspace(); } else { split = 1; OUT; } } else { OUTK; } } } } else if(dolevel && clev->tabs <= dotabs[dolevel]) resetdo(); continue; case ' ': case '\t': if ((lptr = lookup(lastlook,p)) != 0){ if(!(lptr->type==TYPE||lptr->type==STRUCT)) keyflag = KEYWORD; else if(paren == 0)keyflag = DATADEF; if(strict){ if(lptr->type != ELSE){ if(lptr->type == TYPE){ if(paren != 0)putch(' ',YES); } else putch(lptr->punc,NO); eatspace(); } } else putch(c,YES); switch(lptr->type){ case CASE: outs(clev->tabs-1); continue; case ELSE: pt = getnext(1); eatspace(); if((cc = getch()) == '\n' && !strict){ unget(cc); } else { unget(cc); if(checkif(pt))continue; } gotelse(); if(strict) unget(c); if(getnl() == 1 && !strict){ OUTK; if(*pt != '{'){ BUMP; } } else if(strict){ if(*pt != '{'){ OUTK; BUMP; } } continue; case IF: gotif(); continue; case DO: gotdo(); pt = getnext(1); if(*pt != '{'){ eatallsp(); OUTK; docurly[dolevel] = NO; dopdepth[dolevel] = clev->pdepth; clev->pdepth = 0; clev->tabs++; } continue; case TYPE: if(paren)continue; if(!strict)continue; gottype(lptr); continue; case STRUCT: gotstruct(); continue; } } else if (lbegin == 0 || p > string) if(strict) putch(c,NO); else putch(c,YES); continue; case ';': putch(c,NO); if(paren != 0){ if(strict){ putch(' ',YES); eatspace(); } opflag = 1; continue; } outs(clev->tabs); pt = getnext(0); lptr=lookup(pt,lastplace+1); if(lptr == 0 || lptr->type != ELSE){ clev->iflev = 0; if(clev->pdepth != 0){ UNBUMP; } if(dolevel && docurly[dolevel] == NO && clev->tabs <= dotabs[dolevel]+1) clev->tabs--;/* else if(clev->pdepth != 0){ UNBUMP; }*/ } getnl(); OUTK; continue; case '\n': if ((lptr = lookup(lastlook,p)) != 0){ pt = getnext(1); if (lptr->type == ELSE){ if(strict) if(checkif(pt))continue; gotelse(); OUTK; if(*pt != '{'){ BUMP; } } else if(lptr->type == DO){ OUTK; gotdo(); if(*pt != '{'){ docurly[dolevel] = NO; dopdepth[dolevel] = clev->pdepth; clev->pdepth = 0; clev->tabs++; } } else { OUTK; if(lptr->type == STRUCT)gotstruct(); } } else if(p == string)Bputc(output, '\n'); else { if(clev->tabs > 0 &&(paren != 0 || keyflag == 0)){ if(join){ putch(' ',YES); eatspace(); continue; } else { OUT; split = 1; continue; } } else if(keyflag == KEYWORD){ OUTK; continue; } OUT; } continue; case '"': case '\'': putch(c,NO); while ((cc = getch()) != c){ if(cc == Beof) error("\" or '"); putch(cc,NO); if (cc == '\\'){ putch(getch(),NO); } if (cc == '\n'){ outs(clev->tabs); lbegin = 1; count = 0; } } putch(cc,NO); opflag=0; if (getnl() == 1){ unget('\n'); } continue; case '\\': putch(c,NO); putch(getch(),NO); continue; case '?': question = 1; gotop(c); continue; case ':': if ((cc = getch()) == ':') { putch(c,NO); putch(cc,NO); continue; } unget(cc); if (question == 1){ question = 0; gotop(c); continue; } putch(c,NO); if(structlev)continue; if ((lptr = lookup(lastlook,p)) != 0){ if (lptr->type == CASE)outs(clev->tabs - 1); } else { lbegin = 0; outs(clev->tabs); } getnl(); OUTK; continue; case '/': if ((cc = getch()) == '/') { putch(c,NO); putch(cc,NO); cpp_comment(YES); OUT; lastlook = 0; continue; } else if (cc != '*') { unget(cc); gotop(c); continue; } putch(c,NO); putch(cc,NO); cc = comment(YES); if(getnl() == 1){ if(cc == 0){ OUT; } else { outs(0); Bputc(output, '\n'); lbegin = 1; count = 0; } lastlook = 0; } continue;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -