xref: /freebsd/contrib/tcsh/gethost.c (revision 6560ac57ce879857203bc456cdc3849808dc0700)
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