>From 8a9dc390303272e555032eeb3262c948812ee943 Mon Sep 17 00:00:00 2001
From: KO Myung-Hun <komh@chollian.net>
Date: Sat, 12 Mar 2011 10:51:31 +0900
Subject: [PATCH 03/44] Workaround for OS/2 iconv(), which 1. supports UCS-2 only not UTF-16 2. does not treat a string as a pathname by default

---
 src/extras/libc.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/src/extras/libc.c b/src/extras/libc.c
index 5004480..6a0295e 100644
--- a/src/extras/libc.c
+++ b/src/extras/libc.c
@@ -43,6 +43,15 @@
 #   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.
@@ -332,7 +341,42 @@ vlc_iconv_t vlc_iconv_open( const char *tocode, const char *fromcode )
         return (vlc_iconv_t)(-2);
 #endif
 #if defined(HAVE_ICONV)
+# 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 ))
+    {
+        strncpy( tocode_ucs2 + 5, tocode + 6, 2 );
+        tocode = tocode_ucs2;
+    }
+
+    if( !strncmp( fromcode, "UTF-16", 6 ))
+    {
+        strncpy( fromcode_ucs2 + 5, fromcode + 6, 2 );
+        fromcode = fromcode_ucs2;
+    }
+
+    p_os2_iconv = ( os2_iconv_t * )iconv_open( tocode, fromcode );
+
+    if( p_os2_iconv != ( iconv_t )(-1))
+    {
+        /* Assume strings contain pathnames */
+        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
--
1.7.3.2

