]> git.sesse.net Git - vlc/commitdiff
Added FromCharset helper.
authorLaurent Aimar <fenrir@videolan.org>
Mon, 25 Jan 2010 22:05:53 +0000 (23:05 +0100)
committerLaurent Aimar <fenrir@videolan.org>
Mon, 25 Jan 2010 22:10:11 +0000 (23:10 +0100)
 It allows to easily convert from any charset supported by
vlc_iconv to UTF-8 (but with a performance penalty).

include/vlc_charset.h
src/text/unicode.c

index ab6d5299a67ed9f06256accd10bc94ff6b1d4c77..81af0c1df176b4915aedb76af0ee4901be8ac582 100644 (file)
@@ -109,6 +109,8 @@ 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( const char *, GetFallbackEncoding, ( void ) LIBVLC_USED );
 
 VLC_EXPORT( double, us_strtod, ( const char *, char ** ) LIBVLC_USED );
index 1fa90e29f35d90b772e2fec5ee6950ffbae89a3a..8a8641724cccf70194b0d93d5068813c8305bf27 100644 (file)
@@ -40,6 +40,7 @@
 #ifdef UNDER_CE
 #  include <tchar.h>
 #endif
+#include <errno.h>
 
 #if defined (__APPLE__) || defined (HAVE_MAEMO)
 /* Define this if the OS always use UTF-8 internally */
@@ -365,3 +366,40 @@ const char *IsUTF8( const char *str )
 {
     return CheckUTF8( (char *)str, 0 );
 }
+
+/**
+ * Converts a string from the given character encoding to utf-8.
+ *
+ * @return a nul-terminated utf-8 string, or null in case of error.
+ * The result must be freed using free().
+ */
+static char *FromCharset(const char *charset, const void *data, size_t data_size)
+{
+    vlc_iconv_t handle = vlc_iconv_open ("UTF-8", charset);
+    if (handle == (vlc_iconv_t)(-1))
+        return NULL;
+
+    char *out = NULL;
+    for(unsigned mul = 4; mul < 8; mul++ )
+    {
+        size_t in_size = data_size;
+        const char *in = data;
+        size_t out_max = mul * data_size;
+        char *tmp = out = malloc (1 + out_max);
+        if (!out)
+            break;
+
+        if (vlc_iconv (handle, &in, &in_size, &tmp, &out_max) != (size_t)(-1)) {
+            *tmp = '\0';
+            break;
+        }
+        free(out);
+        out = NULL;
+
+        if (errno != E2BIG)
+            break;
+    }
+    vlc_iconv_close(handle);
+    return out;
+}
+