>From 8a9dc390303272e555032eeb3262c948812ee943 Mon Sep 17 00:00:00 2001 From: KO Myung-Hun 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 #endif +#if defined(__OS2__) && defined(__INNOTEK_LIBC__) +# include + +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