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