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