X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=common.c;h=d7023b9837bae246ffa6c09fb2585435f25663a5;hb=a915475ec3441cb67ac0d91abf2c18ba4a7a565e;hp=aac01fba3709b022bdb7ce0b2c8dc1a6ec4a9f3b;hpb=50f3f558108be1cf9e79f516bfdb257d2b50e2c5;p=xonotic%2Fdarkplaces.git diff --git a/common.c b/common.c index aac01fba..d7023b98 100644 --- a/common.c +++ b/common.c @@ -33,6 +33,7 @@ cvar_t cmdline = {0, "cmdline","0", "contains commandline the engine was launche char com_token[MAX_INPUTLINE]; int com_argc; const char **com_argv; +int com_selffd = -1; gamemode_t gamemode; const char *gamename; @@ -51,68 +52,78 @@ char com_modname[MAX_OSPATH] = ""; ============================================================================ */ -short ShortSwap (short l) -{ - unsigned char b1,b2; - - b1 = l&255; - b2 = (l>>8)&255; - return (b1<<8) + b2; +float BuffBigFloat (const unsigned char *buffer) +{ + union + { + float f; + unsigned int i; + } + u; + u.i = (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; + return u.f; } -int LongSwap (int l) +int BuffBigLong (const unsigned char *buffer) { - unsigned char b1,b2,b3,b4; - - b1 = l&255; - b2 = (l>>8)&255; - b3 = (l>>16)&255; - b4 = (l>>24)&255; + return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; +} - return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; +short BuffBigShort (const unsigned char *buffer) +{ + return (buffer[0] << 8) | buffer[1]; } -float FloatSwap (float f) +float BuffLittleFloat (const unsigned char *buffer) { union { - float f; - unsigned char b[4]; - } dat1, dat2; - - - dat1.f = f; - dat2.b[0] = dat1.b[3]; - dat2.b[1] = dat1.b[2]; - dat2.b[2] = dat1.b[1]; - dat2.b[3] = dat1.b[0]; - return dat2.f; + float f; + unsigned int i; + } + u; + u.i = (buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0]; + return u.f; } +int BuffLittleLong (const unsigned char *buffer) +{ + return (buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0]; +} -// Extract integers from buffers - -unsigned int BuffBigLong (const unsigned char *buffer) +short BuffLittleShort (const unsigned char *buffer) { - return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]; + return (buffer[1] << 8) | buffer[0]; } -unsigned short BuffBigShort (const unsigned char *buffer) +void StoreBigLong (unsigned char *buffer, unsigned int i) { - return (buffer[0] << 8) | buffer[1]; + buffer[0] = (i >> 24) & 0xFF; + buffer[1] = (i >> 16) & 0xFF; + buffer[2] = (i >> 8) & 0xFF; + buffer[3] = i & 0xFF; } -unsigned int BuffLittleLong (const unsigned char *buffer) +void StoreBigShort (unsigned char *buffer, unsigned short i) { - return (buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0]; + buffer[0] = (i >> 8) & 0xFF; + buffer[1] = i & 0xFF; } -unsigned short BuffLittleShort (const unsigned char *buffer) +void StoreLittleLong (unsigned char *buffer, unsigned int i) { - return (buffer[1] << 8) | buffer[0]; + buffer[0] = i & 0xFF; + buffer[1] = (i >> 8) & 0xFF; + buffer[2] = (i >> 16) & 0xFF; + buffer[3] = (i >> 24) & 0xFF; } +void StoreLittleShort (unsigned char *buffer, unsigned short i) +{ + buffer[0] = i & 0xFF; + buffer[1] = (i >> 8) & 0xFF; +} /* ============================================================================ @@ -680,6 +691,9 @@ would be good for any more. At the beginning of the string, it will be called for the char 0 to initialize a clean state, and then once with the string " " (a space) so the routine knows how long a space is. +In case no single character fits into the given width, the wordWidth function +must return the width of exactly one character. + Wrapped lines get the isContinuation flag set and are continuationWidth less wide. The sum of the return values of the processLine function will be returned. @@ -721,7 +735,6 @@ int COM_Wordwrap(const char *string, size_t length, float continuationWidth, flo result += processLine(passthroughPL, startOfLine, cursor - startOfLine, spaceUsedInLine, isContinuation); isContinuation = false; goto out; - break; case '\n': // end of line result += processLine(passthroughPL, startOfLine, cursor - startOfLine, spaceUsedInLine, isContinuation); isContinuation = false; @@ -749,7 +762,7 @@ int COM_Wordwrap(const char *string, size_t length, float continuationWidth, flo } out_inner: spaceUsedForWord = wordWidth(passthroughCW, cursor, &wordLen, maxWidth - continuationWidth); // this may have reduced wordLen when it won't fit - but this is GOOD. TODO fix words that do fit in a non-continuation line - if(wordLen < 1) + if(wordLen < 1) // cannot happen according to current spec of wordWidth { wordLen = 1; spaceUsedForWord = maxWidth + 1; // too high, forces it in a line of itself @@ -1408,13 +1421,13 @@ int COM_CheckParm (const char *parm) typedef struct gamemode_info_s { - const char* prog_name; - const char* cmdline; - const char* gamename; - const char* gamedirname1; - const char* gamedirname2; - const char* gamescreenshotname; - const char* gameuserdirname; + const char* prog_name; // not null + const char* cmdline; // not null + const char* gamename; // not null + const char* gamedirname1; // not null + const char* gamedirname2; // null + const char* gamescreenshotname; // not nul + const char* gameuserdirname; // not null } gamemode_info_t; static const gamemode_info_t gamemode_info [GAME_COUNT] = @@ -1486,18 +1499,22 @@ static const gamemode_info_t gamemode_info [GAME_COUNT] = // GAME_EDU2P // COMMANDLINEOPTION: Game: -edu2p runs the game Edu2 prototype { "edu2p", "-edu2p", "EDU2 Prototype", "id1", "edu2", "edu2_p", "edu2prototype" }, -// GAME_BLADEMASTER -// COMMANDLINEOPTION: Game: -blademaster runs the game Prophecy: Return of the BladeMaster -{ "blademaster", "-blademaster", "Prophecy: Return of the BladeMaster", "basebm", NULL, "blademaster", "blademaster" }, // GAME_PROPHECY -// COMMANDLINEOPTION: Game: -prophecy runs the game Quake (default) +// COMMANDLINEOPTION: Game: -prophecy runs the game Prophecy { "prophecy", "-prophecy", "Prophecy", "data", NULL, "prophecy", "prophecy" }, +// GAME_BLOODOMNICIDE +// COMMANDLINEOPTION: Game: -omnicide runs the game Blood Omnicide +{ "omnicide", "-omnicide", "Blood Omnicide", "kain", NULL, "omnicide", "omnicide" }, +// GAME_STEELSTORM +// COMMANDLINEOPTION: Game: -steelstorm runs the game Steel Storm +{ "steelstorm", "-steelstorm", "Steel-Storm", "gamedata", NULL, "ss", "steelstorm" }, }; void COM_InitGameType (void) { char name [MAX_OSPATH]; unsigned int i; + int t; FS_StripExtension (com_argv[0], name, sizeof (name)); COM_ToLowerString (name, name, sizeof (name)); @@ -1524,6 +1541,17 @@ void COM_InitGameType (void) gamedirname2 = gamemode_info[gamemode].gamedirname2; gamescreenshotname = gamemode_info[gamemode].gamescreenshotname; gameuserdirname = gamemode_info[gamemode].gameuserdirname; + + if((t = COM_CheckParm("-customgamename")) && t + 1 < com_argc) + gamename = com_argv[t+1]; + if((t = COM_CheckParm("-customgamedirname1")) && t + 1 < com_argc) + gamedirname1 = com_argv[t+1]; + if((t = COM_CheckParm("-customgamedirname2")) && t + 1 < com_argc) + gamedirname2 = *com_argv[t+1] ? com_argv[t+1] : NULL; + if((t = COM_CheckParm("-customgamescreenshotname")) && t + 1 < com_argc) + gamescreenshotname = com_argv[t+1]; + if((t = COM_CheckParm("-customgameuserdirname")) && t + 1 < com_argc) + gameuserdirname = com_argv[t+1]; } @@ -1777,7 +1805,7 @@ COM_StringLengthNoColors(const char *s, size_t size_s, qboolean *valid) ++s; switch((s == end) ? 0 : *s) { - case STRING_COLOR_RGB_DEFAULT: + case STRING_COLOR_RGB_TAG_CHAR: if (s+1 != end && isxdigit(s[1]) && s+2 != end && isxdigit(s[2]) && s+3 != end && isxdigit(s[3]) ) @@ -1786,17 +1814,8 @@ COM_StringLengthNoColors(const char *s, size_t size_s, qboolean *valid) break; } ++len; // STRING_COLOR_TAG - ++len; // STRING_COLOR_RGB_DEFAULT + ++len; // STRING_COLOR_RGB_TAG_CHAR break; - /*case 'a': - if ( s+1 != end && ( isxdigit(s[1]) || (s[1] == '+' || s[1] == '-') ) ) - { - s++; - break; - } - ++len; // STRING_COLOR_TAG - ++len; // STRING_COLOR_RGB_DEFAULT - break;*/ case 0: // ends with unfinished color code! ++len; if(valid) @@ -1835,7 +1854,7 @@ for example). If the output buffer size did not suffice for converting, the function returns FALSE. Generally, if escape_carets is false, the output buffer needs -strlen(str)+1 bytes, and if escape_carets is true, it can need strlen(str)+2 +strlen(str)+1 bytes, and if escape_carets is true, it can need strlen(str)*1.5+2 bytes. In any case, the function makes sure that the resulting string is zero terminated. @@ -1861,7 +1880,7 @@ COM_StringDecolorize(const char *in, size_t size_in, char *out, size_t size_out, ++in; switch((in == end) ? 0 : *in) { - case STRING_COLOR_RGB_DEFAULT: + case STRING_COLOR_RGB_TAG_CHAR: if (in+1 != end && isxdigit(in[1]) && in+2 != end && isxdigit(in[2]) && in+3 != end && isxdigit(in[3]) ) @@ -1869,12 +1888,11 @@ COM_StringDecolorize(const char *in, size_t size_in, char *out, size_t size_out, in+=3; break; } - /*case 'a': - if ( in+1 != end && ( isxdigit(in[1]) || (in[1] == '+' || in[1] == '-') ) ) - { - in++; - break; - }*/ + APPEND(STRING_COLOR_TAG); + if(escape_carets) + APPEND(STRING_COLOR_TAG); + APPEND(STRING_COLOR_RGB_TAG_CHAR); + break; case 0: // ends with unfinished color code! APPEND(STRING_COLOR_TAG); // finish the code by appending another caret when escaping @@ -2185,3 +2203,25 @@ strlcpy(char *dst, const char *src, size_t siz) } #endif // #ifndef HAVE_STRLCPY + +void FindFraction(double val, int *num, int *denom, int denomMax) +{ + int i; + double bestdiff; + // initialize + bestdiff = fabs(val); + *num = 0; + *denom = 1; + + for(i = 1; i <= denomMax; ++i) + { + int inum = (int) floor(0.5 + val * i); + double diff = fabs(val - inum / (double)i); + if(diff < bestdiff) + { + bestdiff = diff; + *num = inum; + *denom = i; + } + } +}