00001
00002
00003
00004
00005
00006 #include "cmdlib.h"
00007 #include "windows.h"
00008
00009 #define PATHSEPERATOR '/'
00010
00011
00012
00013 PFN_ERR *g_pfnError = NULL;
00014 PFN_PRINTF *g_pfnPrintf = NULL;
00015 PFN_ERR_NUM *g_pfnErrorNum = NULL;
00016 PFN_PRINTF_NUM *g_pfnPrintfNum = NULL;
00017
00018
00019 void Error(const char *pFormat, ...)
00020 {
00021 if (g_pfnError)
00022 {
00023 va_list arg_ptr;
00024 va_start(arg_ptr, pFormat);
00025 g_pfnError(pFormat, arg_ptr);
00026 va_end(arg_ptr);
00027 }
00028 }
00029
00030 void Printf(const char *pFormat, ...)
00031 {
00032 if (g_pfnPrintf)
00033 {
00034 va_list arg_ptr;
00035 va_start(arg_ptr, pFormat);
00036 g_pfnPrintf(pFormat, arg_ptr);
00037 va_end(arg_ptr);
00038 }
00039 }
00040
00041 void ErrorNum(int nErr, const char *pFormat, ...)
00042 {
00043 if (g_pfnErrorNum)
00044 {
00045 va_list arg_ptr;
00046 va_start(arg_ptr, pFormat);
00047 g_pfnErrorNum(nErr, pFormat, arg_ptr);
00048 va_end(arg_ptr);
00049 }
00050 }
00051
00052 void PrintfNum(int nErr, const char *pFormat, ...)
00053 {
00054 if (g_pfnPrintfNum)
00055 {
00056 va_list arg_ptr;
00057 va_start(arg_ptr, pFormat);
00058 g_pfnPrintfNum(nErr, pFormat, arg_ptr);
00059 va_end(arg_ptr);
00060 }
00061 }
00062
00063
00064
00065 void SetErrorHandler(PFN_ERR pe)
00066 {
00067 g_pfnError = pe;
00068 }
00069
00070 void SetPrintfHandler(PFN_PRINTF pe)
00071 {
00072 g_pfnPrintf = pe;
00073 }
00074
00075 void SetErrorHandlerNum(PFN_ERR_NUM pe)
00076 {
00077 g_pfnErrorNum = pe;
00078 }
00079
00080 void SetPrintfHandler(PFN_PRINTF_NUM pe)
00081 {
00082 g_pfnPrintfNum = pe;
00083 }
00084
00085
00086
00087
00088
00089 #define MEM_BLOCKSIZE 4096
00090 void* qblockmalloc(size_t nSize)
00091 {
00092 void *b;
00093
00094 int nAllocSize = nSize % MEM_BLOCKSIZE;
00095 if ( nAllocSize > 0)
00096 {
00097 nSize += MEM_BLOCKSIZE - nAllocSize;
00098 }
00099 b = malloc(nSize + 1);
00100 memset (b, 0, nSize);
00101 return b;
00102 }
00103
00104 void* qmalloc (size_t nSize)
00105 {
00106 void *b;
00107 b = malloc(nSize + 1);
00108 memset (b, 0, nSize);
00109 return b;
00110 }
00111
00112
00113
00114
00115
00116
00117 int Q_filelength (FILE *f)
00118 {
00119 int pos;
00120 int end;
00121
00122 pos = ftell (f);
00123 fseek (f, 0, SEEK_END);
00124 end = ftell (f);
00125 fseek (f, pos, SEEK_SET);
00126
00127 return end;
00128 }
00129
00130
00131
00132 FILE *SafeOpenWrite (const char *filename)
00133 {
00134 FILE *f;
00135
00136 f = fopen(filename, "wb");
00137
00138 if (!f)
00139 {
00140 Error ("Error opening %s: %s",filename,strerror(errno));
00141 }
00142
00143 return f;
00144 }
00145
00146 FILE *SafeOpenRead (const char *filename)
00147 {
00148 FILE *f;
00149
00150 f = fopen(filename, "rb");
00151
00152 if (!f)
00153 {
00154 Error ("Error opening %s: %s",filename,strerror(errno));
00155 }
00156
00157 return f;
00158 }
00159
00160
00161 void SafeRead (FILE *f, void *buffer, int count)
00162 {
00163 if ( (int)fread (buffer, 1, count, f) != count)
00164 Error ("File read failure");
00165 }
00166
00167
00168 void SafeWrite (FILE *f, const void *buffer, int count)
00169 {
00170 if ( (int)fwrite (buffer, 1, count, f) != count)
00171 Error ("File read failure");
00172 }
00173
00174
00175
00176
00177
00178
00179
00180
00181 int LoadFile (const char *filename, void **bufferptr)
00182 {
00183 FILE *f;
00184 int length;
00185 void *buffer;
00186
00187 *bufferptr = NULL;
00188
00189 if (filename == NULL || strlen(filename) == 0)
00190 {
00191 return -1;
00192 }
00193
00194 f = fopen (filename, "rb");
00195 if (!f)
00196 {
00197 return -1;
00198 }
00199 length = Q_filelength (f);
00200 buffer = qblockmalloc (length+1);
00201 ((char *)buffer)[length] = 0;
00202 SafeRead (f, buffer, length);
00203 fclose (f);
00204
00205 *bufferptr = buffer;
00206 return length;
00207 }
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217 int LoadFileNoCrash (const char *filename, void **bufferptr)
00218 {
00219 FILE *f;
00220 int length;
00221 void *buffer;
00222
00223 f = fopen (filename, "rb");
00224 if (!f)
00225 return -1;
00226 length = Q_filelength (f);
00227 buffer = qmalloc (length+1);
00228 ((char *)buffer)[length] = 0;
00229 SafeRead (f, buffer, length);
00230 fclose (f);
00231
00232 *bufferptr = buffer;
00233 return length;
00234 }
00235
00236
00237
00238
00239
00240
00241
00242 void SaveFile (const char *filename, void *buffer, int count)
00243 {
00244 FILE *f;
00245
00246 f = SafeOpenWrite (filename);
00247 SafeWrite (f, buffer, count);
00248 fclose (f);
00249 }
00250
00251
00252
00253 void DefaultExtension (char *path, char *extension)
00254 {
00255 char *src;
00256
00257
00258
00259
00260 src = path + strlen(path) - 1;
00261
00262 while (*src != PATHSEPERATOR && src != path)
00263 {
00264 if (*src == '.')
00265 return;
00266 src--;
00267 }
00268
00269 strcat (path, extension);
00270 }
00271
00272
00273 void DefaultPath (char *path, char *basepath)
00274 {
00275 char temp[128];
00276
00277 if (path[0] == PATHSEPERATOR)
00278 return;
00279 strcpy (temp,path);
00280 strcpy (path,basepath);
00281 strcat (path,temp);
00282 }
00283
00284
00285 void StripFilename (char *path)
00286 {
00287 int length;
00288
00289 length = strlen(path)-1;
00290 while (length > 0 && path[length] != PATHSEPERATOR)
00291 length--;
00292 path[length] = 0;
00293 }
00294
00295 void StripExtension (char *path)
00296 {
00297 int length;
00298
00299 length = strlen(path)-1;
00300 while (length > 0 && path[length] != '.')
00301 {
00302 length--;
00303 if (path[length] == '/')
00304 return;
00305 }
00306 if (length)
00307 path[length] = 0;
00308 }
00309
00310
00311
00312
00313
00314
00315
00316 void ExtractFilePath (const char *path, char *dest)
00317 {
00318 const char *src;
00319
00320 src = path + strlen(path) - 1;
00321
00322
00323
00324
00325 while (src != path && *(src-1) != PATHSEPERATOR)
00326 src--;
00327
00328 memcpy (dest, path, src-path);
00329 dest[src-path] = 0;
00330 }
00331
00332 void ExtractFileName (const char *path, char *dest)
00333 {
00334 const char *src;
00335
00336 src = path + strlen(path) - 1;
00337
00338
00339
00340
00341 while (src != path && *(src-1) != '/'
00342 && *(src-1) != '\\' )
00343 src--;
00344
00345 while (*src)
00346 {
00347 *dest++ = *src++;
00348 }
00349 *dest = 0;
00350 }
00351
00352 void ExtractFileBase (const char *path, char *dest)
00353 {
00354 const char *src;
00355
00356 src = path + strlen(path) - 1;
00357
00358
00359
00360
00361 while (src != path && *(src-1) != '/'
00362 && *(src-1) != '\\' )
00363 src--;
00364
00365 while (*src && *src != '.')
00366 {
00367 *dest++ = *src++;
00368 }
00369 *dest = 0;
00370 }
00371
00372 void ExtractFileExtension (const char *path, char *dest)
00373 {
00374 const char *src;
00375
00376 src = path + strlen(path) - 1;
00377
00378
00379
00380
00381 while (src != path && *(src-1) != '.')
00382 src--;
00383 if (src == path)
00384 {
00385 *dest = 0;
00386 return;
00387 }
00388
00389 strcpy (dest,src);
00390 }
00391
00392
00393 void ConvertDOSToUnixName( char *dst, const char *src )
00394 {
00395 while ( *src )
00396 {
00397 if ( *src == '\\' )
00398 *dst = '/';
00399 else
00400 *dst = *src;
00401 dst++; src++;
00402 }
00403 *dst = 0;
00404 }
00405
00406
00407 char* StrDup(char* pStr)
00408 {
00409 if (pStr)
00410 {
00411 return strcpy(new char[strlen(pStr)+1], pStr);
00412 }
00413 return NULL;
00414 }
00415
00416 char* StrDup(const char* pStr)
00417 {
00418 if (pStr)
00419 {
00420 return strcpy(new char[strlen(pStr)+1], pStr);
00421 }
00422 return NULL;
00423 }
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434 #ifdef _SGI_SOURCE
00435 #define __BIG_ENDIAN__
00436 #endif
00437
00438 #ifdef __BIG_ENDIAN__
00439
00440 short LittleShort (short l)
00441 {
00442 byte b1,b2;
00443
00444 b1 = l&255;
00445 b2 = (l>>8)&255;
00446
00447 return (b1<<8) + b2;
00448 }
00449
00450 short BigShort (short l)
00451 {
00452 return l;
00453 }
00454
00455
00456 int LittleLong (int l)
00457 {
00458 byte b1,b2,b3,b4;
00459
00460 b1 = l&255;
00461 b2 = (l>>8)&255;
00462 b3 = (l>>16)&255;
00463 b4 = (l>>24)&255;
00464
00465 return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
00466 }
00467
00468 int BigLong (int l)
00469 {
00470 return l;
00471 }
00472
00473
00474 float LittleFloat (float l)
00475 {
00476 union {byte b[4]; float f;} in, out;
00477
00478 in.f = l;
00479 out.b[0] = in.b[3];
00480 out.b[1] = in.b[2];
00481 out.b[2] = in.b[1];
00482 out.b[3] = in.b[0];
00483
00484 return out.f;
00485 }
00486
00487 float BigFloat (float l)
00488 {
00489 return l;
00490 }
00491
00492
00493 #else
00494
00495
00496 short BigShort (short l)
00497 {
00498 byte b1,b2;
00499
00500 b1 = l&255;
00501 b2 = (l>>8)&255;
00502
00503 return (b1<<8) + b2;
00504 }
00505
00506 short LittleShort (short l)
00507 {
00508 return l;
00509 }
00510
00511
00512 int BigLong (int l)
00513 {
00514 byte b1,b2,b3,b4;
00515
00516 b1 = l&255;
00517 b2 = (l>>8)&255;
00518 b3 = (l>>16)&255;
00519 b4 = (l>>24)&255;
00520
00521 return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
00522 }
00523
00524 int LittleLong (int l)
00525 {
00526 return l;
00527 }
00528
00529 float BigFloat (float l)
00530 {
00531 union {byte b[4]; float f;} in, out;
00532
00533 in.f = l;
00534 out.b[0] = in.b[3];
00535 out.b[1] = in.b[2];
00536 out.b[2] = in.b[1];
00537 out.b[3] = in.b[0];
00538
00539 return out.f;
00540 }
00541
00542 float LittleFloat (float l)
00543 {
00544 return l;
00545 }
00546
00547
00548
00549 #endif
00550