From: Pekka Riikonen Date: Wed, 16 May 2007 06:03:01 +0000 (+0000) Subject: Added silc_utf8_[c2w|w2c]. X-Git-Tag: silc.client.1.1.beta4~3 X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=abad048b221437e76d71d02123c2416d3dec5209 Added silc_utf8_[c2w|w2c]. --- diff --git a/lib/silcutil/silcutf8.c b/lib/silcutil/silcutf8.c index 65254eb5..1faf14c9 100644 --- a/lib/silcutil/silcutf8.c +++ b/lib/silcutil/silcutf8.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2004 - 2005 Pekka Riikonen + Copyright (C) 2004 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -515,6 +515,67 @@ SilcUInt32 silc_utf8_decode(const unsigned char *utf8, SilcUInt32 utf8_len, return enclen; } +/* UTF-8 to wide characters */ + +SilcUInt32 silc_utf8_c2w(const unsigned char *utf8, SilcUInt32 utf8_len, + SilcUInt16 *utf8_wide, SilcUInt32 utf8_wide_size) +{ + unsigned char *tmp; + SilcUInt32 tmp_len; + int i, k; + + tmp_len = silc_utf8_decoded_len(utf8, utf8_len, SILC_STRING_BMP); + if (!tmp_len) + return 0; + + if (utf8_wide_size < tmp_len / 2) + return 0; + + memset(utf8_wide, 0, utf8_wide_size * 2); + + tmp = silc_malloc(tmp_len); + if (!tmp) + return 0; + + silc_utf8_decode(utf8, utf8_len, SILC_STRING_BMP, tmp, tmp_len); + + for (i = 0, k = 0; i < tmp_len; i += 2, k++) + SILC_GET16_MSB(utf8_wide[k], tmp + i); + + silc_free(tmp); + return k + 1; +} + +/* Wide characters to UTF-8 */ + +SilcUInt32 silc_utf8_w2c(const SilcUInt16 *wide_str, + SilcUInt32 wide_str_len, + unsigned char *utf8, SilcUInt32 utf8_size) + +{ + unsigned char *tmp; + SilcUInt32 tmp_len; + int i, k; + + if (utf8_size < wide_str_len * 2) + return 0; + + memset(utf8, 0, utf8_size); + + tmp = silc_malloc(wide_str_len * 2); + if (!tmp) + return 0; + + for (i = 0, k = 0; i < wide_str_len; i += 2, k++) + SILC_PUT16_MSB(wide_str[k], tmp + i); + + tmp_len = silc_utf8_encode(tmp, wide_str_len * 2, SILC_STRING_BMP, + utf8, utf8_size); + + silc_free(tmp); + return tmp_len; +} + /* Returns the length of UTF-8 encoded string if the `bin' of encoding of `bin_encoding' is encoded with silc_utf8_encode. */ diff --git a/lib/silcutil/silcutf8.h b/lib/silcutil/silcutf8.h index f82142d1..1f6fe4de 100644 --- a/lib/silcutil/silcutf8.h +++ b/lib/silcutil/silcutf8.h @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2004 - 2005 Pekka Riikonen + Copyright (C) 2004 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -74,6 +74,51 @@ SilcUInt32 silc_utf8_decode(const unsigned char *utf8, SilcUInt32 utf8_len, SilcStringEncoding bin_encoding, unsigned char *bin, SilcUInt32 bin_size); +/****f* silcutil/SilcStrUtilAPI/silc_utf8_c2w + * + * SYNOPSIS + * + * SilcUInt32 silc_utf8_c2w(const unsigned char *utf8, + * SilcUInt32 utf8_len, + * SilcUInt16 *utf8_wide, + * SilcUInt32 utf8_wide_size); + * + * DESCRIPTION + * + * Converts UTF-8 string into UTF-8 wide character string into the + * `utf8_wide' buffer of size of `utf8_wide_size' in characters. Returns + * the length of the UTF-8 wide character string or 0 on error. The + * returned length is in characters and not in bytes. The byte length + * is twice the returned character length. + * + * If there is extra space in `utf8_wide' this will NULL terminate the + * string automatically. + * + ***/ +SilcUInt32 silc_utf8_c2w(const unsigned char *utf8, SilcUInt32 utf8_len, + SilcUInt16 *utf8_wide, SilcUInt32 utf8_wide_size); + +/****f* silcutil/SilcStrUtilAPI/silc_utf8_w2c + * + * SYNOPSIS + * + * SilcUInt32 silc_utf8_w2c(const SilcUInt16 *wide_str, + * SilcUInt32 wide_str_len, + * unsigned char *utf8, SilcUInt32 utf8_size); + * + * DESCRIPTION + * + * Converts UTF-8 wide character string into UTF-8 binary string into the + * `utf8' buffer of size of `utf8_size' in bytes. Returns the length of + * the encoded UTF-8 string in bytes or 0 on error. + * + * If there is extra space in `utf8' this will NULL terminate the string + * automatically. + * + ***/ +SilcUInt32 silc_utf8_w2c(const SilcUInt16 *wide_str, SilcUInt32 wide_str_len, + unsigned char *utf8, SilcUInt32 utf8_size); + /****f* silcutil/SilcStrUtilAPI/silc_utf8_encoded_len * * SYNOPSIS @@ -148,7 +193,7 @@ SilcBool silc_utf8_strcasecmp(const char *s1, const char *s2); * SYNOPSIS * * SilcBool silc_utf8_strcasecmp(const char *s1, const char *s2, - * SilcUInt32 n); + * SilcUInt32 n); * * DESCRIPTION *