diff -ru gaim-0.59-orig/ChangeLog gaim-0.59/ChangeLog --- gaim-0.59-orig/ChangeLog Tue Jun 25 10:30:18 2002 +++ gaim-0.59/ChangeLog Sat Jul 27 18:37:06 2002 @@ -1,3 +1,11 @@ +2002-07-27 Junichi Uekawa + + * src/util.c (convert_string): add convert_string + (utf8_to_str): use convert_string + (str_to_utf8): use convert_string + add include for langinfo.h and iconv.h + + Gaim: The Pimpin' Penguin IM Clone thats good for the soul! version 0.59 (06/24/2002): diff -ru gaim-0.59-orig/debian/changelog gaim-0.59/debian/changelog --- gaim-0.59-orig/debian/changelog Sat Jul 27 17:34:58 2002 +++ gaim-0.59/debian/changelog Sat Jul 27 17:47:28 2002 @@ -9,8 +9,10 @@ * Should display UTF8 MSN names in their full glory. (closes: #150354) * Updated config.sub from 20010420 to 20020307, and config.guess from 20010420 to 20020320. + * GNU config automated update: config.sub (20020307 to 20020621), + config.guess (20020320 to 20020529) - -- Robert McQueen Tue, 25 Jun 2002 13:32:56 +0100 + -- root Sat, 27 Jul 2002 17:47:28 +0900 gaim (1:0.58-2) unstable; urgency=low diff -ru gaim-0.59-orig/src/util.c gaim-0.59/src/util.c --- gaim-0.59-orig/src/util.c Tue Jun 25 10:29:59 2002 +++ gaim-0.59/src/util.c Sat Jul 27 18:42:33 2002 @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #include "gaim.h" #include "prpl.h" @@ -1118,92 +1120,52 @@ fclose(fd); } + +char *convert_string(char *str, + const char *destset, + const char *srcset) +{ + unsigned char *buf; + iconv_t cd; + size_t insize = 0; + size_t outsize = 0; + size_t nconv = 0; + char *inptr; + char *outptr; + + if (!str) return NULL; + buf = (unsigned char *)malloc(strlen(str)*4); + insize = strlen(str); + inptr = str; + outsize = strlen(str)*4; + outptr = buf; + + cd = iconv_open(destset, srcset); + if (cd == (iconv_t) -1) { + free(buf); + printf("iconv_open(%s, %s) Error\n",destset, srcset); + return strdup(str); + } + + nconv = iconv(cd, &inptr, &insize, &outptr, &outsize); + if (nconv == (size_t) -1) { + printf("iconv Error\n"); + return str; + } + *outptr = '\0'; + iconv_close(cd); + + return buf; +} + unsigned char *utf8_to_str(unsigned char *in) { - int n = 0, i = 0; - int inlen; - unsigned char *result; - - if (!in) - return NULL; - - inlen = strlen(in); - - result = g_malloc(inlen + 1); - - while (n <= inlen - 1) { - long c = (long)in[n]; - if (c < 0x80) - result[i++] = (char)c; - else { - if ((c & 0xC0) == 0xC0) - result[i++] = - (char)(((c & 0x03) << 6) | (((unsigned char)in[++n]) & 0x3F)); - else if ((c & 0xE0) == 0xE0) { - if (n + 2 <= inlen) { - result[i] = - (char)(((c & 0xF) << 4) | (((unsigned char)in[++n]) & 0x3F)); - result[i] = - (char)(((unsigned char)result[i]) | - (((unsigned char)in[++n]) & 0x3F)); - i++; - } else - n += 2; - } else if ((c & 0xF0) == 0xF0) - n += 3; - else if ((c & 0xF8) == 0xF8) - n += 4; - else if ((c & 0xFC) == 0xFC) - n += 5; - } - n++; - } - result[i] = '\0'; - - return result; + return convert_string (in, nl_langinfo(CODESET), "UTF-8"); } char *str_to_utf8(unsigned char *in) { - int n = 0, i = 0; - int inlen; - char *result = NULL; - - if (!in) - return NULL; - - inlen = strlen(in); - - result = g_malloc(inlen * 2 + 1); - - while (n < inlen) { - long c = (long)in[n]; - if (c == 27) { - n += 2; - if (in[n] == 'x') - n++; - if (in[n] == '3') - n++; - n += 2; - continue; - } - /* why are we removing newlines and carriage returns? - if ((c == 0x0D) || (c == 0x0A)) { - n++; - continue; - } - */ - if (c < 128) - result[i++] = (char)c; - else { - result[i++] = (char)((c >> 6) | 192); - result[i++] = (char)((c & 63) | 128); - } - n++; - } - result[i] = '\0'; - - return result; + return convert_string (in, "UTF-8", nl_langinfo(CODESET)); } void strip_linefeed(gchar *text)