OSDN Git Service

- added a CANUSEWALLS flag which allows a monster to activate 'use' specials
[zandronum/zandronum-acc.git] / misc.c
1 \r
2 //**************************************************************************\r
3 //**\r
4 //** misc.c\r
5 //**\r
6 //**************************************************************************\r
7 \r
8 // HEADER FILES ------------------------------------------------------------\r
9 \r
10 #ifdef __NeXT__\r
11 #include <libc.h>\r
12 #else\r
13 #include <fcntl.h>\r
14 #include <stdlib.h>\r
15 #ifndef unix\r
16 #include <io.h>\r
17 #endif\r
18 #endif\r
19 #ifdef __GNUC__\r
20 #include <sys/stat.h>\r
21 #include <unistd.h>\r
22 #endif\r
23 #ifdef _WIN32\r
24 #include <sys/stat.h>\r
25 #include <sys/types.h>\r
26 #endif\r
27 #include <stdio.h>\r
28 #include <stddef.h>\r
29 #include <stdarg.h>\r
30 #include <string.h>\r
31 #include <ctype.h>\r
32 #include "common.h"\r
33 #include "misc.h"\r
34 #include "error.h"\r
35 \r
36 // MACROS ------------------------------------------------------------------\r
37 \r
38 #ifndef O_BINARY\r
39 #define O_BINARY 0\r
40 #endif\r
41 \r
42 // TYPES -------------------------------------------------------------------\r
43 \r
44 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------\r
45 \r
46 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------\r
47 \r
48 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------\r
49 \r
50 // EXTERNAL DATA DECLARATIONS ----------------------------------------------\r
51 \r
52 extern boolean acs_BigEndianHost;\r
53 extern boolean acs_VerboseMode;\r
54 extern boolean acs_DebugMode;\r
55 extern FILE *acs_DebugFile;\r
56 \r
57 // PUBLIC DATA DEFINITIONS -------------------------------------------------\r
58 \r
59 // PRIVATE DATA DEFINITIONS ------------------------------------------------\r
60 \r
61 // CODE --------------------------------------------------------------------\r
62 \r
63 //==========================================================================\r
64 //\r
65 // MS_Alloc\r
66 //\r
67 //==========================================================================\r
68 \r
69 void *MS_Alloc(size_t size, error_t error)\r
70 {\r
71         void *mem;\r
72 \r
73         if((mem = malloc(size)) == NULL)\r
74         {\r
75                 ERR_Exit(error, NO);\r
76         }\r
77         return mem;\r
78 }\r
79 \r
80 //==========================================================================\r
81 //\r
82 // MS_Realloc\r
83 //\r
84 //==========================================================================\r
85 \r
86 void *MS_Realloc(void *base, size_t size, error_t error)\r
87 {\r
88         void *mem;\r
89 \r
90         if((mem = realloc(base, size)) == NULL)\r
91         {\r
92                 ERR_Exit(error, NO);\r
93         }\r
94         return mem;\r
95 }\r
96 \r
97 //==========================================================================\r
98 //\r
99 // MS_LittleUWORD\r
100 //\r
101 // Converts a host U_WORD (2 bytes) to little endian byte order.\r
102 //\r
103 //==========================================================================\r
104 \r
105 U_WORD MS_LittleUWORD(U_WORD val)\r
106 {\r
107         if(acs_BigEndianHost == NO)\r
108         {\r
109                 return val;\r
110         }\r
111         return ((val&255)<<8)+((val>>8)&255);\r
112 }\r
113 \r
114 //==========================================================================\r
115 //\r
116 // MS_LittleULONG\r
117 //\r
118 // Converts a host U_LONG (4 bytes) to little endian byte order.\r
119 //\r
120 //==========================================================================\r
121 \r
122 U_LONG MS_LittleULONG(U_LONG val)\r
123 {\r
124         if(acs_BigEndianHost == NO)\r
125         {\r
126                 return val;\r
127         }\r
128         return ((val&255)<<24)+(((val>>8)&255)<<16)+(((val>>16)&255)<<8)\r
129                 +((val>>24)&255);\r
130 }\r
131 \r
132 //==========================================================================\r
133 //\r
134 // MS_LoadFile\r
135 //\r
136 //==========================================================================\r
137 \r
138 int MS_LoadFile(char *name, char **buffer)\r
139 {\r
140         int handle;\r
141         int size;\r
142         int count;\r
143         char *addr;\r
144         struct stat fileInfo;\r
145 \r
146         if(strlen(name) >= MAX_FILE_NAME_LENGTH)\r
147         {\r
148                 ERR_Exit(ERR_FILE_NAME_TOO_LONG, NO, name);\r
149         }\r
150         if((handle = open(name, O_RDONLY|O_BINARY, 0666)) == -1)\r
151         {\r
152                 ERR_Exit(ERR_CANT_OPEN_FILE, NO, name);\r
153         }\r
154         if(fstat(handle, &fileInfo) == -1)\r
155         {\r
156                 ERR_Exit(ERR_CANT_READ_FILE, NO, name);\r
157         }\r
158         size = fileInfo.st_size;\r
159         if((addr = malloc(size)) == NULL)\r
160         {\r
161                 ERR_Exit(ERR_NONE, NO, "Couldn't malloc %d bytes for "\r
162                         "file \"%s\".", size, name);\r
163         }\r
164         count = read(handle, addr, size);\r
165         close(handle);\r
166         if(count < size)\r
167         {\r
168                 ERR_Exit(ERR_CANT_READ_FILE, NO, name);\r
169         }\r
170         *buffer = addr;\r
171         return size;\r
172 }\r
173 \r
174 //==========================================================================\r
175 //\r
176 // MS_SaveFile\r
177 //\r
178 //==========================================================================\r
179 \r
180 boolean MS_SaveFile(char *name, void *buffer, int length)\r
181 {\r
182         int handle;\r
183         int count;\r
184 \r
185         handle = open(name, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);\r
186         if(handle == -1)\r
187         {\r
188                 return FALSE;\r
189         }\r
190         count = write(handle, buffer, length);\r
191         close(handle);\r
192         if(count < length)\r
193         {\r
194                 return FALSE;\r
195         }\r
196         return TRUE;\r
197 }\r
198 \r
199 //==========================================================================\r
200 //\r
201 // MS_StrCmp\r
202 //\r
203 //==========================================================================\r
204 \r
205 int MS_StrCmp(char *s1, char *s2)\r
206 {\r
207         for(; tolower(*s1) == tolower(*s2); s1++, s2++)\r
208         {\r
209                 if(*s1 == '\0')\r
210                 {\r
211                         return 0;\r
212                 }\r
213         }\r
214         return tolower(*s1)-tolower(*s2);\r
215 }\r
216 \r
217 //==========================================================================\r
218 //\r
219 // MS_StrLwr\r
220 //\r
221 //==========================================================================\r
222 \r
223 char *MS_StrLwr(char *string)\r
224 {\r
225         char *c;\r
226 \r
227         c = string;\r
228         while(*c)\r
229         {\r
230                 *c = tolower(*c);\r
231                 c++;\r
232         }\r
233         return string;\r
234 }\r
235 \r
236 //==========================================================================\r
237 //\r
238 // MS_StrUpr\r
239 //\r
240 //==========================================================================\r
241 \r
242 char *MS_StrUpr(char *string)\r
243 {\r
244         char *c;\r
245 \r
246         c = string;\r
247         while(*c)\r
248         {\r
249                 *c = toupper(*c);\r
250                 c++;\r
251         }\r
252         return string;\r
253 }\r
254 \r
255 //==========================================================================\r
256 //\r
257 // MS_SuggestFileExt\r
258 //\r
259 //==========================================================================\r
260 \r
261 void MS_SuggestFileExt(char *base, char *extension)\r
262 {\r
263         char *search;\r
264 \r
265         search = base+strlen(base)-1;\r
266         while(*search != ASCII_SLASH && *search != ASCII_BACKSLASH\r
267                 && search != base)\r
268         {\r
269                 if(*search-- == '.')\r
270                 {\r
271                         return;\r
272                 }\r
273         }\r
274         strcat(base, extension);\r
275 }\r
276 \r
277 //==========================================================================\r
278 //\r
279 // MS_StripFileExt\r
280 //\r
281 //==========================================================================\r
282 \r
283 void MS_StripFileExt(char *name)\r
284 {\r
285         char *search;\r
286 \r
287         search = name+strlen(name)-1;\r
288         while(*search != ASCII_SLASH && *search != ASCII_BACKSLASH\r
289                 && search != name)\r
290         {\r
291                 if(*search == '.')\r
292                 {\r
293                         *search = '\0';\r
294                         return;\r
295                 }\r
296                 search--;\r
297         }\r
298 }\r
299 \r
300 //==========================================================================\r
301 //\r
302 // MS_StripFilename\r
303 //\r
304 //==========================================================================\r
305 \r
306 boolean MS_StripFilename(char *name)\r
307 {\r
308         char *c;\r
309 \r
310         c = name+strlen(name);\r
311         do\r
312         {\r
313                 if(--c == name)\r
314                 { // No directory delimiter\r
315                         return NO;\r
316                 }\r
317         } while(*c != DIRECTORY_DELIMITER_CHAR);\r
318         *c = 0;\r
319         return YES;\r
320 }\r
321 \r
322 //==========================================================================\r
323 //\r
324 // MS_Message\r
325 //\r
326 //==========================================================================\r
327 \r
328 void MS_Message(msg_t type, char *text, ...)\r
329 {\r
330         FILE *fp;\r
331         va_list argPtr;\r
332 \r
333         if(type == MSG_VERBOSE && acs_VerboseMode == NO)\r
334         {\r
335                 return;\r
336         }\r
337         fp = stdout;\r
338         if(type == MSG_DEBUG)\r
339         {\r
340                 if(acs_DebugMode == NO)\r
341                 {\r
342                         return;\r
343                 }\r
344                 if(acs_DebugFile != NULL)\r
345                 {\r
346                         fp = acs_DebugFile;\r
347                 }\r
348         }\r
349         if(text)\r
350         {\r
351                 va_start(argPtr, text);\r
352                 vfprintf(fp, text, argPtr);\r
353                 va_end(argPtr);\r
354         }\r
355 }\r