diff options
Diffstat (limited to 'src/qcommon/q_shared.c')
-rw-r--r-- | src/qcommon/q_shared.c | 63 |
1 files changed, 41 insertions, 22 deletions
diff --git a/src/qcommon/q_shared.c b/src/qcommon/q_shared.c index ce28f953..8b13aba2 100644 --- a/src/qcommon/q_shared.c +++ b/src/qcommon/q_shared.c @@ -706,10 +706,6 @@ char* Q_strrchr( const char* string, int c ) qboolean Q_isanumber( const char *s ) { -#ifdef Q3_VM - //FIXME: implement - return qfalse; -#else char *p; double d; @@ -719,7 +715,6 @@ qboolean Q_isanumber( const char *s ) d = strtod( s, &p ); return *p == '\0'; -#endif } qboolean Q_isintegral( float f ) @@ -727,6 +722,39 @@ qboolean Q_isintegral( float f ) return (int)f == f; } +#ifdef _MSC_VER +/* +============= +Q_vsnprintf + +Special wrapper function for Microsoft's broken _vsnprintf() function. +MinGW comes with its own snprintf() which is not broken. +============= +*/ + +int Q_vsnprintf(char *str, size_t size, const char *format, va_list ap) +{ + int retval; + + retval = _vsnprintf(str, size, format, ap); + + if(retval < 0 || retval == size) + { + // Microsoft doesn't adhere to the C99 standard of vsnprintf, + // which states that the return value must be the number of + // bytes written if the output string had sufficient length. + // + // Obviously we cannot determine that value from Microsoft's + // implementation, so we have no choice but to return size. + + str[size - 1] = '\0'; + return size; + } + + return retval; +} +#endif + /* ============= Q_strncpyz @@ -954,28 +982,18 @@ void Q_ParseNewlines( char *dest, const char *src, int destsize ) *dest++ = '\0'; } -void QDECL Com_sprintf( char *dest, int size, const char *fmt, ...) { +void QDECL Com_sprintf(char *dest, int size, const char *fmt, ...) +{ int len; va_list argptr; - char bigbuffer[32000]; // big, but small enough to fit in PPC stack va_start (argptr,fmt); - len = Q_vsnprintf (bigbuffer, sizeof(bigbuffer), fmt,argptr); + len = Q_vsnprintf(dest, size, fmt, argptr); va_end (argptr); - if ( len >= sizeof( bigbuffer ) ) { - Com_Error( ERR_FATAL, "Com_sprintf: overflowed bigbuffer" ); - } - if (len >= size) { - Com_Printf ("Com_sprintf: overflow of %i in %i\n", len, size); -#ifdef _DEBUG - __asm { - int 3; - } -#endif - } - Q_strncpyz (dest, bigbuffer, size ); -} + if(len >= size) + Com_Printf("Com_sprintf: Output length %d too short, require %d bytes.\n", size, len); +} /* ============ @@ -1317,6 +1335,7 @@ void Info_SetValueForKey( char *s, const char *key, const char *value ) { Info_SetValueForKey_Big Changes or adds a key/value pair +Includes and retains zero-length values ================== */ void Info_SetValueForKey_Big( char *s, const char *key, const char *value ) { @@ -1337,7 +1356,7 @@ void Info_SetValueForKey_Big( char *s, const char *key, const char *value ) { } Info_RemoveKey_Big (s, key); - if (!value || !strlen(value)) + if (!value) return; Com_sprintf (newi, sizeof(newi), "\\%s\\%s", key, value); |