diff options
author | Shauren <shauren.trinity@gmail.com> | 2019-08-10 19:01:24 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2019-08-10 19:01:24 +0200 |
commit | cd720efbfa60f434f420ab66e220eca742c48e45 (patch) | |
tree | 3c960ac5249d0711b71fbfdc62f6c0b665ed85ee /dep/CascLib/src/common/Path.h | |
parent | 0d6320dfd3932865edb69c8528327b767bd476ef (diff) |
Dep/CascLib: Update to ladislav-zezula/CascLib@b91f87c770c78340dcd96df970e55b5c0469e884
Diffstat (limited to 'dep/CascLib/src/common/Path.h')
-rw-r--r-- | dep/CascLib/src/common/Path.h | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/dep/CascLib/src/common/Path.h b/dep/CascLib/src/common/Path.h new file mode 100644 index 00000000000..b77dde0cc3d --- /dev/null +++ b/dep/CascLib/src/common/Path.h @@ -0,0 +1,182 @@ +/*****************************************************************************/ +/* Path.h Copyright (c) Ladislav Zezula 2019 */ +/*---------------------------------------------------------------------------*/ +/* Global path merger class */ +/*---------------------------------------------------------------------------*/ +/* Date Ver Who Comment */ +/* -------- ---- --- ------- */ +/* 24.07.17 1.00 Lad Created */ +/*****************************************************************************/ + +#ifndef __CASC_PATH_H__ +#define __CASC_PATH_H__ + +//----------------------------------------------------------------------------- +// Structures + +template <typename xchar> +struct CASC_PATH +{ + CASC_PATH(xchar chSeparator = PATH_SEP_CHAR) + { + m_szBufferBegin = m_szBufferPtr = m_Buffer; + m_szBufferEnd = m_szBufferBegin + _countof(m_Buffer); + m_chSeparator = chSeparator; + m_Buffer[0] = 0; + } + + ~CASC_PATH() + { + if(m_szBufferBegin != m_Buffer) + { + CASC_FREE(m_szBufferBegin); + } + } + + // LPCTSTR szPath = Path; + operator const xchar *() + { + return m_szBufferBegin; + } + + // LPTSTR szPath = Path.New(); + xchar * New() + { + xchar * szNewStr; + + if((szNewStr = CASC_ALLOC<xchar>(Length() + 1)) != NULL) + { + memcpy(szNewStr, m_szBufferBegin, Length() * sizeof(xchar)); + szNewStr[Length()] = 0; + } + + return szNewStr; + } + + size_t Save() + { + return (m_szBufferPtr - m_szBufferBegin); + } + + bool Restore(size_t nSavePos) + { + if((m_szBufferBegin + nSavePos) < m_szBufferEnd) + { + m_szBufferPtr = m_szBufferBegin + nSavePos; + m_szBufferPtr[0] = 0; + return true; + } + + return false; + } + + // Path.Copy(szBuffer, _countof(szBuffer)); + bool Copy(xchar * szBuffer, size_t cchBuffer) + { + if((Length() + 1) > cchBuffer) + return false; + + memcpy(szBuffer, m_szBufferBegin, Length() * sizeof(xchar)); + szBuffer[Length()] = 0; + return true; + } + + size_t Length() + { + return m_szBufferPtr - m_szBufferBegin; + } + + bool SetPathRoot(const xchar * szRoot) + { + // Make sure that there is no characters + m_szBufferPtr = m_szBufferBegin; + m_szBufferPtr[0] = 0; + + // Append the root path + return AppendString(szRoot, false); + } + + bool AppendStringN(const xchar * szString, size_t nMaxchars, bool bWithSeparator) + { + const xchar * szStringEnd = szString + nMaxchars; + xchar chOneChar; + + if(szString && szString[0] && nMaxchars) + { + // Append separator, if required and not in begin of the string + if(m_szBufferPtr > m_szBufferBegin && bWithSeparator) + AppendChar(m_chSeparator); + + // Append the characters from the string + while(szString[0] && szString < szStringEnd) + { + // Retrieve the single character + chOneChar = *szString++; + + // Normalize the character + if(chOneChar == '/' || chOneChar == '\\') + chOneChar = m_chSeparator; + + if(!AppendChar(chOneChar)) + break; + } + } + + return true; + } + + bool AppendString(const xchar * szString, bool bWithSeparator) + { + return AppendStringN(szString, (0x10000 / sizeof(xchar)), bWithSeparator); + } + + bool AppendEKey(LPBYTE pbEKey) + { + xchar szEKey[MD5_STRING_SIZE + 1]; + + StringFromBinary(pbEKey, MD5_HASH_SIZE, szEKey); + AppendStringN(szEKey, 2, true); + AppendStringN(szEKey+2, 2, true); + return AppendString(szEKey, true); + } + + bool AppendChar(xchar chOneChar) + { + // Buffer our of space? + if((m_szBufferPtr + 2) >= m_szBufferEnd) + { + xchar * szOldBuffer = m_szBufferBegin; + xchar * szNewBuffer; + size_t nToAllocate = (m_szBufferEnd - m_szBufferBegin) * 2; + size_t nLength = (m_szBufferPtr - m_szBufferBegin); + + if((szNewBuffer = CASC_ALLOC<xchar>(nToAllocate)) == NULL) + return false; + + // Copy the chars + memcpy(szNewBuffer, m_szBufferBegin, (m_szBufferPtr - m_szBufferBegin) * sizeof(xchar)); + m_szBufferBegin = szNewBuffer; + m_szBufferPtr = m_szBufferBegin + nLength; + m_szBufferEnd = m_szBufferBegin + nToAllocate; + + // Free the old buffer + if(szOldBuffer != m_Buffer) + CASC_FREE(szOldBuffer); + } + + // Append the character + *m_szBufferPtr++ = chOneChar; + m_szBufferPtr[0] = 0; + return true; + } + + protected: + + xchar * m_szBufferBegin; + xchar * m_szBufferPtr; + xchar * m_szBufferEnd; + xchar m_Buffer[MAX_PATH]; + xchar m_chSeparator; +}; + +#endif // __CASC_PATH_H__ |