2 //**************************************************************************
\r
6 //**************************************************************************
\r
8 // HEADER FILES ------------------------------------------------------------
\r
20 #include <sys/stat.h>
\r
24 #include <sys/stat.h>
\r
25 #include <sys/types.h>
\r
36 // MACROS ------------------------------------------------------------------
\r
42 // TYPES -------------------------------------------------------------------
\r
44 // EXTERNAL FUNCTION PROTOTYPES --------------------------------------------
\r
46 // PUBLIC FUNCTION PROTOTYPES ----------------------------------------------
\r
48 // PRIVATE FUNCTION PROTOTYPES ---------------------------------------------
\r
50 // EXTERNAL DATA DECLARATIONS ----------------------------------------------
\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
57 // PUBLIC DATA DEFINITIONS -------------------------------------------------
\r
59 // PRIVATE DATA DEFINITIONS ------------------------------------------------
\r
61 // CODE --------------------------------------------------------------------
\r
63 //==========================================================================
\r
67 //==========================================================================
\r
69 void *MS_Alloc(size_t size, error_t error)
\r
73 if((mem = malloc(size)) == NULL)
\r
75 ERR_Exit(error, NO);
\r
80 //==========================================================================
\r
84 //==========================================================================
\r
86 void *MS_Realloc(void *base, size_t size, error_t error)
\r
90 if((mem = realloc(base, size)) == NULL)
\r
92 ERR_Exit(error, NO);
\r
97 //==========================================================================
\r
101 // Converts a host U_WORD (2 bytes) to little endian byte order.
\r
103 //==========================================================================
\r
105 U_WORD MS_LittleUWORD(U_WORD val)
\r
107 if(acs_BigEndianHost == NO)
\r
111 return ((val&255)<<8)+((val>>8)&255);
\r
114 //==========================================================================
\r
118 // Converts a host U_INT (4 bytes) to little endian byte order.
\r
120 //==========================================================================
\r
122 U_INT MS_LittleUINT(U_INT val)
\r
124 if(acs_BigEndianHost == NO)
\r
128 return ((val&255)<<24)+(((val>>8)&255)<<16)+(((val>>16)&255)<<8)
\r
132 //==========================================================================
\r
136 //==========================================================================
\r
138 int MS_LoadFile(char *name, char **buffer)
\r
144 struct stat fileInfo;
\r
146 if(strlen(name) >= MAX_FILE_NAME_LENGTH)
\r
148 ERR_Exit(ERR_FILE_NAME_TOO_LONG, NO, name);
\r
150 if((handle = open(name, O_RDONLY|O_BINARY, 0666)) == -1)
\r
152 ERR_Exit(ERR_CANT_OPEN_FILE, NO, name);
\r
154 if(fstat(handle, &fileInfo) == -1)
\r
156 ERR_Exit(ERR_CANT_READ_FILE, NO, name);
\r
158 size = fileInfo.st_size;
\r
159 if((addr = malloc(size)) == NULL)
\r
161 ERR_Exit(ERR_NONE, NO, "Couldn't malloc %d bytes for "
\r
162 "file \"%s\".", size, name);
\r
164 count = read(handle, addr, size);
\r
168 ERR_Exit(ERR_CANT_READ_FILE, NO, name);
\r
175 //==========================================================================
\r
181 //==========================================================================
\r
182 boolean MS_FileExists(char *name)
\r
185 int ret = stat(name, &info);
\r
190 //==========================================================================
\r
194 //==========================================================================
\r
196 boolean MS_SaveFile(char *name, void *buffer, int length)
\r
201 handle = open(name, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
\r
206 count = write(handle, buffer, length);
\r
215 //==========================================================================
\r
219 //==========================================================================
\r
221 int MS_StrCmp(char *s1, char *s2)
\r
223 for(; tolower(*s1) == tolower(*s2); s1++, s2++)
\r
230 return tolower(*s1)-tolower(*s2);
\r
233 //==========================================================================
\r
237 //==========================================================================
\r
239 char *MS_StrLwr(char *string)
\r
252 //==========================================================================
\r
256 //==========================================================================
\r
258 char *MS_StrUpr(char *string)
\r
271 //==========================================================================
\r
273 // MS_SuggestFileExt
\r
275 //==========================================================================
\r
277 void MS_SuggestFileExt(char *base, char *extension)
\r
281 search = base+strlen(base)-1;
\r
282 while(!MS_IsDirectoryDelimiter(*search) && search != base)
\r
284 if(*search-- == '.')
\r
289 strcat(base, extension);
\r
292 //==========================================================================
\r
294 // MS_IsDirectoryDelimiter
\r
296 //==========================================================================
\r
298 boolean MS_IsDirectoryDelimiter(char foo)
\r
300 #if defined(_WIN32) || defined(__MSDOS__)
\r
301 return foo == '/' || foo == '\\' || foo == ':';
\r
308 //==========================================================================
\r
312 //==========================================================================
\r
314 void MS_StripFileExt(char *name)
\r
318 search = name+strlen(name)-1;
\r
319 while(!MS_IsDirectoryDelimiter(*search) && search != name)
\r
330 //==========================================================================
\r
332 // MS_StripFilename
\r
334 // [RH] This now leaves the directory delimiter in place.
\r
336 //==========================================================================
\r
338 boolean MS_StripFilename(char *name)
\r
342 c = name+strlen(name);
\r
346 { // No directory delimiter
\r
349 } while(!MS_IsDirectoryDelimiter(*c));
\r
354 //==========================================================================
\r
358 //==========================================================================
\r
360 void MS_Message(msg_t type, char *text, ...)
\r
365 if(type == MSG_VERBOSE && acs_VerboseMode == NO)
\r
370 if(type == MSG_DEBUG)
\r
372 if(acs_DebugMode == NO)
\r
376 if(acs_DebugFile != NULL)
\r
378 fp = acs_DebugFile;
\r
383 va_start(argPtr, text);
\r
384 vfprintf(fp, text, argPtr);
\r
389 //==========================================================================
\r
391 // MS_IsPathAbsolute
\r
395 //==========================================================================
\r
397 boolean MS_IsPathAbsolute(char *name)
\r
399 #if defined(_WIN32) || defined(__MSDOS__)
\r
400 // In Windows, the second character must be : if it is an
\r
401 // absolute path (the first character indicates the drive)
\r
402 // or the first character is either / or \ for absolute path
\r
403 if((name[0] != '\0') && (name[1] == ':'))
\r
406 // In Unix-land, the first character must be / for a root path
\r
407 return MS_IsDirectoryDelimiter(name[0]);
\r