From: Sean E. <sea...@us...> - 2002-08-02 04:33:53
|
Update of /cvsroot/gaim/gaim/src In directory usw-pr-cvs1:/tmp/cvs-serv4814/src Modified Files: util.c Log Message: We've returned. Index: util.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/util.c,v retrieving revision 1.123 retrieving revision 1.124 diff -u -d -r1.123 -r1.124 --- util.c 22 Jun 2002 02:07:48 -0000 1.123 +++ util.c 2 Aug 2002 04:33:50 -0000 1.124 @@ -32,6 +32,7 @@ #include <string.h> #include <sys/wait.h> #include <ctype.h> +#include <iconv.h> #include <math.h> #include "gaim.h" #include "prpl.h" @@ -1118,92 +1119,45 @@ fclose(fd); } -unsigned char *utf8_to_str(unsigned char *in) +char *convert_string(char *str, const char *destset, const char *srcset) { - int n = 0, i = 0; - int inlen; - unsigned char *result; - - if (!in) - return NULL; - - inlen = strlen(in); + char *buf; + iconv_t cd; + size_t insize = 0; + size_t outsize = 0; + size_t nconv = 0; + char *inptr; + char *outptr; + char *ret; - result = g_malloc(inlen + 1); + if (!str) + return g_strdup(""); + buf = g_malloc(strlen(str)*4); + insize = strlen(str); + inptr = str; + outsize = strlen(str)*4; + outptr = buf; - 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++; + cd = iconv_open(destset, srcset); + if (cd == (iconv_t) -1) { + g_free(buf); + debug_printf("iconv_open(%s, %s) Error\n",destset, srcset); + return g_strdup(str); } - result[i] = '\0'; - - return result; -} - -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++; + nconv = iconv(cd, &inptr, &insize, &outptr, &outsize); + if (nconv == (size_t) -1) { + debug_printf("iconv Error\n"); + g_free(buf); + return g_strdup(str); } - result[i] = '\0'; + *outptr = '\0'; + iconv_close(cd); - return result; + ret = g_strdup(buf); + g_free(buf); + + return ret; } void strip_linefeed(gchar *text) |