]> git.saurik.com Git - wxWidgets.git/commitdiff
1.10.2 and less mbtowc and wctomb HAVE THE COOTIEScd .. (they are just stubs and...
authorRyan Norton <wxprojects@comcast.net>
Thu, 7 Oct 2004 22:28:57 +0000 (22:28 +0000)
committerRyan Norton <wxprojects@comcast.net>
Thu, 7 Oct 2004 22:28:57 +0000 (22:28 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29717 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/string.h
include/wx/wxchar.h
src/common/string.cpp
src/common/wxchar.cpp
tests/strings/strings.cpp

index f2ba5dfa68840b2018eac5a859284046a7fcc84e..30b903e3226679bc6ff084a6b843fae524b21529 100644 (file)
@@ -819,8 +819,7 @@ public:
     // type differs because a function may either return pointer to the buffer
     // directly or have to use intermediate buffer for translation.
 #if wxUSE_UNICODE
-    const wxCharBuffer mb_str(wxMBConv& conv = wxConvLibc) const
-        { return conv.cWC2MB(c_str()); }
+    const wxCharBuffer mb_str(wxMBConv& conv = wxConvLibc) const;
 
     const wxWX2MBbuf mbc_str() const { return mb_str(*wxConvCurrent); }
 
@@ -843,8 +842,7 @@ public:
     const wxWX2MBbuf mbc_str() const { return mb_str(); }
 
 #if wxUSE_WCHAR_T
-    const wxWCharBuffer wc_str(wxMBConv& conv) const
-        { return conv.cMB2WC(c_str()); }
+    const wxWCharBuffer wc_str(wxMBConv& conv) const;
 #endif // wxUSE_WCHAR_T
 
     const wxChar* fn_str() const { return c_str(); }
index 515d80ddfec0531dc4018c3fdc07012d502ccbe5..e6f54b771e0d2e428c3f91415fcbe88720727e6b 100644 (file)
     #define  wxCtime     _tctime
 #else /* !TCHAR-aware compilers */
 
+    #if __DARWIN__ && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) && !defined(__MWERKS__)
+        /* even though they are defined and "implemented", they are bad and just 
+           stubs so we need our own - we need these even in ANSI builds!! */
+        #define mbstowcs wxInternalMbstowcs
+        #define wcstombs wxInternalWcstombs
+        
+        WXDLLIMPEXP_BASE size_t wxInternalMbstowcs (wchar_t *, const char *, size_t);
+        WXDLLIMPEXP_BASE size_t        wxInternalWcstombs (char *, const wchar_t *, size_t);
+    #endif
+    
     /* No UNICODE in the c library except wchar_t typedef on mac OSX 10.2 and less - roll our own */
     #if wxUSE_UNICODE && __DARWIN__ && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) && !defined(__MWERKS__)
-
+        
         /* we need everything! */
         #define wxNEED_WX_STRING_H
         #define wxNEED_WX_CTYPE_H
-         
+        
         #define  wxFgetchar(c)  wxFgetc(c, stdin)
         #define  wxFputc     wxPutc
         #define  wxFputchar(c)  wxPutc(c, stdout)
         #define wxNEED_WX_STDIO_H
         #define wxNEED_WX_STDLIB_H
         #define wxNEED_WX_TIME_H
-        
-        /* even though they are defined and "implemented", they are bad and just 
-           stubs so we need our own */
-        #define mbstowcs wxInternalMbstowcs
-        #define wcstombs wxInternalWcstombs
-        
-        WXDLLIMPEXP_BASE size_t wxInternalMbstowcs (wchar_t *, const char *, size_t);
-        WXDLLIMPEXP_BASE size_t        wxInternalWcstombs (char *, const wchar_t *, size_t);
-        
+                
     #elif wxUSE_UNICODE
         #include <wctype.h>
 
index 7532732646f332774b5bedf1a23e28346709832c..f27e32da9bae78dc157b4698beb7eef9cb23b3b9 100644 (file)
@@ -1043,6 +1043,36 @@ wxString::wxString(const char *psz, wxMBConv& conv, size_t nLength)
             //else: the conversion failed -- leave the string empty (what else?)
         }
     }
+}        
+
+const wxCharBuffer wxString::mb_str(wxMBConv& conv) const
+{
+    const wxChar* szEnd = (*this).c_str() + length() + 1;
+    const wxChar* szPos = (*this).c_str();
+    const wxChar* szStart = szPos;
+    
+    wxCharBuffer buffer(length() + 1);
+    
+    //Convert the string until the length() is reached, continuing the
+    //loop every time a null character is reached
+    while(szPos != szEnd)
+    {
+        size_t nLen = conv.WC2MB(NULL, szPos, 0);
+        
+        wxASSERT(nLen != (size_t)-1); //should not be true!  If it is system wctomb could be bad
+
+        if ( conv.WC2MB(&buffer.data()[szPos - szStart], szPos, nLen + 1) == (size_t)-1 )
+        {
+            //error - return empty buffer
+            wxFAIL_MSG(wxT("Error converting wide-character string to a multi-byte string"));
+            buffer.data()[0] = '\0';
+            return buffer;
+        }        
+        
+        szPos += nLen + 1;
+    }
+    
+    return buffer;
 }
 
 #else // ANSI
