1c80476e4SDavid E. O'Brien /*
2c80476e4SDavid E. O'Brien * gethost.c: Create version file from prototype
3c80476e4SDavid E. O'Brien */
4c80476e4SDavid E. O'Brien /*-
5c80476e4SDavid E. O'Brien * Copyright (c) 1980, 1991 The Regents of the University of California.
6c80476e4SDavid E. O'Brien * All rights reserved.
7c80476e4SDavid E. O'Brien *
8c80476e4SDavid E. O'Brien * Redistribution and use in source and binary forms, with or without
9c80476e4SDavid E. O'Brien * modification, are permitted provided that the following conditions
10c80476e4SDavid E. O'Brien * are met:
11c80476e4SDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright
12c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer.
13c80476e4SDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright
14c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the
15c80476e4SDavid E. O'Brien * documentation and/or other materials provided with the distribution.
1629301572SMark Peek * 3. Neither the name of the University nor the names of its contributors
17c80476e4SDavid E. O'Brien * may be used to endorse or promote products derived from this software
18c80476e4SDavid E. O'Brien * without specific prior written permission.
19c80476e4SDavid E. O'Brien *
20c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30c80476e4SDavid E. O'Brien * SUCH DAMAGE.
31c80476e4SDavid E. O'Brien */
32c80476e4SDavid E. O'Brien #include "sh.h"
33c80476e4SDavid E. O'Brien
34c80476e4SDavid E. O'Brien #ifdef SCO
35c80476e4SDavid E. O'Brien # define perror __perror
36c80476e4SDavid E. O'Brien # define rename __rename
37c80476e4SDavid E. O'Brien # define getopt __getopt
38c80476e4SDavid E. O'Brien # define system __system
39c80476e4SDavid E. O'Brien #endif
40c80476e4SDavid E. O'Brien #include <stdio.h>
41c80476e4SDavid E. O'Brien #ifdef SCO
42c80476e4SDavid E. O'Brien # undef perror
43c80476e4SDavid E. O'Brien # undef rename
44c80476e4SDavid E. O'Brien # undef getopt
45c80476e4SDavid E. O'Brien # undef system
46c80476e4SDavid E. O'Brien #endif
47c80476e4SDavid E. O'Brien
48c80476e4SDavid E. O'Brien #include <ctype.h>
49c80476e4SDavid E. O'Brien
50c80476e4SDavid E. O'Brien #define ISSPACE(p) (isspace((unsigned char) (p)) && (p) != '\n')
51c80476e4SDavid E. O'Brien
52c80476e4SDavid E. O'Brien /*
53c80476e4SDavid E. O'Brien * We cannot do that, because some compilers like #line and others
54c80476e4SDavid E. O'Brien * like # <lineno>
55c80476e4SDavid E. O'Brien * #define LINEDIRECTIVE
56c80476e4SDavid E. O'Brien */
57c80476e4SDavid E. O'Brien
58c80476e4SDavid E. O'Brien static const char *keyword[] =
59c80476e4SDavid E. O'Brien {
60c80476e4SDavid E. O'Brien "vendor",
61c80476e4SDavid E. O'Brien #define T_VENDOR 0
62c80476e4SDavid E. O'Brien "hosttype",
63c80476e4SDavid E. O'Brien #define T_HOSTTYPE 1
64c80476e4SDavid E. O'Brien "machtype",
65c80476e4SDavid E. O'Brien #define T_MACHTYPE 2
66c80476e4SDavid E. O'Brien "ostype",
67c80476e4SDavid E. O'Brien #define T_OSTYPE 3
68c80476e4SDavid E. O'Brien "newdef",
69c80476e4SDavid E. O'Brien #define T_NEWDEF 4
70c80476e4SDavid E. O'Brien "enddef",
71c80476e4SDavid E. O'Brien #define T_ENDDEF 5
72c80476e4SDavid E. O'Brien "newcode",
73c80476e4SDavid E. O'Brien #define T_NEWCODE 6
74c80476e4SDavid E. O'Brien "endcode",
75c80476e4SDavid E. O'Brien #define T_ENDCODE 7
76c80476e4SDavid E. O'Brien "comment",
77c80476e4SDavid E. O'Brien #define T_COMMENT 8
78c80476e4SDavid E. O'Brien "macro",
79c80476e4SDavid E. O'Brien #define T_MACRO 9
80c80476e4SDavid E. O'Brien NULL
81c80476e4SDavid E. O'Brien #define T_NONE 10
82c80476e4SDavid E. O'Brien };
83c80476e4SDavid E. O'Brien
84c80476e4SDavid E. O'Brien #define S_DISCARD 0
85c80476e4SDavid E. O'Brien #define S_COMMENT 1
86c80476e4SDavid E. O'Brien #define S_CODE 2
87c80476e4SDavid E. O'Brien #define S_KEYWORD 3
88c80476e4SDavid E. O'Brien
8945e5710bSMark Peek static int findtoken (char *);
9045e5710bSMark Peek static char *gettoken (char **, char *);
919ccc37e3SMark Peek static char *pname;
92c80476e4SDavid E. O'Brien
9345e5710bSMark Peek int main (int, char *[]);
94c80476e4SDavid E. O'Brien
95c80476e4SDavid E. O'Brien /* findtoken():
96c80476e4SDavid E. O'Brien * Return the token number of the given token
97c80476e4SDavid E. O'Brien */
98c80476e4SDavid E. O'Brien static int
findtoken(char * ptr)9945e5710bSMark Peek findtoken(char *ptr)
100c80476e4SDavid E. O'Brien {
101c80476e4SDavid E. O'Brien int i;
102c80476e4SDavid E. O'Brien
103c80476e4SDavid E. O'Brien if (ptr == NULL || *ptr == '\0')
104c80476e4SDavid E. O'Brien return T_NONE;
105c80476e4SDavid E. O'Brien
106c80476e4SDavid E. O'Brien for (i = 0; keyword[i] != NULL; i++)
107c80476e4SDavid E. O'Brien if (strcmp(keyword[i], ptr) == 0)
108c80476e4SDavid E. O'Brien return i;
109c80476e4SDavid E. O'Brien
110c80476e4SDavid E. O'Brien return T_NONE;
111c80476e4SDavid E. O'Brien }
112c80476e4SDavid E. O'Brien
113c80476e4SDavid E. O'Brien
114c80476e4SDavid E. O'Brien /* gettoken():
115c80476e4SDavid E. O'Brien * Get : delimited token and remove leading/trailing blanks/newlines
116c80476e4SDavid E. O'Brien */
117c80476e4SDavid E. O'Brien static char *
gettoken(char ** pptr,char * token)11845e5710bSMark Peek gettoken(char **pptr, char *token)
119c80476e4SDavid E. O'Brien {
120c80476e4SDavid E. O'Brien char *ptr = *pptr;
121c80476e4SDavid E. O'Brien char *tok = token;
122c80476e4SDavid E. O'Brien
123c80476e4SDavid E. O'Brien for (; *ptr && ISSPACE(*ptr); ptr++)
124c80476e4SDavid E. O'Brien continue;
125c80476e4SDavid E. O'Brien
126c80476e4SDavid E. O'Brien for (; *ptr && *ptr != ':'; *tok++ = *ptr++)
127c80476e4SDavid E. O'Brien continue;
128c80476e4SDavid E. O'Brien
129c80476e4SDavid E. O'Brien if (*ptr == ':')
130c80476e4SDavid E. O'Brien ptr++;
131c80476e4SDavid E. O'Brien else
132c80476e4SDavid E. O'Brien tok--;
133c80476e4SDavid E. O'Brien
134c80476e4SDavid E. O'Brien for (tok--; tok >= token && *tok && ISSPACE(*tok); tok--)
135c80476e4SDavid E. O'Brien continue;
136c80476e4SDavid E. O'Brien
137c80476e4SDavid E. O'Brien *++tok = '\0';
138c80476e4SDavid E. O'Brien
139c80476e4SDavid E. O'Brien *pptr = ptr;
140c80476e4SDavid E. O'Brien return token;
141c80476e4SDavid E. O'Brien }
142c80476e4SDavid E. O'Brien
1439ccc37e3SMark Peek static char *
cat(const char * a,const char * b,size_t len)1449ccc37e3SMark Peek cat(const char *a, const char *b, size_t len)
1459ccc37e3SMark Peek {
1469ccc37e3SMark Peek size_t l;
1479ccc37e3SMark Peek char *r;
1489ccc37e3SMark Peek
1499ccc37e3SMark Peek if (len == 0)
150*19d2e3deSDmitry Chagin len = strlen(b) + 1;
151*19d2e3deSDmitry Chagin if (a)
152*19d2e3deSDmitry Chagin l = strlen(a) + len;
153*19d2e3deSDmitry Chagin else
154*19d2e3deSDmitry Chagin l = len;
1559ccc37e3SMark Peek if ((r = malloc(l)) == NULL)
1569ccc37e3SMark Peek abort();
157*19d2e3deSDmitry Chagin if (a)
1589ccc37e3SMark Peek snprintf(r, l, "%s%.*s", a, (int)len, b);
159*19d2e3deSDmitry Chagin else
160*19d2e3deSDmitry Chagin snprintf(r, l, "%.*s", (int)len, b);
1619ccc37e3SMark Peek return r;
1629ccc37e3SMark Peek }
1639ccc37e3SMark Peek
1649ccc37e3SMark Peek static const char *
explode(const char * defs)1659ccc37e3SMark Peek explode(const char *defs)
1669ccc37e3SMark Peek {
1679ccc37e3SMark Peek static const char def[] = "defined("; /* ) */
1689ccc37e3SMark Peek static char *buf;
1699ccc37e3SMark Peek size_t len;
1709ccc37e3SMark Peek const char *ptr, *bptr, *eptr = NULL, *name;
1719ccc37e3SMark Peek
1729ccc37e3SMark Peek if (strstr(defs, "#machine(" /* ) */))
1739ccc37e3SMark Peek return defs;
174*19d2e3deSDmitry Chagin if (!strstr(defs, def))
175*19d2e3deSDmitry Chagin return defs;
1769ccc37e3SMark Peek
1779ccc37e3SMark Peek free(buf);
178*19d2e3deSDmitry Chagin buf = NULL;
1799ccc37e3SMark Peek for (ptr = defs; (bptr = strstr(ptr, def)) != NULL; ptr = eptr + 1) {
1809ccc37e3SMark Peek if (ptr != bptr)
181*19d2e3deSDmitry Chagin buf = cat(buf, ptr, bptr - ptr + 1);
182*19d2e3deSDmitry Chagin buf = cat(buf, "(", 0); /* ) */
1839ccc37e3SMark Peek if ((eptr = strchr(ptr + sizeof(def) - 1, ')')) == NULL) {
1849ccc37e3SMark Peek (void) fprintf(stderr, "%s: missing close paren `%s'\n",
1859ccc37e3SMark Peek pname, defs);
186*19d2e3deSDmitry Chagin free(buf);
1879ccc37e3SMark Peek return defs;
1889ccc37e3SMark Peek }
1899ccc37e3SMark Peek buf = cat(buf, bptr, eptr - bptr + 1);
1909ccc37e3SMark Peek name = bptr + sizeof(def) - 1;
1919ccc37e3SMark Peek len = eptr - name;
1929ccc37e3SMark Peek if (len < 1) {
1939ccc37e3SMark Peek (void) fprintf(stderr, "%s: empty define `%s'\n",
1949ccc37e3SMark Peek pname, defs);
195*19d2e3deSDmitry Chagin free(buf);
1969ccc37e3SMark Peek return defs;
1979ccc37e3SMark Peek }
198*19d2e3deSDmitry Chagin if (*name != '_' && (*name != 'M' && name[1] != '_')) {
1999ccc37e3SMark Peek char *undername = malloc(len + 10);
200*19d2e3deSDmitry Chagin if (undername == NULL)
201*19d2e3deSDmitry Chagin abort();
202*19d2e3deSDmitry Chagin buf = cat(buf, ") || defined(", 0);
2039ccc37e3SMark Peek snprintf(undername, len + 10, "__%.*s__)", (int)len,
2049ccc37e3SMark Peek name);
2059ccc37e3SMark Peek buf = cat(buf, undername, len + 5);
206*19d2e3deSDmitry Chagin buf = cat(buf, ") || defined(", 0);
2079ccc37e3SMark Peek snprintf(undername, len + 10, "__%.*s)", (int)len,
2089ccc37e3SMark Peek name);
2099ccc37e3SMark Peek buf = cat(buf, undername, len + 3);
2109ccc37e3SMark Peek }
211*19d2e3deSDmitry Chagin buf = cat(buf, "))", 0);
2129ccc37e3SMark Peek }
2139ccc37e3SMark Peek if (!eptr) {
2149ccc37e3SMark Peek (void) fprintf(stderr, "%s: invalid input `%s'\n", pname, defs);
2159ccc37e3SMark Peek return defs;
2169ccc37e3SMark Peek }
2179ccc37e3SMark Peek buf = cat(buf, eptr + 1, 0);
2189ccc37e3SMark Peek return buf;
2199ccc37e3SMark Peek }
2209ccc37e3SMark Peek
221c80476e4SDavid E. O'Brien
222c80476e4SDavid E. O'Brien int
main(int argc,char * argv[])22345e5710bSMark Peek main(int argc, char *argv[])
224c80476e4SDavid E. O'Brien {
225c80476e4SDavid E. O'Brien char line[INBUFSIZE];
226b2d5d167SMark Peek const char *fname = "stdin";
227c80476e4SDavid E. O'Brien char *ptr, *tok;
228c80476e4SDavid E. O'Brien char defs[INBUFSIZE];
229c80476e4SDavid E. O'Brien char stmt[INBUFSIZE];
230c80476e4SDavid E. O'Brien FILE *fp = stdin;
231c80476e4SDavid E. O'Brien int lineno = 0;
232c80476e4SDavid E. O'Brien int inprocess = 0;
233c80476e4SDavid E. O'Brien int token, state;
234c80476e4SDavid E. O'Brien int errs = 0;
235c80476e4SDavid E. O'Brien
236c80476e4SDavid E. O'Brien if ((pname = strrchr(argv[0], '/')) == NULL)
237c80476e4SDavid E. O'Brien pname = argv[0];
238c80476e4SDavid E. O'Brien else
239c80476e4SDavid E. O'Brien pname++;
240c80476e4SDavid E. O'Brien
241c80476e4SDavid E. O'Brien if (argc > 2) {
242c80476e4SDavid E. O'Brien (void) fprintf(stderr, "Usage: %s [<filename>]\n", pname);
243c80476e4SDavid E. O'Brien return 1;
244c80476e4SDavid E. O'Brien }
245c80476e4SDavid E. O'Brien
246c80476e4SDavid E. O'Brien if (argc == 2)
247c80476e4SDavid E. O'Brien if ((fp = fopen(fname = argv[1], "r")) == NULL) {
248c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: Cannot open `%s'\n", pname, fname);
249c80476e4SDavid E. O'Brien return 1;
250c80476e4SDavid E. O'Brien }
251c80476e4SDavid E. O'Brien
252c80476e4SDavid E. O'Brien state = S_DISCARD;
253c80476e4SDavid E. O'Brien
254c80476e4SDavid E. O'Brien while ((ptr = fgets(line, sizeof(line), fp)) != NULL) {
255c80476e4SDavid E. O'Brien lineno++;
256c80476e4SDavid E. O'Brien switch (token = findtoken(gettoken(&ptr, defs))) {
257c80476e4SDavid E. O'Brien case T_NEWCODE:
258c80476e4SDavid E. O'Brien state = S_CODE;
259c80476e4SDavid E. O'Brien break;
260c80476e4SDavid E. O'Brien
261c80476e4SDavid E. O'Brien case T_ENDCODE:
262c80476e4SDavid E. O'Brien state = S_DISCARD;
263c80476e4SDavid E. O'Brien break;
264c80476e4SDavid E. O'Brien
265c80476e4SDavid E. O'Brien case T_COMMENT:
266c80476e4SDavid E. O'Brien state = S_COMMENT;
267c80476e4SDavid E. O'Brien break;
268c80476e4SDavid E. O'Brien
269c80476e4SDavid E. O'Brien case T_NEWDEF:
270c80476e4SDavid E. O'Brien state = S_KEYWORD;
271c80476e4SDavid E. O'Brien break;
272c80476e4SDavid E. O'Brien
273c80476e4SDavid E. O'Brien case T_ENDDEF:
274c80476e4SDavid E. O'Brien state = S_DISCARD;
275c80476e4SDavid E. O'Brien break;
276c80476e4SDavid E. O'Brien
277c80476e4SDavid E. O'Brien case T_VENDOR:
278c80476e4SDavid E. O'Brien state = S_KEYWORD;
279c80476e4SDavid E. O'Brien break;
280c80476e4SDavid E. O'Brien
281c80476e4SDavid E. O'Brien case T_HOSTTYPE:
282c80476e4SDavid E. O'Brien state = S_KEYWORD;
283c80476e4SDavid E. O'Brien break;
284c80476e4SDavid E. O'Brien
285c80476e4SDavid E. O'Brien case T_MACHTYPE:
286c80476e4SDavid E. O'Brien state = S_KEYWORD;
287c80476e4SDavid E. O'Brien break;
288c80476e4SDavid E. O'Brien
289c80476e4SDavid E. O'Brien case T_OSTYPE:
290c80476e4SDavid E. O'Brien state = S_KEYWORD;
291c80476e4SDavid E. O'Brien break;
292c80476e4SDavid E. O'Brien
293c80476e4SDavid E. O'Brien case T_MACRO:
294c80476e4SDavid E. O'Brien if (gettoken(&ptr, defs) == NULL) {
295c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Missing macro name\n",
296c80476e4SDavid E. O'Brien pname, fname, lineno);
297c80476e4SDavid E. O'Brien break;
298c80476e4SDavid E. O'Brien }
299c80476e4SDavid E. O'Brien if (gettoken(&ptr, stmt) == NULL) {
300c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Missing macro body\n",
301c80476e4SDavid E. O'Brien pname, fname, lineno);
302c80476e4SDavid E. O'Brien break;
303c80476e4SDavid E. O'Brien }
304*19d2e3deSDmitry Chagin (void) fprintf(stdout, "\n#if %s\n# define %s\n#endif\n\n",
305*19d2e3deSDmitry Chagin explode(stmt), defs);
306c80476e4SDavid E. O'Brien break;
307c80476e4SDavid E. O'Brien
308c80476e4SDavid E. O'Brien case T_NONE:
3099ccc37e3SMark Peek if (state != S_CODE && *defs != '\0') {
310c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Discarded\n",
311c80476e4SDavid E. O'Brien pname, fname, lineno);
312c80476e4SDavid E. O'Brien if (++errs == 30) {
313c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: Too many errors\n", pname);
314c80476e4SDavid E. O'Brien return 1;
315c80476e4SDavid E. O'Brien }
316c80476e4SDavid E. O'Brien break;
317c80476e4SDavid E. O'Brien }
318c80476e4SDavid E. O'Brien (void) fprintf(stdout, "%s", line);
319c80476e4SDavid E. O'Brien break;
320c80476e4SDavid E. O'Brien
321c80476e4SDavid E. O'Brien default:
322c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected token\n",
323c80476e4SDavid E. O'Brien pname, fname, lineno);
324c80476e4SDavid E. O'Brien return 1;
325c80476e4SDavid E. O'Brien }
326c80476e4SDavid E. O'Brien
327c80476e4SDavid E. O'Brien switch (state) {
328c80476e4SDavid E. O'Brien case S_DISCARD:
329c80476e4SDavid E. O'Brien if (inprocess) {
330c80476e4SDavid E. O'Brien inprocess = 0;
331c80476e4SDavid E. O'Brien (void) fprintf(stdout, "#endif\n");
332c80476e4SDavid E. O'Brien }
333c80476e4SDavid E. O'Brien break;
334c80476e4SDavid E. O'Brien
335c80476e4SDavid E. O'Brien case S_KEYWORD:
336c80476e4SDavid E. O'Brien tok = gettoken(&ptr, defs);
337c80476e4SDavid E. O'Brien if (token == T_NEWDEF) {
338c80476e4SDavid E. O'Brien if (inprocess) {
339c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n",
340c80476e4SDavid E. O'Brien pname, fname, lineno);
341c80476e4SDavid E. O'Brien return 1;
342c80476e4SDavid E. O'Brien }
343c80476e4SDavid E. O'Brien if (tok == NULL) {
344c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: No defs\n",
345c80476e4SDavid E. O'Brien pname, fname, lineno);
346c80476e4SDavid E. O'Brien return 1;
347c80476e4SDavid E. O'Brien }
348c80476e4SDavid E. O'Brien (void) fprintf(stdout, "\n\n");
349c80476e4SDavid E. O'Brien #ifdef LINEDIRECTIVE
350c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname);
351c80476e4SDavid E. O'Brien #endif /* LINEDIRECTIVE */
352*19d2e3deSDmitry Chagin (void) fprintf(stdout, "#if (%s)\n", explode(defs));
353c80476e4SDavid E. O'Brien inprocess = 1;
354c80476e4SDavid E. O'Brien }
355c80476e4SDavid E. O'Brien else {
356c80476e4SDavid E. O'Brien if (tok && *tok)
357c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# if (%s) && !defined(_%s_)\n",
3589ccc37e3SMark Peek explode(defs), keyword[token]);
359c80476e4SDavid E. O'Brien else
360c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# if !defined(_%s_)\n",
361c80476e4SDavid E. O'Brien keyword[token]);
362c80476e4SDavid E. O'Brien
363c80476e4SDavid E. O'Brien if (gettoken(&ptr, stmt) == NULL) {
364c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: No statement\n",
365c80476e4SDavid E. O'Brien pname, fname, lineno);
366c80476e4SDavid E. O'Brien return 1;
367c80476e4SDavid E. O'Brien }
368c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# define _%s_\n", keyword[token]);
369c80476e4SDavid E. O'Brien (void) fprintf(stdout, " %s = %s;\n", keyword[token], stmt);
370c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# endif\n");
371c80476e4SDavid E. O'Brien }
372c80476e4SDavid E. O'Brien break;
373c80476e4SDavid E. O'Brien
374c80476e4SDavid E. O'Brien case S_COMMENT:
375c80476e4SDavid E. O'Brien if (gettoken(&ptr, defs))
376c80476e4SDavid E. O'Brien (void) fprintf(stdout, " /* %s */\n", defs);
377c80476e4SDavid E. O'Brien break;
378c80476e4SDavid E. O'Brien
379c80476e4SDavid E. O'Brien case S_CODE:
380c80476e4SDavid E. O'Brien if (token == T_NEWCODE) {
381c80476e4SDavid E. O'Brien #ifdef LINEDIRECTIVE
382c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname);
383c80476e4SDavid E. O'Brien #endif /* LINEDIRECTIVE */
384c80476e4SDavid E. O'Brien }
385c80476e4SDavid E. O'Brien break;
386c80476e4SDavid E. O'Brien
387c80476e4SDavid E. O'Brien default:
388c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected state\n",
389c80476e4SDavid E. O'Brien pname, fname, lineno);
390c80476e4SDavid E. O'Brien return 1;
391c80476e4SDavid E. O'Brien }
392c80476e4SDavid E. O'Brien }
393c80476e4SDavid E. O'Brien
394c80476e4SDavid E. O'Brien if (inprocess) {
395c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n",
396c80476e4SDavid E. O'Brien pname, fname, lineno);
397c80476e4SDavid E. O'Brien return 1;
398c80476e4SDavid E. O'Brien }
399c80476e4SDavid E. O'Brien
400c80476e4SDavid E. O'Brien if (fp != stdin)
401c80476e4SDavid E. O'Brien (void) fclose(fp);
402c80476e4SDavid E. O'Brien
403c80476e4SDavid E. O'Brien return 0;
404c80476e4SDavid E. O'Brien }
405