0
|
1 #include "dmlib.h"
|
|
2 #include <errno.h>
|
|
3
|
|
4
|
|
5 int dmVerbosity = 0;
|
|
6 char *dmProgName = NULL,
|
|
7 *dmProgDesc = NULL,
|
|
8 *dmProgVersion = NULL,
|
|
9 *dmProgAuthor = NULL,
|
|
10 *dmProgLicense = NULL;
|
|
11
|
|
12
|
|
13 void dmInitProg(char *name, char *desc, char *version, char *author, char *license)
|
|
14 {
|
|
15 dmProgName = name;
|
|
16 dmProgDesc = desc;
|
|
17 dmProgVersion = version;
|
|
18
|
|
19 if (author)
|
|
20 dmProgAuthor = author;
|
|
21 else
|
|
22 dmProgAuthor = DM_PROG_AUTHOR;
|
|
23
|
|
24 if (license)
|
|
25 dmProgLicense = license;
|
|
26 else
|
|
27 dmProgLicense = DM_PROG_LICENSE;
|
|
28
|
|
29 }
|
|
30
|
|
31
|
|
32 void dmPrintBanner(FILE *outFile, const char *name, const char *usage)
|
|
33 {
|
|
34 fprintf(outFile,
|
|
35 "\n%s v%s (%s)\n"
|
|
36 "%s\n"
|
|
37 "%s\n"
|
|
38 "Usage: %s %s\n",
|
|
39 dmProgName, dmProgVersion, dmProgDesc,
|
|
40 dmProgAuthor, dmProgLicense, name, usage);
|
|
41 }
|
|
42
|
|
43
|
|
44 void dmMsgVA(int level, const char *fmt, va_list ap)
|
|
45 {
|
|
46 if (dmVerbosity >= level)
|
|
47 {
|
|
48 fprintf(stderr, "%s: ", dmProgName);
|
|
49 vfprintf(stderr, fmt, ap);
|
|
50 }
|
|
51 }
|
|
52
|
|
53
|
|
54 void dmPrintVA(int level, const char *fmt, va_list ap)
|
|
55 {
|
|
56 if (dmVerbosity >= level)
|
|
57 {
|
|
58 vfprintf(stderr, fmt, ap);
|
|
59 }
|
|
60 }
|
|
61
|
|
62
|
|
63 void dmErrorVA(const char *fmt, va_list ap)
|
|
64 {
|
|
65 fprintf(stderr, "%s: ", dmProgName);
|
|
66 vfprintf(stderr, fmt, ap);
|
|
67 }
|
|
68
|
|
69
|
|
70 void dmError(const char *fmt, ...)
|
|
71 {
|
|
72 va_list ap;
|
|
73
|
|
74 va_start(ap, fmt);
|
|
75 dmErrorVA(fmt, ap);
|
|
76 va_end(ap);
|
|
77 }
|
|
78
|
|
79
|
|
80 void dmMsg(int level, const char *fmt, ...)
|
|
81 {
|
|
82 va_list ap;
|
|
83
|
|
84 va_start(ap, fmt);
|
|
85 dmMsgVA(level, fmt, ap);
|
|
86 va_end(ap);
|
|
87 }
|
|
88
|
|
89
|
|
90 void dmPrint(int level, const char *fmt, ...)
|
|
91 {
|
|
92 va_list ap;
|
|
93
|
|
94 va_start(ap, fmt);
|
|
95 dmPrintVA(level, fmt, ap);
|
|
96 va_end(ap);
|
|
97 }
|
|
98
|
|
99
|
|
100 /* Memory handling routines
|
|
101 */
|
|
102 void *dmMalloc(size_t l)
|
|
103 {
|
|
104 return malloc(l);
|
|
105 }
|
|
106
|
|
107
|
|
108 void *dmMalloc0(size_t l)
|
|
109 {
|
|
110 return calloc(1, l);
|
|
111 }
|
|
112
|
|
113
|
|
114 void *dmCalloc(size_t n, size_t l)
|
|
115 {
|
|
116 return calloc(n, l);
|
|
117 }
|
|
118
|
|
119
|
|
120 void *dmRealloc(void *p, size_t l)
|
|
121 {
|
|
122 return realloc(p, l);
|
|
123 }
|
|
124
|
|
125
|
|
126 void dmFree(void *p)
|
|
127 {
|
|
128 /* Check for NULL pointers for portability due to some libc
|
|
129 * implementations not handling free(NULL) too well.
|
|
130 */
|
|
131 if (p) free(p);
|
|
132 }
|
|
133
|
|
134
|
|
135 BOOL dmGetIntVal(const char *s, int *i)
|
|
136 {
|
|
137 if (s[0] == '$')
|
|
138 {
|
|
139 if (sscanf(&s[1], "%x", i) < 1)
|
|
140 return FALSE;
|
|
141 }
|
|
142 else if (s[0] == '0' && s[1] == 'x')
|
|
143 {
|
|
144 if (sscanf(&s[2], "%x", i) < 1)
|
|
145 return FALSE;
|
|
146 }
|
|
147 else
|
|
148 {
|
|
149 if (sscanf(s, "%u", i) < 1)
|
|
150 return FALSE;
|
|
151 }
|
|
152 return TRUE;
|
|
153 }
|
|
154
|
|
155
|
|
156 /* Error handling
|
|
157 */
|
|
158 #define DM_SYSTEM_ERRORS 100000
|
|
159
|
|
160 int dmGetErrno()
|
|
161 {
|
|
162 return DM_SYSTEM_ERRORS + errno;
|
|
163 }
|
|
164
|
|
165
|
|
166 const char *dmErrorStr(int error)
|
|
167 {
|
|
168 if (error >= DM_SYSTEM_ERRORS)
|
|
169 return strerror(error - DM_SYSTEM_ERRORS);
|
|
170
|
|
171 switch (error)
|
|
172 {
|
|
173 case DMERR_OK: return "No error";
|
|
174 case DMERR_FOPEN: return "File open error";
|
|
175 case DMERR_FREAD: return "Read error";
|
|
176 case DMERR_FWRITE: return "Write error";
|
|
177 case DMERR_FSEEK: return "Seek error";
|
|
178 case DMERR_NOT_FOUND: return "Resource not found";
|
|
179
|
|
180 case DMERR_INVALID_DATA: return "Invalid data";
|
|
181 case DMERR_MALLOC: return "Memory allocation failure";
|
|
182 case DMERR_ALREADY_INIT: return "Already initialized";
|
|
183 case DMERR_INIT_FAIL: return "Initialization failed";
|
|
184 case DMERR_INVALID_ARGS: return "Invalid arguments";
|
|
185
|
|
186 case DMERR_NULLPTR: return "NULL pointer";
|
|
187 case DMERR_NOT_SUPPORTED: return "Operation not supported";
|
|
188 case DMERR_OUT_OF_DATA: return "Out of data";
|
|
189 case DMERR_EXTRA_DATA: return "Extra data";
|
|
190 case DMERR_BOUNDS: return "Bounds check failed";
|
|
191
|
|
192 case DMERR_NOTPACK: return "File is not a PACK";
|
|
193 case DMERR_VERSION: return "Unsupported PACK version";
|
|
194 case DMERR_INVALID: return "Invalid data, corrupted file";
|
|
195 case DMERR_COMPRESSION: return "Error in compression";
|
|
196
|
|
197 default: return "Unknown error";
|
|
198 }
|
|
199 }
|