X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a69f7aa823711f098af48c0453b556cf82c0700d..bcd2b961ff2545f4daf8ca7150b660a23cb0c8f7:/include/wx/string.h diff --git a/include/wx/string.h b/include/wx/string.h index 9ffc9d1a04..6a966ae6fc 100644 --- a/include/wx/string.h +++ b/include/wx/string.h @@ -66,6 +66,7 @@ const unsigned int wxSTRING_MAXLEN = UINT_MAX - 100; // 'naughty' cast #define WXSTRINGCAST (wxChar *)(const wxChar *) +#define WXCSTRINGCAST (wxChar *)(const wxChar *) #define MBSTRINGCAST (char *)(const char *) #define WCSTRINGCAST (wchar_t *)(const wchar_t *) @@ -169,25 +170,15 @@ struct WXDLLEXPORT wxStringData // --------------------------------------------------------------------------- // types of multibyte<->Unicode conversions // --------------------------------------------------------------------------- +#if wxUSE_WCHAR_T class WXDLLEXPORT wxMBConv { public: virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const; virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const; - const wxWCharBuffer cMB2WC(const char *psz) const - { - size_t nLen = MB2WC((wchar_t *) NULL, psz, 0); - wxWCharBuffer buf(nLen); - MB2WC(WCSTRINGCAST buf, psz, nLen); - return buf; - } - const wxCharBuffer cWC2MB(const wchar_t *psz) const - { - size_t nLen = WC2MB((char *) NULL, psz, 0); - wxCharBuffer buf(nLen); - WC2MB(MBSTRINGCAST buf, psz, nLen); - return buf; - } + // No longer inline since BC++ complains. + const wxWCharBuffer cMB2WC(const char *psz) const; + const wxCharBuffer cWC2MB(const wchar_t *psz) const; #if wxUSE_UNICODE const wxWCharBuffer cMB2WX(const char *psz) const { return cMB2WC(psz); } const wxCharBuffer cWX2MB(const wchar_t *psz) const { return cWC2MB(psz); } @@ -200,7 +191,8 @@ class WXDLLEXPORT wxMBConv const wxWCharBuffer cWX2WC(const char *psz) const { return cMB2WC(psz); } #endif }; -WXDLLEXPORT_DATA(extern wxMBConv) wxConv_libc; +WXDLLEXPORT_DATA(extern wxMBConv) wxConvLibc; +#define wxConv_libc wxConvLibc #define wxANOTHER_MBCONV(type) \ class type : public wxMBConv { \ @@ -209,43 +201,66 @@ class type : public wxMBConv { \ virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const; \ } -WXDLLEXPORT_DATA(extern wxANOTHER_MBCONV(wxMBConv_file)) wxConv_file; -WXDLLEXPORT_DATA(extern wxANOTHER_MBCONV(wxMBConv_UTF7)) wxConv_UTF7; -WXDLLEXPORT_DATA(extern wxANOTHER_MBCONV(wxMBConv_UTF8)) wxConv_UTF8; -#ifdef __WXGTK__ -WXDLLEXPORT_DATA(extern wxANOTHER_MBCONV(wxMBConv_gdk)) wxConv_gdk; -#endif +WXDLLEXPORT_DATA(extern wxANOTHER_MBCONV(wxMBConvFile)) wxConvFile; +#define wxConv_file wxConvFile +WXDLLEXPORT_DATA(extern wxANOTHER_MBCONV(wxMBConvUTF7)) wxConvUTF7; +WXDLLEXPORT_DATA(extern wxANOTHER_MBCONV(wxMBConvUTF8)) wxConvUTF8; +#define wxConv_UTF8 wxConvUTF8 +#if defined(__WXGTK12__) + WXDLLEXPORT_DATA(extern wxANOTHER_MBCONV(wxMBConvGdk)) wxConvGdk; + #define wxConv_gdk wxConvGdk +#endif // GTK > 1.0 class wxCharacterSet; class WXDLLEXPORT wxCSConv : public wxMBConv { private: - wxCharacterSet *cset; + wxChar *m_name; + wxCharacterSet *m_cset; + bool m_deferred; + void SetName(const wxChar *charset); public: wxCSConv(const wxChar *charset); - virtual ~wxCSConv(void); + virtual ~wxCSConv(); + void LoadNow(); virtual size_t MB2WC(wchar_t *buf, const char *psz, size_t n) const; virtual size_t WC2MB(char *buf, const wchar_t *psz, size_t n) const; }; -WXDLLEXPORT_DATA(extern wxCSConv) wxConv_local; +WXDLLEXPORT_DATA(extern wxCSConv) wxConvLocal; +#define wxConv_local wxConvLocal -WXDLLEXPORT_DATA(extern wxMBConv *) wxConv_current; +WXDLLEXPORT_DATA(extern wxMBConv *) wxConvCurrent; +#define wxConv_current wxConvCurrent // filenames are multibyte on Unix and probably widechar on Windows? -#ifdef __UNIX__ +#if defined(__UNIX__) || defined(__BORLANDC__) #define wxMBFILES 1 #else #define wxMBFILES 0 #endif #if wxMBFILES -#define wxFNCONV(name) wxConv_file.cWX2MB(name) +#define wxFNCONV(name) wxConvFile.cWX2MB(name) #define FNSTRINGCAST MBSTRINGCAST #else #define wxFNCONV(name) name #define FNSTRINGCAST WXSTRINGCAST #endif +#else//!wxUSE_WCHAR_T +class WXDLLEXPORT wxMBConv { +public: + const char* cMB2WX(const char *psz) const { return psz; } + const char* cWX2MB(const char *psz) const { return psz; } +}; +WXDLLEXPORT_DATA(extern wxMBConv) wxConvLibc, wxConvFile; +#define wxConv_libc wxConvLibc +#define wxConv_file wxConvFile +WXDLLEXPORT_DATA(extern wxMBConv *) wxConvCurrent; +#define wxConv_current wxConvCurrent +#define wxFNCONV(name) name +#define FNSTRINGCAST WXSTRINGCAST +#endif//wxUSE_WCHAR_T // --------------------------------------------------------------------------- // This is (yet another one) String class for C++ programmers. It doesn't use @@ -351,7 +366,7 @@ public: // from multibyte string // (NB: nLength is right now number of Unicode characters, not // characters in psz! So try not to use it yet!) - wxString(const char *psz, wxMBConv& conv = wxConv_libc, size_t nLength = wxSTRING_MAXLEN); + wxString(const char *psz, wxMBConv& conv = wxConvLibc, size_t nLength = wxSTRING_MAXLEN); // from wxWCharBuffer (i.e. return from wxGetString) wxString(const wxWCharBuffer& psz) { InitWith(psz, 0, wxSTRING_MAXLEN); } @@ -359,8 +374,13 @@ public: // from C string (for compilers using unsigned char) wxString(const unsigned char* psz, size_t nLength = wxSTRING_MAXLEN) { InitWith((const char*)psz, 0, nLength); } + // from multibyte string + wxString(const char *psz, wxMBConv& WXUNUSED(conv), size_t nLength = wxSTRING_MAXLEN) + { InitWith(psz, 0, nLength); } +#if wxUSE_WCHAR_T // from wide (Unicode) string wxString(const wchar_t *pwz); +#endif // from wxCharBuffer wxString(const wxCharBuffer& psz) { InitWith(psz, 0, wxSTRING_MAXLEN); } @@ -440,23 +460,27 @@ public: operator const wxChar*() const { return m_pchData; } // explicit conversion to C string (use this with printf()!) const wxChar* c_str() const { return m_pchData; } + // (and this with [wx]Printf()!) + const wxChar* wx_str() const { return m_pchData; } // const wxChar* GetData() const { return m_pchData; } #if wxUSE_UNICODE - const wxCharBuffer mb_str(wxMBConv& conv = wxConv_libc) const { return conv.cWC2MB(m_pchData); } - const wxChar* wc_str(wxMBConv& WXUNUSED(conv) = wxConv_libc) const { return m_pchData; } + const wxCharBuffer mb_str(wxMBConv& conv = wxConvLibc) const { return conv.cWC2MB(m_pchData); } + const wxChar* wc_str(wxMBConv& WXUNUSED(conv) = wxConvLibc) const { return m_pchData; } #if wxMBFILES - const wxCharBuffer fn_str() const { return mb_str(wxConv_file); } + const wxCharBuffer fn_str() const { return mb_str(wxConvFile); } #else const wxChar* fn_str() const { return m_pchData; } #endif #else - const wxChar* mb_str(wxMBConv& WXUNUSED(conv) = wxConv_libc ) const { return m_pchData; } + const wxChar* mb_str(wxMBConv& WXUNUSED(conv) = wxConvLibc ) const { return m_pchData; } +#if wxUSE_WCHAR_T const wxWCharBuffer wc_str(wxMBConv& conv) const { return conv.cMB2WC(m_pchData); } +#endif const wxChar* fn_str() const { return m_pchData; } #endif // for convenience - const wxWX2MBbuf mbc_str() const { return mb_str(*wxConv_current); } + const wxWX2MBbuf mbc_str() const { return mb_str(*wxConvCurrent); } // overloaded assignment // from another wxString @@ -471,8 +495,10 @@ public: #else // from another kind of C string wxString& operator=(const unsigned char* psz); +#if wxUSE_WCHAR_T // from a wide string wxString& operator=(const wchar_t *pwz); +#endif // from wxCharBuffer wxString& operator=(const wxCharBuffer& psz) { return operator=((const char *)psz); } #endif @@ -549,7 +575,7 @@ public: // case-sensitive comparison (returns a value < 0, = 0 or > 0) int Cmp(const wxChar *psz) const { return wxStrcmp(c_str(), psz); } // same as Cmp() but not case-sensitive - int CmpNoCase(const wxChar *psz) const { return wxStricmp(c_str(), psz); } + int CmpNoCase(const wxChar *psz) const { return Stricmp(c_str(), psz); } // test for the string equality, either considering case or not // (if compareWithCase then the case matters) bool IsSameAs(const wxChar *psz, bool compareWithCase = TRUE) const @@ -687,6 +713,10 @@ public: #ifdef wxSTD_STRING_COMPATIBILITY // std::string compatibility functions + // standard types + typedef wxChar value_type; + typedef const value_type *const_iterator; + // an 'invalid' value for string index static const size_t npos; @@ -720,6 +750,11 @@ public: // returns the writable character at position n wxChar& at(size_t n) { return GetWritableChar(n); } + // first valid index position + const_iterator begin() const { return wx_str(); } + // position one after the last valid one + const_iterator end() const { return wx_str() + length(); } + // lib.string.modifiers // append a string wxString& append(const wxString& str) @@ -810,32 +845,37 @@ public: // find first/last occurence of any character in the set - // - size_t find_first_of(const wxString& str, size_t nStart = 0) const; - // + // as strpbrk() but starts at nStart, returns npos if not found + size_t find_first_of(const wxString& str, size_t nStart = 0) const + { return find_first_of(str.c_str(), nStart); } + // same as above size_t find_first_of(const wxChar* sz, size_t nStart = 0) const; // same as find(char, size_t) - size_t find_first_of(wxChar c, size_t nStart = 0) const; - // - size_t find_last_of (const wxString& str, size_t nStart = npos) const; - // - size_t find_last_of (const wxChar* s, size_t nStart = npos) const; - // same as rfind(char, size_t) - size_t find_last_of (wxChar c, size_t nStart = npos) const; + size_t find_first_of(wxChar c, size_t nStart = 0) const + { return find(c, nStart); } + // find the last (starting from nStart) char from str in this string + size_t find_last_of (const wxString& str, size_t nStart = npos) const + { return find_last_of(str.c_str(), nStart); } + // same as above + size_t find_last_of (const wxChar* sz, size_t nStart = npos) const; + // same as above + size_t find_last_of(wxChar c, size_t nStart = npos) const + { return rfind(c, nStart); } // find first/last occurence of any character not in the set - // - size_t find_first_not_of(const wxString& str, size_t nStart = 0) const; - // - size_t find_first_not_of(const wxChar* s, size_t nStart = 0) const; - // + // as strspn() (starting from nStart), returns npos on failure + size_t find_first_not_of(const wxString& str, size_t nStart = 0) const + { return find_first_not_of(str.c_str(), nStart); } + // same as above + size_t find_first_not_of(const wxChar* sz, size_t nStart = 0) const; + // same as above size_t find_first_not_of(wxChar ch, size_t nStart = 0) const; - // + // as strcspn() size_t find_last_not_of(const wxString& str, size_t nStart=npos) const; - // - size_t find_last_not_of(const wxChar* s, size_t nStart = npos) const; - // + // same as above + size_t find_last_not_of(const wxChar* sz, size_t nStart = npos) const; + // same as above size_t find_last_not_of(wxChar ch, size_t nStart = npos) const; // All compare functions return -1, 0 or 1 if the [sub]string is less, @@ -996,6 +1036,17 @@ wxString WXDLLEXPORT operator+(const wxString& string, wxChar ch); wxString WXDLLEXPORT operator+(wxChar ch, const wxString& string); wxString WXDLLEXPORT operator+(const wxString& string, const wxChar *psz); wxString WXDLLEXPORT operator+(const wxChar *psz, const wxString& string); +#if wxUSE_UNICODE +inline wxString WXDLLEXPORT operator+(const wxString& string, const wxWCharBuffer& buf) +{ return string + (const wchar_t *)buf; } +inline wxString WXDLLEXPORT operator+(const wxWCharBuffer& buf, const wxString& string) +{ return (const wchar_t *)buf + string; } +#else +inline wxString WXDLLEXPORT operator+(const wxString& string, const wxCharBuffer& buf) +{ return string + (const char *)buf; } +inline wxString WXDLLEXPORT operator+(const wxCharBuffer& buf, const wxString& string) +{ return (const char *)buf + string; } +#endif // --------------------------------------------------------------------------- // Implementation only from here until the end of file