X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_charset.h;h=56808f37d4b6b293912498da0322bf69c5d45d70;hb=4be9fdff0f8279cb1164b12bf169beda4158a331;hp=5c7590f10adadcc86462c4f329322e621fb2e229;hpb=5d3ffa0e963370f821e71dfb055b49ed7d8c8a2d;p=vlc diff --git a/include/vlc_charset.h b/include/vlc_charset.h index 5c7590f10a..56808f37d4 100644 --- a/include/vlc_charset.h +++ b/include/vlc_charset.h @@ -1,25 +1,25 @@ /***************************************************************************** - * charset.h: Unicode UTF-8 wrappers function + * vlc_charset.h: Unicode UTF-8 wrappers function ***************************************************************************** - * Copyright (C) 2003-2005 the VideoLAN team + * Copyright (C) 2003-2005 VLC authors and VideoLAN * Copyright © 2005-2010 Rémi Denis-Courmont * $Id$ * * Author: Rémi Denis-Courmont * - * 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 + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #ifndef VLC_CHARSET_H @@ -32,27 +32,24 @@ /* iconv wrappers (defined in src/extras/libc.c) */ typedef void *vlc_iconv_t; -VLC_EXPORT( vlc_iconv_t, vlc_iconv_open, ( const char *, const char * ) LIBVLC_USED ); -VLC_EXPORT( size_t, vlc_iconv, ( vlc_iconv_t, const char **, size_t *, char **, size_t * ) LIBVLC_USED ); -VLC_EXPORT( int, vlc_iconv_close, ( vlc_iconv_t ) ); +VLC_API vlc_iconv_t vlc_iconv_open( const char *, const char * ) VLC_USED; +VLC_API size_t vlc_iconv( vlc_iconv_t, const char **, size_t *, char **, size_t * ) VLC_USED; +VLC_API int vlc_iconv_close( vlc_iconv_t ); #include -VLC_EXPORT( void, LocaleFree, ( const char * ) ); -VLC_EXPORT( char *, FromLocale, ( const char * ) LIBVLC_USED ); -VLC_EXPORT( char *, FromLocaleDup, ( const char * ) LIBVLC_USED ); -VLC_EXPORT( char *, ToLocale, ( const char * ) LIBVLC_USED ); -VLC_EXPORT( char *, ToLocaleDup, ( const char * ) LIBVLC_USED ); +VLC_API int utf8_vfprintf( FILE *stream, const char *fmt, va_list ap ); +VLC_API int utf8_fprintf( FILE *, const char *, ... ) VLC_FORMAT( 2, 3 ); +VLC_API char * vlc_strcasestr(const char *, const char *) VLC_USED; -VLC_EXPORT( int, utf8_vfprintf, ( FILE *stream, const char *fmt, va_list ap ) ); -VLC_EXPORT( int, utf8_fprintf, ( FILE *, const char *, ... ) LIBVLC_FORMAT( 2, 3 ) ); -VLC_EXPORT( char *, vlc_strcasestr, (const char *, const char *) LIBVLC_USED ); +VLC_API char * EnsureUTF8( char * ); +VLC_API const char * IsUTF8( const char * ) VLC_USED; -VLC_EXPORT( char *, EnsureUTF8, ( char * ) ); -VLC_EXPORT( const char *, IsUTF8, ( const char * ) LIBVLC_USED ); +VLC_API char * FromCharset( const char *charset, const void *data, size_t data_size ) VLC_USED; +VLC_API void * ToCharset( const char *charset, const char *in, size_t *outsize ) VLC_USED; #ifdef WIN32 -LIBVLC_USED +VLC_USED static inline char *FromWide (const wchar_t *wide) { size_t len = WideCharToMultiByte (CP_UTF8, 0, wide, -1, NULL, 0, NULL, NULL); @@ -66,7 +63,7 @@ static inline char *FromWide (const wchar_t *wide) return out; } -LIBVLC_USED +VLC_USED static inline wchar_t *ToWide (const char *utf8) { int len = MultiByteToWideChar (CP_UTF8, 0, utf8, -1, NULL, 0); @@ -79,6 +76,103 @@ static inline wchar_t *ToWide (const char *utf8) MultiByteToWideChar (CP_UTF8, 0, utf8, -1, out, len); return out; } + +VLC_USED VLC_MALLOC +static inline char *ToCodePage (unsigned cp, const char *utf8) +{ + wchar_t *wide = ToWide (utf8); + if (wide == NULL) + return NULL; + + size_t len = WideCharToMultiByte (cp, 0, wide, -1, NULL, 0, NULL, NULL); + if (len == 0) + return NULL; + + char *out = (char *)malloc (len); + if (likely(out != NULL)) + WideCharToMultiByte (cp, 0, wide, -1, out, len, NULL, NULL); + free (wide); + return out; +} + +VLC_USED VLC_MALLOC +static inline char *FromCodePage (unsigned cp, const char *mb) +{ + int len = MultiByteToWideChar (cp, 0, mb, -1, NULL, 0); + if (len == 0) + return NULL; + + wchar_t *wide = (wchar_t *)malloc (len * sizeof (wchar_t)); + if (unlikely(wide == NULL)) + return NULL; + MultiByteToWideChar (cp, 0, mb, -1, wide, len); + + char *utf8 = FromWide (wide); + free (wide); + return utf8; +} + +VLC_USED VLC_MALLOC +static inline char *FromANSI (const char *ansi) +{ + return FromCodePage (GetACP (), ansi); +} + +VLC_USED VLC_MALLOC +static inline char *ToANSI (const char *utf8) +{ + return ToCodePage (GetACP (), utf8); +} + +# ifdef UNICODE +# define FromT FromWide +# define ToT ToWide +# else +# define FromT FromANSI +# define ToT ToANSI +# endif +# define FromLocale FromANSI +# define ToLocale ToANSI +# define LocaleFree(s) free((char *)(s)) +# define FromLocaleDup FromANSI +# define ToLocaleDup ToANSI + +#elif defined(__OS2__) + +VLC_USED static inline char *FromLocale (const char *locale) +{ + return locale ? FromCharset ((char *)"", locale, strlen(locale)) : NULL; +} + +VLC_USED static inline char *ToLocale (const char *utf8) +{ + size_t outsize; + return utf8 ? (char *)ToCharset ("", utf8, &outsize) : NULL; +} + +VLC_USED static inline void LocaleFree (const char *str) +{ + free ((char *)str); +} + +VLC_USED static inline char *FromLocaleDup (const char *locale) +{ + return FromCharset ("", locale, strlen(locale)); +} + +VLC_USED static inline char *ToLocaleDup (const char *utf8) +{ + size_t outsize; + return (char *)ToCharset ("", utf8, &outsize); +} + +#else + +# define FromLocale(l) (l) +# define ToLocale(u) (u) +# define LocaleFree(s) ((void)(s)) +# define FromLocaleDup strdup +# define ToLocaleDup strdup #endif /** @@ -108,13 +202,10 @@ static inline char *FromLatin1 (const char *latin) return utf8 ? utf8 : str; } -VLC_EXPORT( char *, FromCharset, ( const char *charset, const void *data, size_t data_size ) LIBVLC_USED ); -VLC_EXPORT( void *, ToCharset, ( const char *charset, const char *in, size_t *outsize ) LIBVLC_USED ); - -VLC_EXPORT( double, us_strtod, ( const char *, char ** ) LIBVLC_USED ); -VLC_EXPORT( float, us_strtof, ( const char *, char ** ) LIBVLC_USED ); -VLC_EXPORT( double, us_atof, ( const char * ) LIBVLC_USED ); -VLC_EXPORT( int, us_vasprintf, ( char **, const char *, va_list ) ); -VLC_EXPORT( int, us_asprintf, ( char **, const char *, ... ) LIBVLC_USED ); +VLC_API double us_strtod( const char *, char ** ) VLC_USED; +VLC_API float us_strtof( const char *, char ** ) VLC_USED; +VLC_API double us_atof( const char * ) VLC_USED; +VLC_API int us_vasprintf( char **, const char *, va_list ); +VLC_API int us_asprintf( char **, const char *, ... ) VLC_USED; #endif