diff options
author | Pierre Ossman <ossman@cendio.se> | 2006-05-18 08:19:07 +0000 |
---|---|---|
committer | Pierre Ossman <ossman@cendio.se> | 2006-05-18 08:19:07 +0000 |
commit | 4981092a797c18c1be8f2d5e0864c8b30f4130a0 (patch) | |
tree | 3f044389b72744387bbc17d860179b7ed1841452 /src/polyp | |
parent | 40d9f5d00d99d55d3dbb20801c4842ae8d0d95ac (diff) |
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
Diffstat (limited to 'src/polyp')
-rw-r--r-- | src/polyp/utf8.c | 72 | ||||
-rw-r--r-- | src/polyp/utf8.h | 6 |
2 files changed, 78 insertions, 0 deletions
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 <assert.h> +#include <errno.h> #include <stdlib.h> #include <inttypes.h> #include <string.h> +#ifdef HAVE_ICONV_H +#include <iconv.h> +#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 |