xref: /dragonfly/contrib/tcsh-6/gethost.c (revision d6ab524c)
17d8fb588SMatthias Schmidt /*
27d8fb588SMatthias Schmidt  * gethost.c: Create version file from prototype
37d8fb588SMatthias Schmidt  */
47d8fb588SMatthias Schmidt /*-
57d8fb588SMatthias Schmidt  * Copyright (c) 1980, 1991 The Regents of the University of California.
67d8fb588SMatthias Schmidt  * All rights reserved.
77d8fb588SMatthias Schmidt  *
87d8fb588SMatthias Schmidt  * Redistribution and use in source and binary forms, with or without
97d8fb588SMatthias Schmidt  * modification, are permitted provided that the following conditions
107d8fb588SMatthias Schmidt  * are met:
117d8fb588SMatthias Schmidt  * 1. Redistributions of source code must retain the above copyright
127d8fb588SMatthias Schmidt  *    notice, this list of conditions and the following disclaimer.
137d8fb588SMatthias Schmidt  * 2. Redistributions in binary form must reproduce the above copyright
147d8fb588SMatthias Schmidt  *    notice, this list of conditions and the following disclaimer in the
157d8fb588SMatthias Schmidt  *    documentation and/or other materials provided with the distribution.
167d8fb588SMatthias Schmidt  * 3. Neither the name of the University nor the names of its contributors
177d8fb588SMatthias Schmidt  *    may be used to endorse or promote products derived from this software
187d8fb588SMatthias Schmidt  *    without specific prior written permission.
197d8fb588SMatthias Schmidt  *
207d8fb588SMatthias Schmidt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
217d8fb588SMatthias Schmidt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
227d8fb588SMatthias Schmidt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
237d8fb588SMatthias Schmidt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
247d8fb588SMatthias Schmidt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
257d8fb588SMatthias Schmidt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
267d8fb588SMatthias Schmidt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
277d8fb588SMatthias Schmidt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
287d8fb588SMatthias Schmidt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
297d8fb588SMatthias Schmidt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
307d8fb588SMatthias Schmidt  * SUCH DAMAGE.
317d8fb588SMatthias Schmidt  */
327d8fb588SMatthias Schmidt #include "sh.h"
337d8fb588SMatthias Schmidt 
347d8fb588SMatthias Schmidt #ifdef SCO
357d8fb588SMatthias Schmidt # define perror __perror
367d8fb588SMatthias Schmidt # define rename __rename
377d8fb588SMatthias Schmidt # define getopt __getopt
387d8fb588SMatthias Schmidt # define system __system
397d8fb588SMatthias Schmidt #endif
407d8fb588SMatthias Schmidt #include <stdio.h>
417d8fb588SMatthias Schmidt #ifdef SCO
427d8fb588SMatthias Schmidt # undef perror
437d8fb588SMatthias Schmidt # undef rename
447d8fb588SMatthias Schmidt # undef getopt
457d8fb588SMatthias Schmidt # undef system
467d8fb588SMatthias Schmidt #endif
477d8fb588SMatthias Schmidt 
487d8fb588SMatthias Schmidt #include <ctype.h>
497d8fb588SMatthias Schmidt 
507d8fb588SMatthias Schmidt #define ISSPACE(p)	(isspace((unsigned char) (p)) && (p) != '\n')
517d8fb588SMatthias Schmidt 
527d8fb588SMatthias Schmidt /*
537d8fb588SMatthias Schmidt  * We cannot do that, because some compilers like #line and others
547d8fb588SMatthias Schmidt  * like # <lineno>
557d8fb588SMatthias Schmidt  * #define LINEDIRECTIVE
567d8fb588SMatthias Schmidt  */
577d8fb588SMatthias Schmidt 
587d8fb588SMatthias Schmidt static const char *keyword[] =
597d8fb588SMatthias Schmidt {
607d8fb588SMatthias Schmidt     "vendor",
617d8fb588SMatthias Schmidt #define T_VENDOR	0
627d8fb588SMatthias Schmidt     "hosttype",
637d8fb588SMatthias Schmidt #define T_HOSTTYPE	1
647d8fb588SMatthias Schmidt     "machtype",
657d8fb588SMatthias Schmidt #define T_MACHTYPE	2
667d8fb588SMatthias Schmidt     "ostype",
677d8fb588SMatthias Schmidt #define T_OSTYPE	3
687d8fb588SMatthias Schmidt     "newdef",
697d8fb588SMatthias Schmidt #define T_NEWDEF	4
707d8fb588SMatthias Schmidt     "enddef",
717d8fb588SMatthias Schmidt #define T_ENDDEF	5
727d8fb588SMatthias Schmidt     "newcode",
737d8fb588SMatthias Schmidt #define T_NEWCODE	6
747d8fb588SMatthias Schmidt     "endcode",
757d8fb588SMatthias Schmidt #define T_ENDCODE	7
767d8fb588SMatthias Schmidt     "comment",
777d8fb588SMatthias Schmidt #define T_COMMENT	8
787d8fb588SMatthias Schmidt     "macro",
797d8fb588SMatthias Schmidt #define T_MACRO		9
807d8fb588SMatthias Schmidt     NULL
817d8fb588SMatthias Schmidt #define T_NONE		10
827d8fb588SMatthias Schmidt };
837d8fb588SMatthias Schmidt 
847d8fb588SMatthias Schmidt #define S_DISCARD	0
857d8fb588SMatthias Schmidt #define S_COMMENT	1
867d8fb588SMatthias Schmidt #define S_CODE		2
877d8fb588SMatthias Schmidt #define S_KEYWORD	3
887d8fb588SMatthias Schmidt 
897d8fb588SMatthias Schmidt static int findtoken (char *);
907d8fb588SMatthias Schmidt static char *gettoken (char **, char  *);
9194afa86dSJohn Marino static char *pname;
927d8fb588SMatthias Schmidt 
937d8fb588SMatthias Schmidt int main (int, char *[]);
947d8fb588SMatthias Schmidt 
957d8fb588SMatthias Schmidt /* findtoken():
967d8fb588SMatthias Schmidt  *	Return the token number of the given token
977d8fb588SMatthias Schmidt  */
987d8fb588SMatthias Schmidt static int
findtoken(char * ptr)997d8fb588SMatthias Schmidt findtoken(char *ptr)
1007d8fb588SMatthias Schmidt {
1017d8fb588SMatthias Schmidt     int i;
1027d8fb588SMatthias Schmidt 
1037d8fb588SMatthias Schmidt     if (ptr == NULL || *ptr == '\0')
1047d8fb588SMatthias Schmidt 	return T_NONE;
1057d8fb588SMatthias Schmidt 
1067d8fb588SMatthias Schmidt     for (i = 0; keyword[i] != NULL; i++)
1077d8fb588SMatthias Schmidt 	if (strcmp(keyword[i], ptr) == 0)
1087d8fb588SMatthias Schmidt 	    return i;
1097d8fb588SMatthias Schmidt 
1107d8fb588SMatthias Schmidt     return T_NONE;
1117d8fb588SMatthias Schmidt }
1127d8fb588SMatthias Schmidt 
1137d8fb588SMatthias Schmidt 
1147d8fb588SMatthias Schmidt /* gettoken():
1157d8fb588SMatthias Schmidt  *	Get : delimited token and remove leading/trailing blanks/newlines
1167d8fb588SMatthias Schmidt  */
1177d8fb588SMatthias Schmidt static char *
gettoken(char ** pptr,char * token)1187d8fb588SMatthias Schmidt gettoken(char **pptr, char *token)
1197d8fb588SMatthias Schmidt {
1207d8fb588SMatthias Schmidt     char *ptr = *pptr;
1217d8fb588SMatthias Schmidt     char *tok = token;
1227d8fb588SMatthias Schmidt 
1237d8fb588SMatthias Schmidt     for (; *ptr && ISSPACE(*ptr); ptr++)
1247d8fb588SMatthias Schmidt 	continue;
1257d8fb588SMatthias Schmidt 
1267d8fb588SMatthias Schmidt     for (; *ptr && *ptr != ':'; *tok++ = *ptr++)
1277d8fb588SMatthias Schmidt 	continue;
1287d8fb588SMatthias Schmidt 
1297d8fb588SMatthias Schmidt     if (*ptr == ':')
1307d8fb588SMatthias Schmidt 	ptr++;
1317d8fb588SMatthias Schmidt     else
1327d8fb588SMatthias Schmidt 	tok--;
1337d8fb588SMatthias Schmidt 
1347d8fb588SMatthias Schmidt     for (tok--; tok >= token && *tok && ISSPACE(*tok); tok--)
1357d8fb588SMatthias Schmidt 	continue;
1367d8fb588SMatthias Schmidt 
1377d8fb588SMatthias Schmidt     *++tok = '\0';
1387d8fb588SMatthias Schmidt 
1397d8fb588SMatthias Schmidt     *pptr = ptr;
1407d8fb588SMatthias Schmidt     return token;
1417d8fb588SMatthias Schmidt }
1427d8fb588SMatthias Schmidt 
14394afa86dSJohn Marino static char *
cat(const char * a,const char * b,size_t len)14494afa86dSJohn Marino cat(const char *a, const char *b, size_t len)
14594afa86dSJohn Marino {
14694afa86dSJohn Marino 	size_t l;
14794afa86dSJohn Marino 	char *r;
14894afa86dSJohn Marino 
14994afa86dSJohn Marino 	if (len == 0)
15060962bbcSJohn Marino 		len = strlen(b) + 1;
15160962bbcSJohn Marino 	if (a)
15260962bbcSJohn Marino 	    l = strlen(a) + len;
15360962bbcSJohn Marino 	else
15460962bbcSJohn Marino 	    l = len;
15594afa86dSJohn Marino 	if ((r = malloc(l)) == NULL)
15694afa86dSJohn Marino 		abort();
15760962bbcSJohn Marino 	if (a)
15894afa86dSJohn Marino 	    snprintf(r, l, "%s%.*s", a, (int)len, b);
15960962bbcSJohn Marino 	else
16060962bbcSJohn Marino 	    snprintf(r, l, "%.*s", (int)len, b);
16194afa86dSJohn Marino 	return r;
16294afa86dSJohn Marino }
16394afa86dSJohn Marino 
16494afa86dSJohn Marino static const char *
explode(const char * defs)16594afa86dSJohn Marino explode(const char *defs)
16694afa86dSJohn Marino {
16794afa86dSJohn Marino 	static const char def[] = "defined("; /* ) */
16894afa86dSJohn Marino 	static char *buf;
16994afa86dSJohn Marino 	size_t len;
17094afa86dSJohn Marino 	const char *ptr, *bptr, *eptr = NULL, *name;
17194afa86dSJohn Marino 
17294afa86dSJohn Marino 	if (strstr(defs, "#machine(" /* ) */))
17394afa86dSJohn Marino 		return defs;
17460962bbcSJohn Marino 	if (!strstr(defs, def))
17560962bbcSJohn Marino 		return defs;
17694afa86dSJohn Marino 
17794afa86dSJohn Marino 	free(buf);
17860962bbcSJohn Marino 	buf = NULL;
17994afa86dSJohn Marino 	for (ptr = defs; (bptr = strstr(ptr, def)) != NULL; ptr = eptr + 1) {
18094afa86dSJohn Marino 		if (ptr != bptr)
18160962bbcSJohn Marino 			buf = cat(buf, ptr, bptr - ptr + 1);
18260962bbcSJohn Marino 		buf = cat(buf, "(", 0); /* ) */
18394afa86dSJohn Marino 		if ((eptr = strchr(ptr + sizeof(def) - 1, ')')) == NULL) {
18494afa86dSJohn Marino 			(void) fprintf(stderr, "%s: missing close paren `%s'\n",
18594afa86dSJohn Marino 			    pname, defs);
18660962bbcSJohn Marino 			free(buf);
18794afa86dSJohn Marino 			return defs;
18894afa86dSJohn Marino 		}
18994afa86dSJohn Marino 		buf = cat(buf, bptr, eptr - bptr + 1);
19094afa86dSJohn Marino 		name = bptr + sizeof(def) - 1;
19194afa86dSJohn Marino 		len = eptr - name;
19294afa86dSJohn Marino 		if (len < 1) {
19394afa86dSJohn Marino 			(void) fprintf(stderr, "%s: empty define `%s'\n",
19494afa86dSJohn Marino 			    pname, defs);
19560962bbcSJohn Marino 			free(buf);
19694afa86dSJohn Marino 			return defs;
19794afa86dSJohn Marino 		}
19860962bbcSJohn Marino 		if (*name != '_' && (*name != 'M' && name[1] != '_')) {
19994afa86dSJohn Marino 			char *undername = malloc(len + 10);
20060962bbcSJohn Marino 			if (undername == NULL)
20160962bbcSJohn Marino 				abort();
20260962bbcSJohn Marino 			buf = cat(buf, ") || defined(", 0);
20394afa86dSJohn Marino 			snprintf(undername, len + 10, "__%.*s__)", (int)len,
20494afa86dSJohn Marino 			    name);
20594afa86dSJohn Marino 			buf = cat(buf, undername, len + 5);
20660962bbcSJohn Marino 			buf = cat(buf, ") || defined(", 0);
20794afa86dSJohn Marino 			snprintf(undername, len + 10, "__%.*s)", (int)len,
20894afa86dSJohn Marino 			    name);
20994afa86dSJohn Marino 			buf = cat(buf, undername, len + 3);
21094afa86dSJohn Marino 		}
21160962bbcSJohn Marino 		buf = cat(buf, "))", 0);
21294afa86dSJohn Marino 	}
21394afa86dSJohn Marino 	if (!eptr) {
21494afa86dSJohn Marino 	    (void) fprintf(stderr, "%s: invalid input `%s'\n", pname, defs);
21594afa86dSJohn Marino 	    return defs;
21694afa86dSJohn Marino         }
21794afa86dSJohn Marino 	buf = cat(buf, eptr + 1, 0);
21894afa86dSJohn Marino 	return buf;
21994afa86dSJohn Marino }
22094afa86dSJohn Marino 
2217d8fb588SMatthias Schmidt 
2227d8fb588SMatthias Schmidt int
main(int argc,char * argv[])2237d8fb588SMatthias Schmidt main(int argc, char *argv[])
2247d8fb588SMatthias Schmidt {
2257d8fb588SMatthias Schmidt     char line[INBUFSIZE];
2267d8fb588SMatthias Schmidt     const char *fname = "stdin";
2277d8fb588SMatthias Schmidt     char *ptr, *tok;
2287d8fb588SMatthias Schmidt     char defs[INBUFSIZE];
2297d8fb588SMatthias Schmidt     char stmt[INBUFSIZE];
2307d8fb588SMatthias Schmidt     FILE *fp = stdin;
2317d8fb588SMatthias Schmidt     int lineno = 0;
2327d8fb588SMatthias Schmidt     int inprocess = 0;
2337d8fb588SMatthias Schmidt     int token, state;
2347d8fb588SMatthias Schmidt     int errs = 0;
2357d8fb588SMatthias Schmidt 
2367d8fb588SMatthias Schmidt     if ((pname = strrchr(argv[0], '/')) == NULL)
2377d8fb588SMatthias Schmidt 	pname = argv[0];
2387d8fb588SMatthias Schmidt     else
2397d8fb588SMatthias Schmidt 	pname++;
2407d8fb588SMatthias Schmidt 
2417d8fb588SMatthias Schmidt     if (argc > 2) {
2427d8fb588SMatthias Schmidt 	(void) fprintf(stderr, "Usage: %s [<filename>]\n", pname);
2437d8fb588SMatthias Schmidt 	return 1;
2447d8fb588SMatthias Schmidt     }
2457d8fb588SMatthias Schmidt 
2467d8fb588SMatthias Schmidt     if (argc == 2)
2477d8fb588SMatthias Schmidt 	if ((fp = fopen(fname = argv[1], "r")) == NULL) {
2487d8fb588SMatthias Schmidt 	    (void) fprintf(stderr, "%s: Cannot open `%s'\n", pname, fname);
2497d8fb588SMatthias Schmidt 	    return 1;
2507d8fb588SMatthias Schmidt 	}
2517d8fb588SMatthias Schmidt 
2527d8fb588SMatthias Schmidt     state = S_DISCARD;
2537d8fb588SMatthias Schmidt 
2547d8fb588SMatthias Schmidt     while ((ptr = fgets(line, sizeof(line), fp)) != NULL) {
2557d8fb588SMatthias Schmidt 	lineno++;
2567d8fb588SMatthias Schmidt 	switch (token = findtoken(gettoken(&ptr, defs))) {
2577d8fb588SMatthias Schmidt 	case T_NEWCODE:
2587d8fb588SMatthias Schmidt 	    state = S_CODE;
2597d8fb588SMatthias Schmidt 	    break;
2607d8fb588SMatthias Schmidt 
2617d8fb588SMatthias Schmidt 	case T_ENDCODE:
2627d8fb588SMatthias Schmidt 	    state = S_DISCARD;
2637d8fb588SMatthias Schmidt 	    break;
2647d8fb588SMatthias Schmidt 
2657d8fb588SMatthias Schmidt 	case T_COMMENT:
2667d8fb588SMatthias Schmidt 	    state = S_COMMENT;
2677d8fb588SMatthias Schmidt 	    break;
2687d8fb588SMatthias Schmidt 
2697d8fb588SMatthias Schmidt 	case T_NEWDEF:
2707d8fb588SMatthias Schmidt 	    state = S_KEYWORD;
2717d8fb588SMatthias Schmidt 	    break;
2727d8fb588SMatthias Schmidt 
2737d8fb588SMatthias Schmidt 	case T_ENDDEF:
2747d8fb588SMatthias Schmidt 	    state = S_DISCARD;
2757d8fb588SMatthias Schmidt 	    break;
2767d8fb588SMatthias Schmidt 
2777d8fb588SMatthias Schmidt 	case T_VENDOR:
2787d8fb588SMatthias Schmidt 	    state = S_KEYWORD;
2797d8fb588SMatthias Schmidt 	    break;
2807d8fb588SMatthias Schmidt 
2817d8fb588SMatthias Schmidt 	case T_HOSTTYPE:
2827d8fb588SMatthias Schmidt 	    state = S_KEYWORD;
2837d8fb588SMatthias Schmidt 	    break;
2847d8fb588SMatthias Schmidt 
2857d8fb588SMatthias Schmidt 	case T_MACHTYPE:
2867d8fb588SMatthias Schmidt 	    state = S_KEYWORD;
2877d8fb588SMatthias Schmidt 	    break;
2887d8fb588SMatthias Schmidt 
2897d8fb588SMatthias Schmidt 	case T_OSTYPE:
2907d8fb588SMatthias Schmidt 	    state = S_KEYWORD;
2917d8fb588SMatthias Schmidt 	    break;
2927d8fb588SMatthias Schmidt 
2937d8fb588SMatthias Schmidt 	case T_MACRO:
2947d8fb588SMatthias Schmidt 	    if (gettoken(&ptr, defs) == NULL) {
2957d8fb588SMatthias Schmidt 		(void) fprintf(stderr, "%s: \"%s\", %d: Missing macro name\n",
2967d8fb588SMatthias Schmidt 			       pname, fname, lineno);
2977d8fb588SMatthias Schmidt 		break;
2987d8fb588SMatthias Schmidt 	    }
2997d8fb588SMatthias Schmidt 	    if (gettoken(&ptr, stmt) == NULL) {
3007d8fb588SMatthias Schmidt 		(void) fprintf(stderr, "%s: \"%s\", %d: Missing macro body\n",
3017d8fb588SMatthias Schmidt 			       pname, fname, lineno);
3027d8fb588SMatthias Schmidt 		break;
3037d8fb588SMatthias Schmidt 	    }
30460962bbcSJohn Marino 	    (void) fprintf(stdout, "\n#if %s\n# define %s\n#endif\n\n",
30560962bbcSJohn Marino 		explode(stmt), defs);
3067d8fb588SMatthias Schmidt 	    break;
3077d8fb588SMatthias Schmidt 
3087d8fb588SMatthias Schmidt 	case T_NONE:
30994afa86dSJohn Marino 	    if (state != S_CODE && *defs != '\0') {
3107d8fb588SMatthias Schmidt 		(void) fprintf(stderr, "%s: \"%s\", %d: Discarded\n",
3117d8fb588SMatthias Schmidt 			       pname, fname, lineno);
3127d8fb588SMatthias Schmidt 		if (++errs == 30) {
3137d8fb588SMatthias Schmidt 		    (void) fprintf(stderr, "%s: Too many errors\n", pname);
3147d8fb588SMatthias Schmidt 		    return 1;
3157d8fb588SMatthias Schmidt 		}
3167d8fb588SMatthias Schmidt 		break;
3177d8fb588SMatthias Schmidt 	    }
3187d8fb588SMatthias Schmidt 	    (void) fprintf(stdout, "%s", line);
3197d8fb588SMatthias Schmidt 	    break;
3207d8fb588SMatthias Schmidt 
3217d8fb588SMatthias Schmidt 	default:
3227d8fb588SMatthias Schmidt 	    (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected token\n",
3237d8fb588SMatthias Schmidt 			   pname, fname, lineno);
3247d8fb588SMatthias Schmidt 	    return 1;
3257d8fb588SMatthias Schmidt 	}
3267d8fb588SMatthias Schmidt 
3277d8fb588SMatthias Schmidt 	switch (state) {
3287d8fb588SMatthias Schmidt 	case S_DISCARD:
3297d8fb588SMatthias Schmidt 	    if (inprocess) {
3307d8fb588SMatthias Schmidt 		inprocess = 0;
3317d8fb588SMatthias Schmidt 		(void) fprintf(stdout, "#endif\n");
3327d8fb588SMatthias Schmidt 	    }
3337d8fb588SMatthias Schmidt 	    break;
3347d8fb588SMatthias Schmidt 
3357d8fb588SMatthias Schmidt 	case S_KEYWORD:
3367d8fb588SMatthias Schmidt 	    tok = gettoken(&ptr, defs);
3377d8fb588SMatthias Schmidt 	    if (token == T_NEWDEF) {
3387d8fb588SMatthias Schmidt 		if (inprocess) {
3397d8fb588SMatthias Schmidt 		    (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n",
3407d8fb588SMatthias Schmidt 				   pname, fname, lineno);
3417d8fb588SMatthias Schmidt 		    return 1;
3427d8fb588SMatthias Schmidt 		}
3437d8fb588SMatthias Schmidt 		if (tok == NULL) {
3447d8fb588SMatthias Schmidt 		    (void) fprintf(stderr, "%s: \"%s\", %d: No defs\n",
3457d8fb588SMatthias Schmidt 				   pname, fname, lineno);
3467d8fb588SMatthias Schmidt 		    return 1;
3477d8fb588SMatthias Schmidt 		}
3487d8fb588SMatthias Schmidt 		(void) fprintf(stdout, "\n\n");
3497d8fb588SMatthias Schmidt #ifdef LINEDIRECTIVE
3507d8fb588SMatthias Schmidt 		(void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname);
3517d8fb588SMatthias Schmidt #endif /* LINEDIRECTIVE */
35260962bbcSJohn Marino 		(void) fprintf(stdout, "#if (%s)\n", explode(defs));
3537d8fb588SMatthias Schmidt 		inprocess = 1;
3547d8fb588SMatthias Schmidt 	    }
3557d8fb588SMatthias Schmidt 	    else {
3567d8fb588SMatthias Schmidt 		if (tok && *tok)
3577d8fb588SMatthias Schmidt 		    (void) fprintf(stdout, "# if (%s) && !defined(_%s_)\n",
35894afa86dSJohn Marino 				   explode(defs), keyword[token]);
3597d8fb588SMatthias Schmidt 		else
3607d8fb588SMatthias Schmidt 		    (void) fprintf(stdout, "# if !defined(_%s_)\n",
3617d8fb588SMatthias Schmidt 				   keyword[token]);
3627d8fb588SMatthias Schmidt 
3637d8fb588SMatthias Schmidt 		if (gettoken(&ptr, stmt) == NULL) {
3647d8fb588SMatthias Schmidt 		    (void) fprintf(stderr, "%s: \"%s\", %d: No statement\n",
3657d8fb588SMatthias Schmidt 				   pname, fname, lineno);
3667d8fb588SMatthias Schmidt 		    return 1;
3677d8fb588SMatthias Schmidt 		}
3687d8fb588SMatthias Schmidt 		(void) fprintf(stdout, "# define _%s_\n", keyword[token]);
3697d8fb588SMatthias Schmidt 		(void) fprintf(stdout, "    %s = %s;\n", keyword[token], stmt);
3707d8fb588SMatthias Schmidt 		(void) fprintf(stdout, "# endif\n");
3717d8fb588SMatthias Schmidt 	    }
3727d8fb588SMatthias Schmidt 	    break;
3737d8fb588SMatthias Schmidt 
3747d8fb588SMatthias Schmidt 	case S_COMMENT:
3757d8fb588SMatthias Schmidt 	    if (gettoken(&ptr, defs))
3767d8fb588SMatthias Schmidt 		(void) fprintf(stdout, "    /* %s */\n", defs);
3777d8fb588SMatthias Schmidt 	    break;
3787d8fb588SMatthias Schmidt 
3797d8fb588SMatthias Schmidt 	case S_CODE:
3807d8fb588SMatthias Schmidt 	    if (token == T_NEWCODE) {
3817d8fb588SMatthias Schmidt #ifdef LINEDIRECTIVE
3827d8fb588SMatthias Schmidt 		(void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname);
3837d8fb588SMatthias Schmidt #endif /* LINEDIRECTIVE */
3847d8fb588SMatthias Schmidt 	    }
3857d8fb588SMatthias Schmidt 	    break;
3867d8fb588SMatthias Schmidt 
3877d8fb588SMatthias Schmidt 	default:
3887d8fb588SMatthias Schmidt 	    (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected state\n",
3897d8fb588SMatthias Schmidt 			   pname, fname, lineno);
3907d8fb588SMatthias Schmidt 	    return 1;
3917d8fb588SMatthias Schmidt 	}
3927d8fb588SMatthias Schmidt     }
3937d8fb588SMatthias Schmidt 
3947d8fb588SMatthias Schmidt     if (inprocess) {
3957d8fb588SMatthias Schmidt 	(void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n",
3967d8fb588SMatthias Schmidt 		       pname, fname, lineno);
3977d8fb588SMatthias Schmidt 	return 1;
3987d8fb588SMatthias Schmidt     }
3997d8fb588SMatthias Schmidt 
4007d8fb588SMatthias Schmidt     if (fp != stdin)
4017d8fb588SMatthias Schmidt 	(void) fclose(fp);
4027d8fb588SMatthias Schmidt 
4037d8fb588SMatthias Schmidt     return 0;
4047d8fb588SMatthias Schmidt }
405