mirror of
https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git
synced 2025-07-21 12:49:10 +00:00
Get rid of pnUtils PCH stuff.
--HG-- rename : Sources/Plasma/NucleusLib/pnUtils/Private/Unix/pnUtUxStr.cpp => Sources/Plasma/NucleusLib/pnUtils/Unix/pnUtUxStr.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/Unix/pnUtUxSync.cpp => Sources/Plasma/NucleusLib/pnUtils/Unix/pnUtUxSync.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/Unix/pnUtUxUuid.cpp => Sources/Plasma/NucleusLib/pnUtils/Unix/pnUtUxUuid.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/Win32/W32Int.h => Sources/Plasma/NucleusLib/pnUtils/Win32/W32Int.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/Win32/pnUtW32Addr.cpp => Sources/Plasma/NucleusLib/pnUtils/Win32/pnUtW32Addr.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/Win32/pnUtW32Dll.cpp => Sources/Plasma/NucleusLib/pnUtils/Win32/pnUtW32Dll.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/Win32/pnUtW32Misc.cpp => Sources/Plasma/NucleusLib/pnUtils/Win32/pnUtW32Misc.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/Win32/pnUtW32Path.cpp => Sources/Plasma/NucleusLib/pnUtils/Win32/pnUtW32Path.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/Win32/pnUtW32Str.cpp => Sources/Plasma/NucleusLib/pnUtils/Win32/pnUtW32Str.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/Win32/pnUtW32Sync.cpp => Sources/Plasma/NucleusLib/pnUtils/Win32/pnUtW32Sync.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/Win32/pnUtW32Time.cpp => Sources/Plasma/NucleusLib/pnUtils/Win32/pnUtW32Time.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/Win32/pnUtW32Uuid.cpp => Sources/Plasma/NucleusLib/pnUtils/Win32/pnUtW32Uuid.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtAddr.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtAddr.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtAddr.h => Sources/Plasma/NucleusLib/pnUtils/pnUtAddr.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtAllIncludes.h => Sources/Plasma/NucleusLib/pnUtils/pnUtAllIncludes.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtArray.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtArray.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtArray.h => Sources/Plasma/NucleusLib/pnUtils/pnUtArray.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtBase64.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtBase64.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtBase64.h => Sources/Plasma/NucleusLib/pnUtils/pnUtBase64.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtBigNum.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtBigNum.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtBigNum.h => Sources/Plasma/NucleusLib/pnUtils/pnUtBigNum.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtCmd.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtCmd.h => Sources/Plasma/NucleusLib/pnUtils/pnUtCmd.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtCoreLib.h => Sources/Plasma/NucleusLib/pnUtils/pnUtCoreLib.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtCrypt.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtCrypt.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtCrypt.h => Sources/Plasma/NucleusLib/pnUtils/pnUtCrypt.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtHash.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtHash.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtHash.h => Sources/Plasma/NucleusLib/pnUtils/pnUtHash.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtList.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtList.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtList.h => Sources/Plasma/NucleusLib/pnUtils/pnUtList.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtMath.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtMath.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtMath.h => Sources/Plasma/NucleusLib/pnUtils/pnUtMath.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtMisc.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtMisc.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtMisc.h => Sources/Plasma/NucleusLib/pnUtils/pnUtMisc.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtPath.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtPath.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtPath.h => Sources/Plasma/NucleusLib/pnUtils/pnUtPath.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtPragma.h => Sources/Plasma/NucleusLib/pnUtils/pnUtPragma.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtPriQ.h => Sources/Plasma/NucleusLib/pnUtils/pnUtPriQ.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtRand.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtRand.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtRand.h => Sources/Plasma/NucleusLib/pnUtils/pnUtRand.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtRef.h => Sources/Plasma/NucleusLib/pnUtils/pnUtRef.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtSkipList.h => Sources/Plasma/NucleusLib/pnUtils/pnUtSkipList.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtSort.h => Sources/Plasma/NucleusLib/pnUtils/pnUtSort.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtSpareList.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtSpareList.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtSpareList.h => Sources/Plasma/NucleusLib/pnUtils/pnUtSpareList.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtStr.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtStr.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtStr.h => Sources/Plasma/NucleusLib/pnUtils/pnUtStr.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtSync.h => Sources/Plasma/NucleusLib/pnUtils/pnUtSync.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtTime.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtTime.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtTime.h => Sources/Plasma/NucleusLib/pnUtils/pnUtTime.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtTls.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtTls.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtTls.h => Sources/Plasma/NucleusLib/pnUtils/pnUtTls.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtTypes.h => Sources/Plasma/NucleusLib/pnUtils/pnUtTypes.h rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtUuid.cpp => Sources/Plasma/NucleusLib/pnUtils/pnUtUuid.cpp rename : Sources/Plasma/NucleusLib/pnUtils/Private/pnUtUuid.h => Sources/Plasma/NucleusLib/pnUtils/pnUtUuid.h
This commit is contained in:
771
Sources/Plasma/NucleusLib/pnUtils/pnUtStr.cpp
Normal file
771
Sources/Plasma/NucleusLib/pnUtils/pnUtStr.cpp
Normal file
@ -0,0 +1,771 @@
|
||||
/*==LICENSE==*
|
||||
|
||||
CyanWorlds.com Engine - MMOG client, server and tools
|
||||
Copyright (C) 2011 Cyan Worlds, Inc.
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Additional permissions under GNU GPL version 3 section 7
|
||||
|
||||
If you modify this Program, or any covered work, by linking or
|
||||
combining it with any of RAD Game Tools Bink SDK, Autodesk 3ds Max SDK,
|
||||
NVIDIA PhysX SDK, Microsoft DirectX SDK, OpenSSL library, Independent
|
||||
JPEG Group JPEG library, Microsoft Windows Media SDK, or Apple QuickTime SDK
|
||||
(or a modified version of those libraries),
|
||||
containing parts covered by the terms of the Bink SDK EULA, 3ds Max EULA,
|
||||
PhysX SDK EULA, DirectX SDK EULA, OpenSSL and SSLeay licenses, IJG
|
||||
JPEG Library README, Windows Media SDK EULA, or QuickTime SDK EULA, the
|
||||
licensors of this Program grant you additional
|
||||
permission to convey the resulting work. Corresponding Source for a
|
||||
non-source form of such a combination shall include the source code for
|
||||
the parts of OpenSSL and IJG JPEG Library used as well as that of the covered
|
||||
work.
|
||||
|
||||
You can contact Cyan Worlds, Inc. by email legal@cyan.com
|
||||
or by snail mail at:
|
||||
Cyan Worlds, Inc.
|
||||
14617 N Newport Hwy
|
||||
Mead, WA 99021
|
||||
|
||||
*==LICENSE==*/
|
||||
/*****************************************************************************
|
||||
*
|
||||
* $/Plasma20/Sources/Plasma/NucleusLib/pnUtils/Private/pnUtStr.cpp
|
||||
*
|
||||
***/
|
||||
|
||||
#include "pnUtStr.h"
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Private data
|
||||
*
|
||||
***/
|
||||
|
||||
// These random values were generated by the radioactive decay based
|
||||
// random number generator at www.fourmilab.ch
|
||||
static uint32_t s_hashValue[] = {
|
||||
0xc30d2a72, 0x15efaec1, 0xd250c7d9, 0xaf3c60a8,
|
||||
0x9608ae8f, 0x452c0e11, 0xb6840ffd, 0x3e36c913,
|
||||
0x2864eace, 0x9b0a17d6, 0x108da74b, 0xf2c479c1,
|
||||
0x8b4dd597, 0x97199bc0, 0x621f0cce, 0x1658553e,
|
||||
};
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Internal functions
|
||||
*
|
||||
***/
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static chartype * IStrDup (const chartype str[]) {
|
||||
unsigned chars = IStrLen(str) + 1;
|
||||
chartype * buffer = (chartype *)malloc(chars * sizeof(chartype));
|
||||
IStrCopy(buffer, str, chars);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static chartype * IStrDupLen (const chartype str[], unsigned chars) {
|
||||
unsigned len = IStrLen(str) + 1;
|
||||
if (len > chars)
|
||||
len = chars;
|
||||
chartype * buffer = (chartype *)malloc(len * sizeof(chartype));
|
||||
IStrCopy(buffer, str, len);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype, class findchartype>
|
||||
static chartype * IStrChr (chartype * str, findchartype ch, unsigned chars) {
|
||||
for (; chars--; ++str)
|
||||
if (*str == ch)
|
||||
return str;
|
||||
else if (!*str)
|
||||
break;
|
||||
return nil;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype, class findchartype>
|
||||
static chartype * IStrChrR (chartype * str, findchartype ch) {
|
||||
chartype * start = str;
|
||||
for (; *str; ++str)
|
||||
NULL_STMT;
|
||||
while (str-- > start)
|
||||
if (*str == ch)
|
||||
return str;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
static inline bool ICharUnicodeToUtf8 (char ** dest, const wchar_t * source[], unsigned destChars) {
|
||||
unsigned ch = *(*source)++;
|
||||
bool result = false;
|
||||
if (ch < 0x80) {
|
||||
if (destChars >= 1) {
|
||||
*(*dest)++ = (char)ch;
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
else if (ch < 0x800) {
|
||||
if (destChars >= 2) {
|
||||
*(*dest)++ = (char)(0xc0 | (ch >> 6));
|
||||
*(*dest)++ = (char)(0x80 | (ch & 0x3f));
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (destChars >= 3) {
|
||||
*(*dest)++ = (char)(0xe0 | (ch >> 12));
|
||||
*(*dest)++ = (char)(0x80 | ((ch >> 6) & 0x3f));
|
||||
*(*dest)++ = (char)(0x80 | (ch & 0x3f));
|
||||
result = true;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
static inline void ICharUtf8ToUnicode (wchar_t ** dest, const char * source[]) {
|
||||
unsigned result, remaining;
|
||||
if ((**source & 0xf0) == 0xe0) {
|
||||
result = *(*source)++ & 0x0f;
|
||||
remaining = 2;
|
||||
}
|
||||
else if ((**source & 0xe0) == 0xc0) {
|
||||
result = *(*source)++ & 0x1f;
|
||||
remaining = 1;
|
||||
}
|
||||
else if ((**source & 0x80) == 0x00) {
|
||||
result = *(*source)++;
|
||||
remaining = 0;
|
||||
}
|
||||
else {
|
||||
// unsupported code sequence (>0xffff)
|
||||
++(*source);
|
||||
return;
|
||||
}
|
||||
for (; remaining-- && *source; ++*source)
|
||||
if ((**source & 0xc0) == 0x80)
|
||||
result = (result << 6) | (**source & 0x3f);
|
||||
*(*dest)++ = (wchar_t)result;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<typename chartype>
|
||||
static unsigned IStrPrintfValidate (chartype * dest, unsigned count, int result) {
|
||||
if (!count)
|
||||
return 0;
|
||||
ASSERT(result <= (int)count);
|
||||
if ((result < 0) || (result == (int)count)) {
|
||||
dest[count - 1] = 0;
|
||||
return count - 1;
|
||||
}
|
||||
else
|
||||
return (unsigned)result;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static int IStrCmp (const chartype str1[], const chartype str2[], unsigned chars) {
|
||||
for (; chars--; ++str1, ++str2) {
|
||||
if (*str1 != *str2)
|
||||
return (*str1 > *str2) ? 1 : -1;
|
||||
if (!*str1)
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static int IStrCmpI (const chartype str1[], const chartype str2[], unsigned chars) {
|
||||
while (chars--) {
|
||||
chartype ch1 = CharLowerFast(*str1++);
|
||||
chartype ch2 = CharLowerFast(*str2++);
|
||||
if (ch1 != ch2)
|
||||
return (ch1 > ch2) ? 1 : -1;
|
||||
if (!ch1)
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static void IStrCopy (chartype * dest, const chartype source[], unsigned chars) {
|
||||
while ((chars > 1) && ((*dest = *source++) != 0)) {
|
||||
--chars;
|
||||
++dest;
|
||||
}
|
||||
if (chars)
|
||||
*dest = 0;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
// returns StrLen(dest)
|
||||
template<class chartype>
|
||||
static unsigned IStrCopyLen (chartype * dest, const chartype source[], unsigned chars) {
|
||||
chartype * const start = dest;
|
||||
while ((chars > 1) && ((*dest = *source++) != 0)) {
|
||||
--chars;
|
||||
++dest;
|
||||
}
|
||||
if (chars)
|
||||
*dest = 0;
|
||||
return dest - start;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static void IStrPack (chartype * dest, const chartype source[], unsigned chars) {
|
||||
while ((chars > 1) && *dest) {
|
||||
--chars;
|
||||
++dest;
|
||||
}
|
||||
while ((chars > 1) && ((*dest = *source++) != 0)) {
|
||||
--chars;
|
||||
++dest;
|
||||
}
|
||||
if (chars)
|
||||
*dest = 0;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static chartype * IStrStr (chartype source[], const chartype match[]) {
|
||||
if (!*match)
|
||||
return source;
|
||||
|
||||
for (chartype * curr = source; *curr; ++curr) {
|
||||
chartype * s1 = curr;
|
||||
const chartype * s2 = match;
|
||||
while (*s1 && *s2 && *s1 == *s2)
|
||||
s1++, s2++;
|
||||
if (!*s2)
|
||||
return curr;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static chartype * IStrStrI (chartype source[], const chartype match[]) {
|
||||
if (!*match)
|
||||
return source;
|
||||
|
||||
for (chartype * curr = source; *curr; ++curr) {
|
||||
chartype * s1 = curr;
|
||||
const chartype * s2 = match;
|
||||
while (*s1 && *s2 && (CharLowerFast(*s1) == CharLowerFast(*s2)))
|
||||
s1++, s2++;
|
||||
if (!*s2)
|
||||
return curr;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static unsigned IStrLen (const chartype str[]) {
|
||||
unsigned chars = 0;
|
||||
for (; *str++; ++chars)
|
||||
NULL_STMT;
|
||||
return chars;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static void IStrLower (chartype * dest, unsigned chars) {
|
||||
while ((chars > 1) && ((*dest = CharLowerFast(*dest)) != 0)) {
|
||||
--chars;
|
||||
++dest;
|
||||
}
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static void IStrLower (chartype * dest, const chartype source[], unsigned chars) {
|
||||
while ((chars > 1) && ((*dest = CharLowerFast(*source)) != 0)) {
|
||||
--chars;
|
||||
++dest;
|
||||
++source;
|
||||
}
|
||||
if (chars)
|
||||
*dest = 0;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static uint32_t IStrHash (const chartype str[], unsigned chars) {
|
||||
uint32_t temp0 = 0xE2C15C9D;
|
||||
uint32_t temp1 = 0x2170A28A;
|
||||
uint32_t result = 0x325D1EAE;
|
||||
for (unsigned ch; chars-- && ((ch = (unsigned)*str) != 0); ++str) {
|
||||
temp0 = (temp0 << 3) ^ ch;
|
||||
temp1 += s_hashValue[temp0 & 0x0F];
|
||||
result ^= temp0 + temp1;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static uint32_t IStrHashI (const chartype str[], unsigned chars) {
|
||||
uint32_t temp0 = 0xE2C15C9D;
|
||||
uint32_t temp1 = 0x2170A28A;
|
||||
uint32_t result = 0x325D1EAE;
|
||||
for (unsigned ch; chars-- && ((ch = (unsigned)*str) != 0); ++str) {
|
||||
if ((ch >= 'a') && (ch <= 'z'))
|
||||
ch = ch + 'A' - 'a';
|
||||
temp0 = (temp0 << 3) ^ ch;
|
||||
temp1 += s_hashValue[temp0 & 0x0F];
|
||||
result ^= temp0 + temp1;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static bool IStrTokenize (const chartype * source[], chartype * dest, unsigned chars, const chartype whitespace[], unsigned maxWhitespaceSkipCount) {
|
||||
|
||||
// Skip past leading whitespace
|
||||
bool inQuotes = false;
|
||||
unsigned whitespaceSkipped = 0;
|
||||
while (**source && IStrChr(whitespace, **source, (unsigned)-1) && whitespaceSkipped < maxWhitespaceSkipCount) {
|
||||
inQuotes = (**source == '\"');
|
||||
++*source;
|
||||
++whitespaceSkipped;
|
||||
if (inQuotes)
|
||||
break;
|
||||
}
|
||||
|
||||
// Copy the token
|
||||
unsigned offset = 0;
|
||||
while (**source &&
|
||||
((inQuotes && (**source != '\"')) || !IStrChr(whitespace, **source, (unsigned)-1))) {
|
||||
if (offset + 1 < chars)
|
||||
dest[offset++] = **source;
|
||||
++*source;
|
||||
}
|
||||
|
||||
// Skip past the terminating quote
|
||||
if (inQuotes && (**source == '\"'))
|
||||
++*source;
|
||||
|
||||
// Null terminate the destination buffer
|
||||
if (chars) {
|
||||
ASSERT(offset < chars);
|
||||
dest[offset] = 0;
|
||||
}
|
||||
|
||||
// Upon return, 'source' is guaranteed to point to the first character
|
||||
// following the returned token (and following any closing quotes)
|
||||
|
||||
return (offset || inQuotes);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
template<class chartype>
|
||||
static bool IStrTokenize (const chartype * source[], ARRAY(chartype) * destArray, const chartype whitespace[], unsigned maxWhitespaceSkipCount) {
|
||||
|
||||
// Verify that the destination array is empty
|
||||
ASSERT(!destArray->Count());
|
||||
|
||||
// Skip past leading whitespace
|
||||
bool inQuotes = false;
|
||||
unsigned whitespaceSkipped = 0;
|
||||
while (**source && IStrChr(whitespace, **source, (unsigned)-1) && whitespaceSkipped < maxWhitespaceSkipCount) {
|
||||
inQuotes = (**source == '\"');
|
||||
++*source;
|
||||
++whitespaceSkipped;
|
||||
if (inQuotes)
|
||||
break;
|
||||
}
|
||||
|
||||
// Copy the token
|
||||
bool added = false;
|
||||
while (**source &&
|
||||
((inQuotes && (**source != '\"')) || !IStrChr(whitespace, **source, (unsigned)-1))) {
|
||||
destArray->Add(**source);
|
||||
added = true;
|
||||
++*source;
|
||||
}
|
||||
|
||||
// Skip past the terminating quote
|
||||
if (inQuotes && (**source == '\"'))
|
||||
++*source;
|
||||
|
||||
// Null terminate the destination array
|
||||
destArray->Add(0);
|
||||
|
||||
// Upon return, 'source' is guaranteed to point to the first character
|
||||
// following the returned token (and following any closing quotes)
|
||||
|
||||
return (added || inQuotes);
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************
|
||||
*
|
||||
* Exported functions
|
||||
*
|
||||
***/
|
||||
|
||||
//===========================================================================
|
||||
char * StrDup (const char str[]) {
|
||||
return IStrDup(str);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
wchar_t * StrDup (const wchar_t str[]) {
|
||||
return IStrDup(str);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
char * StrDupLen (const char str[], unsigned chars) {
|
||||
return IStrDupLen(str, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
wchar_t * StrDupLen (const wchar_t str[], unsigned chars) {
|
||||
return IStrDupLen(str, chars);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
wchar_t * StrDupToUnicode (const char str[]) {
|
||||
unsigned bytes = StrBytes(str) * sizeof(wchar_t);
|
||||
wchar_t * dst = (wchar_t*)malloc(bytes);
|
||||
StrToUnicode(dst, str, bytes / sizeof(wchar_t));
|
||||
return dst;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
char * StrDupToAnsi (const wchar_t str[]) {
|
||||
unsigned bytes = StrBytes(str) / sizeof(wchar_t);
|
||||
char * dst = (char*)malloc(bytes);
|
||||
StrToAnsi(dst, str, bytes);
|
||||
return dst;
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrBytes (const char str[]) { // includes space for terminator
|
||||
return (IStrLen(str) + 1) * sizeof(str[0]);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrBytes (const wchar_t str[]) { // includes space for terminator
|
||||
return (IStrLen(str) + 1) * sizeof(str[0]);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
char * StrChr (char * str, char ch, unsigned chars) {
|
||||
return IStrChr(str, ch, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
wchar_t * StrChr (wchar_t * str, wchar_t ch, unsigned chars) {
|
||||
return IStrChr(str, ch, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
const char * StrChr (const char str[], char ch, unsigned chars) {
|
||||
return IStrChr(str, ch, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
const wchar_t * StrChr (const wchar_t str[], wchar_t ch, unsigned chars) {
|
||||
return IStrChr(str, ch, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
char * StrChrR (char * str, char ch) {
|
||||
return IStrChrR(str, ch);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
wchar_t * StrChrR (wchar_t * str, wchar_t ch) {
|
||||
return IStrChrR(str, ch);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
const char * StrChrR (const char str[], char ch) {
|
||||
return IStrChrR(str, ch);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
const wchar_t * StrChrR (const wchar_t str[], wchar_t ch) {
|
||||
return IStrChrR(str, ch);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrPrintf (char * dest, unsigned count, const char format[], ...) {
|
||||
va_list argList;
|
||||
va_start(argList, format);
|
||||
int result = hsVsnprintf((char *)dest, count, (const char *)format, argList);
|
||||
va_end(argList);
|
||||
return IStrPrintfValidate(dest, count, result);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrPrintf (wchar_t * dest, unsigned count, const wchar_t format[], ...) {
|
||||
va_list argList;
|
||||
va_start(argList, format);
|
||||
int result = hsVsnwprintf(dest, count, format, argList);
|
||||
va_end(argList);
|
||||
return IStrPrintfValidate(dest, count, result);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrPrintfV (char * dest, unsigned count, const char format[], va_list args) {
|
||||
int result = hsVsnprintf(dest, count, format, args);
|
||||
return IStrPrintfValidate(dest, count, result);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrPrintfV (wchar_t * dest, unsigned count, const wchar_t format[], va_list args) {
|
||||
int result = hsVsnwprintf(dest, count, format, args);
|
||||
return IStrPrintfValidate(dest, count, result);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
int StrCmp (const char str1[], const char str2[], unsigned chars) {
|
||||
return IStrCmp(str1, str2, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
int StrCmp (const wchar_t str1[], const wchar_t str2[], unsigned chars) {
|
||||
return IStrCmp(str1, str2, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
int StrCmpI (const char str1[], const char str2[], unsigned chars) {
|
||||
return IStrCmpI(str1, str2, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
int StrCmpI (const wchar_t str1[], const wchar_t str2[], unsigned chars) {
|
||||
return IStrCmpI(str1, str2, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void StrCopy (char * dest, const char source[], unsigned chars) {
|
||||
IStrCopy(dest, source, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void StrCopy (wchar_t * dest, const wchar_t source[], unsigned chars) {
|
||||
IStrCopy(dest, source, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrCopyLen (char * dest, const char source[], unsigned chars) {
|
||||
return IStrCopyLen(dest, source, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrCopyLen (wchar_t * dest, const wchar_t source[], unsigned chars) {
|
||||
return IStrCopyLen(dest, source, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void StrPack (char * dest, const char source[], unsigned chars) {
|
||||
IStrPack(dest, source, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void StrPack (wchar_t * dest, const wchar_t source[], unsigned chars) {
|
||||
IStrPack(dest, source, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
char * StrStr (char * source, const char match[]) {
|
||||
return IStrStr(source, match);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
const char * StrStr (const char source[], const char match[]) {
|
||||
return IStrStr<const char>(source, match);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
wchar_t * StrStr (wchar_t * source, const wchar_t match[]) {
|
||||
return IStrStr(source, match);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
const wchar_t * StrStr (const wchar_t source[], const wchar_t match[]) {
|
||||
return IStrStr<const wchar_t>(source, match);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
char * StrStrI (char * source, const char match[]) {
|
||||
return IStrStrI(source, match);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
const char * StrStrI (const char source[], const char match[]) {
|
||||
return IStrStrI<const char>(source, match);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
wchar_t * StrStrI (wchar_t * source, const wchar_t match[]) {
|
||||
return IStrStrI(source, match);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
const wchar_t * StrStrI (const wchar_t source[], const wchar_t match[]) {
|
||||
return IStrStrI<const wchar_t>(source, match);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrLen (const char str[]) {
|
||||
return IStrLen(str);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrLen (const wchar_t str[]) {
|
||||
return IStrLen(str);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrUnicodeToUtf8 (char * dest, const wchar_t source[], unsigned destChars) {
|
||||
char * destCurr = dest;
|
||||
char * destTerm = dest + destChars;
|
||||
while (*source && (destCurr + 1 < destTerm))
|
||||
if (!ICharUnicodeToUtf8(&destCurr, &source, destTerm - destCurr - 1))
|
||||
break;
|
||||
if (destCurr < destTerm)
|
||||
*destCurr = 0;
|
||||
return destCurr - dest; // dest chars not including null terminator
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrUtf8ToUnicode (wchar_t * dest, const char source[], unsigned destChars) {
|
||||
wchar_t * destCurr = dest;
|
||||
wchar_t * destTerm = dest + destChars;
|
||||
while (*source && (destCurr + 1 < destTerm))
|
||||
ICharUtf8ToUnicode(&destCurr, &source);
|
||||
if (destCurr < destTerm)
|
||||
*destCurr = 0;
|
||||
return destCurr - dest; // dest chars not including null terminator
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
float StrToFloat (const char source[], const char ** endptr) {
|
||||
return (float) strtod(source, const_cast<char **>(endptr));
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
float StrToFloat (const wchar_t source[], const wchar_t ** endptr) {
|
||||
return (float) wcstod(source, const_cast<wchar_t **>(endptr));
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
int StrToInt (const char source[], const char ** endptr) {
|
||||
return strtol(source, const_cast<char **>(endptr), 0);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
int StrToInt (const wchar_t source[], const wchar_t ** endptr) {
|
||||
return wcstol(source, const_cast<wchar_t **>(endptr), 0);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrToUnsigned (char source[], char ** endptr, int radix) {
|
||||
return strtoul(source, const_cast<char **>(endptr), radix);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrToUnsigned (wchar_t source[], wchar_t ** endptr, int radix) {
|
||||
return wcstoul(source, const_cast<wchar_t **>(endptr), radix);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrToUnsigned (const char source[], const char ** endptr, int radix) {
|
||||
return strtoul(source, const_cast<char **>(endptr), radix);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
unsigned StrToUnsigned (const wchar_t source[], const wchar_t ** endptr, int radix) {
|
||||
return wcstoul(source, const_cast<wchar_t **>(endptr), radix);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void StrLower (char * dest, unsigned chars) {
|
||||
IStrLower(dest, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void StrLower (wchar_t * dest, unsigned chars) {
|
||||
IStrLower(dest, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void StrLower (char * dest, const char source[], unsigned chars) {
|
||||
IStrLower(dest, source, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
void StrLower (wchar_t * dest, const wchar_t source[], unsigned chars) {
|
||||
IStrLower(dest, source, chars);
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
uint32_t StrHash (const char str[], unsigned chars) {
|
||||
return IStrHash(str, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
uint32_t StrHash (const wchar_t str[], unsigned chars) {
|
||||
return IStrHash(str, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
uint32_t StrHashI (const char str[], unsigned chars) {
|
||||
return IStrHashI(str, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
uint32_t StrHashI (const wchar_t str[], unsigned chars) {
|
||||
return IStrHashI(str, chars);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
bool StrTokenize (const char * source[], char * dest, unsigned chars, const char whitespace[], unsigned maxWhitespaceSkipCount) {
|
||||
return IStrTokenize(source, dest, chars, whitespace, maxWhitespaceSkipCount);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
bool StrTokenize (const wchar_t * source[], wchar_t * dest, unsigned chars, const wchar_t whitespace[], unsigned maxWhitespaceSkipCount) {
|
||||
return IStrTokenize(source, dest, chars, whitespace, maxWhitespaceSkipCount);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
bool StrTokenize (const char * source[], ARRAY(char) * destArray, const char whitespace[], unsigned maxWhitespaceSkipCount) {
|
||||
return IStrTokenize(source, destArray, whitespace, maxWhitespaceSkipCount);
|
||||
}
|
||||
|
||||
//===========================================================================
|
||||
bool StrTokenize (const wchar_t * source[], ARRAY(wchar_t) * destArray, const wchar_t whitespace[], unsigned maxWhitespaceSkipCount) {
|
||||
return IStrTokenize(source, destArray, whitespace, maxWhitespaceSkipCount);
|
||||
}
|
Reference in New Issue
Block a user