1 #define IF 1 2 #define ELSE 2 3 #define CASE 3 4 #define TYPE 4 5 #define DO 5 6 #define STRUCT 6 7 #define OTHER 7 8 9 #define ALWAYS 01 10 #define NEVER 02 11 #define SOMETIMES 04 12 13 #define YES 1 14 #define NO 0 15 16 #define KEYWORD 1 17 #define DATADEF 2 18 #define SINIT 3 19 20 #define CLEVEL 200 21 #define IFLEVEL 100 22 #define DOLEVEL 100 23 #define OPLENGTH 100 24 #define LINE 2048 25 #define LINELENG 2048 26 #define MAXTABS 8 27 #define TABLENG 8 28 #define TEMP 20480 29 30 #define OUT outs(clev->tabs); Bputc(output, '\n');opflag = lbegin = 1; count = 0 31 #define OUTK OUT; keyflag = 0; 32 #define BUMP clev->tabs++; clev->pdepth++ 33 #define UNBUMP clev->tabs -= clev->pdepth; clev->pdepth = 0 34 #define eatspace() while((cc=getch()) == ' ' || cc == '\t'); unget(cc) 35 #define eatallsp() while((cc=getch()) == ' ' || cc == '\t' || cc == '\n'); unget(cc) 36 37 struct indent { /* one for each level of { } */ 38 int tabs; 39 int pdepth; 40 int iflev; 41 int ifc[IFLEVEL]; 42 int spdepth[IFLEVEL]; 43 } ind[CLEVEL]; 44 struct indent *clev = ind; 45 struct keyw { 46 char *name; 47 char punc; 48 char type; 49 } key[] = { 50 "switch", ' ', OTHER, 51 "do", ' ', DO, 52 "while", ' ', OTHER, 53 "if", ' ', IF, 54 "for", ' ', OTHER, 55 "else", ' ', ELSE, 56 "case", ' ', CASE, 57 "default", ' ', CASE, 58 "char", '\t', TYPE, 59 "int", '\t', TYPE, 60 "short", '\t', TYPE, 61 "long", '\t', TYPE, 62 "unsigned", '\t', TYPE, 63 "float", '\t', TYPE, 64 "double", '\t', TYPE, 65 "struct", ' ', STRUCT, 66 "union", ' ', STRUCT, 67 "enum", ' ', STRUCT, 68 "extern", ' ', TYPE, 69 "register", ' ', TYPE, 70 "static", ' ', TYPE, 71 "typedef", ' ', TYPE, 72 0, 0, 0 73 }; 74 struct op { 75 char *name; 76 char blanks; 77 char setop; 78 } op[] = { 79 "+=", ALWAYS, YES, 80 "-=", ALWAYS, YES, 81 "*=", ALWAYS, YES, 82 "/=", ALWAYS, YES, 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 "++", NEVER, NO, 99 "--", NEVER, NO, 100 "->", NEVER, NO, 101 "<", ALWAYS, YES, 102 ">", ALWAYS, YES, 103 "+", ALWAYS, YES, 104 "/", ALWAYS, YES, 105 "%", ALWAYS, YES, 106 "^", ALWAYS, YES, 107 "|", ALWAYS, YES, 108 "!", NEVER, YES, 109 "~", NEVER, YES, 110 "*", SOMETIMES, YES, 111 "&", SOMETIMES, YES, 112 "-", SOMETIMES, YES, 113 "?", ALWAYS,YES, 114 ":", ALWAYS,YES, 115 0, 0,0 116 }; 117 Biobuf *input; 118 Biobuf *output; 119 int strict = 0; 120 int join = 0; 121 int opflag = 1; 122 int keyflag = 0; 123 int paren = 0; 124 int split = 0; 125 int folded = 0; 126 int dolevel =0; 127 int dotabs[DOLEVEL]; 128 int docurly[DOLEVEL]; 129 int dopdepth[DOLEVEL]; 130 int structlev = 0; 131 int question = 0; 132 char string[LINE]; 133 char *lastlook; 134 char *p = string; 135 char temp[TEMP]; 136 char *tp; 137 int err = 0; 138 char *lastplace = temp; 139 char *tptr = temp; 140 int maxleng = LINELENG; 141 int maxtabs = MAXTABS; 142 int count = 0; 143 char next = '\0'; 144 int inswitch =0; 145 int lbegin = 1; 146 int lineno = 0; 147 148 void work(void); 149 void gotif(void); 150 void gotelse(void); 151 int checkif(char *); 152 void gotdo(void); 153 void resetdo(void); 154 void gottype(struct keyw *lptr); 155 void gotstruct(void); 156 void gotop(int); 157 void keep(struct op *); 158 int getnl(void); 159 void ptabs(int); 160 void outs(int); 161 void putch(char, int); 162 struct keyw *lookup(char *, char *); 163 int comment(int); 164 void putspace(char, int); 165 int getch(void); 166 void unget(char); 167 char *getnext(int); 168 void copy(char *); 169 void clearif(struct indent *); 170 char puttmp(char, int); 171 void error(char *); 172 int cpp_comment(int); 173