#define IF 1 #define ELSE 2 #define CASE 3 #define TYPE 4 #define DO 5 #define STRUCT 6 #define OTHER 7 #define ALWAYS 01 #define NEVER 02 #define SOMETIMES 04 #define YES 1 #define NO 0 #define KEYWORD 1 #define DATADEF 2 #define SINIT 3 #define CLEVEL 200 #define IFLEVEL 100 #define DOLEVEL 100 #define OPLENGTH 100 #define LINE 2048 #define LINELENG 2048 #define MAXTABS 8 #define TABLENG 8 #define TEMP 20480 #define OUT outs(clev->tabs); Bputc(output, '\n');opflag = lbegin = 1; count = 0 #define OUTK OUT; keyflag = 0; #define BUMP clev->tabs++; clev->pdepth++ #define UNBUMP clev->tabs -= clev->pdepth; clev->pdepth = 0 #define eatspace() while((cc=getch()) == ' ' || cc == '\t'); unget(cc) #define eatallsp() while((cc=getch()) == ' ' || cc == '\t' || cc == '\n'); unget(cc) struct indent { /* one for each level of { } */ int tabs; int pdepth; int iflev; int ifc[IFLEVEL]; int spdepth[IFLEVEL]; } ind[CLEVEL]; struct indent *clev = ind; struct keyw { char *name; char punc; char type; } key[] = { "switch", ' ', OTHER, "do", ' ', DO, "while", ' ', OTHER, "if", ' ', IF, "for", ' ', OTHER, "else", ' ', ELSE, "case", ' ', CASE, "default", ' ', CASE, "char", '\t', TYPE, "int", '\t', TYPE, "short", '\t', TYPE, "long", '\t', TYPE, "unsigned", '\t', TYPE, "float", '\t', TYPE, "double", '\t', TYPE, "struct", ' ', STRUCT, "union", ' ', STRUCT, "enum", ' ', STRUCT, "extern", ' ', TYPE, "register", ' ', TYPE, "static", ' ', TYPE, "typedef", ' ', TYPE, 0, 0, 0 }; struct op { char *name; char blanks; char setop; } op[] = { "+=", ALWAYS, YES, "-=", ALWAYS, YES, "*=", ALWAYS, YES, "/=", ALWAYS, YES, "%=", ALWAYS, YES, ">>=", ALWAYS, YES, "<<=", ALWAYS, YES, "&=", ALWAYS, YES, "^=", ALWAYS, YES, "|=", ALWAYS, YES, ">>", ALWAYS, YES, "<<", ALWAYS, YES, "<=", ALWAYS, YES, ">=", ALWAYS, YES, "==", ALWAYS, YES, "!=", ALWAYS, YES, "=", ALWAYS, YES, "&&", ALWAYS, YES, "||", ALWAYS, YES, "++", NEVER, NO, "--", NEVER, NO, "->", NEVER, NO, "<", ALWAYS, YES, ">", ALWAYS, YES, "+", ALWAYS, YES, "/", ALWAYS, YES, "%", ALWAYS, YES, "^", ALWAYS, YES, "|", ALWAYS, YES, "!", NEVER, YES, "~", NEVER, YES, "*", SOMETIMES, YES, "&", SOMETIMES, YES, "-", SOMETIMES, YES, "?", ALWAYS,YES, ":", ALWAYS,YES, 0, 0,0 }; Biobuf *input; Biobuf *output; int strict = 0; int join = 0; int opflag = 1; int keyflag = 0; int paren = 0; int split = 0; int folded = 0; int dolevel =0; int dotabs[DOLEVEL]; int docurly[DOLEVEL]; int dopdepth[DOLEVEL]; int structlev = 0; int question = 0; char string[LINE]; char *lastlook; char *p = string; char temp[TEMP]; char *tp; int err = 0; char *lastplace = temp; char *tptr = temp; int maxleng = LINELENG; int maxtabs = MAXTABS; int count = 0; char next = '\0'; int inswitch =0; int lbegin = 1; int lineno = 0; void work(void); void gotif(void); void gotelse(void); int checkif(char *); void gotdo(void); void resetdo(void); void gottype(struct keyw *lptr); void gotstruct(void); void gotop(int); void keep(struct op *); int getnl(void); void ptabs(int); void outs(int); void putch(char, int); struct keyw *lookup(char *, char *); int comment(int); void putspace(char, int); int getch(void); void unget(char); char *getnext(int); void copy(char *); void clearif(struct indent *); char puttmp(char, int); void error(char *); int cpp_comment(int);