Mercurial > pidgin.yaz
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; |