X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=common.c;h=0f413b2ddde0cc493ed19b662cfde10571388041;hp=80a7389fc3b1e372a7e6d7a731e802e4f7991583;hb=d73510b7f24213b76b1611909adc9e39d77215d2;hpb=08dc528c1e2e6c2b1891c12dbc69ec985387a232 diff --git a/common.c b/common.c index 80a7389f..0f413b2d 100644 --- a/common.c +++ b/common.c @@ -29,14 +29,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" -#define NUM_SAFE_ARGVS 7 - -static char *largv[MAX_NUM_ARGVS + NUM_SAFE_ARGVS + 1]; -static char *argvdummy = " "; - -static char *safeargvs[NUM_SAFE_ARGVS] = - {"-stdvid", "-nolan", "-nosound", "-nocdaudio", "-nojoy", "-nomouse", "-window"}; - cvar_t registered = {0, "registered","0"}; cvar_t cmdline = {0, "cmdline","0"}; @@ -44,17 +36,12 @@ mempool_t *pak_mempool; qboolean com_modified; // set true if using non-id files -//qboolean proghack; - -//int static_registered = 1; // only for startup check, then set - -qboolean msg_suppress_1 = 0; - void COM_InitFilesystem (void); char com_token[1024]; +char com_basedir[MAX_OSPATH]; int com_argc; -char **com_argv; +const char **com_argv; // LordHavoc: made commandline 1024 characters instead of 256 #define CMDLINE_LENGTH 1024 @@ -62,6 +49,8 @@ char com_cmdline[CMDLINE_LENGTH]; int gamemode; char *gamename; +char *gamedirname; +char com_modname[MAX_OSPATH]; /* @@ -95,127 +84,7 @@ The file "parms.txt" will be read out of the game directory and appended to the ============================================================================ */ -/* -void Q_memset (void *dest, int fill, int count) -{ - int i; - - if ( (((long)dest | count) & 3) == 0) - { - count >>= 2; - fill = fill | (fill<<8) | (fill<<16) | (fill<<24); - for (i=0 ; i>=2; - for (i=0 ; i= '0' && c <= '9') - val = (val<<4) + c - '0'; - else if (c >= 'a' && c <= 'f') - val = (val<<4) + c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - val = (val<<4) + c - 'A' + 10; - else - return val*sign; - } - } - -// -// check for character -// - if (str[0] == '\'') - { - return sign * str[1]; - } - -// -// assume decimal -// - while (1) - { - c = *str++; - if (c <'0' || c > '9') - return val*sign; - val = val*10 + c - '0'; - } - - return 0; -} - - -float Q_atof (char *str) -{ - double val; - int sign; - int c; - int decimal, total; - - if (*str == '-') - { - sign = -1; - str++; - } - else - sign = 1; - - val = 0; - -// -// check for hex -// - if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X') ) - { - str += 2; - while (1) - { - c = *str++; - if (c >= '0' && c <= '9') - val = (val*16) + c - '0'; - else if (c >= 'a' && c <= 'f') - val = (val*16) + c - 'a' + 10; - else if (c >= 'A' && c <= 'F') - val = (val*16) + c - 'A' + 10; - else - return val*sign; - } - } - -// -// check for character -// - if (str[0] == '\'') - { - return sign * str[1]; - } - -// -// assume decimal -// - decimal = -1; - total = 0; - while (1) - { - c = *str++; - if (c == '.') - { - decimal = total; - continue; - } - if (c <'0' || c > '9') - break; - val = val*10 + c - '0'; - total++; - } - - if (decimal == -1) - return val*sign; - while (total > decimal) - { - val /= 10; - total--; - } - - return val*sign; -} -*/ /* ============================================================================ @@ -479,11 +211,6 @@ void MSG_WriteChar (sizebuf_t *sb, int c) { qbyte *buf; -//#ifdef PARANOID -// if (c < -128 || c > 127) -// Sys_Error ("MSG_WriteChar: range error"); -//#endif - buf = SZ_GetSpace (sb, 1); buf[0] = c; } @@ -492,11 +219,6 @@ void MSG_WriteByte (sizebuf_t *sb, int c) { qbyte *buf; -//#ifdef PARANOID -// if (c < 0 || c > 255) -// Sys_Error ("MSG_WriteByte: range error"); -//#endif - buf = SZ_GetSpace (sb, 1); buf[0] = c; } @@ -505,11 +227,6 @@ void MSG_WriteShort (sizebuf_t *sb, int c) { qbyte *buf; -//#ifdef PARANOID -// if (c < ((short)0x8000) || c > (short)0x7fff) -// Sys_Error ("MSG_WriteShort: range error"); -//#endif - buf = SZ_GetSpace (sb, 2); buf[0] = c&0xff; buf[1] = c>>8; @@ -541,7 +258,7 @@ void MSG_WriteFloat (sizebuf_t *sb, float f) SZ_Write (sb, &dat.l, 4); } -void MSG_WriteString (sizebuf_t *sb, char *s) +void MSG_WriteString (sizebuf_t *sb, const char *s) { if (!s) SZ_Write (sb, "", 1); @@ -578,8 +295,8 @@ void MSG_WriteAngle (sizebuf_t *sb, float f) // // reading functions // -int msg_readcount; -qboolean msg_badread; +int msg_readcount; +qboolean msg_badread; void MSG_BeginReading (void) { @@ -587,48 +304,9 @@ void MSG_BeginReading (void) msg_badread = false; } -/* -// returns -1 and sets msg_badread if no more characters are available -int MSG_ReadChar (void) -{ - int c; - - // LordHavoc: minor optimization - if (msg_readcount >= net_message.cursize) -// if (msg_readcount+1 > net_message.cursize) - { - msg_badread = true; - return -1; - } - - c = (signed char)net_message.data[msg_readcount]; - msg_readcount++; - - return c; -} - -int MSG_ReadByte (void) -{ - int c; - - // LordHavoc: minor optimization - if (msg_readcount >= net_message.cursize) -// if (msg_readcount+1 > net_message.cursize) - { - msg_badread = true; - return -1; - } - - c = (unsigned char)net_message.data[msg_readcount]; - msg_readcount++; - - return c; -} -*/ - int MSG_ReadShort (void) { - int c; + int c; if (msg_readcount+2 > net_message.cursize) { @@ -646,7 +324,7 @@ int MSG_ReadShort (void) int MSG_ReadLong (void) { - int c; + int c; if (msg_readcount+4 > net_message.cursize) { @@ -668,9 +346,9 @@ float MSG_ReadFloat (void) { union { - qbyte b[4]; - float f; - int l; + qbyte b[4]; + float f; + int l; } dat; dat.b[0] = net_message.data[msg_readcount]; @@ -686,8 +364,8 @@ float MSG_ReadFloat (void) char *MSG_ReadString (void) { - static char string[2048]; - int l,c; + static char string[2048]; + int l,c; l = 0; do @@ -721,27 +399,10 @@ float MSG_ReadCoord (void) return MSG_ReadShort() * (1.0f/8.0f); } -/* -float MSG_ReadCoord (void) -{ - return MSG_ReadShort() * (1.0f/8.0f); -} - -float MSG_ReadAngle (void) -{ - return MSG_ReadChar() * (360.0f/256.0f); -} - -float MSG_ReadPreciseAngle (void) -{ - return MSG_ReadShort() * (360.0f/65536); -} -*/ - //=========================================================================== -void SZ_Alloc (sizebuf_t *buf, int startsize, char *name) +void SZ_Alloc (sizebuf_t *buf, int startsize, const char *name) { if (startsize < 256) startsize = 256; @@ -767,36 +428,35 @@ void SZ_Clear (sizebuf_t *buf) void *SZ_GetSpace (sizebuf_t *buf, int length) { - void *data; + void *data; if (buf->cursize + length > buf->maxsize) { if (!buf->allowoverflow) - Host_Error ("SZ_GetSpace: overflow without allowoverflow set"); + Host_Error ("SZ_GetSpace: overflow without allowoverflow set\n"); if (length > buf->maxsize) - Host_Error ("SZ_GetSpace: %i is > full buffer size", length); + Host_Error ("SZ_GetSpace: %i is > full buffer size\n", length); buf->overflowed = true; - Con_Printf ("SZ_GetSpace: overflow"); + Con_Printf ("SZ_GetSpace: overflow\n"); SZ_Clear (buf); } data = buf->data + buf->cursize; buf->cursize += length; - + return data; } -void SZ_Write (sizebuf_t *buf, void *data, int length) +void SZ_Write (sizebuf_t *buf, const void *data, int length) { - memcpy (SZ_GetSpace(buf,length),data,length); + memcpy (SZ_GetSpace(buf,length),data,length); } -void SZ_Print (sizebuf_t *buf, char *data) +void SZ_Print (sizebuf_t *buf, const char *data) { - int len; - + int len; len = strlen(data)+1; // byte * cast to keep VC++ happy @@ -806,36 +466,66 @@ void SZ_Print (sizebuf_t *buf, char *data) memcpy ((qbyte *)SZ_GetSpace(buf, len-1)-1,data,len); // write over trailing 0 } - -//============================================================================ - - -/* -============ -COM_SkipPath -============ -*/ -char *COM_SkipPath (char *pathname) +static char *hexchar = "0123456789ABCDEF"; +void SZ_HexDumpToConsole(const sizebuf_t *buf) { - char *last; - - last = pathname; - while (*pathname) + int i; + char text[1024]; + char *cur, *flushpointer; + cur = text; + flushpointer = text + 512; + for (i = 0;i < buf->cursize;i++) + { + if ((i & 15) == 0) + { + *cur++ = hexchar[(i >> 12) & 15]; + *cur++ = hexchar[(i >> 8) & 15]; + *cur++ = hexchar[(i >> 4) & 15]; + *cur++ = hexchar[(i >> 0) & 15]; + *cur++ = ':'; + *cur++ = ' '; + } + else if ((i & 15) == 15) + *cur++ = '\n'; + else + *cur++ = ' '; + if (i & 1) + { + *cur++ = hexchar[(buf->data[i] >> 4) & 15] | 0x80; + *cur++ = hexchar[(buf->data[i] >> 0) & 15] | 0x80; + } + else + { + *cur++ = hexchar[(buf->data[i] >> 4) & 15]; + *cur++ = hexchar[(buf->data[i] >> 0) & 15]; + } + if (cur >= flushpointer) + { + *cur++ = 0; + Con_Printf("%s", text); + cur = text; + } + } + if ((i & 15) != 0) + *cur++ = '\n'; + if (cur > text) { - if (*pathname=='/') - last = pathname+1; - pathname++; + *cur++ = 0; + Con_Printf("%s", text); } - return last; } + +//============================================================================ + + /* ============ COM_StripExtension ============ */ // LordHavoc: replacement for severely broken COM_StripExtension that was used in original quake. -void COM_StripExtension (char *in, char *out) +void COM_StripExtension (const char *in, char *out) { char *last = NULL; while (*in) @@ -848,6 +538,8 @@ void COM_StripExtension (char *in, char *out) } if (last) *last = 0; + else + *out = 0; } /* @@ -855,10 +547,10 @@ void COM_StripExtension (char *in, char *out) COM_FileExtension ============ */ -char *COM_FileExtension (char *in) +char *COM_FileExtension (const char *in) { static char exten[8]; - int i; + int i; while (*in && *in != '.') in++; @@ -876,10 +568,9 @@ char *COM_FileExtension (char *in) COM_FileBase ============ */ -void COM_FileBase (char *in, char *out) +void COM_FileBase (const char *in, char *out) { - char *slash, *dot; - char *s; + const char *slash, *dot, *s; slash = in; dot = NULL; @@ -910,9 +601,9 @@ void COM_FileBase (char *in, char *out) COM_DefaultExtension ================== */ -void COM_DefaultExtension (char *path, char *extension) +void COM_DefaultExtension (char *path, const char *extension) { - char *src; + const char *src; // // if path doesn't have a .EXT, append extension // (extension should include the .) @@ -932,31 +623,39 @@ void COM_DefaultExtension (char *path, char *extension) /* ============== -COM_Parse +COM_ParseToken Parse a token out of a string ============== */ -char *COM_Parse (char *data) +int COM_ParseToken (const char **datapointer) { - int c; - int len; - + int c; + int len; + const char *data = *datapointer; + len = 0; com_token[0] = 0; - + if (!data) - return NULL; - + { + *datapointer = NULL; + return false; + } + // skip whitespace skipwhite: - while ( (c = *data) <= ' ') + while ((c = *data) <= ' ') { if (c == 0) - return NULL; // end of file; + { + // end of file + *datapointer = NULL; + return false; + } data++; } - + // skip // comments if (c=='/' && data[1] == '/') { @@ -964,7 +663,7 @@ skipwhite: data++; goto skipwhite; } - + // handle quoted strings specially if (c == '\"') @@ -976,7 +675,8 @@ skipwhite: if (c=='\"' || !c) { com_token[len] = 0; - return data; + *datapointer = data; + return true; } com_token[len] = c; len++; @@ -989,7 +689,8 @@ skipwhite: com_token[len] = c; len++; com_token[len] = 0; - return data+1; + *datapointer = data+1; + return true; } // parse a regular word @@ -999,12 +700,13 @@ skipwhite: data++; len++; c = *data; - if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':') + if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c==':') break; } while (c>32); - + com_token[len] = 0; - return data; + *datapointer = data; + return true; } @@ -1016,10 +718,10 @@ Returns the position (1 to argc-1) in the program's argument list where the given parameter apears, or 0 if not present ================ */ -int COM_CheckParm (char *parm) +int COM_CheckParm (const char *parm) { - int i; - + int i; + for (i=1 ; inext) @@ -1358,7 +1016,7 @@ LordHavoc: Previously only used for CopyFile, now also used for COM_WriteFile. */ void COM_CreatePath (char *path) { - char *ofs, save; + char *ofs, save; for (ofs = path+1 ; *ofs ; ofs++) { @@ -1381,15 +1039,16 @@ COM_WriteFile The filename will be prefixed by the current game directory ============ */ -qboolean COM_WriteFile (char *filename, void *data, int len) +qboolean COM_WriteFile (const char *filename, void *data, int len) { - int handle; - char name[MAX_OSPATH]; + int handle; + char name[MAX_OSPATH]; sprintf (name, "%s/%s", com_gamedir, filename); // LordHavoc: added this - COM_CreatePath (name); // create directories up to the file + // create directories up to the file + COM_CreatePath (name); handle = Sys_FileOpenWrite (name); if (handle == -1) @@ -1415,14 +1074,13 @@ needed. This is for the convenience of developers using ISDN from home. */ void COM_CopyFile (char *netpath, char *cachepath) { - int in, out; - int remaining, count; - char buf[4096]; + int in, out, remaining, count; + char buf[4096]; - remaining = Sys_FileOpenRead (netpath, &in); + remaining = Sys_FileOpenRead (netpath, &in); COM_CreatePath (cachepath); // create directories up to the cache file out = Sys_FileOpenWrite (cachepath); - + while (remaining) { if (remaining < sizeof(buf)) @@ -1435,7 +1093,7 @@ void COM_CopyFile (char *netpath, char *cachepath) } Sys_FileClose (in); - Sys_FileClose (out); + Sys_FileClose (out); } /* @@ -1445,9 +1103,8 @@ COM_OpenRead */ QFile * COM_OpenRead (const char *path, int offs, int len, qboolean zip) { - int fd = open (path, O_RDONLY); - unsigned char id[2]; - unsigned char len_bytes[4]; + int fd = open (path, O_RDONLY); + unsigned char id[2], len_bytes[4]; if (fd == -1) { @@ -1495,35 +1152,28 @@ Finds the file in the search path. Sets com_filesize and one of handle or file =========== */ -int COM_FindFile (char *filename, QFile **file, qboolean quiet, qboolean zip) +int COM_FindFile (const char *filename, QFile **file, qboolean quiet, qboolean zip) { - searchpath_t *search; - char netpath[MAX_OSPATH]; + searchpath_t *search; + char netpath[MAX_OSPATH]; #if CACHEENABLE - char cachepath[MAX_OSPATH]; - int cachetime; + char cachepath[MAX_OSPATH]; + int cachetime; #endif - pack_t *pak; - int i; - int findtime; - char gzfilename[MAX_OSPATH]; - int filenamelen; + pack_t *pak; + int i, findtime, filenamelen; + char gzfilename[MAX_OSPATH]; filenamelen = strlen (filename); sprintf (gzfilename, "%s.gz", filename); if (!file) Sys_Error ("COM_FindFile: file not set"); - + // // search through the path, one element at a time // search = com_searchpaths; -// if (proghack) -// { // gross hack to use quake 1 progs with quake 2 maps -// if (!strcmp(filename, "progs.dat")) -// search = search->next; -// } for ( ; search ; search = search->next) { @@ -1544,24 +1194,17 @@ int COM_FindFile (char *filename, QFile **file, qboolean quiet, qboolean zip) } } else - { - // check a file in the directory tree -// if (!static_registered) -// { // if not a registered version, don't ever go beyond base -// if ( strchr (filename, '/') || strchr (filename,'\\')) -// continue; -// } - + { sprintf (netpath, "%s/%s",search->filename, filename); - + findtime = Sys_FileTime (netpath); if (findtime == -1) continue; - + #if CACHEENABLE // see if the file needs to be updated in the cache if (com_cachedir[0]) - { + { #if defined(_WIN32) if ((strlen(netpath) < 2) || (netpath[1] != ':')) sprintf (cachepath,"%s%s", com_cachedir, netpath); @@ -1572,24 +1215,22 @@ int COM_FindFile (char *filename, QFile **file, qboolean quiet, qboolean zip) #endif cachetime = Sys_FileTime (cachepath); - + if (cachetime < findtime) COM_CopyFile (netpath, cachepath); strcpy (netpath, cachepath); - } + } #endif - if (!quiet) Sys_Printf ("FindFile: %s\n",netpath); *file = COM_OpenRead (netpath, -1, -1, zip); return com_filesize; } - } - + if (!quiet) Sys_Printf ("FindFile: can't find %s\n", filename); - + *file = NULL; com_filesize = -1; return -1; @@ -1604,7 +1245,7 @@ If the requested file is inside a packfile, a new QFile * will be opened into the file. =========== */ -int COM_FOpenFile (char *filename, QFile **file, qboolean quiet, qboolean zip) +int COM_FOpenFile (const char *filename, QFile **file, qboolean quiet, qboolean zip) { return COM_FindFile (filename, file, quiet, zip); } @@ -1620,7 +1261,7 @@ Always appends a 0 byte. */ qbyte *loadbuf; int loadsize; -qbyte *COM_LoadFile (char *path, qboolean quiet) +qbyte *COM_LoadFile (const char *path, qboolean quiet) { QFile *h; qbyte *buf; @@ -1662,21 +1303,17 @@ Loads the header and directory, adding the files at the beginning of the list so they override previous pack files. ================= */ -pack_t *COM_LoadPackFile (char *packfile) +pack_t *COM_LoadPackFile (const char *packfile) { - dpackheader_t header; - int i; - int numpackfiles; - pack_t *pack; - int packhandle; + dpackheader_t header; + int i, numpackfiles, packhandle; + pack_t *pack; // LordHavoc: changed from stack array to temporary alloc, allowing huge pack directories - dpackfile_t *info; + dpackfile_t *info; if (Sys_FileOpenRead (packfile, &packhandle) == -1) - { - //Con_Printf ("Couldn't open %s\n", packfile); return NULL; - } + Sys_FileRead (packhandle, (void *)&header, sizeof(header)); if (memcmp(header.id, "PACK", 4)) Sys_Error ("%s is not a packfile", packfile); @@ -1729,7 +1366,6 @@ then loads and adds pak1.pak pak2.pak ... */ void COM_AddGameDirectory (char *dir) { - //int i; stringlist_t *list, *current; searchpath_t *search; pack_t *pak; @@ -1749,7 +1385,7 @@ void COM_AddGameDirectory (char *dir) list = listdirectory(dir); for (current = list;current;current = current->next) { - if (matchpattern(current->text, "*.pak")) + if (matchpattern(current->text, "*.pak", true)) { sprintf (pakfile, "%s/%s", dir, current->text); pak = COM_LoadPackFile (pakfile); @@ -1765,28 +1401,6 @@ void COM_AddGameDirectory (char *dir) } } freedirectory(list); - - /* -// -// add any pak files in the format pak0.pak pak1.pak, ... -// - for (i=0 ; ; i++) - { - sprintf (pakfile, "%s/pak%i.pak", dir, i); - pak = COM_LoadPackFile (pakfile); - if (!pak) - break; - search = Mem_Alloc(pak_mempool, sizeof(searchpath_t)); - search->pack = pak; - search->next = com_searchpaths; - com_searchpaths = search; - } - */ - -// -// add the contents of the parms.txt file to the end of the command line -// - } /* @@ -1796,93 +1410,43 @@ COM_InitFilesystem */ void COM_InitFilesystem (void) { - int i, j; - char basedir[MAX_OSPATH]; - searchpath_t *search; + int i; + searchpath_t *search; -// -// -basedir -// Overrides the system supplied base directory (under GAMENAME) -// + strcpy(com_basedir, "."); + + // -basedir + // Overrides the system supplied base directory (under GAMENAME) i = COM_CheckParm ("-basedir"); if (i && i < com_argc-1) - strcpy (basedir, com_argv[i+1]); - else - strcpy (basedir, host_parms.basedir); - - j = strlen (basedir); + strcpy (com_basedir, com_argv[i+1]); - if (j > 0) - { - if ((basedir[j-1] == '\\') || (basedir[j-1] == '/')) - basedir[j-1] = 0; - } - -#if CACHEENABLE -// -// -cachedir -// Overrides the system supplied cache directory (NULL or /qcache) -// -cachedir - will disable caching. -// - i = COM_CheckParm ("-cachedir"); - if (i && i < com_argc-1) - { - if (com_argv[i+1][0] == '-') - com_cachedir[0] = 0; - else - strcpy (com_cachedir, com_argv[i+1]); - } - else if (host_parms.cachedir) - strcpy (com_cachedir, host_parms.cachedir); - else - com_cachedir[0] = 0; -#endif + i = strlen (com_basedir); + if (i > 0 && (com_basedir[i-1] == '\\' || com_basedir[i-1] == '/')) + com_basedir[i-1] = 0; // start up with GAMENAME by default (id1) - COM_AddGameDirectory (va("%s/"GAMENAME, basedir) ); - - switch(gamemode) + strcpy(com_modname, GAMENAME); + COM_AddGameDirectory (va("%s/"GAMENAME, com_basedir)); + if (gamedirname[0]) { - case GAME_NORMAL: - break; - case GAME_HIPNOTIC: - COM_AddGameDirectory (va("%s/hipnotic", basedir) ); - break; - case GAME_ROGUE: - COM_AddGameDirectory (va("%s/rogue", basedir) ); - break; - case GAME_NEHAHRA: - COM_AddGameDirectory (va("%s/nehahra", basedir) ); - break; - case GAME_FIENDARENA: - COM_AddGameDirectory (va("%s/fiendarena", basedir) ); - break; - case GAME_ZYMOTIC: - COM_AddGameDirectory (va("%s/zymotic", basedir) ); - break; - case GAME_BLOODBATH: - COM_AddGameDirectory (va("%s/bb", basedir) ); - break; - default: - Sys_Error("COM_InitFilesystem: unknown gamemode %i\n", gamemode); - break; + com_modified = true; + strcpy(com_modname, gamedirname); + COM_AddGameDirectory (va("%s/%s", com_basedir, gamedirname)); } -// -// -game -// Adds basedir/gamedir as an override game -// + // -game + // Adds basedir/gamedir as an override game i = COM_CheckParm ("-game"); if (i && i < com_argc-1) { com_modified = true; - COM_AddGameDirectory (va("%s/%s", basedir, com_argv[i+1])); + strcpy(com_modname, com_argv[i+1]); + COM_AddGameDirectory (va("%s/%s", com_basedir, com_argv[i+1])); } -// -// -path [] ... -// Fully specifies the exact search path, overriding the generated one -// + // -path [] ... + // Fully specifies the exact search path, overriding the generated one i = COM_CheckParm ("-path"); if (i) { @@ -1906,18 +1470,14 @@ void COM_InitFilesystem (void) com_searchpaths = search; } } - -// if (COM_CheckParm ("-proghack")) -// proghack = true; } -int COM_FileExists(char *filename) +int COM_FileExists(const char *filename) { - searchpath_t *search; - char netpath[MAX_OSPATH]; - pack_t *pak; - int i; - int findtime; + searchpath_t *search; + char netpath[MAX_OSPATH]; + pack_t *pak; + int i, findtime; for (search = com_searchpaths;search;search = search->next) { @@ -1934,7 +1494,7 @@ int COM_FileExists(char *filename) findtime = Sys_FileTime (netpath); if (findtime != -1) return true; - } + } } return false; @@ -1944,7 +1504,7 @@ int COM_FileExists(char *filename) //====================================== // LordHavoc: added these because they are useful -void COM_ToLowerString(char *in, char *out) +void COM_ToLowerString(const char *in, char *out) { while (*in) { @@ -1955,7 +1515,7 @@ void COM_ToLowerString(char *in, char *out) } } -void COM_ToUpperString(char *in, char *out) +void COM_ToUpperString(const char *in, char *out) { while (*in) { @@ -1965,3 +1525,11 @@ void COM_ToUpperString(char *in, char *out) *out++ = *in++; } } + +int COM_StringBeginsWith(const char *s, const char *match) +{ + for (;*s && *match;s++, match++) + if (*s != *match) + return false; + return true; +}