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