1 1.23 joe /* $NetBSD: util.c,v 1.23 2025/01/07 14:21:11 joe 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.23 joe __RCSID("$NetBSD: util.c,v 1.23 2025/01/07 14:21:11 joe 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.21 christos extern const char *yyfile; 62 1.21 christos 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.21 christos nv->nv_where.w_srcfile = yyfile; 204 1.21 christos 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.22 thorpej dl->dl_mkvar = 0; 262 1.14 dholland dl->dl_depends = NULL; 263 1.21 christos dl->dl_where.w_srcfile = yyfile; 264 1.21 christos dl->dl_where.w_srcline = currentline(); 265 1.14 dholland return dl; 266 1.14 dholland } 267 1.14 dholland 268 1.14 dholland void 269 1.14 dholland defoptlist_destroy(struct defoptlist *dl) 270 1.14 dholland { 271 1.14 dholland struct defoptlist *next; 272 1.14 dholland 273 1.14 dholland while (dl != NULL) { 274 1.14 dholland next = dl->dl_next; 275 1.14 dholland dl->dl_next = NULL; 276 1.14 dholland 277 1.14 dholland // XXX should we assert that dl->dl_deps is null to 278 1.14 dholland // be sure the deps have already been destroyed? 279 1.14 dholland free(dl); 280 1.14 dholland 281 1.14 dholland dl = next; 282 1.14 dholland } 283 1.14 dholland } 284 1.14 dholland 285 1.14 dholland struct defoptlist * 286 1.14 dholland defoptlist_append(struct defoptlist *dla, struct defoptlist *dlb) 287 1.14 dholland { 288 1.14 dholland struct defoptlist *dl; 289 1.14 dholland 290 1.14 dholland if (dla == NULL) 291 1.14 dholland return dlb; 292 1.14 dholland 293 1.14 dholland for (dl = dla; dl->dl_next != NULL; dl = dl->dl_next) 294 1.14 dholland ; 295 1.14 dholland 296 1.14 dholland dl->dl_next = dlb; 297 1.14 dholland return dla; 298 1.14 dholland } 299 1.14 dholland 300 1.14 dholland /* 301 1.13 dholland * Locator lists 302 1.13 dholland */ 303 1.13 dholland 304 1.13 dholland struct loclist * 305 1.13 dholland loclist_create(const char *name, const char *string, long long num) 306 1.13 dholland { 307 1.13 dholland struct loclist *ll; 308 1.13 dholland 309 1.13 dholland ll = emalloc(sizeof(*ll)); 310 1.13 dholland ll->ll_name = name; 311 1.13 dholland ll->ll_string = string; 312 1.13 dholland ll->ll_num = num; 313 1.13 dholland ll->ll_next = NULL; 314 1.13 dholland return ll; 315 1.13 dholland } 316 1.13 dholland 317 1.13 dholland void 318 1.13 dholland loclist_destroy(struct loclist *ll) 319 1.13 dholland { 320 1.13 dholland struct loclist *next; 321 1.13 dholland 322 1.13 dholland while (ll != NULL) { 323 1.13 dholland next = ll->ll_next; 324 1.13 dholland ll->ll_next = NULL; 325 1.13 dholland free(ll); 326 1.13 dholland ll = next; 327 1.13 dholland } 328 1.13 dholland } 329 1.13 dholland 330 1.13 dholland /* 331 1.12 dholland * Attribute lists 332 1.12 dholland */ 333 1.12 dholland 334 1.10 dholland struct attrlist * 335 1.10 dholland attrlist_create(void) 336 1.10 dholland { 337 1.10 dholland struct attrlist *al; 338 1.10 dholland 339 1.10 dholland al = emalloc(sizeof(*al)); 340 1.10 dholland al->al_next = NULL; 341 1.10 dholland al->al_this = NULL; 342 1.10 dholland return al; 343 1.10 dholland } 344 1.10 dholland 345 1.10 dholland struct attrlist * 346 1.10 dholland attrlist_cons(struct attrlist *next, struct attr *a) 347 1.10 dholland { 348 1.10 dholland struct attrlist *al; 349 1.10 dholland 350 1.10 dholland al = attrlist_create(); 351 1.10 dholland al->al_next = next; 352 1.10 dholland al->al_this = a; 353 1.10 dholland return al; 354 1.10 dholland } 355 1.10 dholland 356 1.10 dholland void 357 1.10 dholland attrlist_destroy(struct attrlist *al) 358 1.10 dholland { 359 1.10 dholland assert(al->al_next == NULL); 360 1.10 dholland assert(al->al_this == NULL); 361 1.10 dholland free(al); 362 1.10 dholland } 363 1.10 dholland 364 1.10 dholland void 365 1.10 dholland attrlist_destroyall(struct attrlist *al) 366 1.10 dholland { 367 1.10 dholland struct attrlist *next; 368 1.10 dholland 369 1.10 dholland while (al != NULL) { 370 1.10 dholland next = al->al_next; 371 1.10 dholland al->al_next = NULL; 372 1.10 dholland /* XXX should we make the caller guarantee this? */ 373 1.10 dholland al->al_this = NULL; 374 1.10 dholland attrlist_destroy(al); 375 1.10 dholland al = next; 376 1.10 dholland } 377 1.10 dholland } 378 1.10 dholland 379 1.11 dholland /* 380 1.12 dholland * Condition expressions 381 1.12 dholland */ 382 1.12 dholland 383 1.12 dholland /* 384 1.11 dholland * Create an expression node. 385 1.11 dholland */ 386 1.11 dholland struct condexpr * 387 1.11 dholland condexpr_create(enum condexpr_types type) 388 1.11 dholland { 389 1.11 dholland struct condexpr *cx; 390 1.11 dholland 391 1.11 dholland cx = emalloc(sizeof(*cx)); 392 1.11 dholland cx->cx_type = type; 393 1.11 dholland switch (type) { 394 1.11 dholland 395 1.11 dholland case CX_ATOM: 396 1.11 dholland cx->cx_atom = NULL; 397 1.11 dholland break; 398 1.11 dholland 399 1.11 dholland case CX_NOT: 400 1.11 dholland cx->cx_not = NULL; 401 1.11 dholland break; 402 1.11 dholland 403 1.11 dholland case CX_AND: 404 1.11 dholland cx->cx_and.left = NULL; 405 1.11 dholland cx->cx_and.right = NULL; 406 1.11 dholland break; 407 1.11 dholland 408 1.11 dholland case CX_OR: 409 1.11 dholland cx->cx_or.left = NULL; 410 1.11 dholland cx->cx_or.right = NULL; 411 1.11 dholland break; 412 1.23 joe 413 1.11 dholland default: 414 1.11 dholland panic("condexpr_create: invalid expr type %d", (int)type); 415 1.11 dholland } 416 1.11 dholland return cx; 417 1.11 dholland } 418 1.11 dholland 419 1.11 dholland /* 420 1.11 dholland * Free an expression tree. 421 1.11 dholland */ 422 1.11 dholland void 423 1.11 dholland condexpr_destroy(struct condexpr *expr) 424 1.11 dholland { 425 1.11 dholland switch (expr->cx_type) { 426 1.11 dholland 427 1.11 dholland case CX_ATOM: 428 1.11 dholland /* nothing */ 429 1.11 dholland break; 430 1.11 dholland 431 1.11 dholland case CX_NOT: 432 1.11 dholland condexpr_destroy(expr->cx_not); 433 1.11 dholland break; 434 1.11 dholland 435 1.11 dholland case CX_AND: 436 1.11 dholland condexpr_destroy(expr->cx_and.left); 437 1.11 dholland condexpr_destroy(expr->cx_and.right); 438 1.11 dholland break; 439 1.11 dholland 440 1.11 dholland case CX_OR: 441 1.11 dholland condexpr_destroy(expr->cx_or.left); 442 1.11 dholland condexpr_destroy(expr->cx_or.right); 443 1.11 dholland break; 444 1.11 dholland 445 1.11 dholland default: 446 1.11 dholland panic("condexpr_destroy: invalid expr type %d", 447 1.11 dholland (int)expr->cx_type); 448 1.11 dholland } 449 1.11 dholland free(expr); 450 1.11 dholland } 451 1.11 dholland 452 1.12 dholland /************************************************************/ 453 1.12 dholland 454 1.12 dholland /* 455 1.12 dholland * Diagnostic messages 456 1.12 dholland */ 457 1.12 dholland 458 1.17 uebayasi void 459 1.17 uebayasi cfgdbg(const char *fmt, ...) 460 1.17 uebayasi { 461 1.17 uebayasi va_list ap; 462 1.17 uebayasi extern const char *yyfile; 463 1.17 uebayasi 464 1.17 uebayasi va_start(ap, fmt); 465 1.17 uebayasi cfgvxdbg(yyfile, currentline(), fmt, ap); 466 1.17 uebayasi va_end(ap); 467 1.17 uebayasi } 468 1.17 uebayasi 469 1.1 thorpej void 470 1.6 christos cfgwarn(const char *fmt, ...) 471 1.1 thorpej { 472 1.1 thorpej va_list ap; 473 1.1 thorpej extern const char *yyfile; 474 1.1 thorpej 475 1.1 thorpej va_start(ap, fmt); 476 1.6 christos cfgvxwarn(yyfile, currentline(), fmt, ap); 477 1.1 thorpej va_end(ap); 478 1.1 thorpej } 479 1.1 thorpej 480 1.2 cube void 481 1.6 christos cfgxwarn(const char *file, int line, const char *fmt, ...) 482 1.2 cube { 483 1.2 cube va_list ap; 484 1.2 cube 485 1.2 cube va_start(ap, fmt); 486 1.6 christos cfgvxwarn(file, line, fmt, ap); 487 1.2 cube va_end(ap); 488 1.2 cube } 489 1.1 thorpej 490 1.17 uebayasi static void 491 1.17 uebayasi cfgvxdbg(const char *file, int line, const char *fmt, va_list ap) 492 1.17 uebayasi { 493 1.17 uebayasi cfgvxmsg(file, line, "debug: ", fmt, ap); 494 1.17 uebayasi } 495 1.17 uebayasi 496 1.1 thorpej static void 497 1.6 christos cfgvxwarn(const char *file, int line, const char *fmt, va_list ap) 498 1.1 thorpej { 499 1.6 christos cfgvxmsg(file, line, "warning: ", fmt, ap); 500 1.1 thorpej } 501 1.1 thorpej 502 1.1 thorpej /* 503 1.1 thorpej * External (config file) error. Complain, using current file 504 1.1 thorpej * and line number. 505 1.1 thorpej */ 506 1.1 thorpej void 507 1.6 christos cfgerror(const char *fmt, ...) 508 1.1 thorpej { 509 1.1 thorpej va_list ap; 510 1.1 thorpej extern const char *yyfile; 511 1.1 thorpej 512 1.1 thorpej va_start(ap, fmt); 513 1.6 christos cfgvxerror(yyfile, currentline(), fmt, ap); 514 1.1 thorpej va_end(ap); 515 1.1 thorpej } 516 1.1 thorpej 517 1.1 thorpej /* 518 1.1 thorpej * Delayed config file error (i.e., something was wrong but we could not 519 1.1 thorpej * find out about it until later). 520 1.1 thorpej */ 521 1.1 thorpej void 522 1.6 christos cfgxerror(const char *file, int line, const char *fmt, ...) 523 1.1 thorpej { 524 1.1 thorpej va_list ap; 525 1.1 thorpej 526 1.1 thorpej va_start(ap, fmt); 527 1.6 christos cfgvxerror(file, line, fmt, ap); 528 1.1 thorpej va_end(ap); 529 1.1 thorpej } 530 1.1 thorpej 531 1.1 thorpej /* 532 1.1 thorpej * Internal form of error() and xerror(). 533 1.1 thorpej */ 534 1.1 thorpej static void 535 1.6 christos cfgvxerror(const char *file, int line, const char *fmt, va_list ap) 536 1.1 thorpej { 537 1.6 christos cfgvxmsg(file, line, "", fmt, ap); 538 1.1 thorpej errors++; 539 1.1 thorpej } 540 1.1 thorpej 541 1.1 thorpej 542 1.1 thorpej /* 543 1.1 thorpej * Internal error, abort. 544 1.1 thorpej */ 545 1.1 thorpej __dead void 546 1.1 thorpej panic(const char *fmt, ...) 547 1.1 thorpej { 548 1.1 thorpej va_list ap; 549 1.1 thorpej 550 1.1 thorpej va_start(ap, fmt); 551 1.6 christos (void)fprintf(stderr, "%s: panic: ", getprogname()); 552 1.1 thorpej (void)vfprintf(stderr, fmt, ap); 553 1.1 thorpej (void)putc('\n', stderr); 554 1.1 thorpej va_end(ap); 555 1.1 thorpej exit(2); 556 1.1 thorpej } 557 1.1 thorpej 558 1.1 thorpej /* 559 1.1 thorpej * Internal form of error() and xerror(). 560 1.1 thorpej */ 561 1.1 thorpej static void 562 1.6 christos cfgvxmsg(const char *file, int line, const char *msgclass, const char *fmt, 563 1.1 thorpej va_list ap) 564 1.1 thorpej { 565 1.1 thorpej 566 1.16 christos (void)fprintf(stderr, "%s:%d: %s", file, line, msgclass); 567 1.1 thorpej (void)vfprintf(stderr, fmt, ap); 568 1.1 thorpej (void)putc('\n', stderr); 569 1.1 thorpej } 570 1.7 lukem 571 1.7 lukem void 572 1.7 lukem autogen_comment(FILE *fp, const char *targetfile) 573 1.7 lukem { 574 1.7 lukem 575 1.7 lukem (void)fprintf(fp, 576 1.7 lukem "/*\n" 577 1.7 lukem " * MACHINE GENERATED: DO NOT EDIT\n" 578 1.7 lukem " *\n" 579 1.7 lukem " * %s, from \"%s\"\n" 580 1.7 lukem " */\n\n", 581 1.7 lukem targetfile, conffile); 582 1.7 lukem } 583