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