From 4981092a797c18c1be8f2d5e0864c8b30f4130a0 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Thu, 18 May 2006 08:19:07 +0000 Subject: And functions for convertion to and from current locale and UTF-8. git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@931 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/polyp/utf8.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/polyp/utf8.h | 6 +++++ 2 files changed, 78 insertions(+) (limited to 'src') diff --git a/src/polyp/utf8.c b/src/polyp/utf8.c index 300a54ca..931328e5 100644 --- a/src/polyp/utf8.c +++ b/src/polyp/utf8.c @@ -29,10 +29,15 @@ #endif #include +#include #include #include #include +#ifdef HAVE_ICONV_H +#include +#endif + #include "utf8.h" #include "xmalloc.h" @@ -162,3 +167,70 @@ char* pa_utf8_filter (const char *str) { return utf8_validate(str, new_str); } + +#ifdef HAVE_ICONV_H + +static char* iconv_simple(const char *str, const char *to, const char *from) { + char *new_str; + size_t len, inlen; + + iconv_t cd; + char *inbuf, *outbuf; + size_t res, inbytes, outbytes; + + cd = iconv_open(to, from); + if (cd == (iconv_t)-1) + return NULL; + + inlen = len = strlen(str) + 1; + new_str = pa_xmalloc(len); + assert(new_str); + + while (1) { + inbuf = (char*)str; /* Brain dead prototype for iconv() */ + inbytes = inlen; + outbuf = new_str; + outbytes = len; + + res = iconv(cd, &inbuf, &inbytes, &outbuf, &outbytes); + + if (res != (size_t)-1) + break; + + if (errno != E2BIG) { + pa_xfree(new_str); + new_str = NULL; + break; + } + + assert(inbytes != 0); + + len += inbytes; + new_str = pa_xrealloc(new_str, len); + assert(new_str); + } + + iconv_close(cd); + + return new_str; +} + +char* pa_utf8_to_locale (const char *str) { + return iconv_simple(str, "", "UTF-8"); +} + +char* pa_locale_to_utf8 (const char *str) { + return iconv_simple(str, "UTF-8", ""); +} + +#else + +char* pa_utf8_to_locale (const char *str) { + return NULL; +} + +char* pa_locale_to_utf8 (const char *str) { + return NULL; +} + +#endif diff --git a/src/polyp/utf8.h b/src/polyp/utf8.h index 3cc3a7d0..55b8d2e4 100644 --- a/src/polyp/utf8.h +++ b/src/polyp/utf8.h @@ -36,6 +36,12 @@ const char *pa_utf8_valid(const char *str); /** Filter all invalid UTF8 characters from the specified string, returning a new fully UTF8 valid string. Don't forget to free the returned string with pa_xfree() */ char *pa_utf8_filter(const char *str); +/** Convert a UTF-8 string to the current locale. Free the string using pa_xfree(). */ +char* pa_utf8_to_locale (const char *str); + +/** Convert a string in the current locale to UTF-8. Free the string using pa_xfree(). */ +char* pa_locale_to_utf8 (const char *str); + PA_C_DECL_END #endif -- cgit