diff options
author | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2012-11-19 17:41:44 +0100 |
---|---|---|
committer | Nikos Mavrogiannopoulos <nmav@gnutls.org> | 2012-11-19 17:41:44 +0100 |
commit | fa21bae5ed69aebef11af32a3d96dd24690363e3 (patch) | |
tree | 4098ba3218e9bc66096cc5e143965cd16937fa0e | |
parent | 834586f8b3a768daae8a9e1a193779686445d7ae (diff) | |
download | gnutls-fa21bae5ed69aebef11af32a3d96dd24690363e3.tar.gz |
Added _gnutls_ucs2_to_utf8() for windows (untested)
-rw-r--r-- | lib/system.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/lib/system.c b/lib/system.c index 285ffbd74e..fd7508cf40 100644 --- a/lib/system.c +++ b/lib/system.c @@ -519,6 +519,67 @@ cleanup: return ret; } +#elif defined(_WIN32) +#include <Winnls.h> + +/* Can convert only english */ +int _gnutls_ucs2_to_utf8(const void* data, size_t size, gnutls_datum_t *output) +{ +int ret; +int len = 0, src_len; +char* dst = NULL; +char* src = NULL; + + src_len = size/2; + + src = gnutls_malloc(size); + if (src == NULL) + return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); + + /* convert to LE */ + for (i=0;i<size;i+=2) + { + src[i] = ((char*)data)[1+i]; + src[1+i] = ((char*)data)[i]; + } + + ret = WideCharToMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS, src, src_len, + NULL, 0, NULL, NULL); + if (ret == 0) + { + ret = gnutls_assert_val(GNUTLS_E_PARSING_ERROR); + goto fail; + } + + len = ret+1; + dst = gnutls_malloc(len); + if (dst == NULL) + { + ret = gnutls_assert_val(GNUTLS_E_MEMORY_ERROR); + goto fail; + } + + ret = WideCharToMultiByte(CP_UTF8, MB_ERR_INVALID_CHARS, data, size/2, + dst, len, NULL, NULL); + if (ret == 0) + { + ret = gnutls_assert_val(GNUTLS_E_PARSING_ERROR); + goto fail; + } + + output->data = dst; + output->size = ret; + ret = 0; + goto cleanup; + +fail: + gnutls_free(dst); + +cleanup: + gnutls_free(src); + return ret; +} + #else /* Can convert only english */ |