]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/encconv.cpp
reuse Clear() instead of duplicating its code in Close()
[wxWidgets.git] / src / common / encconv.cpp
index dd7c28d52048b3a26fea28ff36207fa5bf8c3f84..a44449dc0d744a516082f79f767c0b3bbbcc888e 100644 (file)
@@ -7,10 +7,6 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "encconv.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
@@ -18,8 +14,6 @@
   #pragma hdrstop
 #endif
 
-#if wxUSE_FONTMAP
-
 #include "wx/encconv.h"
 
 #include <stdlib.h>
 #endif
 
 #ifdef __WXMAC__
-    #include <ATSUnicode.h>
-    #include <TextCommon.h>
-    #include <TextEncodingConverter.h>
-
+#ifdef __DARWIN__
+#include <Carbon/Carbon.h>
+#else
+#include <ATSUnicode.h>
+#include <TextCommon.h>
+#include <TextEncodingConverter.h>
+#endif
     #include "wx/fontutil.h"
     #include "wx/mac/private.h"  // includes mac headers
 
@@ -106,7 +103,7 @@ static CharsetItem* BuildReverseTable(wxUint16 *tbl)
     CharsetItem *rev = new CharsetItem[128];
 
     for (int i = 0; i < 128; i++)
-        rev[i].c = 128 + i, rev[i].u = tbl[i];
+        rev[i].c = wxUint8(128 + i), rev[i].u = tbl[i];
 
     qsort(rev, 128, sizeof(CharsetItem), CompareCharsetItems);
 
