129301572SMark Peek /* $Header: /src/pub/tcsh/gethost.c,v 1.8 2002/03/08 17:36:46 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 3529301572SMark Peek RCSID("$Id: gethost.c,v 1.8 2002/03/08 17:36:46 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 /* Some people don't bother to declare these */ 54c80476e4SDavid E. O'Brien #if defined(SUNOS4) || defined(ibm032) 55c80476e4SDavid E. O'Brien extern int fprintf(); 56c80476e4SDavid E. O'Brien extern int fclose(); 57c80476e4SDavid E. O'Brien #endif /* SUNOS4 || ibm032 */ 58c80476e4SDavid E. O'Brien 59c80476e4SDavid E. O'Brien #define ISSPACE(p) (isspace((unsigned char) (p)) && (p) != '\n') 60c80476e4SDavid E. O'Brien 61c80476e4SDavid E. O'Brien /* 62c80476e4SDavid E. O'Brien * We cannot do that, because some compilers like #line and others 63c80476e4SDavid E. O'Brien * like # <lineno> 64c80476e4SDavid E. O'Brien * #define LINEDIRECTIVE 65c80476e4SDavid E. O'Brien */ 66c80476e4SDavid E. O'Brien 67c80476e4SDavid E. O'Brien static const char *keyword[] = 68c80476e4SDavid E. O'Brien { 69c80476e4SDavid E. O'Brien "vendor", 70c80476e4SDavid E. O'Brien #define T_VENDOR 0 71c80476e4SDavid E. O'Brien "hosttype", 72c80476e4SDavid E. O'Brien #define T_HOSTTYPE 1 73c80476e4SDavid E. O'Brien "machtype", 74c80476e4SDavid E. O'Brien #define T_MACHTYPE 2 75c80476e4SDavid E. O'Brien "ostype", 76c80476e4SDavid E. O'Brien #define T_OSTYPE 3 77c80476e4SDavid E. O'Brien "newdef", 78c80476e4SDavid E. O'Brien #define T_NEWDEF 4 79c80476e4SDavid E. O'Brien "enddef", 80c80476e4SDavid E. O'Brien #define T_ENDDEF 5 81c80476e4SDavid E. O'Brien "newcode", 82c80476e4SDavid E. O'Brien #define T_NEWCODE 6 83c80476e4SDavid E. O'Brien "endcode", 84c80476e4SDavid E. O'Brien #define T_ENDCODE 7 85c80476e4SDavid E. O'Brien "comment", 86c80476e4SDavid E. O'Brien #define T_COMMENT 8 87c80476e4SDavid E. O'Brien "macro", 88c80476e4SDavid E. O'Brien #define T_MACRO 9 89c80476e4SDavid E. O'Brien NULL 90c80476e4SDavid E. O'Brien #define T_NONE 10 91c80476e4SDavid E. O'Brien }; 92c80476e4SDavid E. O'Brien 93c80476e4SDavid E. O'Brien #define S_DISCARD 0 94c80476e4SDavid E. O'Brien #define S_COMMENT 1 95c80476e4SDavid E. O'Brien #define S_CODE 2 96c80476e4SDavid E. O'Brien #define S_KEYWORD 3 97c80476e4SDavid E. O'Brien 98c80476e4SDavid E. O'Brien static int findtoken __P((char *)); 99c80476e4SDavid E. O'Brien static char *gettoken __P((char **, char *)); 100c80476e4SDavid E. O'Brien 101c80476e4SDavid E. O'Brien int main __P((int, char *[])); 102c80476e4SDavid E. O'Brien 103c80476e4SDavid E. O'Brien /* findtoken(): 104c80476e4SDavid E. O'Brien * Return the token number of the given token 105c80476e4SDavid E. O'Brien */ 106c80476e4SDavid E. O'Brien static int 107c80476e4SDavid E. O'Brien findtoken(ptr) 108c80476e4SDavid E. O'Brien char *ptr; 109c80476e4SDavid E. O'Brien { 110c80476e4SDavid E. O'Brien int i; 111c80476e4SDavid E. O'Brien 112c80476e4SDavid E. O'Brien if (ptr == NULL || *ptr == '\0') 113c80476e4SDavid E. O'Brien return T_NONE; 114c80476e4SDavid E. O'Brien 115c80476e4SDavid E. O'Brien for (i = 0; keyword[i] != NULL; i++) 116c80476e4SDavid E. O'Brien if (strcmp(keyword[i], ptr) == 0) 117c80476e4SDavid E. O'Brien return i; 118c80476e4SDavid E. O'Brien 119c80476e4SDavid E. O'Brien return T_NONE; 120c80476e4SDavid E. O'Brien } 121c80476e4SDavid E. O'Brien 122c80476e4SDavid E. O'Brien 123c80476e4SDavid E. O'Brien /* gettoken(): 124c80476e4SDavid E. O'Brien * Get : delimited token and remove leading/trailing blanks/newlines 125c80476e4SDavid E. O'Brien */ 126c80476e4SDavid E. O'Brien static char * 127c80476e4SDavid E. O'Brien gettoken(pptr, token) 128c80476e4SDavid E. O'Brien char **pptr; 129c80476e4SDavid E. O'Brien char *token; 130c80476e4SDavid E. O'Brien { 131c80476e4SDavid E. O'Brien char *ptr = *pptr; 132c80476e4SDavid E. O'Brien char *tok = token; 133c80476e4SDavid E. O'Brien 134c80476e4SDavid E. O'Brien for (; *ptr && ISSPACE(*ptr); ptr++) 135c80476e4SDavid E. O'Brien continue; 136c80476e4SDavid E. O'Brien 137c80476e4SDavid E. O'Brien for (; *ptr && *ptr != ':'; *tok++ = *ptr++) 138c80476e4SDavid E. O'Brien continue; 139c80476e4SDavid E. O'Brien 140c80476e4SDavid E. O'Brien if (*ptr == ':') 141c80476e4SDavid E. O'Brien ptr++; 142c80476e4SDavid E. O'Brien else 143c80476e4SDavid E. O'Brien tok--; 144c80476e4SDavid E. O'Brien 145c80476e4SDavid E. O'Brien for (tok--; tok >= token && *tok && ISSPACE(*tok); tok--) 146c80476e4SDavid E. O'Brien continue; 147c80476e4SDavid E. O'Brien 148c80476e4SDavid E. O'Brien *++tok = '\0'; 149c80476e4SDavid E. O'Brien 150c80476e4SDavid E. O'Brien *pptr = ptr; 151c80476e4SDavid E. O'Brien return token; 152c80476e4SDavid E. O'Brien } 153c80476e4SDavid E. O'Brien 154c80476e4SDavid E. O'Brien 155c80476e4SDavid E. O'Brien int 156c80476e4SDavid E. O'Brien main(argc, argv) 157c80476e4SDavid E. O'Brien int argc; 158c80476e4SDavid E. O'Brien char *argv[]; 159c80476e4SDavid E. O'Brien { 160c80476e4SDavid E. O'Brien char line[INBUFSIZE]; 161c80476e4SDavid E. O'Brien char *pname; 162c80476e4SDavid E. O'Brien char *fname = "stdin"; 163c80476e4SDavid E. O'Brien char *ptr, *tok; 164c80476e4SDavid E. O'Brien char defs[INBUFSIZE]; 165c80476e4SDavid E. O'Brien char stmt[INBUFSIZE]; 166c80476e4SDavid E. O'Brien FILE *fp = stdin; 167c80476e4SDavid E. O'Brien int lineno = 0; 168c80476e4SDavid E. O'Brien int inprocess = 0; 169c80476e4SDavid E. O'Brien int token, state; 170c80476e4SDavid E. O'Brien int errs = 0; 171c80476e4SDavid E. O'Brien 172c80476e4SDavid E. O'Brien if ((pname = strrchr(argv[0], '/')) == NULL) 173c80476e4SDavid E. O'Brien pname = argv[0]; 174c80476e4SDavid E. O'Brien else 175c80476e4SDavid E. O'Brien pname++; 176c80476e4SDavid E. O'Brien 177c80476e4SDavid E. O'Brien if (argc > 2) { 178c80476e4SDavid E. O'Brien (void) fprintf(stderr, "Usage: %s [<filename>]\n", pname); 179c80476e4SDavid E. O'Brien return 1; 180c80476e4SDavid E. O'Brien } 181c80476e4SDavid E. O'Brien 182c80476e4SDavid E. O'Brien if (argc == 2) 183c80476e4SDavid E. O'Brien if ((fp = fopen(fname = argv[1], "r")) == NULL) { 184c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: Cannot open `%s'\n", pname, fname); 185c80476e4SDavid E. O'Brien return 1; 186c80476e4SDavid E. O'Brien } 187c80476e4SDavid E. O'Brien 188c80476e4SDavid E. O'Brien state = S_DISCARD; 189c80476e4SDavid E. O'Brien 190c80476e4SDavid E. O'Brien while ((ptr = fgets(line, sizeof(line), fp)) != NULL) { 191c80476e4SDavid E. O'Brien lineno++; 192c80476e4SDavid E. O'Brien switch (token = findtoken(gettoken(&ptr, defs))) { 193c80476e4SDavid E. O'Brien case T_NEWCODE: 194c80476e4SDavid E. O'Brien state = S_CODE; 195c80476e4SDavid E. O'Brien break; 196c80476e4SDavid E. O'Brien 197c80476e4SDavid E. O'Brien case T_ENDCODE: 198c80476e4SDavid E. O'Brien state = S_DISCARD; 199c80476e4SDavid E. O'Brien break; 200c80476e4SDavid E. O'Brien 201c80476e4SDavid E. O'Brien case T_COMMENT: 202c80476e4SDavid E. O'Brien state = S_COMMENT; 203c80476e4SDavid E. O'Brien break; 204c80476e4SDavid E. O'Brien 205c80476e4SDavid E. O'Brien case T_NEWDEF: 206c80476e4SDavid E. O'Brien state = S_KEYWORD; 207c80476e4SDavid E. O'Brien break; 208c80476e4SDavid E. O'Brien 209c80476e4SDavid E. O'Brien case T_ENDDEF: 210c80476e4SDavid E. O'Brien state = S_DISCARD; 211c80476e4SDavid E. O'Brien break; 212c80476e4SDavid E. O'Brien 213c80476e4SDavid E. O'Brien case T_VENDOR: 214c80476e4SDavid E. O'Brien state = S_KEYWORD; 215c80476e4SDavid E. O'Brien break; 216c80476e4SDavid E. O'Brien 217c80476e4SDavid E. O'Brien case T_HOSTTYPE: 218c80476e4SDavid E. O'Brien state = S_KEYWORD; 219c80476e4SDavid E. O'Brien break; 220c80476e4SDavid E. O'Brien 221c80476e4SDavid E. O'Brien case T_MACHTYPE: 222c80476e4SDavid E. O'Brien state = S_KEYWORD; 223c80476e4SDavid E. O'Brien break; 224c80476e4SDavid E. O'Brien 225c80476e4SDavid E. O'Brien case T_OSTYPE: 226c80476e4SDavid E. O'Brien state = S_KEYWORD; 227c80476e4SDavid E. O'Brien break; 228c80476e4SDavid E. O'Brien 229c80476e4SDavid E. O'Brien case T_MACRO: 230c80476e4SDavid E. O'Brien if (gettoken(&ptr, defs) == NULL) { 231c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Missing macro name\n", 232c80476e4SDavid E. O'Brien pname, fname, lineno); 233c80476e4SDavid E. O'Brien break; 234c80476e4SDavid E. O'Brien } 235c80476e4SDavid E. O'Brien if (gettoken(&ptr, stmt) == NULL) { 236c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Missing macro body\n", 237c80476e4SDavid E. O'Brien pname, fname, lineno); 238c80476e4SDavid E. O'Brien break; 239c80476e4SDavid E. O'Brien } 240c80476e4SDavid E. O'Brien (void) fprintf(stdout, "\n#if %s\n# define %s\n#endif\n\n", stmt, 241c80476e4SDavid E. O'Brien defs); 242c80476e4SDavid E. O'Brien break; 243c80476e4SDavid E. O'Brien 244c80476e4SDavid E. O'Brien case T_NONE: 245c80476e4SDavid E. O'Brien if (state != S_CODE && defs && *defs != '\0') { 246c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Discarded\n", 247c80476e4SDavid E. O'Brien pname, fname, lineno); 248c80476e4SDavid E. O'Brien if (++errs == 30) { 249c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: Too many errors\n", pname); 250c80476e4SDavid E. O'Brien return 1; 251c80476e4SDavid E. O'Brien } 252c80476e4SDavid E. O'Brien break; 253c80476e4SDavid E. O'Brien } 254c80476e4SDavid E. O'Brien (void) fprintf(stdout, "%s", line); 255c80476e4SDavid E. O'Brien break; 256c80476e4SDavid E. O'Brien 257c80476e4SDavid E. O'Brien default: 258c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected token\n", 259c80476e4SDavid E. O'Brien pname, fname, lineno); 260c80476e4SDavid E. O'Brien return 1; 261c80476e4SDavid E. O'Brien } 262c80476e4SDavid E. O'Brien 263c80476e4SDavid E. O'Brien switch (state) { 264c80476e4SDavid E. O'Brien case S_DISCARD: 265c80476e4SDavid E. O'Brien if (inprocess) { 266c80476e4SDavid E. O'Brien inprocess = 0; 267c80476e4SDavid E. O'Brien (void) fprintf(stdout, "#endif\n"); 268c80476e4SDavid E. O'Brien } 269c80476e4SDavid E. O'Brien break; 270c80476e4SDavid E. O'Brien 271c80476e4SDavid E. O'Brien case S_KEYWORD: 272c80476e4SDavid E. O'Brien tok = gettoken(&ptr, defs); 273c80476e4SDavid E. O'Brien if (token == T_NEWDEF) { 274c80476e4SDavid E. O'Brien if (inprocess) { 275c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n", 276c80476e4SDavid E. O'Brien pname, fname, lineno); 277c80476e4SDavid E. O'Brien return 1; 278c80476e4SDavid E. O'Brien } 279c80476e4SDavid E. O'Brien if (tok == NULL) { 280c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: No defs\n", 281c80476e4SDavid E. O'Brien pname, fname, lineno); 282c80476e4SDavid E. O'Brien return 1; 283c80476e4SDavid E. O'Brien } 284c80476e4SDavid E. O'Brien (void) fprintf(stdout, "\n\n"); 285c80476e4SDavid E. O'Brien #ifdef LINEDIRECTIVE 286c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname); 287c80476e4SDavid E. O'Brien #endif /* LINEDIRECTIVE */ 288c80476e4SDavid E. O'Brien (void) fprintf(stdout, "#if %s\n", defs); 289c80476e4SDavid E. O'Brien inprocess = 1; 290c80476e4SDavid E. O'Brien } 291c80476e4SDavid E. O'Brien else { 292c80476e4SDavid E. O'Brien if (tok && *tok) 293c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# if (%s) && !defined(_%s_)\n", 294c80476e4SDavid E. O'Brien defs, keyword[token]); 295c80476e4SDavid E. O'Brien else 296c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# if !defined(_%s_)\n", 297c80476e4SDavid E. O'Brien keyword[token]); 298c80476e4SDavid E. O'Brien 299c80476e4SDavid E. O'Brien if (gettoken(&ptr, stmt) == NULL) { 300c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: No statement\n", 301c80476e4SDavid E. O'Brien pname, fname, lineno); 302c80476e4SDavid E. O'Brien return 1; 303c80476e4SDavid E. O'Brien } 304c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# define _%s_\n", keyword[token]); 305c80476e4SDavid E. O'Brien (void) fprintf(stdout, " %s = %s;\n", keyword[token], stmt); 306c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# endif\n"); 307c80476e4SDavid E. O'Brien } 308c80476e4SDavid E. O'Brien break; 309c80476e4SDavid E. O'Brien 310c80476e4SDavid E. O'Brien case S_COMMENT: 311c80476e4SDavid E. O'Brien if (gettoken(&ptr, defs)) 312c80476e4SDavid E. O'Brien (void) fprintf(stdout, " /* %s */\n", defs); 313c80476e4SDavid E. O'Brien break; 314c80476e4SDavid E. O'Brien 315c80476e4SDavid E. O'Brien case S_CODE: 316c80476e4SDavid E. O'Brien if (token == T_NEWCODE) { 317c80476e4SDavid E. O'Brien #ifdef LINEDIRECTIVE 318c80476e4SDavid E. O'Brien (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname); 319c80476e4SDavid E. O'Brien #endif /* LINEDIRECTIVE */ 320c80476e4SDavid E. O'Brien } 321c80476e4SDavid E. O'Brien break; 322c80476e4SDavid E. O'Brien 323c80476e4SDavid E. O'Brien default: 324c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected state\n", 325c80476e4SDavid E. O'Brien pname, fname, lineno); 326c80476e4SDavid E. O'Brien return 1; 327c80476e4SDavid E. O'Brien } 328c80476e4SDavid E. O'Brien } 329c80476e4SDavid E. O'Brien 330c80476e4SDavid E. O'Brien if (inprocess) { 331c80476e4SDavid E. O'Brien (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n", 332c80476e4SDavid E. O'Brien pname, fname, lineno); 333c80476e4SDavid E. O'Brien return 1; 334c80476e4SDavid E. O'Brien } 335c80476e4SDavid E. O'Brien 336c80476e4SDavid E. O'Brien if (fp != stdin) 337c80476e4SDavid E. O'Brien (void) fclose(fp); 338c80476e4SDavid E. O'Brien 339c80476e4SDavid E. O'Brien return 0; 340c80476e4SDavid E. O'Brien } 341