diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-02-06 20:08:39 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-02-06 20:08:39 +0100 |
commit | fd154940eddc54e556d6bfb5147cedbda4750c3e (patch) | |
tree | 8ff9e3974e8479c1b8157f8aa40bc094cba24bc2 /dep/CascLib/src/common/Common.h | |
parent | 99320464997a5411b7245cb952eaf6cdf8a2a978 (diff) |
Dep/CascLib: Update to ladislav-zezula/CascLib@a5080b5794027a25d98aa6024b2bef17d06fe0ea
Diffstat (limited to 'dep/CascLib/src/common/Common.h')
-rw-r--r-- | dep/CascLib/src/common/Common.h | 87 |
1 files changed, 60 insertions, 27 deletions
diff --git a/dep/CascLib/src/common/Common.h b/dep/CascLib/src/common/Common.h index 3fbbf0d842c..5abc5c77b9a 100644 --- a/dep/CascLib/src/common/Common.h +++ b/dep/CascLib/src/common/Common.h @@ -124,7 +124,7 @@ typedef CASC_CKEY_ENTRY *PCASC_CKEY_ENTRY; extern unsigned char AsciiToLowerTable_Slash[256]; extern unsigned char AsciiToUpperTable_BkSlash[256]; -extern unsigned char AsciiToHexTable[0x80]; +extern unsigned char AsciiToHexTable[128]; extern unsigned char IntToHexChar[]; //----------------------------------------------------------------------------- @@ -186,7 +186,7 @@ inline DWORD Rol32(DWORD dwValue, DWORD dwRolCount) //----------------------------------------------------------------------------- // Big endian number manipulation -inline DWORD ConvertBytesToInteger_2(LPBYTE ValueAsBytes) +inline USHORT ConvertBytesToInteger_2(LPBYTE ValueAsBytes) { USHORT Value = 0; @@ -325,7 +325,9 @@ void CascStrCopy(wchar_t * szTarget, size_t cchTarget, const wchar_t * szSource, //----------------------------------------------------------------------------- // Safe version of s(w)printf +size_t CascStrPrintfV(char * buffer, size_t nCount, const char * format, va_list argList); size_t CascStrPrintf(char * buffer, size_t nCount, const char * format, ...); +size_t CascStrPrintfV(wchar_t * buffer, size_t nCount, const wchar_t * format, va_list argList); size_t CascStrPrintf(wchar_t * buffer, size_t nCount, const wchar_t * format, ...); //----------------------------------------------------------------------------- @@ -337,11 +339,6 @@ wchar_t * CascNewStr(const wchar_t * szString, size_t nCharsToReserve = 0); LPSTR CascNewStrT2A(LPCTSTR szString, size_t nCharsToReserve = 0); LPTSTR CascNewStrA2T(LPCSTR szString, size_t nCharsToReserve = 0); -size_t CombinePath(LPTSTR szBuffer, size_t nMaxChars, va_list argList); -size_t CombinePath(LPTSTR szBuffer, size_t nMaxChars, ...); -LPTSTR GetLastPathPart(LPTSTR szWorkPath); -bool CutLastPathPart(LPTSTR szWorkPath); - size_t NormalizeFileName_UpperBkSlash(char * szNormName, const char * szFileName, size_t cchMaxChars); size_t NormalizeFileName_LowerSlash(char * szNormName, const char * szFileName, size_t cchMaxChars); @@ -351,6 +348,12 @@ ULONGLONG CalcFileNameHash(const char * szFileName); //----------------------------------------------------------------------------- // String conversion functions +template <typename xchar> +bool IsHexadecimalDigit(xchar ch) +{ + return ((ch < sizeof(AsciiToHexTable)) && (AsciiToHexTable[ch] != 0xFF)); +} + template <typename xchar, typename INTXX> DWORD ConvertStringToInt(const xchar * szString, size_t nMaxDigits, INTXX & RefValue, const xchar ** PtrStringEnd = NULL) { @@ -448,34 +451,75 @@ xchar * StringFromBinary(LPBYTE pbBinary, size_t cbBinary, xchar * szBuffer) //----------------------------------------------------------------------------- // Structures for data blobs -struct QUERY_KEY +struct CASC_BLOB { - QUERY_KEY() + CASC_BLOB() { - pbData = NULL; - cbData = 0; + Reset(); } - ~QUERY_KEY() + ~CASC_BLOB() { - CASC_FREE(pbData); - cbData = 0; + Free(); + } + + void MoveFrom(CASC_BLOB & Source) + { + // Free current data, if any + Free(); + + // Take the source data + pbData = Source.pbData; + cbData = Source.cbData; + + // Reset the source data without freeing + Source.Reset(); } DWORD SetData(const void * pv, size_t cb) { - if((pbData = CASC_ALLOC<BYTE>(cb)) == NULL) + if(SetSize(cb) != ERROR_SUCCESS) return ERROR_NOT_ENOUGH_MEMORY; memcpy(pbData, pv, cb); + return ERROR_SUCCESS; + } + + DWORD SetSize(size_t cb) + { + Free(); + + // Always leave one extra byte for NUL character + if((pbData = CASC_ALLOC<BYTE>(cb + 1)) == NULL) + return ERROR_NOT_ENOUGH_MEMORY; + cbData = cb; return ERROR_SUCCESS; } + void Reset() + { + pbData = NULL; + cbData = 0; + } + + void Free() + { + if(pbData != NULL) + CASC_FREE(pbData); + pbData = NULL; + cbData = 0; + } + + LPBYTE End() const + { + return pbData + cbData; + } + LPBYTE pbData; size_t cbData; }; -typedef QUERY_KEY *PQUERY_KEY; +typedef CASC_BLOB *PCASC_BLOB; //----------------------------------------------------------------------------- // File name utilities @@ -526,22 +570,11 @@ bool CascCheckWildCard(const char * szString, const char * szWildCard); //----------------------------------------------------------------------------- // Hashing functions -ULONGLONG HashStringJenkins(const char * szFileName); - bool CascIsValidMD5(LPBYTE pbMd5); void CascCalculateDataBlockHash(void * pvDataBlock, DWORD cbDataBlock, LPBYTE md5_hash); bool CascVerifyDataBlockHash(void * pvDataBlock, DWORD cbDataBlock, LPBYTE expected_md5); //----------------------------------------------------------------------------- -// Scanning a directory - -typedef bool (*INDEX_FILE_FOUND)(LPCTSTR szFileName, void * pvContext); - -bool DirectoryExists(LPCTSTR szDirectory); - -int ScanIndexDirectory(LPCTSTR szIndexPath, INDEX_FILE_FOUND pfnOnFileFound, void * pvContext); - -//----------------------------------------------------------------------------- // Argument structure versioning // Safely retrieves field value from a structure // intended for cases where users upgrade CascLib by simply dropping in a new .dll without recompiling their app |