155996Sbostic /*- 255996Sbostic * Copyright (c) 1992 Diomidis Spinellis. 355996Sbostic * Copyright (c) 1992 The Regents of the University of California. 455996Sbostic * All rights reserved. 555996Sbostic * 655996Sbostic * This code is derived from software contributed to Berkeley by 755996Sbostic * Diomidis Spinellis of Imperial College, University of London. 855996Sbostic * 955996Sbostic * %sccs.include.redist.c% 1055996Sbostic */ 1155996Sbostic 1255996Sbostic #ifndef lint 13*56045Sbostic static char sccsid[] = "@(#)misc.c 5.3 (Berkeley) 08/26/92"; 1455996Sbostic #endif /* not lint */ 1555996Sbostic 1655996Sbostic #include <sys/types.h> 1755996Sbostic 1855996Sbostic #include <errno.h> 1955996Sbostic #include <regex.h> 2055996Sbostic #include <stdio.h> 2155996Sbostic #include <stdlib.h> 2255996Sbostic #include <string.h> 2355996Sbostic 2455996Sbostic #include "defs.h" 2555996Sbostic #include "extern.h" 2655996Sbostic 2755996Sbostic /* 2855996Sbostic * malloc with result test 2955996Sbostic */ 3055996Sbostic void * 3155996Sbostic xmalloc(size) 3255996Sbostic u_int size; 3355996Sbostic { 3455996Sbostic void *p; 3555996Sbostic 3655996Sbostic if ((p = malloc(size)) == NULL) 3755996Sbostic err(FATAL, "%s", strerror(errno)); 3855996Sbostic return (p); 3955996Sbostic } 4055996Sbostic 4155996Sbostic /* 4255996Sbostic * realloc with result test 4355996Sbostic */ 4455996Sbostic void * 4555996Sbostic xrealloc(p, size) 4655996Sbostic void *p; 4755996Sbostic u_int size; 4855996Sbostic { 4955996Sbostic if (p == NULL) /* Compatibility hack. */ 5055996Sbostic return (xmalloc(size)); 5155996Sbostic 5255996Sbostic if ((p = realloc(p, size)) == NULL) 5355996Sbostic err(FATAL, "%s", strerror(errno)); 5455996Sbostic return (p); 5555996Sbostic } 5655996Sbostic 5755996Sbostic /* 5855996Sbostic * Return a string for a regular expression error passed. This is a overkill, 5955996Sbostic * because of the silly semantics of regerror (we can never know the size of 6055996Sbostic * the buffer). 6155996Sbostic */ 6255996Sbostic char * 6355996Sbostic strregerror(errcode, preg) 6455996Sbostic int errcode; 6555996Sbostic regex_t *preg; 6655996Sbostic { 6755996Sbostic static char *oe; 6855996Sbostic size_t s; 6955996Sbostic 7055996Sbostic if (oe != NULL) 7155996Sbostic free(oe); 7255996Sbostic s = regerror(errcode, preg, "", 0); 7355996Sbostic oe = xmalloc(s); 7455996Sbostic (void)regerror(errcode, preg, oe, s); 7555996Sbostic return (oe); 7655996Sbostic } 7755996Sbostic 7855996Sbostic #if __STDC__ 7955996Sbostic #include <stdarg.h> 8055996Sbostic #else 8155996Sbostic #include <varargs.h> 8255996Sbostic #endif 8355996Sbostic /* 8455996Sbostic * Error reporting function 8555996Sbostic */ 8655996Sbostic void 8755996Sbostic #if __STDC__ 8855996Sbostic err(int severity, const char *fmt, ...) 8955996Sbostic #else 9055996Sbostic err(severity, fmt, va_alist) 9155996Sbostic int severity; 9255996Sbostic char *fmt; 9355996Sbostic va_dcl 9455996Sbostic #endif 9555996Sbostic { 9655996Sbostic va_list ap; 9755996Sbostic #if __STDC__ 9855996Sbostic va_start(ap, fmt); 9955996Sbostic #else 10055996Sbostic va_start(ap); 10155996Sbostic #endif 10255996Sbostic (void)fprintf(stderr, "sed: "); 10355996Sbostic switch (severity) { 10455996Sbostic case WARNING: 10555996Sbostic case COMPILE: 106*56045Sbostic (void)fprintf(stderr, "%lu: %s: ", linenum, fname); 10755996Sbostic } 10855996Sbostic (void)vfprintf(stderr, fmt, ap); 10955996Sbostic va_end(ap); 11055996Sbostic (void)fprintf(stderr, "\n"); 11156014Sbostic if (severity == WARNING) 11256014Sbostic return; 11356014Sbostic exit(1); 11455996Sbostic /* NOTREACHED */ 11555996Sbostic } 116