12 struct str keywords[1024] = {
44 {13, "__attribute__"},
49 struct str typedefs[1024] = {
66 int main(argc, argv) int argc; char **argv; {
71 while (fgets(buf, sizeof(buf), stdin)) {
80 if (isalpha(q[m]) || q[m] == '_') {
82 while (isalnum(q[m]) || q[m] == '_')
84 if (m == 7 && memcmp(q, "include", 7) == 0) {
92 else if (p[l] == '"') {
95 fwrite(p, ++l, 1, stdout);
97 for (m = 0; p[m] && p[m] != e; ++m)
99 for (l = m; l > 0 && p[l - 1] != '/'; --l)
103 if (m >= 4 && memcmp(q, "nox_", 4) == 0) {
104 fwrite(p, l, 1, stdout);
109 (l != 0 || m != 8 || memcmp(p, "setjmp.h", 8) != 0) &&
110 (l != 0 || m != 8 || memcmp(p, "stdarg.h", 8) != 0) &&
111 (l != 0 || m != 8 || memcmp(p, "stdint.h", 8) != 0) &&
112 (l != 0 || m != 9 || memcmp(p, "varargs.h", 9) != 0)
115 fwrite(p, l, 1, stdout);
117 fwrite(p - 1, l + m + 2, 1, stderr); /* include <> or "" */
120 fwrite("../", 3, 1, stdout);
121 fwrite(p, l, 1, stdout);
122 fwrite(".xify/", 6, 1, stdout);
125 fwrite("x_", 2, 1, stdout);
134 else if (m == 6 && memcmp(q, "pragma", 6) == 0) {
135 while (isblank(q[m]))
139 if (isalpha(r[n]) || r[n] == '_') {
141 while (isalnum(r[n]) || r[n] == '_')
143 if (n == 7 && memcmp(r, "keyword", 7) == 0) {
144 while (isblank(r[n]))
148 while (isalpha(p[l]) || p[l] == '_') {
149 while (isalnum(p[l]) || p[l] == '_')
152 fwrite("keyword: ", 9, 1, stderr);
153 fwrite(p, l, 1, stderr);
156 if ((q = malloc(l)) == 0)
159 if (n_keywords >= sizeof(keywords) / sizeof(struct str))
161 keywords[n_keywords].str_len = l;
162 keywords[n_keywords].str_data = q;
164 while (isblank(p[l]))
170 fprintf(stderr, "%s: warning: garbage after #pragma keyword: ", argv[0]);
171 while (p[l] && p[l] != '\n')
172 putc(p[l++], stderr);
177 else if (n == 7 && memcmp(r, "typedef", 7) == 0) {
178 while (isblank(r[n]))
182 while (isalpha(p[l]) || p[l] == '_') {
183 while (isalnum(p[l]) || p[l] == '_')
186 fwrite("typedef: ", 9, 1, stderr);
187 fwrite(p, l, 1, stderr);
190 if ((q = malloc(l)) == 0)
193 /* typedefs notified through #pragma are also keywords */
194 /* this isn't the case for typedefs we notice ourselves */
195 if (n_keywords >= sizeof(keywords) / sizeof(struct str))
197 keywords[n_keywords].str_len = l;
198 keywords[n_keywords].str_data = q;
200 if (n_typedefs >= sizeof(typedefs) / sizeof(struct str))
202 typedefs[n_typedefs].str_len = l;
203 typedefs[n_typedefs].str_data = q;
205 while (isblank(p[l]))
211 fprintf(stderr, "%s: warning: garbage after #pragma typedef: ", argv[0]);
212 while (p[l] && p[l] != '\n')
213 putc(p[l++], stderr);
219 fwrite(p, l, 1, stdout);
220 fputs(p + l + m, stdout);
225 fwrite(p, l, 1, stdout);
231 if (isalpha(p[l]) || p[l] == '_') {
233 while (isalnum(p[l]) || p[l] == '_')
236 (l == 6 && memcmp(p, "extern", 6) == 0) ||
237 (l == 8 && memcmp(p, "register", 8) == 0) ||
238 (l == 6 && memcmp(p, "static", 6) == 0)
240 fwrite(p, l, 1, stdout);
243 while (isblank(p[l]))
247 if (isalpha(q[m]) || q[m] == '_') {
249 while (isalnum(q[m]) || q[m] == '_')
251 for (i = 0; i < n_typedefs; ++i)
253 m == typedefs[i].str_len &&
254 memcmp(q, typedefs[i].str_data, m) == 0
259 while (isblank(q[m]))
261 if (q[m] != '*') /* avoid something like: register FILE *fp; */
262 fwrite(" x_int", 6, 1, stdout);
266 else /* maybe something like: register *p; */
267 fwrite(" x_int", 6, 1, stdout);
269 else if (l == 3 && memcmp(p, "int", 3) == 0) {
270 fwrite("x_int", 5, 1, stdout);
275 (l == 5 && memcmp(p, "short", 5) == 0) ||
276 (l == 4 && memcmp(p, "long", 4) == 0)
278 fwrite("x_", 2, 1, stdout);
279 fwrite(p, l, 1, stdout);
282 while (isblank(p[l]))
286 if (isalpha(q[m]) || q[m] == '_') {
288 while (isalnum(q[m]) || q[m] == '_')
290 if (m == 3 && memcmp(q, "int", 3) == 0) {
296 else if (l == 8 && memcmp(p, "unsigned", 8) == 0) {
297 while (isblank(p[l]))
301 if (isalpha(q[m]) || q[m] == '_') {
303 while (isalnum(q[m]) || q[m] == '_')
305 if (m == 3 && memcmp(q, "int", 3) == 0) {
306 fwrite("x_unsigned_int", 14, 1, stdout);
311 (m == 5 && memcmp(q, "short", 5) == 0) ||
312 (m == 4 && memcmp(q, "long", 4) == 0)
314 fwrite("x_unsigned_", 11, 1, stdout);
315 fwrite(q, m, 1, stdout);
318 while (isblank(p[l]))
322 if (isalpha(q[m]) || q[m] == '_') {
324 while (isalnum(q[m]) || q[m] == '_')
326 if (m == 3 && memcmp(q, "int", 3) == 0) {
332 else if (m != 4 || memcmp(q, "char", 4) != 0) {
333 fwrite("x_unsigned_int", 14, 1, stdout);
339 else if (l >= 4 && memcmp(p, "nox_", 4) == 0) {
344 for (i = 0; i < n_keywords; ++i)
346 l == keywords[i].str_len &&
347 memcmp(p, keywords[i].str_data, l) == 0
350 fwrite("x_", 2, 1, stdout);
355 else if (p[l] == '.' && isdigit(p[l + 1])) {
359 else if (p[l] == '0' && (p[l + 1] == 'x' || p[l + 1] == 'X')) {
361 while (isxdigit(p[l]))
365 else if (isdigit(p[l])) {
367 while (isdigit(p[l]))
372 while (isdigit(p[l]))
374 if (p[l] == 'E' || p[l] == 'e' || p[l] == 'D' || p[l] == 'd')
377 else if (p[l] == 'E' || p[l] == 'e' || p[l] == 'D' || p[l] == 'd') {
380 if (p[l] == '+' || p[l] == '-')
382 while (isdigit(p[l]))
387 if (p[l] == 'U' || p[l] == 'u')
389 if (p[l] == 'L' || p[l] == 'l')
393 else if (p[l] == '\'' || p[l] == '"') {
399 fwrite(p, l, 1, stdout);
400 if (fgets(buf, sizeof(buf), stdin) == 0)
410 else if (p[l] == '/' && p[l + 1] == '*') {
412 while (p[l] != '*' || p[l + 1] != '/')
414 fwrite(p, l, 1, stdout);
415 if (fgets(buf, sizeof(buf), stdin) == 0)
426 fwrite(p, l, 1, stdout);