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