]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/strconv.cpp
Hopefully fixed library names generated by wx-config for OS/2's PM port.
[wxWidgets.git] / src / common / strconv.cpp
index a43f43550f6347db67a7cd2a0a82f1bd4f07d646..aea1e1a18af397c745fed35b26afb06974b988e3 100644 (file)
@@ -55,9 +55,6 @@
 #include <ctype.h>
 #include <string.h>
 #include <stdlib.h>
-#ifdef HAVE_LANGINFO_H
-  #include <langinfo.h>
-#endif
 
 #if defined(__WIN32__) && !defined(__WXMICROWIN__)
     #define wxHAVE_WIN32_MB2WC
@@ -155,7 +152,7 @@ static size_t decode_utf16(const wxUint16* input, wxUint32& output)
         output = *input;
         return 1;
     }
-    else if ((input[1]<0xdc00) || (input[1]>=0xdfff))
+    else if ((input[1]<0xdc00) || (input[1]>0xdfff))
     {
         output = *input;
         return (size_t)-1;
@@ -273,9 +270,9 @@ const wxWCharBuffer wxMBConv::cMB2WC(const char *szString, size_t nStringLen, si
         }
 
         //Increment to next (sub)string
-        //Note that we have to use strlen here instead of nLen
-        //here because XX2XX gives us the size of the output buffer,
-        //not neccessarly the length of the string
+        //Note that we have to use strlen instead of nLen here
+        //because XX2XX gives us the size of the output buffer,
+        //which is not necessarily the length of the string
         szPos += strlen(szPos) + 1;
     }
 
@@ -335,9 +332,9 @@ const wxCharBuffer wxMBConv::cWC2MB(const wchar_t *szString, size_t nStringLen,
         }
 
         //Increment to next (sub)string
-        //Note that we have to use wxWcslen here instead of nLen
-        //here because XX2XX gives us the size of the output buffer,
-        //not neccessarly the length of the string
+        //Note that we have to use wxWcslen instead of nLen here
+        //because XX2XX gives us the size of the output buffer,
+        //which is not necessarily the length of the string
         szPos += wxWcslen(szPos) + 1;
     }
 
@@ -366,34 +363,13 @@ size_t wxMBConvLibc::WC2MB(char *buf, const wchar_t *psz, size_t n) const
 // wxConvBrokenFileNames 
 // ----------------------------------------------------------------------------
 
-wxConvBrokenFileNames::wxConvBrokenFileNames()
+wxConvBrokenFileNames::wxConvBrokenFileNames(const wxChar *charset)
 {
-    // decide which conversion to use for the file names
-
-    // (1) this variable exists for the sole purpose of specifying the encoding
-    //     of the filenames for GTK+ programs, so use it if it is set
-    const wxChar *encName = wxGetenv(_T("G_FILENAME_ENCODING"));
-    if ( encName )
-    {
-        m_conv = new wxCSConv(encName);
-    }
-    else // no G_FILENAME_ENCODING
-    {
-        // (2) if a non default locale is set, assume that the user wants his
-        //     filenames in this locale too
-        switch ( wxLocale::GetSystemEncoding() )
-        {
-            default:
-                m_conv = new wxMBConvLibc;
-                break;
-
-            // (3) finally use UTF-8 by default
-            case wxFONTENCODING_SYSTEM:
-            case wxFONTENCODING_UTF8:
-                m_conv = new wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL);
-                break;
-        }
-    }
+    if ( !charset || wxStricmp(charset, _T("UTF-8")) == 0
+                  || wxStricmp(charset, _T("UTF8")) == 0  )
+        m_conv = new wxMBConvUTF8(wxMBConvUTF8::MAP_INVALID_UTF8_TO_OCTAL);
+    else
+        m_conv = new wxCSConv(charset);
 }
 
 size_t
@@ -648,6 +624,15 @@ size_t wxMBConvUTF8::MB2WC(wchar_t *buf, const char *psz, size_t n) const
             if (buf)
                 *buf++ = cc;
             len++;
+
+            // escape the escape character for octal escapes
+            if ((m_options & MAP_INVALID_UTF8_TO_OCTAL)
+                    && cc == '\\' && (!buf || len < n))
+            {
+                if (buf)
+                    *buf++ = cc;
+                len++;
+            }
         }
         else
         {
@@ -785,6 +770,14 @@ size_t wxMBConvUTF8::WC2MB(char *buf, const wchar_t *psz, size_t n) const
                 *buf++ = (char)(cc - wxUnicodePUA);
             len++;
         }
+        else if ( (m_options & MAP_INVALID_UTF8_TO_OCTAL)
+                    && cc == L'\\' && psz[0] == L'\\' )
+        {
+            if (buf)
+                *buf++ = (char)cc;
+            psz++;
+            len++;
+        }
         else if ( (m_options & MAP_INVALID_UTF8_TO_OCTAL) &&
                     cc == L'\\' &&
                         isoctal(psz[0]) && isoctal(psz[1]) && isoctal(psz[2]) )
@@ -2123,7 +2116,7 @@ public:
         UniChar* szUniBuffer = (UniChar*) szUnConv;
 
 #if SIZEOF_WCHAR_T == 4
-        wxMBConvUTF16BE converter ;
+        wxMBConvUTF16 converter ;
         nBufSize = converter.WC2MB( NULL , szUnConv , 0 );
         szUniBuffer = new UniChar[ (nBufSize / sizeof(UniChar)) + 1] ;
         converter.WC2MB( (char*) szUniBuffer , szUnConv, nBufSize + sizeof(UniChar)) ;
@@ -2259,7 +2252,7 @@ public:
         // we have to terminate here, because n might be larger for the trailing zero, and if UniChar
         // is not properly terminated we get random characters at the end
         ubuf[byteOutLen / sizeof( UniChar ) ] = 0 ;
-        wxMBConvUTF16BE converter ;
+        wxMBConvUTF16 converter ;
         res = converter.MB2WC( (buf ? buf : tbuf) , (const char*)ubuf , n ) ;
         free( ubuf ) ;
 #else
@@ -2292,7 +2285,7 @@ public:
         ByteCount byteBufferLen = n ;
         UniChar* ubuf = NULL ;
 #if SIZEOF_WCHAR_T == 4
-        wxMBConvUTF16BE converter ;
+        wxMBConvUTF16 converter ;
         size_t unicharlen = converter.WC2MB( NULL , psz , 0 ) ;
         byteInLen = unicharlen ;
         ubuf = (UniChar*) malloc( byteInLen + 2 ) ;