aboutsummaryrefslogtreecommitdiff
path: root/dep/CascLib/src/common/Path.h
diff options
context:
space:
mode:
Diffstat (limited to 'dep/CascLib/src/common/Path.h')
-rw-r--r--dep/CascLib/src/common/Path.h95
1 files changed, 82 insertions, 13 deletions
diff --git a/dep/CascLib/src/common/Path.h b/dep/CascLib/src/common/Path.h
index 56489c5f4d9..082ce6ea61c 100644
--- a/dep/CascLib/src/common/Path.h
+++ b/dep/CascLib/src/common/Path.h
@@ -17,13 +17,20 @@
template <typename xchar>
struct CASC_PATH
{
- CASC_PATH(int chSeparator = PATH_SEP_CHAR)
+ CASC_PATH(const xchar * szRoot, ...)
{
- m_szBufferBegin = m_szBufferPtr = m_Buffer;
- m_szBufferEnd = m_szBufferBegin + _countof(m_Buffer);
- m_chSeparator = (xchar)chSeparator;
- m_bLocalCache = 0;
- m_Buffer[0] = 0;
+ va_list argList;
+
+ Initialize(PATH_SEP_CHAR);
+
+ va_start(argList, szRoot);
+ Create(szRoot, argList);
+ va_end(argList);
+ }
+
+ CASC_PATH(xchar chSeparator = PATH_SEP_CHAR)
+ {
+ Initialize(chSeparator);
}
~CASC_PATH()
@@ -34,10 +41,53 @@ struct CASC_PATH
}
}
- // LPCTSTR szPath = Path;
- operator const xchar *() const
+ void Create(const xchar * szRoot, ...)
{
- return m_szBufferBegin;
+ va_list argList;
+
+ va_start(argList, szRoot);
+ Create(szRoot, argList);
+ va_end(argList);
+ }
+
+ void Create(const xchar * szRoot, va_list argList)
+ {
+ const xchar * szPathPart;
+
+ // Fill-in the root path
+ SetPathRoot(szRoot);
+
+ // Append all parts until there is NULL
+ while((szPathPart = va_arg(argList, const xchar *)) != NULL)
+ {
+ AppendString(szPathPart, true);
+ }
+ }
+
+ bool CutLastPart()
+ {
+ xchar * szBufferPtr;
+
+ // Cut ending (back)slashes, if any
+ while((m_szBufferPtr > m_szBufferBegin) && (m_szBufferPtr[-1] == _T('\\') || m_szBufferPtr[-1] == _T('/')))
+ m_szBufferPtr--;
+ szBufferPtr = m_szBufferPtr - 1;
+
+ // Cut the last path part
+ while(szBufferPtr > m_szBufferBegin)
+ {
+ // End of path?
+ if(szBufferPtr[0] == _T('\\') || szBufferPtr[0] == _T('/'))
+ {
+ m_szBufferPtr = szBufferPtr;
+ m_szBufferPtr[0] = 0;
+ return true;
+ }
+
+ // Go one character back
+ szBufferPtr--;
+ }
+ return false;
}
void SetLocalCaching(int bLocalCache)
@@ -50,11 +100,22 @@ struct CASC_PATH
return (m_bLocalCache != 0);
}
+ // LPCTSTR szPath = Path;
+ operator const xchar * () const
+ {
+ return m_szBufferBegin;
+ }
+
// LPTSTR szPath = Path.New();
- xchar * New()
+ xchar * New(bool bCutLastPart = false)
{
xchar * szNewStr;
+ if(bCutLastPart)
+ {
+ CutLastPart();
+ }
+
if((szNewStr = CASC_ALLOC<xchar>(Length() + 1)) != NULL)
{
memcpy(szNewStr, m_szBufferBegin, Length() * sizeof(xchar));
@@ -77,12 +138,11 @@ struct CASC_PATH
m_szBufferPtr[0] = 0;
return true;
}
-
return false;
}
- // Path.Copy(szBuffer, _countof(szBuffer));
- bool Copy(xchar * szBuffer, size_t cchBuffer)
+ // Path.CopyTo(szBuffer, _countof(szBuffer));
+ bool CopyTo(xchar * szBuffer, size_t cchBuffer)
{
if((Length() + 1) > cchBuffer)
return false;
@@ -183,6 +243,15 @@ struct CASC_PATH
protected:
+ void Initialize(xchar chSeparator)
+ {
+ m_szBufferBegin = m_szBufferPtr = m_Buffer;
+ m_szBufferEnd = m_szBufferBegin + _countof(m_Buffer);
+ m_chSeparator = chSeparator;
+ m_bLocalCache = 0;
+ m_Buffer[0] = 0;
+ }
+
xchar * m_szBufferBegin;
xchar * m_szBufferPtr;
xchar * m_szBufferEnd;