xref: /freebsd/contrib/tcsh/gethost.c (revision 2930157267fc56387bb43acf5bb441a84ff6e765)
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