Quake-III-Arena

Quake III Arena GPL Source Release
Log | Files | Refs

cmdlib.cpp (7738B)


      1 //
      2 // start of shared cmdlib stuff
      3 // 
      4 
      5 
      6 #include "cmdlib.h"
      7 #include "windows.h"
      8 
      9 #define PATHSEPERATOR   '/'
     10 
     11 // rad additions
     12 // 11.29.99
     13 PFN_ERR *g_pfnError = NULL;
     14 PFN_PRINTF *g_pfnPrintf = NULL;
     15 PFN_ERR_NUM *g_pfnErrorNum = NULL;
     16 PFN_PRINTF_NUM *g_pfnPrintfNum = NULL;
     17 
     18 
     19 void Error(const char *pFormat, ...)
     20 {
     21   if (g_pfnError)
     22   {
     23     va_list arg_ptr;
     24     va_start(arg_ptr, pFormat);
     25     g_pfnError(pFormat, arg_ptr);
     26     va_end(arg_ptr);
     27   }
     28 }
     29 
     30 void Printf(const char *pFormat, ...)
     31 {
     32   if (g_pfnPrintf)
     33   {
     34     va_list arg_ptr;
     35     va_start(arg_ptr, pFormat);
     36     g_pfnPrintf(pFormat, arg_ptr);
     37     va_end(arg_ptr);
     38   }
     39 }
     40 
     41 void ErrorNum(int nErr, const char *pFormat, ...)
     42 {
     43   if (g_pfnErrorNum)
     44   {
     45     va_list arg_ptr;
     46     va_start(arg_ptr, pFormat);
     47     g_pfnErrorNum(nErr, pFormat, arg_ptr);
     48     va_end(arg_ptr);
     49   }
     50 }
     51 
     52 void PrintfNum(int nErr, const char *pFormat, ...)
     53 {
     54   if (g_pfnPrintfNum)
     55   {
     56     va_list arg_ptr;
     57     va_start(arg_ptr, pFormat);
     58     g_pfnPrintfNum(nErr, pFormat, arg_ptr);
     59     va_end(arg_ptr);
     60   }
     61 }
     62 
     63 
     64 
     65 void SetErrorHandler(PFN_ERR pe)
     66 {
     67   g_pfnError = pe;
     68 }
     69 
     70 void SetPrintfHandler(PFN_PRINTF pe)
     71 {
     72   g_pfnPrintf = pe;
     73 }
     74 
     75 void SetErrorHandlerNum(PFN_ERR_NUM pe)
     76 {
     77   g_pfnErrorNum = pe;
     78 }
     79 
     80 void SetPrintfHandler(PFN_PRINTF_NUM pe)
     81 {
     82   g_pfnPrintfNum = pe;
     83 }
     84 
     85 
     86 
     87 // rad end
     88 
     89 #define MEM_BLOCKSIZE 4096
     90 void* qblockmalloc(size_t nSize)
     91 {
     92 	void *b;
     93   // round up to threshold
     94   int nAllocSize = nSize % MEM_BLOCKSIZE;
     95   if ( nAllocSize > 0)
     96   {
     97     nSize += MEM_BLOCKSIZE - nAllocSize;
     98   }
     99 	b = malloc(nSize + 1);
    100 	memset (b, 0, nSize);
    101 	return b;
    102 }
    103 
    104 void* qmalloc (size_t nSize)
    105 {
    106 	void *b;
    107 	b = malloc(nSize + 1);
    108 	memset (b, 0, nSize);
    109 	return b;
    110 }
    111 
    112 /*
    113 ================
    114 Q_filelength
    115 ================
    116 */
    117 int Q_filelength (FILE *f)
    118 {
    119 	int		pos;
    120 	int		end;
    121 
    122 	pos = ftell (f);
    123 	fseek (f, 0, SEEK_END);
    124 	end = ftell (f);
    125 	fseek (f, pos, SEEK_SET);
    126 
    127 	return end;
    128 }
    129 
    130 
    131 // FIXME: need error handler
    132 FILE *SafeOpenWrite (const char *filename)
    133 {
    134 	FILE	*f;
    135 
    136 	f = fopen(filename, "wb");
    137 
    138 	if (!f)
    139   {
    140 		Error ("Error opening %s: %s",filename,strerror(errno));
    141   }
    142 
    143 	return f;
    144 }
    145 
    146 FILE *SafeOpenRead (const char *filename)
    147 {
    148 	FILE	*f;
    149 
    150 	f = fopen(filename, "rb");
    151 
    152 	if (!f)
    153   {
    154 		Error ("Error opening %s: %s",filename,strerror(errno));
    155   }
    156 
    157 	return f;
    158 }
    159 
    160 
    161 void SafeRead (FILE *f, void *buffer, int count)
    162 {
    163 	if ( (int)fread (buffer, 1, count, f) != count)
    164 		Error ("File read failure");
    165 }
    166 
    167 
    168 void SafeWrite (FILE *f, const void *buffer, int count)
    169 {
    170 	if ( (int)fwrite (buffer, 1, count, f) != count)
    171 		Error ("File read failure");
    172 }
    173 
    174 
    175 
    176 /*
    177 ==============
    178 LoadFile
    179 ==============
    180 */
    181 int LoadFile (const char *filename, void **bufferptr)
    182 {
    183 	FILE	*f;
    184 	int    length;
    185 	void    *buffer;
    186 
    187   *bufferptr = NULL;
    188   
    189   if (filename == NULL || strlen(filename) == 0)
    190   {
    191     return -1;
    192   }
    193 
    194 	f = fopen (filename, "rb");
    195 	if (!f)
    196 	{
    197 		return -1;
    198 	}
    199 	length = Q_filelength (f);
    200 	buffer = qblockmalloc (length+1);
    201 	((char *)buffer)[length] = 0;
    202 	SafeRead (f, buffer, length);
    203 	fclose (f);
    204 
    205 	*bufferptr = buffer;
    206 	return length;
    207 }
    208 
    209 
    210 /*
    211 ==============
    212 LoadFileNoCrash
    213 
    214 returns -1 length if not present
    215 ==============
    216 */
    217 int    LoadFileNoCrash (const char *filename, void **bufferptr)
    218 {
    219 	FILE	*f;
    220 	int    length;
    221 	void    *buffer;
    222 
    223 	f = fopen (filename, "rb");
    224 	if (!f)
    225 		return -1;
    226 	length = Q_filelength (f);
    227 	buffer = qmalloc (length+1);
    228 	((char *)buffer)[length] = 0;
    229 	SafeRead (f, buffer, length);
    230 	fclose (f);
    231 
    232 	*bufferptr = buffer;
    233 	return length;
    234 }
    235 
    236 
    237 /*
    238 ==============
    239 SaveFile
    240 ==============
    241 */
    242 void    SaveFile (const char *filename, void *buffer, int count)
    243 {
    244 	FILE	*f;
    245 
    246 	f = SafeOpenWrite (filename);
    247 	SafeWrite (f, buffer, count);
    248 	fclose (f);
    249 }
    250 
    251 
    252 
    253 void DefaultExtension (char *path, char *extension)
    254 {
    255 	char    *src;
    256 //
    257 // if path doesn't have a .EXT, append extension
    258 // (extension should include the .)
    259 //
    260 	src = path + strlen(path) - 1;
    261 
    262 	while (*src != PATHSEPERATOR && src != path)
    263 	{
    264 		if (*src == '.')
    265 			return;                 // it has an extension
    266 		src--;
    267 	}
    268 
    269 	strcat (path, extension);
    270 }
    271 
    272 
    273 void DefaultPath (char *path, char *basepath)
    274 {
    275 	char    temp[128];
    276 
    277 	if (path[0] == PATHSEPERATOR)
    278 		return;                   // absolute path location
    279 	strcpy (temp,path);
    280 	strcpy (path,basepath);
    281 	strcat (path,temp);
    282 }
    283 
    284 
    285 void    StripFilename (char *path)
    286 {
    287 	int             length;
    288 
    289 	length = strlen(path)-1;
    290 	while (length > 0 && path[length] != PATHSEPERATOR)
    291 		length--;
    292 	path[length] = 0;
    293 }
    294 
    295 void    StripExtension (char *path)
    296 {
    297 	int             length;
    298 
    299 	length = strlen(path)-1;
    300 	while (length > 0 && path[length] != '.')
    301 	{
    302 		length--;
    303 		if (path[length] == '/')
    304 			return;		// no extension
    305 	}
    306 	if (length)
    307 		path[length] = 0;
    308 }
    309 
    310 
    311 /*
    312 ====================
    313 Extract file parts
    314 ====================
    315 */
    316 void ExtractFilePath (const char *path, char *dest)
    317 {
    318 	const char *src;
    319 
    320 	src = path + strlen(path) - 1;
    321 
    322 //
    323 // back up until a \ or the start
    324 //
    325 	while (src != path && *(src-1) != PATHSEPERATOR)
    326 		src--;
    327 
    328 	memcpy (dest, path, src-path);
    329 	dest[src-path] = 0;
    330 }
    331 
    332 void ExtractFileName (const char *path, char *dest)
    333 {
    334 	const char *src;
    335 
    336 	src = path + strlen(path) - 1;
    337 
    338 //
    339 // back up until a \ or the start
    340 //
    341 	while (src != path && *(src-1) != '/' 
    342 		 && *(src-1) != '\\' )
    343 		src--;
    344 
    345 	while (*src)
    346 	{
    347 		*dest++ = *src++;
    348 	}
    349 	*dest = 0;
    350 }
    351 
    352 void ExtractFileBase (const char *path, char *dest)
    353 {
    354 	const char *src;
    355 
    356 	src = path + strlen(path) - 1;
    357 
    358 //
    359 // back up until a \ or the start
    360 //
    361 	while (src != path && *(src-1) != '/' 
    362 		 && *(src-1) != '\\' )
    363 		src--;
    364 
    365 	while (*src && *src != '.')
    366 	{
    367 		*dest++ = *src++;
    368 	}
    369 	*dest = 0;
    370 }
    371 
    372 void ExtractFileExtension (const char *path, char *dest)
    373 {
    374 	const char *src;
    375 
    376 	src = path + strlen(path) - 1;
    377 
    378 //
    379 // back up until a . or the start
    380 //
    381 	while (src != path && *(src-1) != '.')
    382 		src--;
    383 	if (src == path)
    384 	{
    385 		*dest = 0;	// no extension
    386 		return;
    387 	}
    388 
    389 	strcpy (dest,src);
    390 }
    391 
    392 
    393 void ConvertDOSToUnixName( char *dst, const char *src )
    394 {
    395 	while ( *src )
    396 	{
    397 		if ( *src == '\\' )
    398 			*dst = '/';
    399 		else
    400 			*dst = *src;
    401 		dst++; src++;
    402 	}
    403 	*dst = 0;
    404 }
    405 
    406 
    407 char* StrDup(char* pStr)
    408 { 
    409   if (pStr)
    410   {
    411     return strcpy(new char[strlen(pStr)+1], pStr); 
    412   }
    413   return NULL;
    414 }
    415 
    416 char* StrDup(const char* pStr)
    417 { 
    418   if (pStr)
    419   {
    420     return strcpy(new char[strlen(pStr)+1], pStr); 
    421   }
    422   return NULL;
    423 }
    424 
    425 
    426 /*
    427 ============================================================================
    428 
    429 					BYTE ORDER FUNCTIONS
    430 
    431 ============================================================================
    432 */
    433 
    434 #ifdef _SGI_SOURCE
    435 #define	__BIG_ENDIAN__
    436 #endif
    437 
    438 #ifdef __BIG_ENDIAN__
    439 
    440 short   LittleShort (short l)
    441 {
    442 	byte    b1,b2;
    443 
    444 	b1 = l&255;
    445 	b2 = (l>>8)&255;
    446 
    447 	return (b1<<8) + b2;
    448 }
    449 
    450 short   BigShort (short l)
    451 {
    452 	return l;
    453 }
    454 
    455 
    456 int    LittleLong (int l)
    457 {
    458 	byte    b1,b2,b3,b4;
    459 
    460 	b1 = l&255;
    461 	b2 = (l>>8)&255;
    462 	b3 = (l>>16)&255;
    463 	b4 = (l>>24)&255;
    464 
    465 	return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
    466 }
    467 
    468 int    BigLong (int l)
    469 {
    470 	return l;
    471 }
    472 
    473 
    474 float	LittleFloat (float l)
    475 {
    476 	union {byte b[4]; float f;} in, out;
    477 	
    478 	in.f = l;
    479 	out.b[0] = in.b[3];
    480 	out.b[1] = in.b[2];
    481 	out.b[2] = in.b[1];
    482 	out.b[3] = in.b[0];
    483 	
    484 	return out.f;
    485 }
    486 
    487 float	BigFloat (float l)
    488 {
    489 	return l;
    490 }
    491 
    492 
    493 #else
    494 
    495 
    496 short   BigShort (short l)
    497 {
    498 	byte    b1,b2;
    499 
    500 	b1 = l&255;
    501 	b2 = (l>>8)&255;
    502 
    503 	return (b1<<8) + b2;
    504 }
    505 
    506 short   LittleShort (short l)
    507 {
    508 	return l;
    509 }
    510 
    511 
    512 int    BigLong (int l)
    513 {
    514 	byte    b1,b2,b3,b4;
    515 
    516 	b1 = l&255;
    517 	b2 = (l>>8)&255;
    518 	b3 = (l>>16)&255;
    519 	b4 = (l>>24)&255;
    520 
    521 	return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
    522 }
    523 
    524 int    LittleLong (int l)
    525 {
    526 	return l;
    527 }
    528 
    529 float	BigFloat (float l)
    530 {
    531 	union {byte b[4]; float f;} in, out;
    532 	
    533 	in.f = l;
    534 	out.b[0] = in.b[3];
    535 	out.b[1] = in.b[2];
    536 	out.b[2] = in.b[1];
    537 	out.b[3] = in.b[0];
    538 	
    539 	return out.f;
    540 }
    541 
    542 float	LittleFloat (float l)
    543 {
    544 	return l;
    545 }
    546 
    547 
    548 
    549 #endif
    550