| 1235 | } |
| 1236 | |
| 1237 | void Input::file_encoding(unsigned short enc, const unsigned short *page) |
| 1238 | { |
| 1239 | if (file_ && utfx_ != enc) |
| 1240 | { |
| 1241 | if (utfx_ == file_encoding::plain && ulen_ > 0) |
| 1242 | { |
| 1243 | // translate (non-BOM) plain bytes (1 to 4 bytes) buffered in utf8_[] |
| 1244 | unsigned char buf[sizeof(utf8_)]; |
| 1245 | std::memcpy(buf, utf8_, sizeof(utf8_)); |
| 1246 | unsigned char *b = buf; |
| 1247 | char *t = utf8_; |
| 1248 | int c1, c2; |
| 1249 | switch (enc) |
| 1250 | { |
| 1251 | case file_encoding::latin: |
| 1252 | while (ulen_-- > 0) |
| 1253 | { |
| 1254 | c1 = *b++; |
| 1255 | if (c1 < 0x80) |
| 1256 | *t++ = static_cast<char>(c1); |
| 1257 | else |
| 1258 | t += utf8(c1, t); |
| 1259 | } |
| 1260 | uidx_ = 0; |
| 1261 | ulen_ = static_cast<unsigned short>(t - utf8_); |
| 1262 | break; |
| 1263 | case file_encoding::cp437: |
| 1264 | case file_encoding::cp850: |
| 1265 | case file_encoding::cp858: |
| 1266 | case file_encoding::ebcdic: |
| 1267 | case file_encoding::cp1250: |
| 1268 | case file_encoding::cp1251: |
| 1269 | case file_encoding::cp1252: |
| 1270 | case file_encoding::cp1253: |
| 1271 | case file_encoding::cp1254: |
| 1272 | case file_encoding::cp1255: |
| 1273 | case file_encoding::cp1256: |
| 1274 | case file_encoding::cp1257: |
| 1275 | case file_encoding::cp1258: |
| 1276 | case file_encoding::iso8859_2: |
| 1277 | case file_encoding::iso8859_3: |
| 1278 | case file_encoding::iso8859_4: |
| 1279 | case file_encoding::iso8859_5: |
| 1280 | case file_encoding::iso8859_6: |
| 1281 | case file_encoding::iso8859_7: |
| 1282 | case file_encoding::iso8859_8: |
| 1283 | case file_encoding::iso8859_9: |
| 1284 | case file_encoding::iso8859_10: |
| 1285 | case file_encoding::iso8859_11: |
| 1286 | case file_encoding::iso8859_13: |
| 1287 | case file_encoding::iso8859_14: |
| 1288 | case file_encoding::iso8859_15: |
| 1289 | case file_encoding::iso8859_16: |
| 1290 | case file_encoding::macroman: |
| 1291 | case file_encoding::koi8_r: |
| 1292 | case file_encoding::koi8_u: |
| 1293 | case file_encoding::koi8_ru: |
| 1294 | page_ = codepages[enc - file_encoding::latin - 1]; |