]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/strconv.cpp
Compile fix for prop.
[wxWidgets.git] / src / common / strconv.cpp
index d613e6174a6757be60d4931bd05f7ab7f43ab733..235194fe4607e6d5da73565947e3ec145a3d3eb2 100644 (file)
@@ -66,7 +66,9 @@ public:
     virtual bool OnInit() { return TRUE; }
     virtual void OnExit()
     {
     virtual bool OnInit() { return TRUE; }
     virtual void OnExit()
     {
-        wxConvLocal.Clear();
+#if wxUSE_WCHAR_T
+         wxConvLocal.Clear();
+#endif
     }
 
     DECLARE_DYNAMIC_CLASS(wxStrConvModule)
     }
 
     DECLARE_DYNAMIC_CLASS(wxStrConvModule)
@@ -184,61 +186,69 @@ static size_t decode_utf16(const wchar_t* input, wxUint32& output)
 // wxMBConv
 // ----------------------------------------------------------------------------
 
 // wxMBConv
 // ----------------------------------------------------------------------------
 
+#define IGNORE_LIBC 0
+
 size_t wxMBConv::MB2WC(wchar_t *buf, const char *psz, size_t n) const
 {
 size_t wxMBConv::MB2WC(wchar_t *buf, const char *psz, size_t n) const
 {
+#if IGNORE_LIBC
+    if (buf)
+    {
+        for (size_t i = 0; i < strlen( psz )+1; i++)
+            buf[i] = (wchar_t) psz[i];
+        return strlen( psz );
+    }
+    else
+    {
+        return strlen( psz );
+    }
+#else
     return wxMB2WC(buf, psz, n);
     return wxMB2WC(buf, psz, n);
+#endif
 }
 
 size_t wxMBConv::WC2MB(char *buf, const wchar_t *psz, size_t n) const
 {
 }
 
 size_t wxMBConv::WC2MB(char *buf, const wchar_t *psz, size_t n) const
 {
+#if IGNORE_LIBC
+    if (buf)
+    {
+        for (size_t i = 0; i < wxStrlen( psz )+1; i++)
+            buf[i] = (char) psz[i];
+        return wxStrlen( psz );
+    }
+    else
+    {
+        return wxStrlen( psz );
+    }
+#else
     return wxWC2MB(buf, psz, n);
     return wxWC2MB(buf, psz, n);
+#endif
 }
 
 const wxWCharBuffer wxMBConv::cMB2WC(const char *psz) const
 {
     if (psz)
     {
 }
 
 const wxWCharBuffer wxMBConv::cMB2WC(const char *psz) const
 {
     if (psz)
     {
-        size_t nLen = MB2WC((wchar_t *) NULL, psz, 0);
+        size_t nLen = MB2WC((wchar_t *) NULL, psz, 0);  // return value excludes /0
         if (nLen == (size_t)-1)
             return wxWCharBuffer((wchar_t *) NULL);
         if (nLen == (size_t)-1)
             return wxWCharBuffer((wchar_t *) NULL);
-        wxWCharBuffer buf(nLen);
-        MB2WC((wchar_t *)(const wchar_t *) buf, psz, nLen);
+        wxWCharBuffer buf(nLen);                        // this allocates nLen1+
+        MB2WC((wchar_t *)(const wchar_t *) buf, psz, nLen+1);
         return buf;
     }
     else
         return wxWCharBuffer((wchar_t *) NULL);
 }
 
         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);
-        if (nLen == (size_t)-1)
-            return wxCharBuffer((char *) NULL);
-        wxCharBuffer buf(nLen);
-        WC2MB((char *)(const char *) buf, psz, nLen);
-        return buf;
-    }
-    else
-        return wxCharBuffer((char *) NULL);
-}
-
-// ----------------------------------------------------------------------------
-// standard file conversion
-// ----------------------------------------------------------------------------
-
-WXDLLEXPORT_DATA(wxMBConvFile) wxConvFile;
-
-// just use the libc conversion for now
-size_t wxMBConvFile::MB2WC(wchar_t *buf, const char *psz, size_t n) const
-{
-    return wxMB2WC(buf, psz, n);
-}
-
-size_t wxMBConvFile::WC2MB(char *buf, const wchar_t *psz, size_t n) const
+const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *pwz) const
 {
 {
-    return wxWC2MB(buf, psz, n);
+    // return value excludes NUL
+    size_t nLen = pwz ? WC2MB((char *) NULL, pwz, 0) : (size_t)-1;
+    if (nLen == (size_t)-1)
+        return wxCharBuffer((const char *)NULL);
+
+    wxCharBuffer buf(nLen);                      // this allocates nLen+1
+    WC2MB((char *)(const char *) buf, pwz, nLen+1);
+    return buf;
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------
@@ -423,6 +433,7 @@ size_t wxMBConvUTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const
     }
 
     if (buf && (len<n)) *buf = 0;
     }
 
     if (buf && (len<n)) *buf = 0;