@@ -146,8 +143,7 @@ bool wxEncodingConverter::Init(wxFontEncoding input_enc, wxFontEncoding output_e
 
         m_Table = new tchar[65536];
         for (i = 0; i < 128; i++)  m_Table[i] = (tchar)i; // 7bit ASCII
-        for (i = 128; i < 65536; i++)  m_Table[i] = (tchar)'?';
-                // FIXME - this should be character that means `unicode to charset' impossible, not '?'
+        for (i = 128; i < 65536; i++)  m_Table[i] = (tchar)0;
 
         if (method == wxCONVERT_SUBSTITUTE)
         {
@@ -207,8 +203,21 @@ bool wxEncodingConverter::Init(wxFontEncoding input_enc, wxFontEncoding output_e
 }
 
 
+#define REPLACEMENT_CHAR  ((tchar)'?')
+
+inline tchar GetTableValue(const tchar *table, tchar value, bool& repl)
+{
+    tchar r = table[value];
+    if (r == 0 && value != 0)
+    {
+        r = REPLACEMENT_CHAR;
+        repl = true;
+    }
+    return r;
+}
+
 
-void wxEncodingConverter::Convert(const char* input, char* output) const
+bool wxEncodingConverter::Convert(const char* input, char* output) const
 {
     wxASSERT_MSG(!m_UnicodeOutput, wxT("You cannot convert to unicode if output is const char*!"));
     wxASSERT_MSG(!m_UnicodeInput, wxT("You cannot convert from unicode if input is const char*!"));
@@ -219,20 +228,25 @@ void wxEncodingConverter::Convert(const char* input, char* output) const
     if (m_JustCopy)
     {
         strcpy(output, input);
-        return;
+        return true;
     }
 
-    wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+    wxCHECK_MSG(m_Table != NULL, false,
+                wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+
+    bool replaced = false;
 
     for (i = input, o = output; *i != 0;)
-        *(o++) = (char)(m_Table[(wxUint8)*(i++)]);
+        *(o++) = (char)(GetTableValue(m_Table, (wxUint8)*(i++), replaced));
     *o = 0;
+
+    return !replaced;
 }
 
 
 #if wxUSE_WCHAR_T
 
-void wxEncodingConverter::Convert(const char* input, wchar_t* output) const
+bool wxEncodingConverter::Convert(const char* input, wchar_t* output) const
 {
     wxASSERT_MSG(m_UnicodeOutput, wxT("You cannot convert to 8-bit if output is const wchar_t*!"));
     wxASSERT_MSG(!m_UnicodeInput, wxT("You cannot convert from unicode if input is const char*!"));
@@ -245,19 +259,24 @@ void wxEncodingConverter::Convert(const char* input, wchar_t* output) const
         for (i = input, o = output; *i != 0;)
             *(o++) = (wchar_t)(*(i++));
         *o = 0;
-        return;
+        return true;
     }
 
-    wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+    wxCHECK_MSG(m_Table != NULL, false,
+                wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+
+    bool replaced = false;
 
     for (i = input, o = output; *i != 0;)
-        *(o++) = (wchar_t)(m_Table[(wxUint8)*(i++)]);
+        *(o++) = (wchar_t)(GetTableValue(m_Table, (wxUint8)*(i++), replaced));
     *o = 0;
+
+    return !replaced;
 }
 
 
 
-void wxEncodingConverter::Convert(const wchar_t* input, char* output) const
+bool wxEncodingConverter::Convert(const wchar_t* input, char* output) const
 {
     wxASSERT_MSG(!m_UnicodeOutput, wxT("You cannot convert to unicode if output is const char*!"));
     wxASSERT_MSG(m_UnicodeInput, wxT("You cannot convert from 8-bit if input is const wchar_t*!"));
@@ -270,19 +289,24 @@ void wxEncodingConverter::Convert(const wchar_t* input, char* output) const
         for (i = input, o = output; *i != 0;)
             *(o++) = (char)(*(i++));
         *o = 0;
-        return;
+        return true;
     }
 
-    wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+    wxCHECK_MSG(m_Table != NULL, false,
+                wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+
+    bool replaced = false;
 
     for (i = input, o = output; *i != 0;)
-        *(o++) = (char)(m_Table[(wxUint16)*(i++)]);
+        *(o++) = (char)(GetTableValue(m_Table, (wxUint16)*(i++), replaced));
     *o = 0;
+
+    return !replaced;
 }
 
 
 
-void wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output) const
+bool wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output) const
 {
     wxASSERT_MSG(m_UnicodeOutput, wxT("You cannot convert to 8-bit if output is const wchar_t*!"));
     wxASSERT_MSG(m_UnicodeInput, wxT("You cannot convert from 8-bit if input is const wchar_t*!"));
@@ -296,14 +320,19 @@ void wxEncodingConverter::Convert(const wchar_t* input, wchar_t* output) const
         for (i = input, o = output; *i != 0;)
             *(o++) = (*(i++));
         *o = 0;
-        return;
+        return true;
     }
 
-    wxCHECK_RET(m_Table != NULL, wxT("You must call wxEncodingConverter::Init() before actually converting!"));
+    wxCHECK_MSG(m_Table != NULL, false,
+                wxT("You must call wxEncodingConverter::Init() before actually converting!"));
 
+    bool replaced = false;
+    
     for (i = input, o = output; *i != 0;)
-        *(o++) = (wchar_t)(m_Table[(wxUint8)*(i++)]);
+        *(o++) = (wchar_t)(GetTableValue(m_Table, (wxUint8)*(i++), replaced));
     *o = 0;
+
+    return !replaced;
 }
 
 #endif // wxUSE_WCHAR_T
@@ -440,7 +469,7 @@ wxFontEncodingArray wxEncodingConverter::GetPlatformEquivalents(wxFontEncoding e
         platform = wxPLATFORM_WINDOWS;
 #elif defined(__WXGTK__) || defined(__WXMOTIF__)
         platform = wxPLATFORM_UNIX;
-#elif defined(__WXOS2__)
+#elif defined(__WXPM__)
         platform = wxPLATFORM_OS2;
 #elif defined(__WXMAC__)
         platform = wxPLATFORM_MAC;
@@ -498,4 +527,3 @@ wxFontEncodingArray wxEncodingConverter::GetAllEquivalents(wxFontEncoding enc)
     return arr;
 }
 
-#endif // wxUSE_FONTMAP