|  | #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); |