diff options
Diffstat (limited to 'game/shared/cstrike/bot/shared_util.cpp')
| -rw-r--r-- | game/shared/cstrike/bot/shared_util.cpp | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/game/shared/cstrike/bot/shared_util.cpp b/game/shared/cstrike/bot/shared_util.cpp new file mode 100644 index 0000000..4d66845 --- /dev/null +++ b/game/shared/cstrike/bot/shared_util.cpp @@ -0,0 +1,207 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: dll-agnostic routines (no dll dependencies here) +// +// $NoKeywords: $ +//=============================================================================// + +// Author: Matthew D. Campbell ([email protected]), 2003 + +#include "cbase.h" + +#include <ctype.h> +#include "shared_util.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +static char s_shared_token[ 1500 ]; +static char s_shared_quote = '\"'; + +//-------------------------------------------------------------------------------------------------------------- +char * SharedVarArgs(const char *format, ...) +{ + va_list argptr; + const int BufLen = 1024; + const int NumBuffers = 4; + static char string[NumBuffers][BufLen]; + static int curstring = 0; + + curstring = ( curstring + 1 ) % NumBuffers; + + va_start (argptr, format); + V_vsprintf_safe( string[curstring], format, argptr ); + va_end (argptr); + + return string[curstring]; +} + +//-------------------------------------------------------------------------------------------------------------- +char * BufPrintf(char *buf, int& len, const char *fmt, ...) +{ + if (len <= 0) + return NULL; + + va_list argptr; + + va_start(argptr, fmt); + _vsnprintf(buf, len, fmt, argptr); + buf[ len - 1 ] = 0; + va_end(argptr); + + len -= strlen(buf); + return buf + strlen(buf); +} + +//-------------------------------------------------------------------------------------------------------------- +wchar_t * BufWPrintf(wchar_t *buf, int& len, const wchar_t *fmt, ...) +{ + if (len <= 0) + return NULL; + + va_list argptr; + + va_start(argptr, fmt); +#ifdef WIN32 + _vsnwprintf(buf, len, fmt, argptr); +#else + vswprintf( buf, len, fmt, argptr ); +#endif + buf[ len - 1 ] = 0; + va_end(argptr); + + len -= wcslen(buf); + return buf + wcslen(buf); +} + +//-------------------------------------------------------------------------------------------------------------- +const wchar_t * NumAsWString( int val ) +{ + const int BufLen = 16; + static wchar_t buf[BufLen]; + int len = BufLen; + BufWPrintf( buf, len, L"%d", val ); + return buf; +} + +//-------------------------------------------------------------------------------------------------------------- +const char * NumAsString( int val ) +{ + const int BufLen = 16; + static char buf[BufLen]; + int len = BufLen; + BufPrintf( buf, len, "%d", val ); + return buf; +} + +//-------------------------------------------------------------------------------------------------------- +/** + * Returns the token parsed by SharedParse() + */ +char *SharedGetToken( void ) +{ + return s_shared_token; +} + +//-------------------------------------------------------------------------------------------------------- +/** + * Returns the token parsed by SharedParse() + */ +void SharedSetQuoteChar( char c ) +{ + s_shared_quote = c; +} + +//-------------------------------------------------------------------------------------------------------- +/** + * Parse a token out of a string + */ +const char *SharedParse( const char *data ) +{ + int c; + int len; + + len = 0; + s_shared_token[0] = 0; + + if (!data) + return NULL; + +// skip whitespace +skipwhite: + while ( (c = *data) <= ' ') + { + if (c == 0) + return NULL; // end of file; + data++; + } + +// skip // comments + if (c=='/' && data[1] == '/') + { + while (*data && *data != '\n') + data++; + goto skipwhite; + } + + +// handle quoted strings specially + if (c == s_shared_quote) + { + data++; + while (1) + { + c = *data++; + if (c==s_shared_quote || !c) + { + s_shared_token[len] = 0; + return data; + } + s_shared_token[len] = c; + len++; + } + } + +// parse single characters + if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c == ',' ) + { + s_shared_token[len] = c; + len++; + s_shared_token[len] = 0; + return data+1; + } + +// parse a regular word + do + { + s_shared_token[len] = c; + data++; + len++; + c = *data; + if (c=='{' || c=='}'|| c==')'|| c=='(' || c=='\'' || c == ',' ) + break; + } while (c>32); + + s_shared_token[len] = 0; + return data; +} + +//-------------------------------------------------------------------------------------------------------- +/** + * Returns true if additional data is waiting to be processed on this line + */ +bool SharedTokenWaiting( const char *buffer ) +{ + const char *p; + + p = buffer; + while ( *p && *p!='\n') + { + if ( !isspace( *p ) || isalnum( *p ) ) + return true; + + p++; + } + + return false; +} |