//----------------------------------------------------------------------------- // // File: passtr.h // Copyright (C) 1994-1997 Microsoft Corporation // All rights reserved. // // Declaration for a pascal (counted) style wide character string class. // The count reflects the number of characters (including NUL characters), // not the amount of storage. Any string in a PascalString is automatically // given a NULL terminator, even if it already has one. This extra terminator // is NOT in the count of characters in the string. // //----------------------------------------------------------------------------- #ifndef PASSTR_H #define PASSTR_H class _bstr_t; class CUnicodeException : public CSimpleException { public: enum UnicodeCause { noCause = 0, invalidChar = 1, unknownCodePage }; UnicodeCause m_cause; NOTHROW CUnicodeException(UnicodeCause); NOTHROW CUnicodeException(UnicodeCause, BOOL); NOTHROW ~CUnicodeException(); virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL ); }; void LTAPIENTRY ThrowUnicodeException(CUnicodeException::UnicodeCause); class LTAPIENTRY CPascalString { public: NOTHROW CPascalString(); NOTHROW CPascalString(const CPascalString &); void AssertValid(void) const; // // The ultimate assignment operator - any random collection // of WIDE characters can be placed in the string. // Also, we can convert any collection of DBCS style strings, // so long as the user provides a code page to work with... // void SetString(const WCHAR *, UINT); void SetString(const char *, UINT, CodePage); void SetString(const CLString &, CodePage); // // Useful assignment operators // const CPascalString & operator=(const CPascalString &); const CPascalString & operator=(const WCHAR *); const CPascalString & operator=(const _bstr_t &); const CPascalString & operator+=(const CPascalString &); const CPascalString & operator+=(const WCHAR *); const CPascalString & operator+=(const WCHAR); void Format(const WCHAR *, ...); // // Comparison operators for counted strings. // NOTHROW int operator==(const CPascalString &) const; NOTHROW int operator!=(const CPascalString &) const; NOTHROW int operator==(const _bstr_t &) const; NOTHROW int operator!=(const _bstr_t &) const; NOTHROW int operator==(const WCHAR *) const; NOTHROW int operator!=(const WCHAR *) const; NOTHROW BOOL IsNull(void) const; // // Retrieving the data from the string. // NOTHROW UINT GetStringLength(void) const; void SetStringLength(UINT); void ReallocString(UINT); void ReserveStorage(UINT); NOTHROW WCHAR * GetStringPointer(void); NOTHROW void ReleaseStringPointer(void); NOTHROW operator const WCHAR *(void) const; // const BSTR GetBSTR(void) const; NOTHROW WCHAR operator[](UINT) const; NOTHROW WCHAR & operator[](UINT); // // Sub-string extraction // NOTHROW void Left(CPascalString &, UINT) const; NOTHROW void Right(CPascalString &, UINT) const; NOTHROW void Mid(CPascalString &, UINT) const; NOTHROW void Mid(CPascalString &, UINT, UINT) const; // // Locate // NOTHROW BOOL Find(WCHAR, UINT, UINT &) const; NOTHROW BOOL FindOneOf(const CPascalString&, UINT, UINT &) const; NOTHROW BOOL FindExcept(const CPascalString &, UINT, UINT &) const; NOTHROW BOOL FindSubString(const CPascalString &, UINT, UINT &) const; NOTHROW BOOL ReverseFind(WCHAR, UINT, UINT &) const; NOTHROW BOOL ReverseFindOneOf(const CPascalString &, UINT, UINT &) const; NOTHROW BOOL ReverseFindExcept(const CPascalString &, UINT, UINT &) const; // // Clears the contents of a Pascal string. // NOTHROW void ClearString(void); // // Conversion API's for Pascal style strings. // enum ConvFlags { ConvNoFlags = 0, // No conversion options HexifyDefaultChars = 0x01, // Hexify chars that convert to the default char HexifyNonPrintingChars = 0x02, HexifyWhiteSpace = 0x04, ConvAddNull = 0x08, ConvAllFlags = 0xFF }; void ConvertToCLString(CLString &, CodePage, BOOL fHex=FALSE) const; void ConvertToMBCSBlob(CLocCOWBlob &, CodePage, DWORD dwFlags = ConvNoFlags) const; NOTHROW void MakeUpper(void); NOTHROW void MakeLower(void); _bstr_t MakeBSTRT() const; void Serialize(CArchive &ar); void Load(CArchive &ar); void Store(CArchive &ar) const; static const char *szUnmappableChar; static char cHexLeaderChar; static void EscapeBackSlash(const CPascalString &srcStr, CPascalString &destStr); int ParseEscapeSequences(CPascalString &pasError); ~CPascalString(); protected: NOTHROW BOOL IsEqualTo(const CPascalString &) const; NOTHROW void AppendBuffer(const WCHAR *, UINT); private: void FormatV(const WCHAR *, va_list arglist); CLocCOWBlob m_blbData; operator const CLocCOWBlob &(void) const; DEBUGONLY(static CCounter m_UsageCounter); DEBUGONLY(static CCounter m_StorageCounter); }; typedef CArray CPasStringArray; // // Comparison helper functions. These should all have the // CPascalString as the SECOND arguement. // NOTHROW int LTAPIENTRY operator==(const WCHAR *, const CPascalString &); NOTHROW int LTAPIENTRY operator!=(const WCHAR *, const CPascalString &); NOTHROW int LTAPIENTRY operator==(const _bstr_t &, const CPascalString &); NOTHROW int LTAPIENTRY operator!=(const _bstr_t, const CPascalString &); #if !defined(_DEBUG) || defined(IMPLEMENT) #include "passtr.inl" #endif #endif // PASSTR_H