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_LONG (4 bytes) to little endian byte order.
\r
120 //==========================================================================
\r
122 U_LONG MS_LittleULONG(U_LONG 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
174 //==========================================================================
\r
178 //==========================================================================
\r
180 boolean MS_SaveFile(char *name, void *buffer, int length)
\r
185 handle = open(name, O_WRONLY|O_CREAT|O_TRUNC|O_BINARY, 0666);
\r
190 count = write(handle, buffer, length);
\r
199 //==========================================================================
\r
203 //==========================================================================
\r
205 int MS_StrCmp(char *s1, char *s2)
\r
207 for(; tolower(*s1) == tolower(*s2); s1++, s2++)
\r
214 return tolower(*s1)-tolower(*s2);
\r
217 //==========================================================================
\r
221 //==========================================================================
\r
223 char *MS_StrLwr(char *string)
\r
236 //==========================================================================
\r
240 //==========================================================================
\r
242 char *MS_StrUpr(char *string)
\r
255 //==========================================================================
\r
257 // MS_SuggestFileExt
\r
259 //==========================================================================
\r
261 void MS_SuggestFileExt(char *base, char *extension)
\r
265 search = base+strlen(base)-1;
\r
266 while(*search != ASCII_SLASH && *search != ASCII_BACKSLASH
\r
269 if(*search-- == '.')
\r
274 strcat(base, extension);
\r
277 //==========================================================================
\r
281 //==========================================================================
\r
283 void MS_StripFileExt(char *name)
\r
287 search = name+strlen(name)-1;
\r
288 while(*search != ASCII_SLASH && *search != ASCII_BACKSLASH
\r
300 //==========================================================================
\r
302 // MS_StripFilename
\r
304 //==========================================================================
\r
306 boolean MS_StripFilename(char *name)
\r
310 c = name+strlen(name);
\r
314 { // No directory delimiter
\r
317 } while(*c != DIRECTORY_DELIMITER_CHAR);
\r
322 //==========================================================================
\r
326 //==========================================================================
\r
328 void MS_Message(msg_t type, char *text, ...)
\r
333 if(type == MSG_VERBOSE && acs_VerboseMode == NO)
\r
338 if(type == MSG_DEBUG)
\r
340 if(acs_DebugMode == NO)
\r
344 if(acs_DebugFile != NULL)
\r
346 fp = acs_DebugFile;
\r
351 va_start(argPtr, text);
\r
352 vfprintf(fp, text, argPtr);
\r