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