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