aboutsummaryrefslogtreecommitdiffstats
path: root/libs/cmdlib/cmdlib.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/cmdlib/cmdlib.cpp')
-rwxr-xr-xlibs/cmdlib/cmdlib.cpp550
1 files changed, 550 insertions, 0 deletions
diff --git a/libs/cmdlib/cmdlib.cpp b/libs/cmdlib/cmdlib.cpp
new file mode 100755
index 0000000..c1e9d8b
--- /dev/null
+++ b/libs/cmdlib/cmdlib.cpp
@@ -0,0 +1,550 @@
+//
+// start of shared cmdlib stuff
+//
+
+
+#include "cmdlib.h"
+#include "windows.h"
+
+#define PATHSEPERATOR '/'
+
+// rad additions
+// 11.29.99
+PFN_ERR *g_pfnError = NULL;
+PFN_PRINTF *g_pfnPrintf = NULL;
+PFN_ERR_NUM *g_pfnErrorNum = NULL;
+PFN_PRINTF_NUM *g_pfnPrintfNum = NULL;
+
+
+void Error(const char *pFormat, ...)
+{
+ if (g_pfnError)
+ {
+ va_list arg_ptr;
+ va_start(arg_ptr, pFormat);
+ g_pfnError(pFormat, arg_ptr);
+ va_end(arg_ptr);
+ }
+}
+
+void Printf(const char *pFormat, ...)
+{
+ if (g_pfnPrintf)
+ {
+ va_list arg_ptr;
+ va_start(arg_ptr, pFormat);
+ g_pfnPrintf(pFormat, arg_ptr);
+ va_end(arg_ptr);
+ }
+}
+
+void ErrorNum(int nErr, const char *pFormat, ...)
+{
+ if (g_pfnErrorNum)
+ {
+ va_list arg_ptr;
+ va_start(arg_ptr, pFormat);
+ g_pfnErrorNum(nErr, pFormat, arg_ptr);
+ va_end(arg_ptr);
+ }
+}
+
+void PrintfNum(int nErr, const char *pFormat, ...)
+{
+ if (g_pfnPrintfNum)
+ {
+ va_list arg_ptr;
+ va_start(arg_ptr, pFormat);
+ g_pfnPrintfNum(nErr, pFormat, arg_ptr);
+ va_end(arg_ptr);
+ }
+}
+
+
+
+void SetErrorHandler(PFN_ERR pe)
+{
+ g_pfnError = pe;
+}
+
+void SetPrintfHandler(PFN_PRINTF pe)
+{
+ g_pfnPrintf = pe;
+}
+
+void SetErrorHandlerNum(PFN_ERR_NUM pe)
+{
+ g_pfnErrorNum = pe;
+}
+
+void SetPrintfHandler(PFN_PRINTF_NUM pe)
+{
+ g_pfnPrintfNum = pe;
+}
+
+
+
+// rad end
+
+#define MEM_BLOCKSIZE 4096
+void* qblockmalloc(size_t nSize)
+{
+ void *b;
+ // round up to threshold
+ int nAllocSize = nSize % MEM_BLOCKSIZE;
+ if ( nAllocSize > 0)
+ {
+ nSize += MEM_BLOCKSIZE - nAllocSize;
+ }
+ b = malloc(nSize + 1);
+ memset (b, 0, nSize);
+ return b;
+}
+
+void* qmalloc (size_t nSize)
+{
+ void *b;
+ b = malloc(nSize + 1);
+ memset (b, 0, nSize);
+ return b;
+}
+
+/*
+================
+Q_filelength
+================
+*/
+int Q_filelength (FILE *f)
+{
+ int pos;
+ int end;
+
+ pos = ftell (f);
+ fseek (f, 0, SEEK_END);
+ end = ftell (f);
+ fseek (f, pos, SEEK_SET);
+
+ return end;
+}
+
+
+// FIXME: need error handler
+FILE *SafeOpenWrite (const char *filename)
+{
+ FILE *f;
+
+ f = fopen(filename, "wb");
+
+ if (!f)
+ {
+ Error ("Error opening %s: %s",filename,strerror(errno));
+ }
+
+ return f;
+}
+
+FILE *SafeOpenRead (const char *filename)
+{
+ FILE *f;
+
+ f = fopen(filename, "rb");
+
+ if (!f)
+ {
+ Error ("Error opening %s: %s",filename,strerror(errno));
+ }
+
+ return f;
+}
+
+
+void SafeRead (FILE *f, void *buffer, int count)
+{
+ if ( (int)fread (buffer, 1, count, f) != count)
+ Error ("File read failure");
+}
+
+
+void SafeWrite (FILE *f, const void *buffer, int count)
+{
+ if ( (int)fwrite (buffer, 1, count, f) != count)
+ Error ("File read failure");
+}
+
+
+
+/*
+==============
+LoadFile
+==============
+*/
+int LoadFile (const char *filename, void **bufferptr)
+{
+ FILE *f;
+ int length;
+ void *buffer;
+
+ *bufferptr = NULL;
+
+ if (filename == NULL || strlen(filename) == 0)
+ {
+ return -1;
+ }
+
+ f = fopen (filename, "rb");
+ if (!f)
+ {
+ return -1;
+ }
+ length = Q_filelength (f);
+ buffer = qblockmalloc (length+1);
+ ((char *)buffer)[length] = 0;
+ SafeRead (f, buffer, length);
+ fclose (f);
+
+ *bufferptr = buffer;
+ return length;
+}
+
+
+/*
+==============
+LoadFileNoCrash
+
+returns -1 length if not present
+==============
+*/
+int LoadFileNoCrash (const char *filename, void **bufferptr)
+{
+ FILE *f;
+ int length;
+ void *buffer;
+
+ f = fopen (filename, "rb");
+ if (!f)
+ return -1;
+ length = Q_filelength (f);
+ buffer = qmalloc (length+1);
+ ((char *)buffer)[length] = 0;
+ SafeRead (f, buffer, length);
+ fclose (f);
+
+ *bufferptr = buffer;
+ return length;
+}
+
+
+/*
+==============
+SaveFile
+==============
+*/
+void SaveFile (const char *filename, void *buffer, int count)
+{
+ FILE *f;
+
+ f = SafeOpenWrite (filename);
+ SafeWrite (f, buffer, count);
+ fclose (f);
+}
+
+
+
+void DefaultExtension (char *path, char *extension)
+{
+ char *src;
+//
+// if path doesn't have a .EXT, append extension
+// (extension should include the .)
+//
+ src = path + strlen(path) - 1;
+
+ while (*src != PATHSEPERATOR && src != path)
+ {
+ if (*src == '.')
+ return; // it has an extension
+ src--;
+ }
+
+ strcat (path, extension);
+}
+
+
+void DefaultPath (char *path, char *basepath)
+{
+ char temp[128];
+
+ if (path[0] == PATHSEPERATOR)
+ return; // absolute path location
+ strcpy (temp,path);
+ strcpy (path,basepath);
+ strcat (path,temp);
+}
+
+
+void StripFilename (char *path)
+{
+ int length;
+
+ length = strlen(path)-1;
+ while (length > 0 && path[length] != PATHSEPERATOR)
+ length--;
+ path[length] = 0;
+}
+
+void StripExtension (char *path)
+{
+ int length;
+
+ length = strlen(path)-1;
+ while (length > 0 && path[length] != '.')
+ {
+ length--;
+ if (path[length] == '/')
+ return; // no extension
+ }
+ if (length)
+ path[length] = 0;
+}
+
+
+/*
+====================
+Extract file parts
+====================
+*/
+void ExtractFilePath (const char *path, char *dest)
+{
+ const char *src;
+
+ src = path + strlen(path) - 1;
+
+//
+// back up until a \ or the start
+//
+ while (src != path && *(src-1) != PATHSEPERATOR)
+ src--;
+
+ memcpy (dest, path, src-path);
+ dest[src-path] = 0;
+}
+
+void ExtractFileName (const char *path, char *dest)
+{
+ const char *src;
+
+ src = path + strlen(path) - 1;
+
+//
+// back up until a \ or the start
+//
+ while (src != path && *(src-1) != '/'
+ && *(src-1) != '\\' )
+ src--;
+
+ while (*src)
+ {
+ *dest++ = *src++;
+ }
+ *dest = 0;
+}
+
+void ExtractFileBase (const char *path, char *dest)
+{
+ const char *src;
+
+ src = path + strlen(path) - 1;
+
+//
+// back up until a \ or the start
+//
+ while (src != path && *(src-1) != '/'
+ && *(src-1) != '\\' )
+ src--;
+
+ while (*src && *src != '.')
+ {
+ *dest++ = *src++;
+ }
+ *dest = 0;
+}
+
+void ExtractFileExtension (const char *path, char *dest)
+{
+ const char *src;
+
+ src = path + strlen(path) - 1;
+
+//
+// back up until a . or the start
+//
+ while (src != path && *(src-1) != '.')
+ src--;
+ if (src == path)
+ {
+ *dest = 0; // no extension
+ return;
+ }
+
+ strcpy (dest,src);
+}
+
+
+void ConvertDOSToUnixName( char *dst, const char *src )
+{
+ while ( *src )
+ {
+ if ( *src == '\\' )
+ *dst = '/';
+ else
+ *dst = *src;
+ dst++; src++;
+ }
+ *dst = 0;
+}
+
+
+char* StrDup(char* pStr)
+{
+ if (pStr)
+ {
+ return strcpy(new char[strlen(pStr)+1], pStr);
+ }
+ return NULL;
+}
+
+char* StrDup(const char* pStr)
+{
+ if (pStr)
+ {
+ return strcpy(new char[strlen(pStr)+1], pStr);
+ }
+ return NULL;
+}
+
+
+/*
+============================================================================
+
+ BYTE ORDER FUNCTIONS
+
+============================================================================
+*/
+
+#ifdef _SGI_SOURCE
+#define __BIG_ENDIAN__
+#endif
+
+#ifdef __BIG_ENDIAN__
+
+short LittleShort (short l)
+{
+ byte b1,b2;
+
+ b1 = l&255;
+ b2 = (l>>8)&255;
+
+ return (b1<<8) + b2;
+}
+
+short BigShort (short l)
+{
+ return l;
+}
+
+
+int LittleLong (int l)
+{
+ byte b1,b2,b3,b4;
+
+ b1 = l&255;
+ b2 = (l>>8)&255;
+ b3 = (l>>16)&255;
+ b4 = (l>>24)&255;
+
+ return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
+}
+
+int BigLong (int l)
+{
+ return l;
+}
+
+
+float LittleFloat (float l)
+{
+ union {byte b[4]; float f;} in, out;
+
+ in.f = l;
+ out.b[0] = in.b[3];
+ out.b[1] = in.b[2];
+ out.b[2] = in.b[1];
+ out.b[3] = in.b[0];
+
+ return out.f;
+}
+
+float BigFloat (float l)
+{
+ return l;
+}
+
+
+#else
+
+
+short BigShort (short l)
+{
+ byte b1,b2;
+
+ b1 = l&255;
+ b2 = (l>>8)&255;
+
+ return (b1<<8) + b2;
+}
+
+short LittleShort (short l)
+{
+ return l;
+}
+
+
+int BigLong (int l)
+{
+ byte b1,b2,b3,b4;
+
+ b1 = l&255;
+ b2 = (l>>8)&255;
+ b3 = (l>>16)&255;
+ b4 = (l>>24)&255;
+
+ return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
+}
+
+int LittleLong (int l)
+{
+ return l;
+}
+
+float BigFloat (float l)
+{
+ union {byte b[4]; float f;} in, out;
+
+ in.f = l;
+ out.b[0] = in.b[3];
+ out.b[1] = in.b[2];
+ out.b[2] = in.b[1];
+ out.b[3] = in.b[0];
+
+ return out.f;
+}
+
+float LittleFloat (float l)
+{
+ return l;
+}
+
+
+
+#endif
+