comparison src/util.c @ 3361:9bb2e904fadb

[gaim-migrate @ 3380] We've returned. committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Fri, 02 Aug 2002 04:33:50 +0000
parents 8f69ff64f0bf
children eb7b398051f2
comparison
equal deleted inserted replaced
3360:f06c87748d91 3361:9bb2e904fadb
30 #include <sys/types.h> 30 #include <sys/types.h>
31 #include <sys/stat.h> 31 #include <sys/stat.h>
32 #include <string.h> 32 #include <string.h>
33 #include <sys/wait.h> 33 #include <sys/wait.h>
34 #include <ctype.h> 34 #include <ctype.h>
35 #include <iconv.h>
35 #include <math.h> 36 #include <math.h>
36 #include "gaim.h" 37 #include "gaim.h"
37 #include "prpl.h" 38 #include "prpl.h"
38 #include "gtkspell.h" 39 #include "gtkspell.h"
39 40
1116 } 1117 }
1117 1118
1118 fclose(fd); 1119 fclose(fd);
1119 } 1120 }
1120 1121
1121 unsigned char *utf8_to_str(unsigned char *in) 1122 char *convert_string(char *str, const char *destset, const char *srcset)
1122 { 1123 {
1123 int n = 0, i = 0; 1124 char *buf;
1124 int inlen; 1125 iconv_t cd;
1125 unsigned char *result; 1126 size_t insize = 0;
1126 1127 size_t outsize = 0;
1127 if (!in) 1128 size_t nconv = 0;
1128 return NULL; 1129 char *inptr;
1129 1130 char *outptr;
1130 inlen = strlen(in); 1131 char *ret;
1131 1132
1132 result = g_malloc(inlen + 1); 1133 if (!str)
1133 1134 return g_strdup("");
1134 while (n <= inlen - 1) { 1135 buf = g_malloc(strlen(str)*4);
1135 long c = (long)in[n]; 1136 insize = strlen(str);
1136 if (c < 0x80) 1137 inptr = str;
1137 result[i++] = (char)c; 1138 outsize = strlen(str)*4;
1138 else { 1139 outptr = buf;
1139 if ((c & 0xC0) == 0xC0) 1140
1140 result[i++] = 1141 cd = iconv_open(destset, srcset);
1141 (char)(((c & 0x03) << 6) | (((unsigned char)in[++n]) & 0x3F)); 1142 if (cd == (iconv_t) -1) {
1142 else if ((c & 0xE0) == 0xE0) { 1143 g_free(buf);
1143 if (n + 2 <= inlen) { 1144 debug_printf("iconv_open(%s, %s) Error\n",destset, srcset);
1144 result[i] = 1145 return g_strdup(str);
1145 (char)(((c & 0xF) << 4) | (((unsigned char)in[++n]) & 0x3F)); 1146 }
1146 result[i] = 1147
1147 (char)(((unsigned char)result[i]) | 1148 nconv = iconv(cd, &inptr, &insize, &outptr, &outsize);
1148 (((unsigned char)in[++n]) & 0x3F)); 1149 if (nconv == (size_t) -1) {
1149 i++; 1150 debug_printf("iconv Error\n");
1150 } else 1151 g_free(buf);
1151 n += 2; 1152 return g_strdup(str);
1152 } else if ((c & 0xF0) == 0xF0) 1153 }
1153 n += 3; 1154 *outptr = '\0';
1154 else if ((c & 0xF8) == 0xF8) 1155 iconv_close(cd);
1155 n += 4; 1156
1156 else if ((c & 0xFC) == 0xFC) 1157 ret = g_strdup(buf);
1157 n += 5; 1158 g_free(buf);
1158 } 1159
1159 n++; 1160 return ret;
1160 }
1161 result[i] = '\0';
1162
1163 return result;
1164 }
1165
1166 char *str_to_utf8(unsigned char *in)
1167 {
1168 int n = 0, i = 0;
1169 int inlen;
1170 char *result = NULL;
1171
1172 if (!in)
1173 return NULL;
1174
1175 inlen = strlen(in);
1176
1177 result = g_malloc(inlen * 2 + 1);
1178
1179 while (n < inlen) {
1180 long c = (long)in[n];
1181 if (c == 27) {
1182 n += 2;
1183 if (in[n] == 'x')
1184 n++;
1185 if (in[n] == '3')
1186 n++;
1187 n += 2;
1188 continue;
1189 }
1190 /* why are we removing newlines and carriage returns?
1191 if ((c == 0x0D) || (c == 0x0A)) {
1192 n++;
1193 continue;
1194 }
1195 */
1196 if (c < 128)
1197 result[i++] = (char)c;
1198 else {
1199 result[i++] = (char)((c >> 6) | 192);
1200 result[i++] = (char)((c & 63) | 128);
1201 }
1202 n++;
1203 }
1204 result[i] = '\0';
1205
1206 return result;
1207 } 1161 }
1208 1162
1209 void strip_linefeed(gchar *text) 1163 void strip_linefeed(gchar *text)
1210 { 1164 {
1211 int i, j; 1165 int i, j;