+    
     return len;
 }
 
     return len;
 }
 
@@ -529,6 +540,11 @@ bool IC_CharSet::ms_wcNeedsSwap = FALSE;
 IC_CharSet::IC_CharSet(const wxChar *name)
           : wxCharacterSet(name)
 {
 IC_CharSet::IC_CharSet(const wxChar *name)
           : wxCharacterSet(name)
 {
+    // Do it the hard way
+    char cname[100];
+    for (size_t i = 0; i < wxStrlen(name)+1; i++)
+        cname[i] = (char) name[i];
+
     // check for charset that represents wchar_t:
     if (ms_wcCharsetName == NULL)
     {
     // check for charset that represents wchar_t:
     if (ms_wcCharsetName == NULL)
     {
@@ -536,20 +552,20 @@ IC_CharSet::IC_CharSet(const wxChar *name)
 
         // try charset with explicit bytesex info (e.g. "UCS-4LE"):
         ms_wcCharsetName = WC_NAME_BEST;
 
         // try charset with explicit bytesex info (e.g. "UCS-4LE"):
         ms_wcCharsetName = WC_NAME_BEST;
-        m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+        m2w = iconv_open(ms_wcCharsetName, cname);
 
         if (m2w == (iconv_t)-1)
         {
             // try charset w/o bytesex info (e.g. "UCS4")
             // and check for bytesex ourselves:
             ms_wcCharsetName = WC_NAME;
 
         if (m2w == (iconv_t)-1)
         {
             // try charset w/o bytesex info (e.g. "UCS4")
             // and check for bytesex ourselves:
             ms_wcCharsetName = WC_NAME;
-            m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+            m2w = iconv_open(ms_wcCharsetName, cname);
 
             // last bet, try if it knows WCHAR_T pseudo-charset
             if (m2w == (iconv_t)-1)
             {
                 ms_wcCharsetName = "WCHAR_T";
 
             // last bet, try if it knows WCHAR_T pseudo-charset
             if (m2w == (iconv_t)-1)
             {
                 ms_wcCharsetName = "WCHAR_T";
-                m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+                m2w = iconv_open(ms_wcCharsetName, cname);
             }
 
             if (m2w != (iconv_t)-1)
             }
 
             if (m2w != (iconv_t)-1)
@@ -595,13 +611,13 @@ IC_CharSet::IC_CharSet(const wxChar *name)
     }
     else // we already have ms_wcCharsetName
     {
     }
     else // we already have ms_wcCharsetName
     {
-        m2w = iconv_open(ms_wcCharsetName, wxConvLibc.cWX2MB(name));
+        m2w = iconv_open(ms_wcCharsetName, cname);
     }
 
     // NB: don't ever pass NULL to iconv_open(), it may crash!
     if ( ms_wcCharsetName )
     {
     }
 
     // NB: don't ever pass NULL to iconv_open(), it may crash!
     if ( ms_wcCharsetName )
     {
-        w2m = iconv_open(wxConvLibc.cWX2MB(name), ms_wcCharsetName);
+        w2m = iconv_open( cname, ms_wcCharsetName);
     }
     else
     {
     }
     else
     {
@@ -639,6 +655,12 @@ size_t IC_CharSet::MB2WC(wchar_t *buf, const char *psz, size_t n)
             // convert to native endianness
             WC_BSWAP(buf /* _not_ bufPtr */, res)
         }
             // convert to native endianness
             WC_BSWAP(buf /* _not_ bufPtr */, res)
         }
+        
+        // NB: iconv was given only strlen(psz) characters on input, and so
+        //     it couldn't convert the trailing zero. Let's do it ourselves
+        //     if there's some room left for it in the output buffer.
+        if (res < n)
+            buf[res] = 0;
     }
     else
     {
     }
     else
     {
@@ -698,6 +720,12 @@ size_t IC_CharSet::WC2MB(char *buf, const wchar_t *psz, size_t n)
         cres = iconv( w2m, ICONV_CHAR_CAST(&psz), &inbuf, &buf, &outbuf );
 
         res = n-outbuf;
         cres = iconv( w2m, ICONV_CHAR_CAST(&psz), &inbuf, &buf, &outbuf );
 
         res = n-outbuf;
+        
+        // NB: iconv was given only wcslen(psz) characters on input, and so
+        //     it couldn't convert the trailing zero. Let's do it ourselves
+        //     if there's some room left for it in the output buffer.
+        if (res < n)
+            buf[0] = 0;
     }
     else
     {
     }
     else
     {
@@ -789,7 +817,7 @@ public:
                                      enc(wxFONTENCODING_SYSTEM)
     {
         if (name)
                                      enc(wxFONTENCODING_SYSTEM)
     {
         if (name)
-            enc = wxTheFontMapper->CharsetToEncoding(name, FALSE);
+            enc = wxFontMapper::Get()->CharsetToEncoding(name, FALSE);
 
         m_ok = m2w.Init(enc, wxFONTENCODING_UNICODE) &&
                w2m.Init(wxFONTENCODING_UNICODE, enc);
 
         m_ok = m2w.Init(enc, wxFONTENCODING_UNICODE) &&
                w2m.Init(wxFONTENCODING_UNICODE, enc);
@@ -838,7 +866,7 @@ static wxCharacterSet *wxGetCharacterSet(const wxChar *name)
 {
     // check for the special case of ASCII charset
 #if wxUSE_FONTMAP
 {
     // check for the special case of ASCII charset
 #if wxUSE_FONTMAP
-    if ( wxTheFontMapper->CharsetToEncoding(name) == wxFONTENCODING_DEFAULT )
+    if ( wxFontMapper::Get()->CharsetToEncoding(name) == wxFONTENCODING_DEFAULT )
 #else // wxUSE_FONTMAP
     if ( !name )
 #endif // wxUSE_FONTMAP/!wxUSE_FONTMAP
 #else // wxUSE_FONTMAP
     if ( !name )
 #endif // wxUSE_FONTMAP/!wxUSE_FONTMAP
@@ -918,6 +946,20 @@ wxCSConv::~wxCSConv()
     Clear();
 }
 
     Clear();
 }
 
+wxCSConv::wxCSConv(const wxCSConv& conv)
+    : wxMBConv()
+{
+    Clear();
+    SetName(conv.m_name);
+}
+
+wxCSConv& wxCSConv::operator=(const wxCSConv& conv)
+{
+    Clear();
+    SetName(conv.m_name);
+    return *this;
+}
+
 void wxCSConv::Clear()
 {
     if (m_name)
 void wxCSConv::Clear()
 {
     if (m_name)
@@ -945,7 +987,9 @@ void wxCSConv::LoadNow()
         {
             wxString name = wxLocale::GetSystemEncodingName();
             if ( !name.empty() )
         {
             wxString name = wxLocale::GetSystemEncodingName();
             if ( !name.empty() )
+            {
                 SetName(name);
                 SetName(name);
+            }
         }
 
         // wxGetCharacterSet() complains about NULL name
         }
 
         // wxGetCharacterSet() complains about NULL name