1 /* Some standard utility stuff. */
2 
3 #include "defs.h"
4 #if STDC_HEADERS
5 # include <stdarg.h>
6 #endif
7 #include "util.h"
8 
9 char *Progname = NULL;
10 
11 /* Print a message and exit. */
12 
fatalerr(const char * str,...)13 void fatalerr(const char *str, ...)
14 {
15 	va_list ap;
16 
17 	if (Progname) {
18 		fprintf(stderr, "%s: ", Progname);
19 	}
20 	va_start(ap, str);
21 	vfprintf(stderr, str, ap);
22 	va_end(ap);
23 	fputc('\n', stderr);
24 
25 	exit(1);
26 }
27 
28 /* Just print a message. */
29 
msg(const char * str,...)30 void msg(const char *str, ...)
31 {
32 	va_list ap;
33 
34 	va_start(ap, str);
35 	vfprintf(stderr, str, ap);
36 	va_end(ap);
37 }
38 
39 /* Allocate some space and return a pointer to it.  See new() in util.h. */
40 
new_(size_t s)41 void *new_(size_t s)
42 {
43 	void *x;
44 
45 	if ((x = (void *)malloc(s)) == NULL) {
46 		fatalerr("can't malloc(%d)", s);
47 	}
48 
49 	return x;
50 }
51 
52 /* Open a file or exit on failure. */
53 
fileopen(const char * name,const char * mode)54 FILE *fileopen(const char *name, const char *mode)
55 {
56 	FILE *f;
57 
58 	if ((f = fopen(name, mode)) == NULL) {
59 		fatalerr("can't %s '%s'", *mode == 'r' ? "open" : "write", name);
60 	}
61 	return (f);
62 }
63 
64 /* Like atoi(), but strings ending in 'K' or 'k' are multiplied by 1024. */
65 
atoik(char * s)66 int atoik(char *s)
67 {
68 	int i, c;
69 
70 	i = atoi(s);
71 	c = s[strlen(s) - 1];
72 	if (c == 'K' || c == 'k') {
73 		i *= 1024;
74 	}
75 	return i;
76 }
77