gethost.c revision 167465
1167465Smp/* $Header: /p/tcsh/cvsroot/tcsh/gethost.c,v 1.12 2006/03/02 18:46:44 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 35167465SmpRCSID("$tcsh: gethost.c,v 1.12 2006/03/02 18:46:44 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#define ISSPACE(p) (isspace((unsigned char) (p)) && (p) != '\n') 5459243Sobrien 5559243Sobrien/* 5659243Sobrien * We cannot do that, because some compilers like #line and others 5759243Sobrien * like # <lineno> 5859243Sobrien * #define LINEDIRECTIVE 5959243Sobrien */ 6059243Sobrien 6159243Sobrienstatic const char *keyword[] = 6259243Sobrien{ 6359243Sobrien "vendor", 6459243Sobrien#define T_VENDOR 0 6559243Sobrien "hosttype", 6659243Sobrien#define T_HOSTTYPE 1 6759243Sobrien "machtype", 6859243Sobrien#define T_MACHTYPE 2 6959243Sobrien "ostype", 7059243Sobrien#define T_OSTYPE 3 7159243Sobrien "newdef", 7259243Sobrien#define T_NEWDEF 4 7359243Sobrien "enddef", 7459243Sobrien#define T_ENDDEF 5 7559243Sobrien "newcode", 7659243Sobrien#define T_NEWCODE 6 7759243Sobrien "endcode", 7859243Sobrien#define T_ENDCODE 7 7959243Sobrien "comment", 8059243Sobrien#define T_COMMENT 8 8159243Sobrien "macro", 8259243Sobrien#define T_MACRO 9 8359243Sobrien NULL 8459243Sobrien#define T_NONE 10 8559243Sobrien}; 8659243Sobrien 8759243Sobrien#define S_DISCARD 0 8859243Sobrien#define S_COMMENT 1 8959243Sobrien#define S_CODE 2 9059243Sobrien#define S_KEYWORD 3 9159243Sobrien 92167465Smpstatic int findtoken (char *); 93167465Smpstatic char *gettoken (char **, char *); 9459243Sobrien 95167465Smpint main (int, char *[]); 9659243Sobrien 9759243Sobrien/* findtoken(): 9859243Sobrien * Return the token number of the given token 9959243Sobrien */ 10059243Sobrienstatic int 101167465Smpfindtoken(char *ptr) 10259243Sobrien{ 10359243Sobrien int i; 10459243Sobrien 10559243Sobrien if (ptr == NULL || *ptr == '\0') 10659243Sobrien return T_NONE; 10759243Sobrien 10859243Sobrien for (i = 0; keyword[i] != NULL; i++) 10959243Sobrien if (strcmp(keyword[i], ptr) == 0) 11059243Sobrien return i; 11159243Sobrien 11259243Sobrien return T_NONE; 11359243Sobrien} 11459243Sobrien 11559243Sobrien 11659243Sobrien/* gettoken(): 11759243Sobrien * Get : delimited token and remove leading/trailing blanks/newlines 11859243Sobrien */ 11959243Sobrienstatic char * 120167465Smpgettoken(char **pptr, char *token) 12159243Sobrien{ 12259243Sobrien char *ptr = *pptr; 12359243Sobrien char *tok = token; 12459243Sobrien 12559243Sobrien for (; *ptr && ISSPACE(*ptr); ptr++) 12659243Sobrien continue; 12759243Sobrien 12859243Sobrien for (; *ptr && *ptr != ':'; *tok++ = *ptr++) 12959243Sobrien continue; 13059243Sobrien 13159243Sobrien if (*ptr == ':') 13259243Sobrien ptr++; 13359243Sobrien else 13459243Sobrien tok--; 13559243Sobrien 13659243Sobrien for (tok--; tok >= token && *tok && ISSPACE(*tok); tok--) 13759243Sobrien continue; 13859243Sobrien 13959243Sobrien *++tok = '\0'; 14059243Sobrien 14159243Sobrien *pptr = ptr; 14259243Sobrien return token; 14359243Sobrien} 14459243Sobrien 14559243Sobrien 14659243Sobrienint 147167465Smpmain(int argc, char *argv[]) 14859243Sobrien{ 14959243Sobrien char line[INBUFSIZE]; 15059243Sobrien char *pname; 151131962Smp const char *fname = "stdin"; 15259243Sobrien char *ptr, *tok; 15359243Sobrien char defs[INBUFSIZE]; 15459243Sobrien char stmt[INBUFSIZE]; 15559243Sobrien FILE *fp = stdin; 15659243Sobrien int lineno = 0; 15759243Sobrien int inprocess = 0; 15859243Sobrien int token, state; 15959243Sobrien int errs = 0; 16059243Sobrien 16159243Sobrien if ((pname = strrchr(argv[0], '/')) == NULL) 16259243Sobrien pname = argv[0]; 16359243Sobrien else 16459243Sobrien pname++; 16559243Sobrien 16659243Sobrien if (argc > 2) { 16759243Sobrien (void) fprintf(stderr, "Usage: %s [<filename>]\n", pname); 16859243Sobrien return 1; 16959243Sobrien } 17059243Sobrien 17159243Sobrien if (argc == 2) 17259243Sobrien if ((fp = fopen(fname = argv[1], "r")) == NULL) { 17359243Sobrien (void) fprintf(stderr, "%s: Cannot open `%s'\n", pname, fname); 17459243Sobrien return 1; 17559243Sobrien } 17659243Sobrien 17759243Sobrien state = S_DISCARD; 17859243Sobrien 17959243Sobrien while ((ptr = fgets(line, sizeof(line), fp)) != NULL) { 18059243Sobrien lineno++; 18159243Sobrien switch (token = findtoken(gettoken(&ptr, defs))) { 18259243Sobrien case T_NEWCODE: 18359243Sobrien state = S_CODE; 18459243Sobrien break; 18559243Sobrien 18659243Sobrien case T_ENDCODE: 18759243Sobrien state = S_DISCARD; 18859243Sobrien break; 18959243Sobrien 19059243Sobrien case T_COMMENT: 19159243Sobrien state = S_COMMENT; 19259243Sobrien break; 19359243Sobrien 19459243Sobrien case T_NEWDEF: 19559243Sobrien state = S_KEYWORD; 19659243Sobrien break; 19759243Sobrien 19859243Sobrien case T_ENDDEF: 19959243Sobrien state = S_DISCARD; 20059243Sobrien break; 20159243Sobrien 20259243Sobrien case T_VENDOR: 20359243Sobrien state = S_KEYWORD; 20459243Sobrien break; 20559243Sobrien 20659243Sobrien case T_HOSTTYPE: 20759243Sobrien state = S_KEYWORD; 20859243Sobrien break; 20959243Sobrien 21059243Sobrien case T_MACHTYPE: 21159243Sobrien state = S_KEYWORD; 21259243Sobrien break; 21359243Sobrien 21459243Sobrien case T_OSTYPE: 21559243Sobrien state = S_KEYWORD; 21659243Sobrien break; 21759243Sobrien 21859243Sobrien case T_MACRO: 21959243Sobrien if (gettoken(&ptr, defs) == NULL) { 22059243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Missing macro name\n", 22159243Sobrien pname, fname, lineno); 22259243Sobrien break; 22359243Sobrien } 22459243Sobrien if (gettoken(&ptr, stmt) == NULL) { 22559243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Missing macro body\n", 22659243Sobrien pname, fname, lineno); 22759243Sobrien break; 22859243Sobrien } 22959243Sobrien (void) fprintf(stdout, "\n#if %s\n# define %s\n#endif\n\n", stmt, 23059243Sobrien defs); 23159243Sobrien break; 23259243Sobrien 23359243Sobrien case T_NONE: 23459243Sobrien if (state != S_CODE && defs && *defs != '\0') { 23559243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Discarded\n", 23659243Sobrien pname, fname, lineno); 23759243Sobrien if (++errs == 30) { 23859243Sobrien (void) fprintf(stderr, "%s: Too many errors\n", pname); 23959243Sobrien return 1; 24059243Sobrien } 24159243Sobrien break; 24259243Sobrien } 24359243Sobrien (void) fprintf(stdout, "%s", line); 24459243Sobrien break; 24559243Sobrien 24659243Sobrien default: 24759243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected token\n", 24859243Sobrien pname, fname, lineno); 24959243Sobrien return 1; 25059243Sobrien } 25159243Sobrien 25259243Sobrien switch (state) { 25359243Sobrien case S_DISCARD: 25459243Sobrien if (inprocess) { 25559243Sobrien inprocess = 0; 25659243Sobrien (void) fprintf(stdout, "#endif\n"); 25759243Sobrien } 25859243Sobrien break; 25959243Sobrien 26059243Sobrien case S_KEYWORD: 26159243Sobrien tok = gettoken(&ptr, defs); 26259243Sobrien if (token == T_NEWDEF) { 26359243Sobrien if (inprocess) { 26459243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n", 26559243Sobrien pname, fname, lineno); 26659243Sobrien return 1; 26759243Sobrien } 26859243Sobrien if (tok == NULL) { 26959243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: No defs\n", 27059243Sobrien pname, fname, lineno); 27159243Sobrien return 1; 27259243Sobrien } 27359243Sobrien (void) fprintf(stdout, "\n\n"); 27459243Sobrien#ifdef LINEDIRECTIVE 27559243Sobrien (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname); 27659243Sobrien#endif /* LINEDIRECTIVE */ 27759243Sobrien (void) fprintf(stdout, "#if %s\n", defs); 27859243Sobrien inprocess = 1; 27959243Sobrien } 28059243Sobrien else { 28159243Sobrien if (tok && *tok) 28259243Sobrien (void) fprintf(stdout, "# if (%s) && !defined(_%s_)\n", 28359243Sobrien defs, keyword[token]); 28459243Sobrien else 28559243Sobrien (void) fprintf(stdout, "# if !defined(_%s_)\n", 28659243Sobrien keyword[token]); 28759243Sobrien 28859243Sobrien if (gettoken(&ptr, stmt) == NULL) { 28959243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: No statement\n", 29059243Sobrien pname, fname, lineno); 29159243Sobrien return 1; 29259243Sobrien } 29359243Sobrien (void) fprintf(stdout, "# define _%s_\n", keyword[token]); 29459243Sobrien (void) fprintf(stdout, " %s = %s;\n", keyword[token], stmt); 29559243Sobrien (void) fprintf(stdout, "# endif\n"); 29659243Sobrien } 29759243Sobrien break; 29859243Sobrien 29959243Sobrien case S_COMMENT: 30059243Sobrien if (gettoken(&ptr, defs)) 30159243Sobrien (void) fprintf(stdout, " /* %s */\n", defs); 30259243Sobrien break; 30359243Sobrien 30459243Sobrien case S_CODE: 30559243Sobrien if (token == T_NEWCODE) { 30659243Sobrien#ifdef LINEDIRECTIVE 30759243Sobrien (void) fprintf(stdout, "# %d \"%s\"\n", lineno + 1, fname); 30859243Sobrien#endif /* LINEDIRECTIVE */ 30959243Sobrien } 31059243Sobrien break; 31159243Sobrien 31259243Sobrien default: 31359243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Unexpected state\n", 31459243Sobrien pname, fname, lineno); 31559243Sobrien return 1; 31659243Sobrien } 31759243Sobrien } 31859243Sobrien 31959243Sobrien if (inprocess) { 32059243Sobrien (void) fprintf(stderr, "%s: \"%s\", %d: Missing enddef\n", 32159243Sobrien pname, fname, lineno); 32259243Sobrien return 1; 32359243Sobrien } 32459243Sobrien 32559243Sobrien if (fp != stdin) 32659243Sobrien (void) fclose(fp); 32759243Sobrien 32859243Sobrien return 0; 32959243Sobrien} 330