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 | |
| 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')
| -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  | 
