From dae0b690f796bd421ab69a0219cb1b46095b9f27 Mon Sep 17 00:00:00 2001 From: Zezula Ladislav Date: Wed, 8 Nov 2017 15:31:45 +0100 Subject: + SFileAddListFile and SFileCompactArchive now take "const TCHAR *" instead of "const char *" + Fixed some bugs --- src/SBaseCommon.cpp | 96 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 29 deletions(-) (limited to 'src/SBaseCommon.cpp') diff --git a/src/SBaseCommon.cpp b/src/SBaseCommon.cpp index aa891df..a131380 100644 --- a/src/SBaseCommon.cpp +++ b/src/SBaseCommon.cpp @@ -93,55 +93,93 @@ unsigned char AsciiToUpperTable_Slash[256] = }; //----------------------------------------------------------------------------- -// Safe string functions +// Safe string functions (for ANSI builds) -void StringCopyA(char * dest, const char * src, size_t nMaxChars) +void StringCopy(char * szTarget, size_t cchTarget, const char * szSource) { - size_t nLength = strlen(src); + if(cchTarget > 0) + { + size_t cchSource = strlen(szSource); - // Don't copy more than nMaxChars - nLength = STORMLIB_MIN(nLength, nMaxChars); - memcpy(dest, src, nLength); - dest[nLength] = 0; + if(cchSource >= cchTarget) + cchSource = cchTarget - 1; + + memcpy(szTarget, szSource, cchSource); + szTarget[cchSource] = 0; + } } -void StringCatA(char * dest, const char * src, size_t nMaxChars) +void StringCat(char * szTarget, size_t cchTargetMax, const char * szSource) +{ + // Get the current length of the target + size_t cchTarget = strlen(szTarget); + + // Copy the string to the target + if(cchTarget < cchTargetMax) + { + StringCopy(szTarget + cchTarget, (cchTargetMax - cchTarget), szSource); + } +} + +//----------------------------------------------------------------------------- +// Utility functions (UNICODE) only exist in the ANSI version of the library +// In ANSI builds, TCHAR = char, so we don't need these functions implemented + +#ifdef _UNICODE +void StringCopy(TCHAR * szTarget, size_t cchTarget, const char * szSource) { - size_t nLength1 = strlen(dest); - size_t nLength2 = strlen(src); + if(cchTarget > 0) + { + size_t cchSource = strlen(szSource); + + if(cchSource >= cchTarget) + cchSource = cchTarget - 1; + + mbstowcs(szTarget, szSource, cchSource); + szTarget[cchSource] = 0; + } +} - // Don't copy more than nMaxChars - if(nLength1 < nMaxChars) +void StringCopy(char * szTarget, size_t cchTarget, const TCHAR * szSource) +{ + if(cchTarget > 0) { - nLength2 = STORMLIB_MIN(nLength2, (nMaxChars - nLength1)); - memcpy(dest + nLength1, src, nLength2); - dest[nLength1 + nLength2] = 0; + size_t cchSource = _tcslen(szSource); + + if(cchSource >= cchTarget) + cchSource = cchTarget - 1; + + wcstombs(szTarget, szSource, cchSource); + szTarget[cchSource] = 0; } } -void StringCopyT(TCHAR * dest, const TCHAR * src, size_t nMaxChars) +void StringCopy(TCHAR * szTarget, size_t cchTarget, const TCHAR * szSource) { - size_t nLength = _tcslen(src); + if(cchTarget > 0) + { + size_t cchSource = _tcslen(szSource); - // Don't copy more than nMaxChars - nLength = STORMLIB_MIN(nLength, nMaxChars); - memcpy(dest, src, (nLength * sizeof(TCHAR))); - dest[nLength] = 0; + if(cchSource >= cchTarget) + cchSource = cchTarget - 1; + + memcpy(szTarget, szSource, cchSource * sizeof(TCHAR)); + szTarget[cchSource] = 0; + } } -void StringCatT(TCHAR * dest, const TCHAR * src, size_t nMaxChars) +void StringCat(TCHAR * szTarget, size_t cchTargetMax, const TCHAR * szSource) { - size_t nLength1 = _tcslen(dest); - size_t nLength2 = _tcslen(src); + // Get the current length of the target + size_t cchTarget = _tcslen(szTarget); - // Don't copy more than nMaxChars - if(nLength1 < nMaxChars) + // Copy the string to the target + if(cchTarget < cchTargetMax) { - nLength2 = STORMLIB_MIN(nLength2, (nMaxChars - nLength1)); - memcpy(dest + nLength1, src, (nLength2 * sizeof(TCHAR))); - dest[nLength1 + nLength2] = 0; + StringCopy(szTarget + cchTarget, (cchTargetMax - cchTarget), szSource); } } +#endif //----------------------------------------------------------------------------- // Storm hashing functions -- cgit v1.2.3