@@ -1101,6 +1131,37 @@ wxString::wxString(const wchar_t *pwz, wxMBConv& conv, size_t nLength)
 
     // leave empty
 }
+
+const wxWCharBuffer wxString::wc_str(wxMBConv& conv) const
+{
+    const wxChar* szEnd = (*this).c_str() + length() + 1;
+    const wxChar* szPos = (*this).c_str();
+    const wxChar* szStart = szPos;
+    
+    wxWCharBuffer buffer(length() + 1);
+    
+    //Convert the string until the length() is reached, continuing the
+    //loop every time a null character is reached
+    while(szPos != szEnd)
+    {
+        size_t nLen = conv.MB2WC(NULL, szPos, 0);
+        
+        wxASSERT(nLen != (size_t)-1); //should not be true!  If it is system mbtowc could be bad
+        
+        if ( conv.MB2WC(&buffer.data()[szPos - szStart], szPos, nLen + 1) == (size_t)-1 )
+        {
+            //error - return empty buffer
+            wxFAIL_MSG(wxT("Error converting multi-byte string to a wide-character string"));
+            buffer.data()[0] = '\0';
+            return buffer;
+        }        
+        
+        szPos += nLen + 1;
+    }
+    
+    return buffer;
+}
+    
 #endif // wxUSE_WCHAR_T
 
 #endif // Unicode/ANSI
index 42d9449b8b36c3fb2f4edead2546e81cbab34588..1aa8374a8cf24ace448c265309ab2e01f1e7ef5c 100644 (file)
@@ -1043,7 +1043,7 @@ WXDLLEXPORT int wxTolower(wxChar ch) { return (wxChar)CharLower((LPTSTR)(ch)); }
 WXDLLEXPORT int wxToupper(wxChar ch) { return (wxChar)CharUpper((LPTSTR)(ch)); }
 #endif
 
-#if wxUSE_UNICODE && __DARWIN__ && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) 
+#if __DARWIN__ && ( MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 ) 
 
 WXDLLEXPORT size_t wxInternalMbstowcs (wchar_t * out, const char * in, size_t outlen)
 {
index 83c1cc24a65ccbc5b39da7075371fdbcaeacccf3..b27fbc79f133efa4cecc2818064683ab6ef11ec3 100644 (file)
@@ -43,6 +43,7 @@ private:
 #if wxUSE_WCHAR_T
         CPPUNIT_TEST( ConstructorsWithConversion );
 #endif
+        CPPUNIT_TEST( Conversion );
         CPPUNIT_TEST( Extraction );
         CPPUNIT_TEST( Find );
         CPPUNIT_TEST( Tokenizer );
@@ -60,6 +61,7 @@ private:
 #if wxUSE_WCHAR_T
     void ConstructorsWithConversion();
 #endif
+    void Conversion();
     void Extraction();
     void Find();
     void SingleTokenizerTest( wxChar *str, wxChar *delims, size_t count , wxStringTokenizerMode mode );
@@ -176,6 +178,31 @@ void StringTestCase::ConstructorsWithConversion()
 }
 #endif
 
+void StringTestCase::Conversion()
+{
+#if wxUSE_UNICODE
+        wxString szTheString(wxT("TheString"));
+        szTheString.insert(3, 1, '\0');
+        wxCharBuffer theBuffer = szTheString.mb_str();
+        
+        CPPUNIT_ASSERT( memcmp(theBuffer.data(), "The\0String", 11) == 0 );     
+#else
+#      if wxUSE_WCHAR_T
+        wxString szTheString(wxT("TheString"));
+        szTheString.insert(3, 1, '\0');
+        wxWCharBuffer theBuffer = szTheString.wc_str(wxConvLibc);
+        
+        CPPUNIT_ASSERT( memcmp(theBuffer.data(), L"The\0String", 11 * sizeof(wchar_t)) == 0 ); 
+
+        wxString szLocalTheString(wxT("TheString"));
+        szLocalTheString.insert(3, 1, '\0');
+        wxWCharBuffer theLocalBuffer = szLocalTheString.wc_str(wxConvLocal);
+        
+        CPPUNIT_ASSERT( memcmp(theLocalBuffer.data(), L"The\0String", 11 * sizeof(wchar_t)) == 0 ); 
+#      endif
+#endif
+}
+
 void StringTestCase::Extraction()
 {
     wxString s(_T("Hello, world!"));