X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=common.c;h=95043325e40be71f476bcb99c8220018dee5c347;hb=f0759ed4221a432267e456d6862000cd55775504;hp=e8c0893f2fd5d69b62fd4b265b067513f9bf014f;hpb=b372ff212a4b42f4ac857a15e95bf04531fa260d;p=xonotic%2Fdarkplaces.git diff --git a/common.c b/common.c index e8c0893f..95043325 100644 --- a/common.c +++ b/common.c @@ -425,17 +425,9 @@ void SZ_Write (sizebuf_t *buf, const void *data, int length) memcpy (SZ_GetSpace(buf,length),data,length); } -void SZ_Print (sizebuf_t *buf, const char *data) -{ - int len; - len = strlen(data)+1; - -// byte * cast to keep VC++ happy - if (buf->data[buf->cursize-1]) - memcpy ((qbyte *)SZ_GetSpace(buf, len),data,len); // no trailing 0 - else - memcpy ((qbyte *)SZ_GetSpace(buf, len-1)-1,data,len); // write over trailing 0 -} +// LordHavoc: thanks to Fuh for bringing the pure evil of SZ_Print to my +// attention, it has been eradicated from here, its only (former) use in +// all of darkplaces. static char *hexchar = "0123456789ABCDEF"; void Com_HexDumpToConsole(const qbyte *data, int size) @@ -547,8 +539,9 @@ skipwhite: // skip /* comments if (data[1] == '*') { - while (*data && *data != '*' && data[1] != '/') + while (*data && (*data != '*' || data[1] != '/')) data++; + data+=2; goto skipwhite; } } @@ -597,6 +590,81 @@ skipwhite: return true; } +/* +============== +COM_ParseTokenConsole + +Parse a token out of a string, behaving like the qwcl console +============== +*/ +int COM_ParseTokenConsole(const char **datapointer) +{ + int c; + int len; + const char *data = *datapointer; + + len = 0; + com_token[0] = 0; + + if (!data) + { + *datapointer = NULL; + return false; + } + +// skip whitespace +skipwhite: + while ((c = *data) <= ' ') + { + if (c == 0) + { + // end of file + *datapointer = NULL; + return false; + } + data++; + } + + // skip // comments + if (c == '/' && data[1] == '/') + { + while (*data && *data != '\n') + data++; + goto skipwhite; + } + +// handle quoted strings specially + if (c == '\"') + { + data++; + while (1) + { + c = *data++; + if (c == '\"' || !c) + { + com_token[len] = 0; + *datapointer = data; + return true; + } + com_token[len] = c; + len++; + } + } + +// parse a regular word + do + { + com_token[len] = c; + data++; + len++; + c = *data; + } while (c>32); + + com_token[len] = 0; + *datapointer = data; + return true; +} + /* ================ @@ -696,6 +764,12 @@ void COM_InitGameType (void) gamemode = GAME_BATTLEMECH; else if (strstr(name, "zymotic")) gamemode = GAME_ZYMOTIC; + else if (strstr(name, "fniggium")) + gamemode = GAME_FNIGGIUM; + else if (strstr(name, "setheral")) + gamemode = GAME_SETHERAL; + else if (strstr(name, "som")) + gamemode = GAME_SOM; else gamemode = GAME_NORMAL; @@ -719,6 +793,12 @@ void COM_InitGameType (void) gamemode = GAME_BATTLEMECH; else if (COM_CheckParm ("-zymotic")) gamemode = GAME_ZYMOTIC; + else if (COM_CheckParm ("-fniggium")) + gamemode = GAME_FNIGGIUM; + else if (COM_CheckParm ("-setheral")) + gamemode = GAME_SETHERAL; + else if (COM_CheckParm ("-som")) + gamemode = GAME_SOM; switch(gamemode) { @@ -762,6 +842,18 @@ void COM_InitGameType (void) gamename = "Zymotic"; gamedirname = "data"; break; + case GAME_FNIGGIUM: + gamename = "Fniggium"; + gamedirname = "data"; + break; + case GAME_SETHERAL: + gamename = "Setheral"; + gamedirname = "data"; + break; + case GAME_SOM: + gamename = "Son of Man"; + gamedirname = "data"; + break; default: Sys_Error("COM_InitGameType: unknown gamemode %i\n", gamemode); break; @@ -884,6 +976,64 @@ int COM_StringBeginsWith(const char *s, const char *match) return true; } +int COM_ReadAndTokenizeLine(const char **text, char **argv, int maxargc, char *tokenbuf, int tokenbufsize, const char *commentprefix) +{ + int argc, commentprefixlength; + char *tokenbufend; + const char *l; + argc = 0; + tokenbufend = tokenbuf + tokenbufsize; + l = *text; + commentprefixlength = 0; + if (commentprefix) + commentprefixlength = strlen(commentprefix); + while (*l && *l != '\n') + { + if (*l > ' ') + { + if (commentprefixlength && !strncmp(l, commentprefix, commentprefixlength)) + { + while (*l && *l != '\n') + l++; + break; + } + if (argc >= maxargc) + return -1; + argv[argc++] = tokenbuf; + if (*l == '"') + { + l++; + while (*l && *l != '"') + { + if (tokenbuf >= tokenbufend) + return -1; + *tokenbuf++ = *l++; + } + if (*l == '"') + l++; + } + else + { + while (*l > ' ') + { + if (tokenbuf >= tokenbufend) + return -1; + *tokenbuf++ = *l++; + } + } + if (tokenbuf >= tokenbufend) + return -1; + *tokenbuf++ = 0; + } + else + l++; + } + if (*l == '\n') + l++; + *text = l; + return argc; +} + // written by Elric, thanks Elric! char *SearchInfostring(const char *infostring, const char *key) { @@ -971,7 +1121,7 @@ char *SearchInfostring(const char *infostring, const char *key) // Most (all?) BSDs already have them -#if !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__FreeBSD__) +#if !defined(__OpenBSD__) && !defined(__NetBSD__) && !defined(__FreeBSD__) && !(defined(__APPLE__) && defined(__MACH__)) size_t strlcat(char *dst, const char *src, size_t siz)