[vlc-devel] [PATCH 03/41] 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

Rémi Denis-Courmont remi at remlab.net
Tue Oct 11 19:06:53 CEST 2011


Le lundi 10 octobre 2011 14:43:42 KO Myung-Hun, vous avez écrit :
> ---
>  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
> 
> +#ifdef __OS2__
> +#   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", 5 ))

Should probably be 6 rather than 5.

> +    {
> +        strncpy( tocode_ucs2 + 5, tocode + 6, 2 );
> +        tocode = tocode_ucs2;
> +    }
> +
> +    if( !strncmp( fromcode, "UTF-16", 5 ))

Same problem.

> +    {
> +        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 );
> +    }

I don't understand this if-block at all. It seems totally out of place. If you 
need to convert paths differently, then you should modify FromLocale() and the 
likes instead.

> +
> +    return ( vlc_iconv_t )p_os2_iconv;
> +# else
>      return iconv_open( tocode, fromcode );
> +# endif
>  #else
>      return (vlc_iconv_t)(-1);
>  #endif


-- 
Rémi Denis-Courmont
http://www.remlab.net/
http://fi.linkedin.com/in/remidenis



More information about the vlc-devel mailing list