|
93 | 93 | #include "filters/mbfilter_singlebyte.h"
|
94 | 94 | #include "filters/mbfilter_utf8.h"
|
95 | 95 |
|
96 |
| -#include "eaw_table.h" |
97 | 96 | #include "rare_cp_bitvec.h"
|
98 | 97 |
|
99 | 98 | /*
|
@@ -1191,205 +1190,6 @@ mbfl_strcut(
|
1191 | 1190 | return result;
|
1192 | 1191 | }
|
1193 | 1192 |
|
1194 |
| -/* Some East Asian characters, when printed at a terminal (or the like), require double |
1195 |
| - * the usual amount of horizontal space. We call these "fullwidth" characters. */ |
1196 |
| -static size_t character_width(unsigned int c) |
1197 |
| -{ |
1198 |
| - if (c < FIRST_DOUBLEWIDTH_CODEPOINT) { |
1199 |
| - return 1; |
1200 |
| - } |
1201 |
| - |
1202 |
| - /* Do a binary search to see if we fall in any of the fullwidth ranges */ |
1203 |
| - int lo = 0, hi = sizeof(mbfl_eaw_table) / sizeof(mbfl_eaw_table[0]); |
1204 |
| - while (lo < hi) { |
1205 |
| - int probe = (lo + hi) / 2; |
1206 |
| - if (c < mbfl_eaw_table[probe].begin) { |
1207 |
| - hi = probe; |
1208 |
| - } else if (c > mbfl_eaw_table[probe].end) { |
1209 |
| - lo = probe + 1; |
1210 |
| - } else { |
1211 |
| - return 2; |
1212 |
| - } |
1213 |
| - } |
1214 |
| - |
1215 |
| - return 1; |
1216 |
| -} |
1217 |
| - |
1218 |
| -size_t mbfl_strwidth(mbfl_string *string) |
1219 |
| -{ |
1220 |
| - if (!string->len) { |
1221 |
| - return 0; |
1222 |
| - } |
1223 |
| - |
1224 |
| - size_t width = 0; |
1225 |
| - uint32_t wchar_buf[128]; |
1226 |
| - unsigned char *in = string->val; |
1227 |
| - size_t in_len = string->len; |
1228 |
| - unsigned int state = 0; |
1229 |
| - |
1230 |
| - while (in_len) { |
1231 |
| - size_t out_len = string->encoding->to_wchar(&in, &in_len, wchar_buf, 128, &state); |
1232 |
| - while (out_len) { |
1233 |
| - /* NOTE: 'bad input' marker will be counted as 1 unit of width |
1234 |
| - * If text conversion is performed with an ordinary ASCII character as |
1235 |
| - * the 'replacement character', this will give us the correct display width. */ |
1236 |
| - width += character_width(wchar_buf[--out_len]); |
1237 |
| - } |
1238 |
| - } |
1239 |
| - |
1240 |
| - return width; |
1241 |
| -} |
1242 |
| - |
1243 |
| - |
1244 |
| -/* |
1245 |
| - * strimwidth |
1246 |
| - */ |
1247 |
| -struct collector_strimwidth_data { |
1248 |
| - mbfl_convert_filter *decoder; |
1249 |
| - mbfl_convert_filter *decoder_backup; |
1250 |
| - mbfl_memory_device device; |
1251 |
| - size_t from; |
1252 |
| - size_t width; |
1253 |
| - size_t outwidth; |
1254 |
| - size_t outchar; |
1255 |
| - size_t endpos; |
1256 |
| - int status; |
1257 |
| -}; |
1258 |
| - |
1259 |
| -static int |
1260 |
| -collector_strimwidth(int c, void* data) |
1261 |
| -{ |
1262 |
| - struct collector_strimwidth_data *pc = (struct collector_strimwidth_data*)data; |
1263 |
| - |
1264 |
| - switch (pc->status) { |
1265 |
| - case 10: |
1266 |
| - (*pc->decoder->filter_function)(c, pc->decoder); |
1267 |
| - break; |
1268 |
| - default: |
1269 |
| - if (pc->outchar >= pc->from) { |
1270 |
| - pc->outwidth += character_width(c); |
1271 |
| - |
1272 |
| - if (pc->outwidth > pc->width) { |
1273 |
| - if (pc->status == 0) { |
1274 |
| - pc->endpos = pc->device.pos; |
1275 |
| - mbfl_convert_filter_copy(pc->decoder, pc->decoder_backup); |
1276 |
| - } |
1277 |
| - pc->status++; |
1278 |
| - (*pc->decoder->filter_function)(c, pc->decoder); |
1279 |
| - pc->outchar++; |
1280 |
| - return -1; |
1281 |
| - } else { |
1282 |
| - (*pc->decoder->filter_function)(c, pc->decoder); |
1283 |
| - } |
1284 |
| - } |
1285 |
| - pc->outchar++; |
1286 |
| - break; |
1287 |
| - } |
1288 |
| - |
1289 |
| - return 0; |
1290 |
| -} |
1291 |
| - |
1292 |
| -mbfl_string * |
1293 |
| -mbfl_strimwidth( |
1294 |
| - mbfl_string *string, |
1295 |
| - mbfl_string *marker, |
1296 |
| - mbfl_string *result, |
1297 |
| - size_t from, |
1298 |
| - size_t width) |
1299 |
| -{ |
1300 |
| - struct collector_strimwidth_data pc; |
1301 |
| - mbfl_convert_filter *encoder; |
1302 |
| - size_t n, mkwidth; |
1303 |
| - unsigned char *p; |
1304 |
| - |
1305 |
| - mbfl_string_init(result); |
1306 |
| - result->encoding = string->encoding; |
1307 |
| - mbfl_memory_device_init(&pc.device, MIN(string->len, width), 0); |
1308 |
| - |
1309 |
| - /* output code filter */ |
1310 |
| - pc.decoder = mbfl_convert_filter_new( |
1311 |
| - &mbfl_encoding_wchar, |
1312 |
| - string->encoding, |
1313 |
| - mbfl_memory_device_output, 0, &pc.device); |
1314 |
| - pc.decoder_backup = mbfl_convert_filter_new( |
1315 |
| - &mbfl_encoding_wchar, |
1316 |
| - string->encoding, |
1317 |
| - mbfl_memory_device_output, 0, &pc.device); |
1318 |
| - /* wchar filter */ |
1319 |
| - encoder = mbfl_convert_filter_new( |
1320 |
| - string->encoding, |
1321 |
| - &mbfl_encoding_wchar, |
1322 |
| - collector_strimwidth, 0, &pc); |
1323 |
| - if (pc.decoder == NULL || pc.decoder_backup == NULL || encoder == NULL) { |
1324 |
| - mbfl_convert_filter_delete(encoder); |
1325 |
| - mbfl_convert_filter_delete(pc.decoder); |
1326 |
| - mbfl_convert_filter_delete(pc.decoder_backup); |
1327 |
| - return NULL; |
1328 |
| - } |
1329 |
| - mkwidth = 0; |
1330 |
| - if (marker) { |
1331 |
| - mkwidth = mbfl_strwidth(marker); |
1332 |
| - } |
1333 |
| - pc.from = from; |
1334 |
| - pc.width = width - mkwidth; |
1335 |
| - pc.outwidth = 0; |
1336 |
| - pc.outchar = 0; |
1337 |
| - pc.status = 0; |
1338 |
| - pc.endpos = 0; |
1339 |
| - |
1340 |
| - /* feed data */ |
1341 |
| - p = string->val; |
1342 |
| - n = string->len; |
1343 |
| - if (p != NULL) { |
1344 |
| - while (n > 0) { |
1345 |
| - n--; |
1346 |
| - if ((*encoder->filter_function)(*p++, encoder) < 0) { |
1347 |
| - break; |
1348 |
| - } |
1349 |
| - } |
1350 |
| - mbfl_convert_filter_flush(encoder); |
1351 |
| - if (pc.status != 0 && mkwidth > 0) { |
1352 |
| - pc.width += mkwidth; |
1353 |
| - if (n > 0) { |
1354 |
| - while (n > 0) { |
1355 |
| - if ((*encoder->filter_function)(*p++, encoder) < 0) { |
1356 |
| - break; |
1357 |
| - } |
1358 |
| - n--; |
1359 |
| - } |
1360 |
| - mbfl_convert_filter_flush(encoder); |
1361 |
| - } else if (pc.outwidth > pc.width) { |
1362 |
| - pc.status++; |
1363 |
| - } |
1364 |
| - if (pc.status != 1) { |
1365 |
| - pc.status = 10; |
1366 |
| - pc.device.pos = pc.endpos; |
1367 |
| - mbfl_convert_filter_copy(pc.decoder_backup, pc.decoder); |
1368 |
| - mbfl_convert_filter_reset(encoder, marker->encoding, &mbfl_encoding_wchar); |
1369 |
| - p = marker->val; |
1370 |
| - n = marker->len; |
1371 |
| - while (n > 0) { |
1372 |
| - if ((*encoder->filter_function)(*p++, encoder) < 0) { |
1373 |
| - break; |
1374 |
| - } |
1375 |
| - n--; |
1376 |
| - } |
1377 |
| - mbfl_convert_filter_flush(encoder); |
1378 |
| - } |
1379 |
| - } else if (pc.status != 0) { |
1380 |
| - pc.device.pos = pc.endpos; |
1381 |
| - mbfl_convert_filter_copy(pc.decoder_backup, pc.decoder); |
1382 |
| - } |
1383 |
| - mbfl_convert_filter_flush(pc.decoder); |
1384 |
| - } |
1385 |
| - result = mbfl_memory_device_result(&pc.device, result); |
1386 |
| - mbfl_convert_filter_delete(encoder); |
1387 |
| - mbfl_convert_filter_delete(pc.decoder); |
1388 |
| - mbfl_convert_filter_delete(pc.decoder_backup); |
1389 |
| - |
1390 |
| - return result; |
1391 |
| -} |
1392 |
| - |
1393 | 1193 |
|
1394 | 1194 | /*
|
1395 | 1195 | * MIME header encode
|
|
0 commit comments