gethost.c revision 100616
1100616Smp/* $Header: /src/pub/tcsh/gethost.c,v 1.8 2002/03/08 17:36:46 christos Exp $ */ 259243Sobrien/* 359243Sobrien * gethost.c: Create version file from prototype 459243Sobrien */ 559243Sobrien/*- 659243Sobrien * Copyright (c) 1980, 1991 The Regents of the University of California. 759243Sobrien * All rights reserved. 859243Sobrien * 959243Sobrien * Redistribution and use in source and binary forms, with or without 1059243Sobrien * modification, are permitted provided that the following conditions 1159243Sobrien * are met: 1259243Sobrien * 1. Redistributions of source code must retain the above copyright 1359243Sobrien * notice, this list of conditions and the following disclaimer. 1459243Sobrien * 2. Redistributions in binary form must reproduce the above copyright 1559243Sobrien * notice, this list of conditions and the following disclaimer in the 1659243Sobrien * documentation and/or other materials provided with the distribution. 17100616Smp * 3. Neither the name of the University nor the names of its contributors 1859243Sobrien * may be used to endorse or promote products derived from this software 1959243Sobrien * without specific prior written permission. 2059243Sobrien * 2159243Sobrien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2259243Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2359243Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2459243Sobrien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2559243Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2659243Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2759243Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2859243Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2959243Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3059243Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3159243Sobrien * SUCH DAMAGE. 3259243Sobrien */ 3359243Sobrien#include "sh.h" 3459243Sobrien 35100616SmpRCSID("$Id: gethost.c,v 1.8 2002/03/08 17:36:46 christos Exp $") 3659243Sobrien 3759243Sobrien#ifdef SCO 3859243Sobrien# define perror __perror 3959243Sobrien# define rename __rename 4059243Sobrien# define getopt __getopt 4159243Sobrien# define system __system 4259243Sobrien#endif 4359243Sobrien#include <stdio.h> 4459243Sobrien#ifdef SCO 4559243Sobrien# undef perror 4659243Sobrien# undef rename 4759243Sobrien# undef getopt 4859243Sobrien# undef system 4959243Sobrien#endif 5059243Sobrien 5159243Sobrien#include <ctype.h> 5259243Sobrien 5359243Sobrien/* Some people don't bother to declare these */ 5459243Sobrien#if defined(SUNOS4) || defined(ibm032) 5559243Sobrienextern int fprintf(); 5659243Sobrienextern int fclose(); 5759243Sobrien#endif /* SUNOS4 || ibm032 */ 5859243Sobrien 5959243Sobrien#define ISSPACE(p) (isspace((unsigned char) (p)) && (p) != '\n') 6059243Sobrien 6159243Sobrien/* 6259243Sobrien * We cannot do that, because some compilers like #line and others 6359243Sobrien * like # <lineno> 6459243Sobrien * #define LINEDIRECTIVE 6559243Sobrien */ 6659243Sobrien 6759243Sobrienstatic const char *keyword[] = 6859243Sobrien{ 6959243Sobrien "vendor", 7059243Sobrien#define T_VENDOR 0 7159243Sobrien "hosttype", 7259243Sobrien#define T_HOSTTYPE 1 7359243Sobrien "machtype", 7459243Sobrien#define T_MACHTYPE 2 7559243Sobrien "ostype", 7659243Sobrien#define T_OSTYPE 3 7759243Sobrien "newdef", 7859243Sobrien#define T_NEWDEF 4 7959243Sobrien "enddef", 8059243Sobrien#define T_ENDDEF 5 8159243Sobrien "newcode", 8259243Sobrien#define T_NEWCODE 6 8359243Sobrien "endcode", 8459243Sobrien#define T_ENDCODE 7 8559243Sobrien "comment", 8659243Sobrien#define T_COMMENT 8 8759243Sobrien "macro", 8859243Sobrien#define T_MACRO 9 8959243Sobrien NULL 9059243Sobrien#define T_NONE 10 9159243Sobrien}; 9259243Sobrien 9359243Sobrien#define S_DISCARD 0 9459243Sobrien#define S_COMMENT 1 9559243Sobrien#define S_CODE 2 9659243Sobrien#define S_KEYWORD 3 9759243Sobrien 9859243Sobrienstatic int findtoken __P((char *)); 9959243Sobrienstatic char *gettoken __P((char **, char *)); 10059243Sobrien 10159243Sobrienint main __P((int, char *[])); 10259243Sobrien 10359243Sobrien/* findtoken(): 10459243Sobrien * Return the token number of the given token 10559243Sobrien */ 10659243Sobrienstatic int 10759243Sobrienfindtoken(ptr) 10859243Sobrien char *ptr; 10959243Sobrien{ 11059243Sobrien int i; 11159243Sobrien 11259243Sobrien if (ptr == NULL || *ptr == '\0') 11359243Sobrien return T_NONE; 11459243Sobrien 11559243Sobrien for (i = 0; keyword[i] != NULL; i++) 11659243Sobrien if (strcmp(keyword[i], ptr) == 0) 11759243Sobrien return i; 11859243Sobrien 11959243Sobrien return T_NONE; 12059243Sobrien} 12159243Sobrien 12259243Sobrien 12359243Sobrien/* gettoken(): 12459243Sobrien * Get : delimited token and remove leading/trailing blanks/newlines 12559243Sobrien */ 12659243Sobrienstatic char * 12759243Sobriengettoken(pptr, token) 12859243Sobrien char **pptr; 12959243Sobrien char *token; 13059243Sobrien{ 13159243Sobrien char *ptr = *pptr; 13259243Sobrien char *tok = token; 13359243Sobrien 13459243Sobrien for (; *ptr && ISSPACE(*ptr); ptr++) 13559243Sobrien continue; 13659243Sobrien 13759243Sobrien for (; *ptr && *ptr != ':'; *tok++ = *ptr++) 13859243Sobrien continue; 13959243Sobrien 14059243Sobrien if (*ptr == ':') 14159243Sobrien ptr++; 14259243Sobrien else 14359243Sobrien tok--; 14459243Sobrien 14559243Sobrien for (tok--; tok >= token && *tok && ISSPACE(*tok); tok--) 14659243Sobrien continue; 14759243Sobrien 14859243Sobrien *++tok = '\0'; 14959243Sobrien 15059243Sobrien *pptr = ptr; 15159243Sobrien return token; 15259243Sobrien} 15359243Sobrien 15459243Sobrien 15559243Sobrienint 15659243Sobrienmain(argc, argv) 15759243Sobrien int argc; 15859243Sobrien char *argv[]; 15959243Sobrien{ 16059243Sobrien char line[INBUFSIZE]; 16159243Sobrien char *pname; 16259243Sobrien char *fname = "stdin"; 16359243Sobrien char *ptr, *tok; 16459243Sobrien char defs[INBUFSIZE]; 16559243Sobrien char stmt[INBUFSIZE]; 16659243Sobrien FILE *fp = stdin; 16759243Sobrien int lineno = 0; 16859243Sobrien int inprocess = 0; 16959243Sobrien int token, state; 17059243Sobrien int errs = 0; 17159243Sobrien 17259243Sobrien if ((pname = strrchr(argv[0], '/')) == NULL) 17359243Sobrien pname = argv[0]; 17459243Sobrien else 17559243Sobrien pname++; 17659243Sobrien 17759243Sobrien if (argc > 2) { 17859243Sobrien (void) fprintf(stderr, "Usage: %s [<filename>]\n", pname); 17959243Sobrien return 1; 18059243Sobrien } 18159243Sobrien 18259243Sobrien if (argc == 2) 18359243Sobrien if ((fp = fopen(fname = argv[1], "r")) == NULL) { 18459243Sobrien (void) fprintf(stderr, "%s: Cannot open `%s'\n", pname, fname); 18559243Sobrien return 1; 18659243Sobrien } 18759243Sobrien 18859243Sobrien state = S_DISCARD; 18959243Sobrien 19059243Sobrien while ((ptr = fgets(line, sizeof(line), fp)) != NULL) { 19159243Sobrien lineno++; 19259243Sobrien switch (token = findtoken(gettoken(&ptr, defs))) { 19359243Sobrien case T_NEWCODE: 19459243Sobrien state = S_CODE; 19559243Sobrien break; 19659243Sobrien 19759243Sobrien case T_ENDCODE: 19859243Sobrien state = S_DISCARD; 19959243Sobrien break; 20059243Sobrien 20159243Sobrien case T_COMMENT: 20259243Sobrien state = S_COMMENT; 20359243Sobrien break; 20459243Sobrien 20559243Sobrien case T_NEWDEF: 20659243Sobrien state = S_KEYWORD; 20759243Sobrien break; 20859243Sobrien 20959243Sobrien case T_ENDDEF: 21059243Sobrien state = S_DISCARD; 21159243Sobrien break; 21259243Sobrien 21359243Sobrien case T_VENDOR: 21459243Sobrien state = S_KEYWORD; 21559243Sobrien break; 21659243Sobrien 21759243Sobrien case T_HOSTTYPE: 21859243Sobrien state = S_KEYWORD; 21959243Sobrien break; 22059243Sobrien 22159243Sobrien case T_MACHTYPE: 22259243Sobrien state = S_KEYWORD; 22359243Sobrien break; 22459243Sobrien 22559243Sobrien case T_OSTYPE: 22659243Sobrien state = S_KEYWORD; 22759243Sobrien break; 22859243Sobrien 22959243Sobrien case T_MACRO: 23059243Sobrien if (gettoken(&ptr, defs) == NULL) { 23159243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Missing macro name\n", 23259243Sobrien pname, fname, lineno); 23359243Sobrien break; 23459243Sobrien } 23559243Sobrien if (gettoken(&ptr, stmt) == NULL) { 23659243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Missing macro body\n", 23759243Sobrien pname, fname, lineno); 23859243Sobrien break; 23959243Sobrien } 24059243Sobrien (void) fprintf(stdout, "\n#if %s\n# define %s\n#endif\n\n", stmt, 24159243Sobrien defs); 24259243Sobrien break; 24359243Sobrien 24459243Sobrien case T_NONE: 24559243Sobrien if (state != S_CODE && defs && *defs != '\0') { 24659243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Discarded\n", 24759243Sobrien pname, fname, lineno); 24859243Sobrien if (++errs == 30) { 24959243Sobrien (void) fprintf(stderr, "%s: Too many errors\n", pname); 25059243Sobrien return 1; 25159243Sobrien } 25259243Sobrien break; 25359243Sobrien } 25459243Sobrien (void) fprintf(stdout, "%s", line); 25559243Sobrien break; 25659243Sobrien 25759243Sobrien default: 25859243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected token\n", 25959243Sobrien pname, fname, lineno); 26059243Sobrien return 1; 26159243Sobrien } 26259243Sobrien 26359243Sobrien switch (state) { 26459243Sobrien case S_DISCARD: 26559243Sobrien if (inprocess) { 26659243Sobrien inprocess = 0; 26759243Sobrien (void) fprintf(stdout, "#endif\n"); 26859243Sobrien } 26959243Sobrien break; 27059243Sobrien 27159243Sobrien case S_KEYWORD: 27259243Sobrien tok = gettoken(&ptr, defs); 27359243Sobrien if (token == T_NEWDEF) { 27459243Sobrien if (inprocess) { 27559243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n", 27659243Sobrien pname, fname, lineno); 27759243Sobrien return 1; 27859243Sobrien } 27959243Sobrien if (tok == NULL) { 28059243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: No defs\n", 28159243Sobrien pname, fname, lineno); 28259243Sobrien return 1; 28359243Sobrien } 28459243Sobrien (void) fprintf(stdout, "\n\n"); 28559243Sobrien#ifdef LINEDIRECTIVE 28659243Sobrien (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname); 28759243Sobrien#endif /* LINEDIRECTIVE */ 28859243Sobrien (void) fprintf(stdout, "#if %s\n", defs); 28959243Sobrien inprocess = 1; 29059243Sobrien } 29159243Sobrien else { 29259243Sobrien if (tok && *tok) 29359243Sobrien (void) fprintf(stdout, "# if (%s) && !defined(_%s_)\n", 29459243Sobrien defs, keyword[token]); 29559243Sobrien else 29659243Sobrien (void) fprintf(stdout, "# if !defined(_%s_)\n", 29759243Sobrien keyword[token]); 29859243Sobrien 29959243Sobrien if (gettoken(&ptr, stmt) == NULL) { 30059243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: No statement\n", 30159243Sobrien pname, fname, lineno); 30259243Sobrien return 1; 30359243Sobrien } 30459243Sobrien (void) fprintf(stdout, "# define _%s_\n", keyword[token]); 30559243Sobrien (void) fprintf(stdout, " %s = %s;\n", keyword[token], stmt); 30659243Sobrien (void) fprintf(stdout, "# endif\n"); 30759243Sobrien } 30859243Sobrien break; 30959243Sobrien 31059243Sobrien case S_COMMENT: 31159243Sobrien if (gettoken(&ptr, defs)) 31259243Sobrien (void) fprintf(stdout, " /* %s */\n", defs); 31359243Sobrien break; 31459243Sobrien 31559243Sobrien case S_CODE: 31659243Sobrien if (token == T_NEWCODE) { 31759243Sobrien#ifdef LINEDIRECTIVE 31859243Sobrien (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname); 31959243Sobrien#endif /* LINEDIRECTIVE */ 32059243Sobrien } 32159243Sobrien break; 32259243Sobrien 32359243Sobrien default: 32459243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected state\n", 32559243Sobrien pname, fname, lineno); 32659243Sobrien return 1; 32759243Sobrien } 32859243Sobrien } 32959243Sobrien 33059243Sobrien if (inprocess) { 33159243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n", 33259243Sobrien pname, fname, lineno); 33359243Sobrien return 1; 33459243Sobrien } 33559243Sobrien 33659243Sobrien if (fp != stdin) 33759243Sobrien (void) fclose(fp); 33859243Sobrien 33959243Sobrien return 0; 34059243Sobrien} 341