Home | History | Annotate | Line # | Download | only in config
util.c revision 1.20.16.1
      1       1.20  uebayasi /*	$NetBSD: util.c,v 1.20.16.1 2020/04/08 14:09:15 martin Exp $	*/
      2        1.1   thorpej 
      3        1.1   thorpej /*
      4        1.1   thorpej  * Copyright (c) 1992, 1993
      5        1.1   thorpej  *	The Regents of the University of California.  All rights reserved.
      6        1.1   thorpej  *
      7        1.1   thorpej  * This software was developed by the Computer Systems Engineering group
      8        1.1   thorpej  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
      9        1.1   thorpej  * contributed to Berkeley.
     10        1.1   thorpej  *
     11        1.1   thorpej  * All advertising materials mentioning features or use of this software
     12        1.1   thorpej  * must display the following acknowledgement:
     13        1.1   thorpej  *	This product includes software developed by the University of
     14        1.1   thorpej  *	California, Lawrence Berkeley Laboratories.
     15        1.1   thorpej  *
     16        1.1   thorpej  * Redistribution and use in source and binary forms, with or without
     17        1.1   thorpej  * modification, are permitted provided that the following conditions
     18        1.1   thorpej  * are met:
     19        1.1   thorpej  * 1. Redistributions of source code must retain the above copyright
     20        1.1   thorpej  *    notice, this list of conditions and the following disclaimer.
     21        1.1   thorpej  * 2. Redistributions in binary form must reproduce the above copyright
     22        1.1   thorpej  *    notice, this list of conditions and the following disclaimer in the
     23        1.1   thorpej  *    documentation and/or other materials provided with the distribution.
     24        1.1   thorpej  * 3. Neither the name of the University nor the names of its contributors
     25        1.1   thorpej  *    may be used to endorse or promote products derived from this software
     26        1.1   thorpej  *    without specific prior written permission.
     27        1.1   thorpej  *
     28        1.1   thorpej  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     29        1.1   thorpej  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     30        1.1   thorpej  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     31        1.1   thorpej  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     32        1.1   thorpej  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     33        1.1   thorpej  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     34        1.1   thorpej  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     35        1.1   thorpej  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     36        1.1   thorpej  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     37        1.1   thorpej  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     38        1.1   thorpej  * SUCH DAMAGE.
     39        1.1   thorpej  *
     40        1.1   thorpej  *	from: @(#)util.c	8.1 (Berkeley) 6/6/93
     41        1.1   thorpej  */
     42        1.1   thorpej 
     43        1.1   thorpej #if HAVE_NBTOOL_CONFIG_H
     44        1.1   thorpej #include "nbtool_config.h"
     45        1.1   thorpej #endif
     46        1.1   thorpej 
     47       1.19  christos #include <sys/cdefs.h>
     48       1.19  christos __RCSID("$NetBSD: util.c,v 1.20.16.1 2020/04/08 14:09:15 martin Exp $");
     49       1.19  christos 
     50        1.3  christos #include <sys/types.h>
     51       1.10  dholland #include <assert.h>
     52        1.1   thorpej #include <ctype.h>
     53        1.1   thorpej #include <stdio.h>
     54        1.1   thorpej #include <stdlib.h>
     55        1.1   thorpej #include <string.h>
     56        1.1   thorpej #include <stdarg.h>
     57        1.3  christos #include <util.h>
     58        1.6  christos #include <err.h>
     59        1.1   thorpej #include "defs.h"
     60        1.1   thorpej 
     61  1.20.16.1    martin extern const char *yyfile;
     62  1.20.16.1    martin 
     63        1.6  christos static void cfgvxerror(const char *, int, const char *, va_list)
     64        1.9  dholland 	     __printflike(3, 0);
     65       1.17  uebayasi static void cfgvxdbg(const char *, int, const char *, va_list)
     66       1.17  uebayasi 	     __printflike(3, 0);
     67        1.6  christos static void cfgvxwarn(const char *, int, const char *, va_list)
     68        1.9  dholland 	     __printflike(3, 0);
     69        1.6  christos static void cfgvxmsg(const char *, int, const char *, const char *, va_list)
     70        1.9  dholland      __printflike(4, 0);
     71        1.1   thorpej 
     72       1.12  dholland /************************************************************/
     73       1.12  dholland 
     74       1.12  dholland /*
     75       1.12  dholland  * Prefix stack
     76       1.12  dholland  */
     77       1.12  dholland 
     78       1.20  uebayasi static void
     79       1.20  uebayasi prefixlist_push(struct prefixlist *pl, const char *path)
     80        1.1   thorpej {
     81       1.20  uebayasi 	struct prefix *prevpf = SLIST_FIRST(pl);
     82        1.1   thorpej 	struct prefix *pf;
     83        1.1   thorpej 	char *cp;
     84        1.1   thorpej 
     85        1.1   thorpej 	pf = ecalloc(1, sizeof(struct prefix));
     86        1.1   thorpej 
     87       1.20  uebayasi 	if (prevpf != NULL) {
     88       1.20  uebayasi 		cp = emalloc(strlen(prevpf->pf_prefix) + 1 +
     89        1.1   thorpej 		    strlen(path) + 1);
     90       1.20  uebayasi 		(void) sprintf(cp, "%s/%s", prevpf->pf_prefix, path);
     91        1.1   thorpej 		pf->pf_prefix = intern(cp);
     92        1.1   thorpej 		free(cp);
     93        1.1   thorpej 	} else
     94        1.1   thorpej 		pf->pf_prefix = intern(path);
     95        1.1   thorpej 
     96       1.20  uebayasi 	SLIST_INSERT_HEAD(pl, pf, pf_next);
     97       1.20  uebayasi }
     98       1.20  uebayasi 
     99       1.20  uebayasi static void
    100       1.20  uebayasi prefixlist_pop(struct prefixlist *allpl, struct prefixlist *pl)
    101       1.20  uebayasi {
    102       1.20  uebayasi 	struct prefix *pf;
    103       1.20  uebayasi 
    104       1.20  uebayasi 	if ((pf = SLIST_FIRST(pl)) == NULL) {
    105       1.20  uebayasi 		cfgerror("no prefixes on the stack to pop");
    106       1.20  uebayasi 		return;
    107       1.20  uebayasi 	}
    108       1.20  uebayasi 
    109       1.20  uebayasi 	SLIST_REMOVE_HEAD(pl, pf_next);
    110       1.20  uebayasi 	/* Remember this prefix for emitting -I... directives later. */
    111       1.20  uebayasi 	SLIST_INSERT_HEAD(allpl, pf, pf_next);
    112       1.20  uebayasi }
    113       1.20  uebayasi 
    114       1.20  uebayasi /*
    115       1.20  uebayasi  * Push a prefix onto the prefix stack.
    116       1.20  uebayasi  */
    117       1.20  uebayasi void
    118       1.20  uebayasi prefix_push(const char *path)
    119       1.20  uebayasi {
    120       1.20  uebayasi 	prefixlist_push(&prefixes, path);
    121        1.1   thorpej }
    122        1.1   thorpej 
    123        1.1   thorpej /*
    124        1.1   thorpej  * Pop a prefix off the prefix stack.
    125        1.1   thorpej  */
    126        1.1   thorpej void
    127        1.1   thorpej prefix_pop(void)
    128        1.1   thorpej {
    129       1.20  uebayasi 	prefixlist_pop(&allprefixes, &prefixes);
    130       1.20  uebayasi }
    131        1.1   thorpej 
    132       1.20  uebayasi /*
    133       1.20  uebayasi  * Push a buildprefix onto the buildprefix stack.
    134       1.20  uebayasi  */
    135       1.20  uebayasi void
    136       1.20  uebayasi buildprefix_push(const char *path)
    137       1.20  uebayasi {
    138       1.20  uebayasi 	prefixlist_push(&buildprefixes, path);
    139       1.20  uebayasi }
    140        1.1   thorpej 
    141       1.20  uebayasi /*
    142       1.20  uebayasi  * Pop a buildprefix off the buildprefix stack.
    143       1.20  uebayasi  */
    144       1.20  uebayasi void
    145       1.20  uebayasi buildprefix_pop(void)
    146       1.20  uebayasi {
    147       1.20  uebayasi 	prefixlist_pop(&allbuildprefixes, &buildprefixes);
    148        1.1   thorpej }
    149        1.1   thorpej 
    150        1.1   thorpej /*
    151        1.1   thorpej  * Prepend the source path to a file name.
    152        1.1   thorpej  */
    153        1.1   thorpej char *
    154        1.1   thorpej sourcepath(const char *file)
    155        1.1   thorpej {
    156        1.1   thorpej 	size_t len;
    157        1.1   thorpej 	char *cp;
    158        1.1   thorpej 	struct prefix *pf;
    159        1.1   thorpej 
    160        1.1   thorpej 	pf = SLIST_EMPTY(&prefixes) ? NULL : SLIST_FIRST(&prefixes);
    161        1.1   thorpej 	if (pf != NULL && *pf->pf_prefix == '/')
    162        1.1   thorpej 		len = strlen(pf->pf_prefix) + 1 + strlen(file) + 1;
    163        1.1   thorpej 	else {
    164        1.1   thorpej 		len = strlen(srcdir) + 1 + strlen(file) + 1;
    165        1.1   thorpej 		if (pf != NULL)
    166        1.1   thorpej 			len += strlen(pf->pf_prefix) + 1;
    167        1.1   thorpej 	}
    168        1.1   thorpej 
    169        1.1   thorpej 	cp = emalloc(len);
    170        1.1   thorpej 
    171        1.1   thorpej 	if (pf != NULL) {
    172        1.1   thorpej 		if (*pf->pf_prefix == '/')
    173        1.1   thorpej 			(void) sprintf(cp, "%s/%s", pf->pf_prefix, file);
    174        1.1   thorpej 		else
    175        1.1   thorpej 			(void) sprintf(cp, "%s/%s/%s", srcdir,
    176        1.1   thorpej 			    pf->pf_prefix, file);
    177        1.1   thorpej 	} else
    178        1.1   thorpej 		(void) sprintf(cp, "%s/%s", srcdir, file);
    179        1.1   thorpej 	return (cp);
    180        1.1   thorpej }
    181        1.1   thorpej 
    182       1.12  dholland /************************************************************/
    183       1.12  dholland 
    184       1.12  dholland /*
    185       1.12  dholland  * Data structures
    186       1.12  dholland  */
    187       1.12  dholland 
    188       1.12  dholland /*
    189       1.12  dholland  * nvlist
    190       1.12  dholland  */
    191       1.12  dholland 
    192        1.1   thorpej struct nvlist *
    193        1.8  christos newnv(const char *name, const char *str, void *ptr, long long i, struct nvlist *next)
    194        1.1   thorpej {
    195        1.1   thorpej 	struct nvlist *nv;
    196        1.1   thorpej 
    197        1.4       dsl 	nv = ecalloc(1, sizeof(*nv));
    198        1.1   thorpej 	nv->nv_next = next;
    199        1.1   thorpej 	nv->nv_name = name;
    200        1.4       dsl 	nv->nv_str = str;
    201        1.4       dsl 	nv->nv_ptr = ptr;
    202        1.8  christos 	nv->nv_num = i;
    203  1.20.16.1    martin 	nv->nv_where.w_srcfile = yyfile;
    204  1.20.16.1    martin 	nv->nv_where.w_srcline = currentline();
    205        1.4       dsl 	return nv;
    206        1.1   thorpej }
    207        1.1   thorpej 
    208        1.1   thorpej /*
    209        1.1   thorpej  * Free an nvlist structure (just one).
    210        1.1   thorpej  */
    211        1.1   thorpej void
    212        1.1   thorpej nvfree(struct nvlist *nv)
    213        1.1   thorpej {
    214        1.1   thorpej 
    215        1.4       dsl 	free(nv);
    216        1.1   thorpej }
    217        1.1   thorpej 
    218        1.1   thorpej /*
    219        1.1   thorpej  * Free an nvlist (the whole list).
    220        1.1   thorpej  */
    221        1.1   thorpej void
    222        1.1   thorpej nvfreel(struct nvlist *nv)
    223        1.1   thorpej {
    224        1.1   thorpej 	struct nvlist *next;
    225        1.1   thorpej 
    226        1.1   thorpej 	for (; nv != NULL; nv = next) {
    227        1.1   thorpej 		next = nv->nv_next;
    228        1.4       dsl 		free(nv);
    229        1.1   thorpej 	}
    230        1.1   thorpej }
    231        1.1   thorpej 
    232        1.5      cube struct nvlist *
    233        1.5      cube nvcat(struct nvlist *nv1, struct nvlist *nv2)
    234        1.5      cube {
    235        1.5      cube 	struct nvlist *nv;
    236        1.5      cube 
    237        1.5      cube 	if (nv1 == NULL)
    238        1.5      cube 		return nv2;
    239        1.5      cube 
    240        1.5      cube 	for (nv = nv1; nv->nv_next != NULL; nv = nv->nv_next);
    241        1.5      cube 
    242        1.5      cube 	nv->nv_next = nv2;
    243        1.5      cube 	return nv1;
    244        1.5      cube }
    245        1.5      cube 
    246       1.12  dholland /*
    247       1.14  dholland  * Option definition lists
    248       1.14  dholland  */
    249       1.14  dholland 
    250       1.14  dholland struct defoptlist *
    251       1.14  dholland defoptlist_create(const char *name, const char *val, const char *lintval)
    252       1.14  dholland {
    253       1.14  dholland 	struct defoptlist *dl;
    254       1.14  dholland 
    255       1.14  dholland 	dl = emalloc(sizeof(*dl));
    256       1.14  dholland 	dl->dl_next = NULL;
    257       1.14  dholland 	dl->dl_name = name;
    258       1.14  dholland 	dl->dl_value = val;
    259       1.14  dholland 	dl->dl_lintvalue = lintval;
    260       1.14  dholland 	dl->dl_obsolete = 0;
    261       1.14  dholland 	dl->dl_depends = NULL;
    262  1.20.16.1    martin 	dl->dl_where.w_srcfile = yyfile;
    263  1.20.16.1    martin 	dl->dl_where.w_srcline = currentline();
    264       1.14  dholland 	return dl;
    265       1.14  dholland }
    266       1.14  dholland 
    267       1.14  dholland void
    268       1.14  dholland defoptlist_destroy(struct defoptlist *dl)
    269       1.14  dholland {
    270       1.14  dholland 	struct defoptlist *next;
    271       1.14  dholland 
    272       1.14  dholland 	while (dl != NULL) {
    273       1.14  dholland 		next = dl->dl_next;
    274       1.14  dholland 		dl->dl_next = NULL;
    275       1.14  dholland 
    276       1.14  dholland 		// XXX should we assert that dl->dl_deps is null to
    277       1.14  dholland 		// be sure the deps have already been destroyed?
    278       1.14  dholland 		free(dl);
    279       1.14  dholland 
    280       1.14  dholland 		dl = next;
    281       1.14  dholland 	}
    282       1.14  dholland }
    283       1.14  dholland 
    284       1.14  dholland struct defoptlist *
    285       1.14  dholland defoptlist_append(struct defoptlist *dla, struct defoptlist *dlb)
    286       1.14  dholland {
    287       1.14  dholland 	struct defoptlist *dl;
    288       1.14  dholland 
    289       1.14  dholland 	if (dla == NULL)
    290       1.14  dholland 		return dlb;
    291       1.14  dholland 
    292       1.14  dholland 	for (dl = dla; dl->dl_next != NULL; dl = dl->dl_next)
    293       1.14  dholland 		;
    294       1.14  dholland 
    295       1.14  dholland 	dl->dl_next = dlb;
    296       1.14  dholland 	return dla;
    297       1.14  dholland }
    298       1.14  dholland 
    299       1.14  dholland /*
    300       1.13  dholland  * Locator lists
    301       1.13  dholland  */
    302       1.13  dholland 
    303       1.13  dholland struct loclist *
    304       1.13  dholland loclist_create(const char *name, const char *string, long long num)
    305       1.13  dholland {
    306       1.13  dholland 	struct loclist *ll;
    307       1.13  dholland 
    308       1.13  dholland 	ll = emalloc(sizeof(*ll));
    309       1.13  dholland 	ll->ll_name = name;
    310       1.13  dholland 	ll->ll_string = string;
    311       1.13  dholland 	ll->ll_num = num;
    312       1.13  dholland 	ll->ll_next = NULL;
    313       1.13  dholland 	return ll;
    314       1.13  dholland }
    315       1.13  dholland 
    316       1.13  dholland void
    317       1.13  dholland loclist_destroy(struct loclist *ll)
    318       1.13  dholland {
    319       1.13  dholland 	struct loclist *next;
    320       1.13  dholland 
    321       1.13  dholland 	while (ll != NULL) {
    322       1.13  dholland 		next = ll->ll_next;
    323       1.13  dholland 		ll->ll_next = NULL;
    324       1.13  dholland 		free(ll);
    325       1.13  dholland 		ll = next;
    326       1.13  dholland 	}
    327       1.13  dholland }
    328       1.13  dholland 
    329       1.13  dholland /*
    330       1.12  dholland  * Attribute lists
    331       1.12  dholland  */
    332       1.12  dholland 
    333       1.10  dholland struct attrlist *
    334       1.10  dholland attrlist_create(void)
    335       1.10  dholland {
    336       1.10  dholland 	struct attrlist *al;
    337       1.10  dholland 
    338       1.10  dholland 	al = emalloc(sizeof(*al));
    339       1.10  dholland 	al->al_next = NULL;
    340       1.10  dholland 	al->al_this = NULL;
    341       1.10  dholland 	return al;
    342       1.10  dholland }
    343       1.10  dholland 
    344       1.10  dholland struct attrlist *
    345       1.10  dholland attrlist_cons(struct attrlist *next, struct attr *a)
    346       1.10  dholland {
    347       1.10  dholland 	struct attrlist *al;
    348       1.10  dholland 
    349       1.10  dholland 	al = attrlist_create();
    350       1.10  dholland 	al->al_next = next;
    351       1.10  dholland 	al->al_this = a;
    352       1.10  dholland 	return al;
    353       1.10  dholland }
    354       1.10  dholland 
    355       1.10  dholland void
    356       1.10  dholland attrlist_destroy(struct attrlist *al)
    357       1.10  dholland {
    358       1.10  dholland 	assert(al->al_next == NULL);
    359       1.10  dholland 	assert(al->al_this == NULL);
    360       1.10  dholland 	free(al);
    361       1.10  dholland }
    362       1.10  dholland 
    363       1.10  dholland void
    364       1.10  dholland attrlist_destroyall(struct attrlist *al)
    365       1.10  dholland {
    366       1.10  dholland 	struct attrlist *next;
    367       1.10  dholland 
    368       1.10  dholland 	while (al != NULL) {
    369       1.10  dholland 		next = al->al_next;
    370       1.10  dholland 		al->al_next = NULL;
    371       1.10  dholland 		/* XXX should we make the caller guarantee this? */
    372       1.10  dholland 		al->al_this = NULL;
    373       1.10  dholland 		attrlist_destroy(al);
    374       1.10  dholland 		al = next;
    375       1.10  dholland 	}
    376       1.10  dholland }
    377       1.10  dholland 
    378       1.11  dholland /*
    379       1.12  dholland  * Condition expressions
    380       1.12  dholland  */
    381       1.12  dholland 
    382       1.12  dholland /*
    383       1.11  dholland  * Create an expression node.
    384       1.11  dholland  */
    385       1.11  dholland struct condexpr *
    386       1.11  dholland condexpr_create(enum condexpr_types type)
    387       1.11  dholland {
    388       1.11  dholland 	struct condexpr *cx;
    389       1.11  dholland 
    390       1.11  dholland 	cx = emalloc(sizeof(*cx));
    391       1.11  dholland 	cx->cx_type = type;
    392       1.11  dholland 	switch (type) {
    393       1.11  dholland 
    394       1.11  dholland 	    case CX_ATOM:
    395       1.11  dholland 		cx->cx_atom = NULL;
    396       1.11  dholland 		break;
    397       1.11  dholland 
    398       1.11  dholland 	    case CX_NOT:
    399       1.11  dholland 		cx->cx_not = NULL;
    400       1.11  dholland 		break;
    401       1.11  dholland 
    402       1.11  dholland 	    case CX_AND:
    403       1.11  dholland 		cx->cx_and.left = NULL;
    404       1.11  dholland 		cx->cx_and.right = NULL;
    405       1.11  dholland 		break;
    406       1.11  dholland 
    407       1.11  dholland 	    case CX_OR:
    408       1.11  dholland 		cx->cx_or.left = NULL;
    409       1.11  dholland 		cx->cx_or.right = NULL;
    410       1.11  dholland 		break;
    411       1.11  dholland 
    412       1.11  dholland 	    default:
    413       1.11  dholland 		panic("condexpr_create: invalid expr type %d", (int)type);
    414       1.11  dholland 	}
    415       1.11  dholland 	return cx;
    416       1.11  dholland }
    417       1.11  dholland 
    418       1.11  dholland /*
    419       1.11  dholland  * Free an expression tree.
    420       1.11  dholland  */
    421       1.11  dholland void
    422       1.11  dholland condexpr_destroy(struct condexpr *expr)
    423       1.11  dholland {
    424       1.11  dholland 	switch (expr->cx_type) {
    425       1.11  dholland 
    426       1.11  dholland 	    case CX_ATOM:
    427       1.11  dholland 		/* nothing */
    428       1.11  dholland 		break;
    429       1.11  dholland 
    430       1.11  dholland 	    case CX_NOT:
    431       1.11  dholland 		condexpr_destroy(expr->cx_not);
    432       1.11  dholland 		break;
    433       1.11  dholland 
    434       1.11  dholland 	    case CX_AND:
    435       1.11  dholland 		condexpr_destroy(expr->cx_and.left);
    436       1.11  dholland 		condexpr_destroy(expr->cx_and.right);
    437       1.11  dholland 		break;
    438       1.11  dholland 
    439       1.11  dholland 	    case CX_OR:
    440       1.11  dholland 		condexpr_destroy(expr->cx_or.left);
    441       1.11  dholland 		condexpr_destroy(expr->cx_or.right);
    442       1.11  dholland 		break;
    443       1.11  dholland 
    444       1.11  dholland 	    default:
    445       1.11  dholland 		panic("condexpr_destroy: invalid expr type %d",
    446       1.11  dholland 		      (int)expr->cx_type);
    447       1.11  dholland 	}
    448       1.11  dholland 	free(expr);
    449       1.11  dholland }
    450       1.11  dholland 
    451       1.12  dholland /************************************************************/
    452       1.12  dholland 
    453       1.12  dholland /*
    454       1.12  dholland  * Diagnostic messages
    455       1.12  dholland  */
    456       1.12  dholland 
    457       1.17  uebayasi void
    458       1.17  uebayasi cfgdbg(const char *fmt, ...)
    459       1.17  uebayasi {
    460       1.17  uebayasi 	va_list ap;
    461       1.17  uebayasi 	extern const char *yyfile;
    462       1.17  uebayasi 
    463       1.17  uebayasi 	va_start(ap, fmt);
    464       1.17  uebayasi 	cfgvxdbg(yyfile, currentline(), fmt, ap);
    465       1.17  uebayasi 	va_end(ap);
    466       1.17  uebayasi }
    467       1.17  uebayasi 
    468        1.1   thorpej void
    469        1.6  christos cfgwarn(const char *fmt, ...)
    470        1.1   thorpej {
    471        1.1   thorpej 	va_list ap;
    472        1.1   thorpej 	extern const char *yyfile;
    473        1.1   thorpej 
    474        1.1   thorpej 	va_start(ap, fmt);
    475        1.6  christos 	cfgvxwarn(yyfile, currentline(), fmt, ap);
    476        1.1   thorpej 	va_end(ap);
    477        1.1   thorpej }
    478        1.1   thorpej 
    479        1.2      cube void
    480        1.6  christos cfgxwarn(const char *file, int line, const char *fmt, ...)
    481        1.2      cube {
    482        1.2      cube 	va_list ap;
    483        1.2      cube 
    484        1.2      cube 	va_start(ap, fmt);
    485        1.6  christos 	cfgvxwarn(file, line, fmt, ap);
    486        1.2      cube 	va_end(ap);
    487        1.2      cube }
    488        1.1   thorpej 
    489       1.17  uebayasi static void
    490       1.17  uebayasi cfgvxdbg(const char *file, int line, const char *fmt, va_list ap)
    491       1.17  uebayasi {
    492       1.17  uebayasi 	cfgvxmsg(file, line, "debug: ", fmt, ap);
    493       1.17  uebayasi }
    494       1.17  uebayasi 
    495        1.1   thorpej static void
    496        1.6  christos cfgvxwarn(const char *file, int line, const char *fmt, va_list ap)
    497        1.1   thorpej {
    498        1.6  christos 	cfgvxmsg(file, line, "warning: ", fmt, ap);
    499        1.1   thorpej }
    500        1.1   thorpej 
    501        1.1   thorpej /*
    502        1.1   thorpej  * External (config file) error.  Complain, using current file
    503        1.1   thorpej  * and line number.
    504        1.1   thorpej  */
    505        1.1   thorpej void
    506        1.6  christos cfgerror(const char *fmt, ...)
    507        1.1   thorpej {
    508        1.1   thorpej 	va_list ap;
    509        1.1   thorpej 	extern const char *yyfile;
    510        1.1   thorpej 
    511        1.1   thorpej 	va_start(ap, fmt);
    512        1.6  christos 	cfgvxerror(yyfile, currentline(), fmt, ap);
    513        1.1   thorpej 	va_end(ap);
    514        1.1   thorpej }
    515        1.1   thorpej 
    516        1.1   thorpej /*
    517        1.1   thorpej  * Delayed config file error (i.e., something was wrong but we could not
    518        1.1   thorpej  * find out about it until later).
    519        1.1   thorpej  */
    520        1.1   thorpej void
    521        1.6  christos cfgxerror(const char *file, int line, const char *fmt, ...)
    522        1.1   thorpej {
    523        1.1   thorpej 	va_list ap;
    524        1.1   thorpej 
    525        1.1   thorpej 	va_start(ap, fmt);
    526        1.6  christos 	cfgvxerror(file, line, fmt, ap);
    527        1.1   thorpej 	va_end(ap);
    528        1.1   thorpej }
    529        1.1   thorpej 
    530        1.1   thorpej /*
    531        1.1   thorpej  * Internal form of error() and xerror().
    532        1.1   thorpej  */
    533        1.1   thorpej static void
    534        1.6  christos cfgvxerror(const char *file, int line, const char *fmt, va_list ap)
    535        1.1   thorpej {
    536        1.6  christos 	cfgvxmsg(file, line, "", fmt, ap);
    537        1.1   thorpej 	errors++;
    538        1.1   thorpej }
    539        1.1   thorpej 
    540        1.1   thorpej 
    541        1.1   thorpej /*
    542        1.1   thorpej  * Internal error, abort.
    543        1.1   thorpej  */
    544        1.1   thorpej __dead void
    545        1.1   thorpej panic(const char *fmt, ...)
    546        1.1   thorpej {
    547        1.1   thorpej 	va_list ap;
    548        1.1   thorpej 
    549        1.1   thorpej 	va_start(ap, fmt);
    550        1.6  christos 	(void)fprintf(stderr, "%s: panic: ", getprogname());
    551        1.1   thorpej 	(void)vfprintf(stderr, fmt, ap);
    552        1.1   thorpej 	(void)putc('\n', stderr);
    553        1.1   thorpej 	va_end(ap);
    554        1.1   thorpej 	exit(2);
    555        1.1   thorpej }
    556        1.1   thorpej 
    557        1.1   thorpej /*
    558        1.1   thorpej  * Internal form of error() and xerror().
    559        1.1   thorpej  */
    560        1.1   thorpej static void
    561        1.6  christos cfgvxmsg(const char *file, int line, const char *msgclass, const char *fmt,
    562        1.1   thorpej       va_list ap)
    563        1.1   thorpej {
    564        1.1   thorpej 
    565       1.16  christos 	(void)fprintf(stderr, "%s:%d: %s", file, line, msgclass);
    566        1.1   thorpej 	(void)vfprintf(stderr, fmt, ap);
    567        1.1   thorpej 	(void)putc('\n', stderr);
    568        1.1   thorpej }
    569        1.7     lukem 
    570        1.7     lukem void
    571        1.7     lukem autogen_comment(FILE *fp, const char *targetfile)
    572        1.7     lukem {
    573        1.7     lukem 
    574        1.7     lukem 	(void)fprintf(fp,
    575        1.7     lukem 	    "/*\n"
    576        1.7     lukem 	    " * MACHINE GENERATED: DO NOT EDIT\n"
    577        1.7     lukem 	    " *\n"
    578        1.7     lukem 	    " * %s, from \"%s\"\n"
    579        1.7     lukem 	    " */\n\n",
    580        1.7     lukem 	    targetfile, conffile);
    581        1.7     lukem }
    582