Commit 8acdc1f5 authored by KO Myung-Hun's avatar KO Myung-Hun Committed by Rafaël Carré

Mimic a behavior of GNU libiconv on OS/2

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: default avatarRafaël Carré <funman@videolan.org>
parent 2cc70e68
...@@ -37,6 +37,15 @@ ...@@ -37,6 +37,15 @@
# include <iconv.h> # include <iconv.h>
#endif #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 * Local conversion routine from ISO_6937 to UTF-8 charset. Support for this
* is still missing in libiconv, hence multiple operating systems lack it. * 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 ) ...@@ -329,6 +338,7 @@ vlc_iconv_t vlc_iconv_open( const char *tocode, const char *fromcode )
# if defined(__OS2__) && defined(__INNOTEK_LIBC__) # if defined(__OS2__) && defined(__INNOTEK_LIBC__)
char tocode_ucs2[] = "UCS-2LE"; char tocode_ucs2[] = "UCS-2LE";
char fromcode_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 */ /* Workaround for UTF-16 because OS/2 supports UCS-2 only not UTF-16 */
if( !strncmp( tocode, "UTF-16", 6 )) if( !strncmp( tocode, "UTF-16", 6 ))
...@@ -342,8 +352,25 @@ vlc_iconv_t vlc_iconv_open( const char *tocode, const char *fromcode ) ...@@ -342,8 +352,25 @@ vlc_iconv_t vlc_iconv_open( const char *tocode, const char *fromcode )
strncpy( fromcode_ucs2 + 5, fromcode + 6, 2 ); strncpy( fromcode_ucs2 + 5, fromcode + 6, 2 );
fromcode = fromcode_ucs2; 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 ); return iconv_open( tocode, fromcode );
# endif
#else #else
return (vlc_iconv_t)(-1); return (vlc_iconv_t)(-1);
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment