X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eea4f86a0c4aab97216a6ce72cbaacacc840247f..dafb7332056d68f0daa76a77ca6bbcb28e1a5a00:/src/common/string.cpp diff --git a/src/common/string.cpp b/src/common/string.cpp index a7d9a36ede..89cc7772f1 100644 --- a/src/common/string.cpp +++ b/src/common/string.cpp @@ -274,6 +274,7 @@ wxString::wxString(const char *psz, wxMBConv& conv, size_t nLength) #else +#if wxUSE_WCHAR_T // from wide string wxString::wxString(const wchar_t *pwz) { @@ -289,6 +290,7 @@ wxString::wxString(const wchar_t *pwz) Init(); } } +#endif #endif @@ -495,12 +497,14 @@ wxString& wxString::operator=(const unsigned char* psz) return *this; } +#if wxUSE_WCHAR_T wxString& wxString::operator=(const wchar_t *pwz) { wxString str(pwz); *this = str; return *this; } +#endif #endif @@ -1164,7 +1168,7 @@ int wxString::PrintfV(const wxChar* pszFormat, va_list argptr) char *val = va_arg(argptr, char *); #if wxUSE_UNICODE // ASCII->Unicode constructor handles max_width right - wxString s(val, wxConv_libc, max_width); + wxString s(val, wxConvLibc, max_width); #else size_t len = wxSTRING_MAXLEN; if (val) { @@ -1406,7 +1410,7 @@ size_t wxString::rfind(const wxString& str, size_t nStart) const wxASSERT( str.GetStringData()->IsValid() ); wxASSERT( nStart <= Len() ); - // # could be quicker than that + // TODO could be made much quicker than that const wxChar *p = c_str() + (nStart == npos ? Len() : nStart); while ( p >= c_str() + str.Len() ) { if ( wxStrncmp(p - str.Len(), str, str.Len()) == 0 ) @@ -1421,19 +1425,131 @@ size_t wxString::rfind(const wxString& str, size_t nStart) const #if !defined(__VISUALC__) || defined(__WIN32__) size_t wxString::rfind(const wxChar* sz, size_t nStart, size_t n) const { - return rfind(wxString(sz, n == npos ? 0 : n), nStart); + return rfind(wxString(sz, n == npos ? 0 : n), nStart); } size_t wxString::rfind(wxChar ch, size_t nStart) const { - wxASSERT( nStart <= Len() ); + if ( nStart == npos ) + { + nStart = Len(); + } + else + { + wxASSERT( nStart <= Len() ); + } - const wxChar *p = wxStrrchr(c_str() + nStart, ch); + const wxChar *p = wxStrrchr(c_str(), ch); - return p == NULL ? npos : p - c_str(); + if ( p == NULL ) + return npos; + + size_t result = p - c_str(); + return ( result > nStart ) ? npos : result; } #endif // VC++ 1.5 +size_t wxString::find_first_of(const wxChar* sz, size_t nStart) const +{ + const wxChar *start = c_str() + nStart; + const wxChar *firstOf = wxStrpbrk(start, sz); + if ( firstOf ) + return firstOf - start; + else + return npos; +} + +size_t wxString::find_last_of(const wxChar* sz, size_t nStart) const +{ + if ( nStart == npos ) + { + nStart = Len(); + } + else + { + wxASSERT( nStart <= Len() ); + } + + for ( const wxChar *p = c_str() + length() - 1; p >= c_str(); p-- ) + { + if ( wxStrchr(sz, *p) ) + return p - c_str(); + } + + return npos; +} + +size_t wxString::find_first_not_of(const wxChar* sz, size_t nStart) const +{ + if ( nStart == npos ) + { + nStart = Len(); + } + else + { + wxASSERT( nStart <= Len() ); + } + + size_t nAccept = wxStrspn(c_str() + nStart, sz); + if ( nAccept >= length() - nStart ) + return npos; + else + return nAccept; +} + +size_t wxString::find_first_not_of(wxChar ch, size_t nStart) const +{ + wxASSERT( nStart <= Len() ); + + for ( const wxChar *p = c_str() + nStart; *p; p++ ) + { + if ( *p != ch ) + return p - c_str(); + } + + return npos; +} + +size_t wxString::find_last_not_of(const wxChar* sz, size_t nStart) const +{ + if ( nStart == npos ) + { + nStart = Len(); + } + else + { + wxASSERT( nStart <= Len() ); + } + + for ( const wxChar *p = c_str() + nStart - 1; p >= c_str(); p-- ) + { + if ( !wxStrchr(sz, *p) ) + return p - c_str(); + } + + return npos; +} + +size_t wxString::find_last_not_of(wxChar ch, size_t nStart) const +{ + if ( nStart == npos ) + { + nStart = Len(); + } + else + { + wxASSERT( nStart <= Len() ); + } + + for ( const wxChar *p = c_str() + nStart - 1; p >= c_str(); p-- ) + { + if ( *p != ch ) + return p - c_str(); + } + + return npos; +} + wxString wxString::substr(size_t nStart, size_t nLen) const { // npos means 'take all' @@ -1801,14 +1917,18 @@ void wxArrayString::DoSort() // MBConv // ============================================================================ +WXDLLEXPORT_DATA(wxMBConv *) wxConvCurrent = &wxConvLibc; +#if !wxUSE_WCHAR_T +WXDLLEXPORT_DATA(wxMBConv) wxConvLibc, wxConvFile; +#endif + #if wxUSE_WCHAR_T -WXDLLEXPORT_DATA(wxMBConv *) wxConv_current = &wxConv_libc; // ---------------------------------------------------------------------------- // standard libc conversion // ---------------------------------------------------------------------------- -WXDLLEXPORT_DATA(wxMBConv) wxConv_libc; +WXDLLEXPORT_DATA(wxMBConv) wxConvLibc; size_t wxMBConv::MB2WC(wchar_t *buf, const char *psz, size_t n) const { @@ -1824,15 +1944,15 @@ size_t wxMBConv::WC2MB(char *buf, const wchar_t *psz, size_t n) const // standard file conversion // ---------------------------------------------------------------------------- -WXDLLEXPORT_DATA(wxMBConv_file) wxConv_file; +WXDLLEXPORT_DATA(wxMBConvFile) wxConvFile; // just use the libc conversion for now -size_t wxMBConv_file::MB2WC(wchar_t *buf, const char *psz, size_t n) const +size_t wxMBConvFile::MB2WC(wchar_t *buf, const char *psz, size_t n) const { return wxMB2WC(buf, psz, n); } -size_t wxMBConv_file::WC2MB(char *buf, const wchar_t *psz, size_t n) const +size_t wxMBConvFile::WC2MB(char *buf, const wchar_t *psz, size_t n) const { return wxWC2MB(buf, psz, n); } @@ -1841,12 +1961,12 @@ size_t wxMBConv_file::WC2MB(char *buf, const wchar_t *psz, size_t n) const // standard gdk conversion // ---------------------------------------------------------------------------- -#if defined(__WXGTK__) && (GTK_MINOR_VERSION > 0) -WXDLLEXPORT_DATA(wxMBConv_gdk) wxConv_gdk; +#ifdef __WXGTK12__ +WXDLLEXPORT_DATA(wxMBConvGdk) wxConvGdk; #include -size_t wxMBConv_gdk::MB2WC(wchar_t *buf, const char *psz, size_t n) const +size_t wxMBConvGdk::MB2WC(wchar_t *buf, const char *psz, size_t n) const { if (buf) { return gdk_mbstowcs((GdkWChar *)buf, psz, n); @@ -1858,7 +1978,7 @@ size_t wxMBConv_gdk::MB2WC(wchar_t *buf, const char *psz, size_t n) const } } -size_t wxMBConv_gdk::WC2MB(char *buf, const wchar_t *psz, size_t n) const +size_t wxMBConvGdk::WC2MB(char *buf, const wchar_t *psz, size_t n) const { char *mbstr = gdk_wcstombs((GdkWChar *)psz); size_t len = mbstr ? strlen(mbstr) : 0; @@ -1875,7 +1995,7 @@ size_t wxMBConv_gdk::WC2MB(char *buf, const wchar_t *psz, size_t n) const // UTF-7 // ---------------------------------------------------------------------------- -WXDLLEXPORT_DATA(wxMBConv_UTF7) wxConv_UTF7; +WXDLLEXPORT_DATA(wxMBConvUTF7) wxConvUTF7; #if 0 static char utf7_setD[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ" @@ -1888,12 +2008,16 @@ static char utf7_setB[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ" #endif // TODO: write actual implementations of UTF-7 here -size_t wxMBConv_UTF7::MB2WC(wchar_t *buf, const char *psz, size_t n) const +size_t wxMBConvUTF7::MB2WC(wchar_t * WXUNUSED(buf), + const char * WXUNUSED(psz), + size_t WXUNUSED(n)) const { return 0; } -size_t wxMBConv_UTF7::WC2MB(char *buf, const wchar_t *psz, size_t n) const +size_t wxMBConvUTF7::WC2MB(char * WXUNUSED(buf), + const wchar_t * WXUNUSED(psz), + size_t WXUNUSED(n)) const { return 0; } @@ -1902,11 +2026,11 @@ size_t wxMBConv_UTF7::WC2MB(char *buf, const wchar_t *psz, size_t n) const // UTF-8 // ---------------------------------------------------------------------------- -WXDLLEXPORT_DATA(wxMBConv_UTF8) wxConv_UTF8; +WXDLLEXPORT_DATA(wxMBConvUTF8) wxConvUTF8; static unsigned long utf8_max[]={0x7f,0x7ff,0xffff,0x1fffff,0x3ffffff,0x7fffffff,0xffffffff}; -size_t wxMBConv_UTF8::MB2WC(wchar_t *buf, const char *psz, size_t n) const +size_t wxMBConvUTF8::MB2WC(wchar_t *buf, const char *psz, size_t n) const { size_t len = 0; @@ -1947,7 +2071,7 @@ size_t wxMBConv_UTF8::MB2WC(wchar_t *buf, const char *psz, size_t n) const return len; } -size_t wxMBConv_UTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const +size_t wxMBConvUTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const { size_t len = 0; @@ -2004,7 +2128,7 @@ static void wxLoadCharacterSets(void) if (already_loaded) return; already_loaded = TRUE; -#if defined(__UNIX__) +#if defined(__UNIX__) && wxUSE_TEXTFILE // search through files in /usr/share/i18n/charmaps wxString fname; for (fname = ::wxFindFirstFile(_T("/usr/share/i18n/charmaps/*")); @@ -2026,12 +2150,8 @@ static void wxLoadCharacterSets(void) wxStringTokenizer token(line); wxString cmd = token.GetNextToken(); if (cmd == comchar) { - if (token.GetNextToken() == _T("alias")) { - wxStringTokenizer names(token.GetNextToken(),_T("/")); - wxString name; - while (!(name = names.GetNextToken()).IsEmpty()) - cset->names.Add(name); - } + if (token.GetNextToken() == _T("alias")) + cset->names.Add(token.GetNextToken()); } else if (cmd == _T("")) cset->names.Add(token.GetNextToken()); @@ -2095,7 +2215,7 @@ static wxCharacterSet *wxFindCharacterSet(const wxChar *charset) return (wxCharacterSet *)NULL; } -WXDLLEXPORT_DATA(wxCSConv) wxConv_local((const wxChar *)NULL); +WXDLLEXPORT_DATA(wxCSConv) wxConvLocal((const wxChar *)NULL); wxCSConv::wxCSConv(const wxChar *charset) { @@ -2190,3 +2310,27 @@ size_t wxCSConv::WC2MB(char *buf, const wchar_t *psz, size_t n) const } #endif//wxUSE_WCHAR_T + +#if wxUSE_WCHAR_T +const wxWCharBuffer wxMBConv::cMB2WC(const char *psz) const + { + if (psz) { + size_t nLen = MB2WC((wchar_t *) NULL, psz, 0); + wxWCharBuffer buf(nLen); + MB2WC(WCSTRINGCAST buf, psz, nLen); + return buf; + } else return wxWCharBuffer((wchar_t *) NULL); + } + +const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *psz) const + { + if (psz) { + size_t nLen = WC2MB((char *) NULL, psz, 0); + wxCharBuffer buf(nLen); + WC2MB(MBSTRINGCAST buf, psz, nLen); + return buf; + } else return wxCharBuffer((char *) NULL); + } + +#endif//wxUSE_WCHAR_T +