/******************************************************************************** Copyright (C) 2001-2012 Hugh Bailey This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. ********************************************************************************/ #pragma once BASE_EXPORT UINT STDCALL slen(const TCHAR *strSrc); BASE_EXPORT UINT STDCALL ssize(const TCHAR *strSrc); BASE_EXPORT void STDCALL scpy(TCHAR *strDest, const TCHAR *strSrc); BASE_EXPORT void STDCALL scpy_n(TCHAR *strDest, const TCHAR *strSrc, unsigned int n); BASE_EXPORT void STDCALL scat(TCHAR *strDest, const TCHAR *strSrc); BASE_EXPORT void STDCALL scat_n(TCHAR *strDest, const TCHAR *strSrc, unsigned int n); BASE_EXPORT void STDCALL slwr(TCHAR *str); BASE_EXPORT void STDCALL supr(TCHAR *str); BASE_EXPORT TCHAR* STDCALL sdup(const TCHAR *str); BASE_EXPORT int STDCALL scmp(const TCHAR *str1, const TCHAR *str2); BASE_EXPORT int STDCALL scmpi(const TCHAR *str1, const TCHAR *str2); BASE_EXPORT int STDCALL scmp_n(const TCHAR *str1, const TCHAR *str2, unsigned int num); BASE_EXPORT int STDCALL scmpi_n(const TCHAR *str1, const TCHAR *str2, unsigned int num); BASE_EXPORT TCHAR* STDCALL srchr(const TCHAR *strSrc, TCHAR chr); BASE_EXPORT TCHAR* STDCALL schr(const TCHAR *strSrc, TCHAR chr); BASE_EXPORT TCHAR* STDCALL sstr(const TCHAR *strSrc, const TCHAR *strSearch); BASE_EXPORT TCHAR* STDCALL srchri(const TCHAR *strSrc, TCHAR chr); BASE_EXPORT TCHAR* STDCALL schri(const TCHAR *strSrc, TCHAR chr); BASE_EXPORT TCHAR* STDCALL sstri(const TCHAR *strSrc, const TCHAR *strSearch); BASE_EXPORT TCHAR* STDCALL sfix(TCHAR *str); BASE_EXPORT BOOL STDCALL ValidFloatString(CTSTR lpStr); BASE_EXPORT BOOL STDCALL ValidIntString(CTSTR lpStr); BASE_EXPORT BOOL DefinitelyFloatString(CTSTR lpStr); BASE_EXPORT BOOL UsingUnicode(); BASE_EXPORT int tstr_to_utf8(const TCHAR *strSrc, char *strDest, size_t destLen); BASE_EXPORT int tstr_to_wide(const TCHAR *strSrc, wchar_t *strDest, size_t destLen); BASE_EXPORT int tstr_to_utf8_datalen(const TCHAR *strSrc); BASE_EXPORT int tstr_to_wide_datalen(const TCHAR *strSrc); BASE_EXPORT int utf8_to_tchar_datalen(const char *strSrc); BASE_EXPORT LPSTR tstr_createUTF8(const TCHAR *strSrc); BASE_EXPORT WSTR tstr_createWide(const TCHAR *strSrc); BASE_EXPORT TSTR utf8_createTstr(const char *strSrc); BASE_EXPORT int vtscprintf(const TCHAR *format, va_list args); BASE_EXPORT int vtsprintf_s(TCHAR *pDest, size_t destLen, const TCHAR *format, va_list args); BASE_EXPORT int tsprintf_s(TCHAR *pDest, size_t destLen, const TCHAR *format, ...); BASE_EXPORT int itots_s(int val, TCHAR *buffer, size_t bufLen, int radix); BASE_EXPORT int uitots_s(unsigned int val, TCHAR *buffer, size_t bufLen, int radix); BASE_EXPORT int i64tots_s(INT64 val, TCHAR *buffer, size_t bufLen, int radix); BASE_EXPORT int ui64tots_s(UINT64 val, TCHAR *buffer, size_t bufLen, int radix); BASE_EXPORT int tstring_base_to_int(const TCHAR *nptr, TCHAR **endptr, int base); BASE_EXPORT unsigned int tstring_base_to_uint(const TCHAR *nptr, TCHAR **endptr, int base); BASE_EXPORT INT64 tstring_base_to_int64(const TCHAR *nptr, TCHAR **endptr, int base); BASE_EXPORT UINT64 tstring_base_to_uint64(const TCHAR *nptr, TCHAR **endptr, int base); BASE_EXPORT double tstof(TCHAR *lpFloat); BASE_EXPORT int tstoi(TCHAR *lpInt); BASE_EXPORT unsigned int tstoui(TCHAR *lpInt); BASE_EXPORT INT64 tstoi64(TCHAR *lpInt); BASE_EXPORT UINT64 tstoui64(TCHAR *lpInt); class StringList; class BASE_EXPORT String { TSTR lpString; unsigned int curLength; public: String(); String(LPCSTR str); String(CWSTR str); String(const String &str); ~String(); String& operator=(CTSTR str); String& operator+=(CTSTR str); String operator+(CTSTR str) const; String& operator=(TCHAR ch); String& operator+=(TCHAR ch); String operator+(TCHAR ch) const; String& operator=(int number); String& operator+=(int number); String operator+(int number) const; String& operator=(unsigned int unumber); String& operator+=(unsigned int unumber); String operator+(unsigned int unumber) const; String& operator=(const String &str); String& operator+=(const String &str); String operator+(const String &str) const; String& operator<<(CTSTR str); String& operator<<(TCHAR ch); String& operator<<(int number); String& operator<<(unsigned int unumber); String& operator<<(const String &str); inline BOOL operator==(const String &str) const {return Compare(str);} inline BOOL operator!=(const String &str) const {return !Compare(str);} inline BOOL operator==(CTSTR lpStr) const {return Compare(lpStr);} inline BOOL operator!=(CTSTR lpStr) const {return !Compare(lpStr);} BOOL Compare(CTSTR str) const; BOOL CompareI(CTSTR str) const; LPSTR CreateUTF8String(); String& FindReplace(CTSTR strFind, CTSTR strReplace); void InsertString(UINT dwPos, CTSTR str); String& AppendString(CTSTR str, UINT count=0); UINT GetLinePos(UINT dwLine); void RemoveRange(unsigned int from, unsigned int to); String& AppendChar(TCHAR chr); String& InsertChar(UINT pos, TCHAR chr); String& RemoveChar(UINT pos); String& Clear(); String& GroupDigits(); int NumTokens(TCHAR token=' ') const; String GetToken(int id, TCHAR token=' ') const; void GetTokenList(StringList &strList, TCHAR token=' ', BOOL bIncludeEmpty=TRUE) const; CTSTR GetTokenOffset(int token, TCHAR seperator=' ') const; String Left(UINT iEnd); String Mid(UINT iStart, UINT iEnd); String Right(UINT iStart); inline int ToInt(int base=10) const { if(lpString && ValidIntString(lpString)) return tstring_base_to_int(lpString, NULL, base); else return 0; } inline float ToFloat() const { if(lpString && ValidFloatString(lpString)) return (float)tstof(lpString); else return 0.0f; } inline BOOL IsEmpty() const {return !lpString || !*lpString || curLength == 0;} inline BOOL IsValid() const {return !IsEmpty();} inline String& KillSpaces() {if(lpString) curLength = slen(sfix(lpString)); return *this;} inline TSTR Array() const {return lpString;} inline operator TSTR() const {return lpString;} String& SetLength(UINT length); inline UINT Length() const {return curLength;} inline UINT DataLength() const {return curLength ? ssize(lpString) : 0;} inline String& MakeLower() {if(lpString) slwr(lpString); return *this;} inline String& MakeUpper() {if(lpString) supr(lpString); return *this;} inline String GetLower() const {return String(*this).MakeLower();} inline String GetUpper() const {return String(*this).MakeUpper();} static String RepresentationToString(String &stringToken); static String StringToRepresentation(String &string); BASE_EXPORT friend Serializer& operator<<(Serializer &s, String &str); }; BASE_EXPORT String FormattedStringva(CTSTR lpFormat, va_list arglist); BASE_EXPORT String FormattedString(CTSTR lpFormat, ...); WORD StringCRC16(CTSTR lpData); WORD StringCRC16I(CTSTR lpData); class BASE_EXPORT StringList : public List { public: inline ~StringList() { for(unsigned int i=0; i::Clear(); } inline unsigned int Add(const String &val) { *CreateNew() = val; return num-1; } inline unsigned int Add(CTSTR lpStr) { *CreateNew() = lpStr; return num-1; } inline void Insert(unsigned int index, const String &val) { *InsertNew(index) = val; } inline void Insert(unsigned int index, CTSTR lpStr) { *InsertNew(index) = lpStr; } inline unsigned int AddSorted(CTSTR lpStr) { UINT i; for(i=0; i= 0) break; } Insert(i, lpStr); return i; } unsigned int SafeAdd(const String& val) { UINT i; for(i=0; i::Remove(index); } inline void RemoveItem(const String& str) { for(UINT i=0; i num) return; if(!new_array && n) { AppWarning(TEXT("List::AppendArray: NULL array with count above zero")); return; } if(!n) return; int oldnum = num; SetSize(n+num); mcpyrev(array+index+n, array+index, sizeof(String)*(oldnum-index)); zero(array+index, sizeof(String)*n); for(unsigned int i=0; i::SetSize(n); } inline void RemoveDupes() { for(UINT i=0; i