Commit 8d7e6079 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Inline FromUTF16 and use Win32 API

(suppress one more ugly piece of code)
parent 19a76342
......@@ -2,9 +2,11 @@
* charset.h: Determine a canonical name for the current locale's character encoding.
*****************************************************************************
* Copyright (C) 2003-2005 the VideoLAN team
* Copyright © 2005-2006 Rémi Denis-Courmont
* $Id$
*
* Author: Derk-Jan Hartman <thedj at users.sourceforge.net>
* Authors: Rémi Denis-Courmont <rem # videolan,org>
* Derk-Jan Hartman <thedj at users.sourceforge.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......@@ -53,8 +55,7 @@ VLC_EXPORT( char *, EnsureUTF8, ( char * ) );
VLC_EXPORT( const char *, IsUTF8, ( const char * ) );
#ifdef WIN32
VLC_EXPORT( char *, FromUTF16, ( const uint16_t * ) );
#define FromWide FromUTF16
VLC_EXPORT( char *, FromWide, ( const wchar_t * ) );
#endif
......
......@@ -483,7 +483,7 @@ struct module_symbols_t
char * (*convert_xml_special_chars_inner) (const char *psz_content);
char * (*unescape_URI_duplicate_inner) (const char *psz);
void (*resolve_xml_special_chars_inner) (char *psz_value);
char * (*FromUTF16_inner) (const uint16_t *);
void *FromUTF16_deprecated;
const char * (*IsUTF8_inner) (const char *);
const char * (*GetFallbackEncoding_inner) (void);
int (*utf8_scandir_inner) (const char *dirname, char ***namelist, int (*select)( const char * ), int (*compar)( const char **, const char ** ));
......@@ -557,6 +557,7 @@ struct module_symbols_t
int (*net_ListenSingle_inner) (vlc_object_t *p_this, const char *psz_host, int i_port, int family, int socktype, int protocol);
char * (*str_format_time_inner) (char *);
char * (*__str_format_meta_inner) (vlc_object_t *, char *);
char * (*FromWide_inner) (const wchar_t *);
};
# if defined (__PLUGIN__)
# define aout_FiltersCreatePipeline (p_symbols)->aout_FiltersCreatePipeline_inner
......@@ -979,7 +980,6 @@ struct module_symbols_t
# define convert_xml_special_chars (p_symbols)->convert_xml_special_chars_inner
# define unescape_URI_duplicate (p_symbols)->unescape_URI_duplicate_inner
# define resolve_xml_special_chars (p_symbols)->resolve_xml_special_chars_inner
# define FromUTF16 (p_symbols)->FromUTF16_inner
# define IsUTF8 (p_symbols)->IsUTF8_inner
# define GetFallbackEncoding (p_symbols)->GetFallbackEncoding_inner
# define utf8_scandir (p_symbols)->utf8_scandir_inner
......@@ -1035,6 +1035,7 @@ struct module_symbols_t
# define net_ListenSingle (p_symbols)->net_ListenSingle_inner
# define str_format_time (p_symbols)->str_format_time_inner
# define __str_format_meta (p_symbols)->__str_format_meta_inner
# define FromWide (p_symbols)->FromWide_inner
# elif defined (HAVE_DYNAMIC_PLUGINS) && !defined (__BUILTIN__)
/******************************************************************
* STORE_SYMBOLS: store VLC APIs into p_symbols for plugin access.
......@@ -1460,7 +1461,6 @@ struct module_symbols_t
((p_symbols)->convert_xml_special_chars_inner) = convert_xml_special_chars; \
((p_symbols)->unescape_URI_duplicate_inner) = unescape_URI_duplicate; \
((p_symbols)->resolve_xml_special_chars_inner) = resolve_xml_special_chars; \
((p_symbols)->FromUTF16_inner) = FromUTF16; \
((p_symbols)->IsUTF8_inner) = IsUTF8; \
((p_symbols)->GetFallbackEncoding_inner) = GetFallbackEncoding; \
((p_symbols)->utf8_scandir_inner) = utf8_scandir; \
......@@ -1516,6 +1516,7 @@ struct module_symbols_t
((p_symbols)->net_ListenSingle_inner) = net_ListenSingle; \
((p_symbols)->str_format_time_inner) = str_format_time; \
((p_symbols)->__str_format_meta_inner) = __str_format_meta; \
((p_symbols)->FromWide_inner) = FromWide; \
(p_symbols)->net_ConvertIPv4_deprecated = NULL; \
(p_symbols)->__sout_CfgParse_deprecated = NULL; \
(p_symbols)->sout_CfgCreate_deprecated = NULL; \
......@@ -1560,6 +1561,7 @@ struct module_symbols_t
(p_symbols)->vlc_HashInsert_deprecated = NULL; \
(p_symbols)->vlc_HashLookup_deprecated = NULL; \
(p_symbols)->vlc_HashRetrieve_deprecated = NULL; \
(p_symbols)->FromUTF16_deprecated = NULL; \
(p_symbols)->playlist_ItemNewFromInput_deprecated = NULL; \
(p_symbols)->playlist_PlaylistAdd_deprecated = NULL; \
(p_symbols)->playlist_PlaylistAddExt_deprecated = NULL; \
......
......@@ -7,9 +7,6 @@
*
* Authors: Rémi Denis-Courmont <rem # videolan.org>
*
* UTF16toUTF8() adapted from Perl 5 (also GPL'd)
* Copyright (C) 1998-2002, Larry Wall
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
......@@ -778,96 +775,3 @@ const char *IsUTF8( const char *str )
{
return CheckUTF8( (char *)str, 0 );
}
/**
* UTF16toUTF8: converts UTF-16 (host byte order) to UTF-8
*
* @param src UTF-16 bytes sequence, aligned on a 16-bits boundary
* @param len number of uint16_t to convert
*/
static inline char *
UTF16toUTF8( const uint16_t *in, size_t len, size_t *newlen )
{
char *res, *out;
/* allocate memory */
out = res = (char *)malloc( 3 * len );
if( res == NULL )
return NULL;
while( len > 0 )
{
uint32_t uv = *in;
in++;
len--;
if( uv < 0x80 )
{
*out++ = uv;
continue;
}
if( uv < 0x800 )
{
*out++ = (( uv >> 6) | 0xc0);
*out++ = (( uv & 0x3f) | 0x80);
continue;
}
if( (uv >= 0xd800) && (uv < 0xdbff) )
{ /* surrogates */
uint16_t low = GetWBE( in );
in++;
len--;
if( (low < 0xdc00) || (low >= 0xdfff) )
{
*out++ = '?'; /* Malformed surrogate */
continue;
}
else
uv = ((uv - 0xd800) << 10) + (low - 0xdc00) + 0x10000;
}
if( uv < 0x10000 )
{
*out++ = (( uv >> 12) | 0xe0);
*out++ = (((uv >> 6) & 0x3f) | 0x80);
*out++ = (( uv & 0x3f) | 0x80);
continue;
}
else
{
*out++ = (( uv >> 18) | 0xf0);
*out++ = (((uv >> 12) & 0x3f) | 0x80);
*out++ = (((uv >> 6) & 0x3f) | 0x80);
*out++ = (( uv & 0x3f) | 0x80);
continue;
}
}
len = out - res;
res = realloc( res, len );
if( newlen != NULL )
*newlen = len;
return res;
}
/**
* FromUTF16(): converts an UTF-16 string to UTF-8.
*
* @param src UTF-16 bytes sequence, aligned on a 16-bits boundary.
*
* @return the result of the conversion (must be free()'d),
* or NULL in case of error.
*/
char *FromUTF16( const uint16_t *src )
{
const uint16_t *in;
size_t len;
/* determine the size of the string */
for( len = 1, in = src; *in; len++ )
in++;
return UTF16toUTF8( src, len, NULL );
}
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