// // IISCString.h // ////////////////////////////////////////////////////////////////////////////// #if !defined(IISCSTRING_H) #define IISCSTRING_H #if _MSC_VER >= 1000 #pragma once #endif // _MSC_VER >= 1000 ////////////////////////////////////////////////////////////////////////////// #pragma warning(disable:4786) // Disable warning for names > 256 #pragma warning(disable:4275) // Disable warning for non dll-interface class used as a base class #include #include #include "common.h" ////////////////////////////////////////////////////////////////////////////// namespace IIS { class _EXPORT CString : public std::basic_string { public: // Constructors CString(); CString(const CString& strInput); CString(const std::basic_string& strInput); CString(TCHAR ch, int nRepeat = 1); #ifdef _UNICODE CString(LPCSTR lpsz); #endif #ifndef _UNICODE CString(LPCWSTR lpsz); #endif CString(LPCTSTR p); CString(LPCTSTR lpch, int nLength); CString(const unsigned char * psz); CString(const CComBSTR& bstr); ~CString(); int GetLength() const; bool IsEmpty() const; void Empty(); TCHAR GetAt(int nIndex) const; TCHAR operator[](int nIndex) const; void SetAt(int nIndex, TCHAR ch); operator LPCTSTR() const; // as a C string const CString& operator=(const CString& stringSrc); const CString& operator=(TCHAR ch); const CString& operator=(LPCTSTR p); #ifdef _UNICODE const CString& operator=(char ch); const CString& operator=(LPCSTR lpsz); const CString& operator=(const unsigned char* psz); #endif #ifndef _UNICODE const CString& operator=(WCHAR ch); const CString& operator=(LPCWSTR lpsz); #endif // string concatenation const CString& operator+=(const CString& string); const CString& operator+=(TCHAR ch); #ifdef _UNICODE const CString& operator+=(char ch); #endif const CString& operator+=(LPCTSTR lpsz); friend CString __stdcall operator+(const CString& string1, const CString& string2); friend CString __stdcall operator+(const CString& string, TCHAR ch); friend CString __stdcall operator+(TCHAR ch, const CString& string); #ifdef _UNICODE friend CString __stdcall operator+(const CString& string, char ch); friend CString __stdcall operator+(char ch, const CString& string); #endif friend CString __stdcall operator+(const CString& string, LPCTSTR lpsz); friend CString __stdcall operator+(LPCTSTR lpsz, const CString& string); int Compare(LPCTSTR lpsz) const; // straight character int CompareNoCase(LPCTSTR lpsz) const; // ignore case int Collate(LPCTSTR lpsz) const; // NLS aware // simple sub-string extraction CString Mid(int nFirst, int nCount) const; CString Mid(int nFirst) const; CString Left(int nCount) const; CString Right(int nCount) const; CString SpanIncluding(LPCTSTR lpszCharSet) const; CString SpanExcluding(LPCTSTR lpszCharSet) const; // upper/lower/reverse conversion void MakeUpper(); void MakeLower(); void MakeReverse(); // trimming whitespace (either side) void TrimRight(); void TrimLeft(); // advanced manipulation // replace occurrences of chOld with chNew int Replace(TCHAR chOld, TCHAR chNew); // replace occurrences of substring lpszOld with lpszNew; // empty lpszNew removes instances of lpszOld int Replace(LPCTSTR lpszOld, LPCTSTR lpszNew); // remove occurrences of chRemove int Remove(TCHAR chRemove); // insert character at zero-based index; concatenates // if index is past end of string int Insert(int nIndex, TCHAR ch); // insert substring at zero-based index; concatenates // if index is past end of string int Insert(int nIndex, LPCTSTR pstr); // delete nCount characters starting at zero-based index int Delete(int nIndex, int nCount = 1); // searching (return starting index, or -1 if not found) // look for a single character match int Find(TCHAR ch) const; // like "C" strchr int ReverseFind(TCHAR ch) const; int FindOneOf(LPCTSTR lpszCharSet) const; // look for a specific sub-string int Find(LPCTSTR lpszSub) const; // like "C" strstr // Concatentation for non strings // const CString& Append(int n) // { // TCHAR szBuffer[10]; // wsprintf(szBuffer,_T("%d"),n); // ConcatInPlace(SafeStrlen(szBuffer), szBuffer); // return *this; // } // simple formatting void __cdecl FormatV(LPCTSTR lpszFormat, va_list argList); void __cdecl Format(LPCTSTR lpszFormat, ...); void __cdecl Format(HINSTANCE hInst, UINT nFormatID, ...); // formatting for localization (uses FormatMessage API) BOOL __cdecl FormatMessage(LPCTSTR lpszFormat, ...); BOOL __cdecl FormatMessage(HINSTANCE hInst, UINT nFormatID, ...); // Windows support BOOL LoadString(HINSTANCE hInstance, UINT nID); #ifndef _UNICODE // ANSI <-> OEM support (convert string in place) void AnsiToOem(); void OemToAnsi(); #endif #ifndef _ATL_NO_COM // OLE BSTR support (use for OLE automation) BSTR AllocSysString() const; BSTR SetSysString(BSTR* pbstr) const; #endif //!_ATL_NO_COM }; ////////////////////////////////////////////////////////////////////////////// inline bool operator==(const CString& s1, const CString& s2) { return s1.compare(s2) == 0; } inline bool operator==(const CString& s1, const TCHAR * s2) { return s1.compare(s2) == 0; } inline bool operator==(const TCHAR * s1, const CString& s2) { return s2.compare(s1) == 0; } inline bool operator!=(const CString& s1, const CString& s2) { return s1.compare(s2) != 0; } inline bool operator!=(const CString& s1, const TCHAR * s2) { return s1.compare(s2) != 0; } inline bool operator!=(const TCHAR * s1, const CString& s2) { return s2.compare(s1) != 0; } inline bool operator<(const CString& s1, const CString& s2) { return s1.compare(s2) < 0; } inline bool operator<(const CString& s1, const TCHAR * s2) { return s1.compare(s2) < 0; } inline bool operator<(const TCHAR * s1, const CString& s2) { return s2.compare(s1) > 0; } inline bool operator>(const CString& s1, const CString& s2) { return s1.compare(s2) > 0; } inline bool operator>(const CString& s1, const TCHAR * s2) { return s1.compare(s2) > 0; } inline bool operator>(const TCHAR * s1, const CString& s2) { return s2.compare(s1) < 0; } inline bool operator<=(const CString& s1, const CString& s2) { return s1.compare(s2) <= 0; } inline bool operator<=(const CString& s1, const TCHAR * s2) { return s1.compare(s2) <= 0; } inline bool operator<=(const TCHAR * s1, const CString& s2) { return s2.compare(s1) >= 0; } inline bool operator>=(const CString& s1, const CString& s2) { return s1.compare(s2) >= 0; } inline bool operator>=(const CString& s1, const TCHAR * s2) { return s1.compare(s2) >= 0; } inline bool operator>=(const TCHAR * s1, const CString& s2) { return s2.compare(s1) <= 0; } inline CString __stdcall operator+(const CString& string1, const CString& string2) { CString s = string1; s += string2; return s; } inline CString __stdcall operator+(const CString& string, LPCTSTR lpsz) { ATLASSERT(lpsz == NULL); CString s = string; s += lpsz; return s; } inline CString __stdcall operator+(LPCTSTR lpsz, const CString& string) { ATLASSERT(lpsz == NULL); CString s = lpsz;; s += string; return s; } inline CString __stdcall operator+(const CString& string, TCHAR c) { CString s = string; s += c; return s; } inline CString __stdcall operator+(TCHAR c, const CString& string) { CString s; s += c; s += string; return s; } }; // namespace IIS #pragma warning(default:4786) // Enable warning for names > 256 #pragma warning(default:4275) #endif // !defined(IISCSTRING_H)