aboutsummaryrefslogtreecommitdiff
path: root/mp/src/tier1/strtools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mp/src/tier1/strtools.cpp')
-rw-r--r--mp/src/tier1/strtools.cpp47
1 files changed, 43 insertions, 4 deletions
diff --git a/mp/src/tier1/strtools.cpp b/mp/src/tier1/strtools.cpp
index 9b1bfa84..ad301750 100644
--- a/mp/src/tier1/strtools.cpp
+++ b/mp/src/tier1/strtools.cpp
@@ -1190,6 +1190,7 @@ bool Q_IsMeanSpaceW( wchar_t wch )
case L'\x200B': // ZERO-WIDTH SPACE
case L'\x200C': // ZERO-WIDTH NON-JOINER
case L'\x200D': // ZERO WIDTH JOINER
+ case L'\x200E': // LEFT-TO-RIGHT MARK
case L'\x2028': // LINE SEPARATOR
case L'\x2029': // PARAGRAPH SEPARATOR
case L'\x202F': // NARROW NO-BREAK SPACE
@@ -1240,6 +1241,48 @@ static wchar_t *StripWhitespaceWorker( int cchLength, wchar_t *pwch, bool *pbStr
return pwch;
}
+//-----------------------------------------------------------------------------
+// Purpose: Strips all evil characters (ie. zero-width no-break space)
+// from a string.
+//-----------------------------------------------------------------------------
+bool Q_RemoveAllEvilCharacters( char *pch )
+{
+ // convert to unicode
+ int cch = Q_strlen( pch );
+ int cubDest = (cch + 1 ) * sizeof( wchar_t );
+ wchar_t *pwch = (wchar_t *)stackalloc( cubDest );
+ int cwch = Q_UTF8ToUnicode( pch, pwch, cubDest );
+
+ bool bStrippedWhitespace = false;
+
+ // Walk through and skip over evil characters
+ int nWalk = 0;
+ for( int i=0; i<cwch; ++i )
+ {
+ if( !Q_IsMeanSpaceW( pwch[i] ) )
+ {
+ pwch[nWalk] = pwch[i];
+ ++nWalk;
+ }
+ else
+ {
+ bStrippedWhitespace = true;
+ }
+ }
+
+ // Null terminate
+ pwch[nWalk-1] = L'\0';
+
+
+ // copy back, if necessary
+ if ( bStrippedWhitespace )
+ {
+ Q_UnicodeToUTF8( pwch, pch, cch );
+ }
+
+ return bStrippedWhitespace;
+}
+
//-----------------------------------------------------------------------------
// Purpose: strips leading and trailing whitespace
@@ -1422,7 +1465,6 @@ int V_UCS2ToUnicode( const ucs2 *pUCS2, wchar_t *pUnicode, int cubDestSizeInByte
char *pOut = (char *)pUnicode;
if ( conv_t > 0 )
{
- cchResult = 0;
cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUTF8 );
iconv_close( conv_t );
if ( (int)cchResult < 0 )
@@ -1463,7 +1505,6 @@ int V_UnicodeToUCS2( const wchar_t *pUnicode, int cubSrcInBytes, char *pUCS2, in
char *pOut = pUCS2;
if ( conv_t > 0 )
{
- cchResult = 0;
cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUCS2 );
iconv_close( conv_t );
if ( (int)cchResult < 0 )
@@ -1510,7 +1551,6 @@ int V_UCS2ToUTF8( const ucs2 *pUCS2, char *pUTF8, int cubDestSizeInBytes )
char *pOut = (char *)pUTF8;
if ( conv_t > 0 )
{
- cchResult = 0;
const size_t nBytesToWrite = nMaxUTF8;
cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUTF8 );
@@ -1556,7 +1596,6 @@ int V_UTF8ToUCS2( const char *pUTF8, int cubSrcInBytes, ucs2 *pUCS2, int cubDest
char *pOut = (char *)pUCS2;
if ( conv_t > 0 )
{
- cchResult = 0;
cchResult = iconv( conv_t, &pIn, &nLenUnicde, &pOut, &nMaxUTF8 );
iconv_close( conv_t );
if ( (int)cchResult < 0 )