xref: /csrg-svn/usr.sbin/config.new/util.c (revision 57497)
1*57497Storek /*
2*57497Storek  * Copyright (c) 1992 The Regents of the University of California.
3*57497Storek  * All rights reserved.
4*57497Storek  *
5*57497Storek  * This software was developed by the Computer Systems Engineering group
6*57497Storek  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
7*57497Storek  * contributed to Berkeley.
8*57497Storek  *
9*57497Storek  * All advertising materials mentioning features or use of this software
10*57497Storek  * must display the following acknowledgement:
11*57497Storek  *	This product includes software developed by the University of
12*57497Storek  *	California, Lawrence Berkeley Laboratories.
13*57497Storek  *
14*57497Storek  * %sccs.include.redist.c%
15*57497Storek  *
16*57497Storek  *	@(#)util.c	5.1 (Berkeley) 01/12/93
17*57497Storek  *
18*57497Storek  * from: $Header: util.c,v 1.3 93/01/12 03:59:55 torek Exp $
19*57497Storek  */
20*57497Storek 
21*57497Storek #include <ctype.h>
22*57497Storek #include <stdio.h>
23*57497Storek #include <stdlib.h>
24*57497Storek #if __STDC__
25*57497Storek #include <stdarg.h>
26*57497Storek #else
27*57497Storek #include <varargs.h>
28*57497Storek #endif
29*57497Storek #include "config.h"
30*57497Storek 
31*57497Storek static void nomem __P((void));
32*57497Storek static void vxerror __P((const char *, int, const char *, va_list));
33*57497Storek 
34*57497Storek /*
35*57497Storek  * Malloc, with abort on error.
36*57497Storek  */
37*57497Storek void *
38*57497Storek emalloc(size)
39*57497Storek 	size_t size;
40*57497Storek {
41*57497Storek 	void *p;
42*57497Storek 
43*57497Storek 	if ((p = malloc(size)) == NULL)
44*57497Storek 		nomem();
45*57497Storek 	return (p);
46*57497Storek }
47*57497Storek 
48*57497Storek /*
49*57497Storek  * Realloc, with abort on error.
50*57497Storek  */
51*57497Storek void *
52*57497Storek erealloc(p, size)
53*57497Storek 	void *p;
54*57497Storek 	size_t size;
55*57497Storek {
56*57497Storek 
57*57497Storek 	if ((p = realloc(p, size)) == NULL)
58*57497Storek 		nomem();
59*57497Storek 	return (p);
60*57497Storek }
61*57497Storek 
62*57497Storek static void
63*57497Storek nomem()
64*57497Storek {
65*57497Storek 
66*57497Storek 	(void)fprintf(stderr, "config: out of memory\n");
67*57497Storek 	exit(1);
68*57497Storek }
69*57497Storek 
70*57497Storek /*
71*57497Storek  * Prepend the compilation directory to a file name.
72*57497Storek  */
73*57497Storek char *
74*57497Storek path(file)
75*57497Storek 	const char *file;
76*57497Storek {
77*57497Storek 	register char *cp;
78*57497Storek #define	CDIR "../../compile/"
79*57497Storek 
80*57497Storek 	if (file == NULL) {
81*57497Storek 		cp = emalloc(sizeof(CDIR) + strlen(confdirbase));
82*57497Storek 		(void)sprintf(cp, "%s%s", CDIR, confdirbase);
83*57497Storek 	} else {
84*57497Storek 		cp = emalloc(sizeof(CDIR) + strlen(confdirbase) + 1 +
85*57497Storek 		    strlen(file));
86*57497Storek 		(void)sprintf(cp, "%s%s/%s", CDIR, confdirbase, file);
87*57497Storek 	}
88*57497Storek 	return (cp);
89*57497Storek }
90*57497Storek 
91*57497Storek static struct nvlist *nvhead;
92*57497Storek 
93*57497Storek struct nvlist *
94*57497Storek newnv(name, str, ptr, i)
95*57497Storek 	const char *name, *str;
96*57497Storek 	void *ptr;
97*57497Storek 	int i;
98*57497Storek {
99*57497Storek 	register struct nvlist *nv;
100*57497Storek 
101*57497Storek 	if ((nv = nvhead) == NULL)
102*57497Storek 		nv = emalloc(sizeof(*nv));
103*57497Storek 	else
104*57497Storek 		nvhead = nv->nv_next;
105*57497Storek 	nv->nv_next = NULL;
106*57497Storek 	nv->nv_name = name;
107*57497Storek 	if (ptr == NULL)
108*57497Storek 		nv->nv_str = str;
109*57497Storek 	else {
110*57497Storek 		if (str != NULL)
111*57497Storek 			panic("newnv");
112*57497Storek 		nv->nv_ptr = ptr;
113*57497Storek 	}
114*57497Storek 	nv->nv_int = i;
115*57497Storek 	return (nv);
116*57497Storek }
117*57497Storek 
118*57497Storek /*
119*57497Storek  * Free an nvlist structure (just one).
120*57497Storek  */
121*57497Storek void
122*57497Storek nvfree(nv)
123*57497Storek 	register struct nvlist *nv;
124*57497Storek {
125*57497Storek 
126*57497Storek 	nv->nv_next = nvhead;
127*57497Storek 	nvhead = nv;
128*57497Storek }
129*57497Storek 
130*57497Storek /*
131*57497Storek  * Free an nvlist (the whole list).
132*57497Storek  */
133*57497Storek void
134*57497Storek nvfreel(nv)
135*57497Storek 	register struct nvlist *nv;
136*57497Storek {
137*57497Storek 	register struct nvlist *next;
138*57497Storek 
139*57497Storek 	for (; nv != NULL; nv = next) {
140*57497Storek 		next = nv->nv_next;
141*57497Storek 		nv->nv_next = nvhead;
142*57497Storek 		nvhead = nv;
143*57497Storek 	}
144*57497Storek }
145*57497Storek 
146*57497Storek /*
147*57497Storek  * External (config file) error.  Complain, using current file
148*57497Storek  * and line number.
149*57497Storek  */
150*57497Storek void
151*57497Storek #if __STDC__
152*57497Storek error(const char *fmt, ...)
153*57497Storek #else
154*57497Storek error(fmt, va_alist)
155*57497Storek 	const char *fmt;
156*57497Storek 	va_dcl
157*57497Storek #endif
158*57497Storek {
159*57497Storek 	va_list ap;
160*57497Storek 	extern const char *yyfile;
161*57497Storek 
162*57497Storek #if __STDC__
163*57497Storek 	va_start(ap, fmt);
164*57497Storek #else
165*57497Storek 	va_start(ap);
166*57497Storek #endif
167*57497Storek 	vxerror(yyfile, currentline(), fmt, ap);
168*57497Storek 	va_end(ap);
169*57497Storek }
170*57497Storek 
171*57497Storek /*
172*57497Storek  * Delayed config file error (i.e., something was wrong but we could not
173*57497Storek  * find out about it until later).
174*57497Storek  */
175*57497Storek void
176*57497Storek #if __STDC__
177*57497Storek xerror(const char *file, int line, const char *fmt, ...)
178*57497Storek #else
179*57497Storek xerror(file, line, fmt, va_alist)
180*57497Storek 	const char *file;
181*57497Storek 	int line;
182*57497Storek 	const char *fmt;
183*57497Storek 	va_dcl
184*57497Storek #endif
185*57497Storek {
186*57497Storek 	va_list ap;
187*57497Storek 
188*57497Storek #if __STDC__
189*57497Storek 	va_start(ap, fmt);
190*57497Storek #else
191*57497Storek 	va_start(ap);
192*57497Storek #endif
193*57497Storek 	vxerror(file, line, fmt, ap);
194*57497Storek 	va_end(ap);
195*57497Storek }
196*57497Storek 
197*57497Storek /*
198*57497Storek  * Internal form of error() and xerror().
199*57497Storek  */
200*57497Storek static void
201*57497Storek vxerror(file, line, fmt, ap)
202*57497Storek 	const char *file;
203*57497Storek 	int line;
204*57497Storek 	const char *fmt;
205*57497Storek 	va_list ap;
206*57497Storek {
207*57497Storek 
208*57497Storek 	(void)fprintf(stderr, "%s:%d: ", file, line);
209*57497Storek 	(void)vfprintf(stderr, fmt, ap);
210*57497Storek 	(void)putc('\n', stderr);
211*57497Storek 	errors++;
212*57497Storek }
213*57497Storek 
214*57497Storek /*
215*57497Storek  * Internal error, abort.
216*57497Storek  */
217*57497Storek __dead void
218*57497Storek #if __STDC__
219*57497Storek panic(const char *fmt, ...)
220*57497Storek #else
221*57497Storek panic(fmt, va_alist)
222*57497Storek 	const char *fmt;
223*57497Storek 	va_dcl
224*57497Storek #endif
225*57497Storek {
226*57497Storek 	va_list ap;
227*57497Storek 
228*57497Storek #if __STDC__
229*57497Storek 	va_start(ap, fmt);
230*57497Storek #else
231*57497Storek 	va_start(ap);
232*57497Storek #endif
233*57497Storek 	(void)fprintf(stderr, "config: panic: ");
234*57497Storek 	(void)vfprintf(stderr, fmt, ap);
235*57497Storek 	(void)putc('\n', stderr);
236*57497Storek 	va_end(ap);
237*57497Storek 	exit(2);
238*57497Storek }
239