]> git.sesse.net Git - vlc/commitdiff
Mimic a behavior of GNU libiconv on OS/2
authorKO Myung-Hun <komh78@gmail.com>
Tue, 10 Jan 2012 12:07:03 +0000 (21:07 +0900)
committerRafaël Carré <funman@videolan.org>
Fri, 17 Feb 2012 08:46:58 +0000 (03:46 -0500)
DBCS countries assign their currency symbol to '\', ASCII 92. This causes
an unexpected behavior when converting a directory separator on OS/2.
In case of GNU libiconv, it does not treat '\', ASCII 92, as a currency
symbol at all. So let's mimic GNU libiconv.

Signed-off-by: Rafaël Carré <funman@videolan.org>
src/extras/libc.c

index 08b19fca88c71f4983d4f092304a24f3d173f689..3389c57d07516824d043d0aa03b23c165d50b820 100644 (file)
 #   include <iconv.h>
 #endif
 
+#if defined(__OS2__) && defined(__INNOTEK_LIBC__)
+#   include <uconv.h>
+
+typedef struct os2_iconv_t
+{
+    UconvObject from;
+} os2_iconv_t;
+#endif
+
 /*****************************************************************************
  * Local conversion routine from ISO_6937 to UTF-8 charset. Support for this
  * is still missing in libiconv, hence multiple operating systems lack it.
@@ -329,6 +338,7 @@ vlc_iconv_t vlc_iconv_open( const char *tocode, const char *fromcode )
 # if defined(__OS2__) && defined(__INNOTEK_LIBC__)
     char tocode_ucs2[] = "UCS-2LE";
     char fromcode_ucs2[] = "UCS-2LE";
+    os2_iconv_t *p_os2_iconv;
 
     /* Workaround for UTF-16 because OS/2 supports UCS-2 only not UTF-16 */
     if( !strncmp( tocode, "UTF-16", 6 ))
@@ -342,8 +352,25 @@ vlc_iconv_t vlc_iconv_open( const char *tocode, const char *fromcode )
         strncpy( fromcode_ucs2 + 5, fromcode + 6, 2 );
         fromcode = fromcode_ucs2;
     }
-# endif
+
+    p_os2_iconv = ( os2_iconv_t * )iconv_open( tocode, fromcode );
+
+    if( p_os2_iconv != ( iconv_t )(-1))
+    {
+        /* Mimic a behavior of GNU libiconv */
+        uconv_attribute_t attr;
+
+        UniQueryUconvObject( p_os2_iconv->from, &attr,
+                             sizeof( uconv_attribute_t ),
+                             NULL, NULL, NULL );
+        attr.converttype |= CVTTYPE_PATH;
+        UniSetUconvObject( p_os2_iconv->from, &attr );
+    }
+
+    return ( vlc_iconv_t )p_os2_iconv;
+# else
     return iconv_open( tocode, fromcode );
+# endif
 #else
     return (vlc_iconv_t)(-1);
 #endif