aboutsummaryrefslogtreecommitdiff
path: root/dep/CascLib/src/common/Path.h
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-08-10 19:01:24 +0200
committerShauren <shauren.trinity@gmail.com>2019-08-10 19:01:24 +0200
commitcd720efbfa60f434f420ab66e220eca742c48e45 (patch)
tree3c960ac5249d0711b71fbfdc62f6c0b665ed85ee /dep/CascLib/src/common/Path.h
parent0d6320dfd3932865edb69c8528327b767bd476ef (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.h182
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__