Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

cmdlib.cpp

Go to the documentation of this file.
00001 //
00002 // start of shared cmdlib stuff
00003 // 
00004 
00005 
00006 #include "cmdlib.h"
00007 #include "windows.h"
00008 
00009 #define PATHSEPERATOR   '/'
00010 
00011 // rad additions
00012 // 11.29.99
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 // rad end
00088 
00089 #define MEM_BLOCKSIZE 4096
00090 void* qblockmalloc(size_t nSize)
00091 {
00092     void *b;
00093   // round up to threshold
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 Q_filelength
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 // FIXME: need error handler
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 LoadFile
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 LoadFileNoCrash
00213 
00214 returns -1 length if not present
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 SaveFile
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 // if path doesn't have a .EXT, append extension
00258 // (extension should include the .)
00259 //
00260     src = path + strlen(path) - 1;
00261 
00262     while (*src != PATHSEPERATOR && src != path)
00263     {
00264         if (*src == '.')
00265             return;                 // it has an extension
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;                   // absolute path location
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;     // no extension
00305     }
00306     if (length)
00307         path[length] = 0;
00308 }
00309 
00310 
00311 /*
00312 ====================
00313 Extract file parts
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 // back up until a \ or the start
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 // back up until a \ or the start
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 // back up until a \ or the start
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 // back up until a . or the start
00380 //
00381     while (src != path && *(src-1) != '.')
00382         src--;
00383     if (src == path)
00384     {
00385         *dest = 0;  // no extension
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                     BYTE ORDER FUNCTIONS
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 

Generated on Thu Aug 25 12:38:17 2005 for Quake III Arena by  doxygen 1.3.9.1