12da9d879SDavid du Colombier #define IF 1 22da9d879SDavid du Colombier #define ELSE 2 32da9d879SDavid du Colombier #define CASE 3 42da9d879SDavid du Colombier #define TYPE 4 52da9d879SDavid du Colombier #define DO 5 62da9d879SDavid du Colombier #define STRUCT 6 72da9d879SDavid du Colombier #define OTHER 7 82da9d879SDavid du Colombier 92da9d879SDavid du Colombier #define ALWAYS 01 102da9d879SDavid du Colombier #define NEVER 02 112da9d879SDavid du Colombier #define SOMETIMES 04 122da9d879SDavid du Colombier 132da9d879SDavid du Colombier #define YES 1 142da9d879SDavid du Colombier #define NO 0 152da9d879SDavid du Colombier 162da9d879SDavid du Colombier #define KEYWORD 1 172da9d879SDavid du Colombier #define DATADEF 2 182da9d879SDavid du Colombier #define SINIT 3 192da9d879SDavid du Colombier 202da9d879SDavid du Colombier #define CLEVEL 200 212da9d879SDavid du Colombier #define IFLEVEL 100 222da9d879SDavid du Colombier #define DOLEVEL 100 232da9d879SDavid du Colombier #define OPLENGTH 100 242da9d879SDavid du Colombier #define LINE 2048 252da9d879SDavid du Colombier #define LINELENG 2048 262da9d879SDavid du Colombier #define MAXTABS 8 272da9d879SDavid du Colombier #define TABLENG 8 282da9d879SDavid du Colombier #define TEMP 20480 292da9d879SDavid du Colombier 302da9d879SDavid du Colombier #define OUT outs(clev->tabs); Bputc(output, '\n');opflag = lbegin = 1; count = 0 312da9d879SDavid du Colombier #define OUTK OUT; keyflag = 0; 322da9d879SDavid du Colombier #define BUMP clev->tabs++; clev->pdepth++ 332da9d879SDavid du Colombier #define UNBUMP clev->tabs -= clev->pdepth; clev->pdepth = 0 342da9d879SDavid du Colombier #define eatspace() while((cc=getch()) == ' ' || cc == '\t'); unget(cc) 352da9d879SDavid du Colombier #define eatallsp() while((cc=getch()) == ' ' || cc == '\t' || cc == '\n'); unget(cc) 362da9d879SDavid du Colombier 372da9d879SDavid du Colombier struct indent { /* one for each level of { } */ 382da9d879SDavid du Colombier int tabs; 392da9d879SDavid du Colombier int pdepth; 402da9d879SDavid du Colombier int iflev; 412da9d879SDavid du Colombier int ifc[IFLEVEL]; 422da9d879SDavid du Colombier int spdepth[IFLEVEL]; 432da9d879SDavid du Colombier } ind[CLEVEL]; 442da9d879SDavid du Colombier struct indent *clev = ind; 452da9d879SDavid du Colombier struct keyw { 462da9d879SDavid du Colombier char *name; 472da9d879SDavid du Colombier char punc; 482da9d879SDavid du Colombier char type; 492da9d879SDavid du Colombier } key[] = { 502da9d879SDavid du Colombier "switch", ' ', OTHER, 512da9d879SDavid du Colombier "do", ' ', DO, 522da9d879SDavid du Colombier "while", ' ', OTHER, 532da9d879SDavid du Colombier "if", ' ', IF, 542da9d879SDavid du Colombier "for", ' ', OTHER, 552da9d879SDavid du Colombier "else", ' ', ELSE, 562da9d879SDavid du Colombier "case", ' ', CASE, 572da9d879SDavid du Colombier "default", ' ', CASE, 582da9d879SDavid du Colombier "char", '\t', TYPE, 592da9d879SDavid du Colombier "int", '\t', TYPE, 602da9d879SDavid du Colombier "short", '\t', TYPE, 612da9d879SDavid du Colombier "long", '\t', TYPE, 622da9d879SDavid du Colombier "unsigned", '\t', TYPE, 632da9d879SDavid du Colombier "float", '\t', TYPE, 642da9d879SDavid du Colombier "double", '\t', TYPE, 652da9d879SDavid du Colombier "struct", ' ', STRUCT, 662da9d879SDavid du Colombier "union", ' ', STRUCT, 672da9d879SDavid du Colombier "enum", ' ', STRUCT, 682da9d879SDavid du Colombier "extern", ' ', TYPE, 692da9d879SDavid du Colombier "register", ' ', TYPE, 702da9d879SDavid du Colombier "static", ' ', TYPE, 712da9d879SDavid du Colombier "typedef", ' ', TYPE, 722da9d879SDavid du Colombier 0, 0, 0 732da9d879SDavid du Colombier }; 742da9d879SDavid du Colombier struct op { 752da9d879SDavid du Colombier char *name; 762da9d879SDavid du Colombier char blanks; 772da9d879SDavid du Colombier char setop; 782da9d879SDavid du Colombier } op[] = { 792da9d879SDavid du Colombier "+=", ALWAYS, YES, 802da9d879SDavid du Colombier "-=", ALWAYS, YES, 812da9d879SDavid du Colombier "*=", ALWAYS, YES, 822da9d879SDavid du Colombier "/=", ALWAYS, YES, 832da9d879SDavid du Colombier "%=", ALWAYS, YES, 842da9d879SDavid du Colombier ">>=", ALWAYS, YES, 852da9d879SDavid du Colombier "<<=", ALWAYS, YES, 862da9d879SDavid du Colombier "&=", ALWAYS, YES, 872da9d879SDavid du Colombier "^=", ALWAYS, YES, 882da9d879SDavid du Colombier "|=", ALWAYS, YES, 892da9d879SDavid du Colombier ">>", ALWAYS, YES, 902da9d879SDavid du Colombier "<<", ALWAYS, YES, 912da9d879SDavid du Colombier "<=", ALWAYS, YES, 922da9d879SDavid du Colombier ">=", ALWAYS, YES, 932da9d879SDavid du Colombier "==", ALWAYS, YES, 942da9d879SDavid du Colombier "!=", ALWAYS, YES, 952da9d879SDavid du Colombier "=", ALWAYS, YES, 962da9d879SDavid du Colombier "&&", ALWAYS, YES, 972da9d879SDavid du Colombier "||", ALWAYS, YES, 982da9d879SDavid du Colombier "++", NEVER, NO, 992da9d879SDavid du Colombier "--", NEVER, NO, 1002da9d879SDavid du Colombier "->", NEVER, NO, 1012da9d879SDavid du Colombier "<", ALWAYS, YES, 1022da9d879SDavid du Colombier ">", ALWAYS, YES, 1032da9d879SDavid du Colombier "+", ALWAYS, YES, 1042da9d879SDavid du Colombier "/", ALWAYS, YES, 1052da9d879SDavid du Colombier "%", ALWAYS, YES, 1062da9d879SDavid du Colombier "^", ALWAYS, YES, 1072da9d879SDavid du Colombier "|", ALWAYS, YES, 1082da9d879SDavid du Colombier "!", NEVER, YES, 1092da9d879SDavid du Colombier "~", NEVER, YES, 1102da9d879SDavid du Colombier "*", SOMETIMES, YES, 1112da9d879SDavid du Colombier "&", SOMETIMES, YES, 1122da9d879SDavid du Colombier "-", SOMETIMES, YES, 1132da9d879SDavid du Colombier "?", ALWAYS,YES, 1142da9d879SDavid du Colombier ":", ALWAYS,YES, 1152da9d879SDavid du Colombier 0, 0,0 1162da9d879SDavid du Colombier }; 1172da9d879SDavid du Colombier Biobuf *input; 1182da9d879SDavid du Colombier Biobuf *output; 1192da9d879SDavid du Colombier int strict = 0; 1202da9d879SDavid du Colombier int join = 0; 1212da9d879SDavid du Colombier int opflag = 1; 1222da9d879SDavid du Colombier int keyflag = 0; 1232da9d879SDavid du Colombier int paren = 0; 1242da9d879SDavid du Colombier int split = 0; 1252da9d879SDavid du Colombier int folded = 0; 1262da9d879SDavid du Colombier int dolevel =0; 1272da9d879SDavid du Colombier int dotabs[DOLEVEL]; 1282da9d879SDavid du Colombier int docurly[DOLEVEL]; 1292da9d879SDavid du Colombier int dopdepth[DOLEVEL]; 1302da9d879SDavid du Colombier int structlev = 0; 1312da9d879SDavid du Colombier int question = 0; 1322da9d879SDavid du Colombier char string[LINE]; 1332da9d879SDavid du Colombier char *lastlook; 1342da9d879SDavid du Colombier char *p = string; 1352da9d879SDavid du Colombier char temp[TEMP]; 1362da9d879SDavid du Colombier char *tp; 1372da9d879SDavid du Colombier int err = 0; 1382da9d879SDavid du Colombier char *lastplace = temp; 1392da9d879SDavid du Colombier char *tptr = temp; 1402da9d879SDavid du Colombier int maxleng = LINELENG; 1412da9d879SDavid du Colombier int maxtabs = MAXTABS; 1422da9d879SDavid du Colombier int count = 0; 1432da9d879SDavid du Colombier char next = '\0'; 1442da9d879SDavid du Colombier int inswitch =0; 1452da9d879SDavid du Colombier int lbegin = 1; 1462da9d879SDavid du Colombier int lineno = 0; 1472da9d879SDavid du Colombier 1482da9d879SDavid du Colombier void work(void); 1492da9d879SDavid du Colombier void gotif(void); 1502da9d879SDavid du Colombier void gotelse(void); 1512da9d879SDavid du Colombier int checkif(char *); 1522da9d879SDavid du Colombier void gotdo(void); 1532da9d879SDavid du Colombier void resetdo(void); 1542da9d879SDavid du Colombier void gottype(struct keyw *lptr); 1552da9d879SDavid du Colombier void gotstruct(void); 1562da9d879SDavid du Colombier void gotop(int); 1572da9d879SDavid du Colombier void keep(struct op *); 1582da9d879SDavid du Colombier int getnl(void); 1592da9d879SDavid du Colombier void ptabs(int); 1602da9d879SDavid du Colombier void outs(int); 1612da9d879SDavid du Colombier void putch(char, int); 1622da9d879SDavid du Colombier struct keyw *lookup(char *, char *); 1632da9d879SDavid du Colombier int comment(int); 1642da9d879SDavid du Colombier void putspace(char, int); 1652da9d879SDavid du Colombier int getch(void); 1662da9d879SDavid du Colombier void unget(char); 1672da9d879SDavid du Colombier char *getnext(int); 1682da9d879SDavid du Colombier void copy(char *); 1692da9d879SDavid du Colombier void clearif(struct indent *); 1702da9d879SDavid du Colombier char puttmp(char, int); 1712da9d879SDavid du Colombier void error(char *); 172*aade22e6SDavid du Colombier int cpp_comment(int); 173