554 lines
13 KiB
Rust
554 lines
13 KiB
Rust
/// Conversion module to convert a String to IBM codepage 437
|
|
|
|
pub fn to_string(input: &[u8]) -> String
|
|
{
|
|
input.iter().map(|c| to_char(*c)).collect()
|
|
}
|
|
|
|
pub fn from_string(input: &str) -> Vec<u8>
|
|
{
|
|
input.chars().map(|c| from_char(c)).collect()
|
|
}
|
|
|
|
fn to_char(input: u8) -> char
|
|
{
|
|
let output = match input
|
|
{
|
|
0x00 => 0x0000,
|
|
0x01 => 0x0001,
|
|
0x02 => 0x0002,
|
|
0x03 => 0x0003,
|
|
0x04 => 0x0004,
|
|
0x05 => 0x0005,
|
|
0x06 => 0x0006,
|
|
0x07 => 0x0007,
|
|
0x08 => 0x0008,
|
|
0x09 => 0x0009,
|
|
0x0a => 0x000a,
|
|
0x0b => 0x000b,
|
|
0x0c => 0x000c,
|
|
0x0d => 0x000d,
|
|
0x0e => 0x000e,
|
|
0x0f => 0x000f,
|
|
0x10 => 0x0010,
|
|
0x11 => 0x0011,
|
|
0x12 => 0x0012,
|
|
0x13 => 0x0013,
|
|
0x14 => 0x0014,
|
|
0x15 => 0x0015,
|
|
0x16 => 0x0016,
|
|
0x17 => 0x0017,
|
|
0x18 => 0x0018,
|
|
0x19 => 0x0019,
|
|
0x1a => 0x001a,
|
|
0x1b => 0x001b,
|
|
0x1c => 0x001c,
|
|
0x1d => 0x001d,
|
|
0x1e => 0x001e,
|
|
0x1f => 0x001f,
|
|
0x20 => 0x0020,
|
|
0x21 => 0x0021,
|
|
0x22 => 0x0022,
|
|
0x23 => 0x0023,
|
|
0x24 => 0x0024,
|
|
0x25 => 0x0025,
|
|
0x26 => 0x0026,
|
|
0x27 => 0x0027,
|
|
0x28 => 0x0028,
|
|
0x29 => 0x0029,
|
|
0x2a => 0x002a,
|
|
0x2b => 0x002b,
|
|
0x2c => 0x002c,
|
|
0x2d => 0x002d,
|
|
0x2e => 0x002e,
|
|
0x2f => 0x002f,
|
|
0x30 => 0x0030,
|
|
0x31 => 0x0031,
|
|
0x32 => 0x0032,
|
|
0x33 => 0x0033,
|
|
0x34 => 0x0034,
|
|
0x35 => 0x0035,
|
|
0x36 => 0x0036,
|
|
0x37 => 0x0037,
|
|
0x38 => 0x0038,
|
|
0x39 => 0x0039,
|
|
0x3a => 0x003a,
|
|
0x3b => 0x003b,
|
|
0x3c => 0x003c,
|
|
0x3d => 0x003d,
|
|
0x3e => 0x003e,
|
|
0x3f => 0x003f,
|
|
0x40 => 0x0040,
|
|
0x41 => 0x0041,
|
|
0x42 => 0x0042,
|
|
0x43 => 0x0043,
|
|
0x44 => 0x0044,
|
|
0x45 => 0x0045,
|
|
0x46 => 0x0046,
|
|
0x47 => 0x0047,
|
|
0x48 => 0x0048,
|
|
0x49 => 0x0049,
|
|
0x4a => 0x004a,
|
|
0x4b => 0x004b,
|
|
0x4c => 0x004c,
|
|
0x4d => 0x004d,
|
|
0x4e => 0x004e,
|
|
0x4f => 0x004f,
|
|
0x50 => 0x0050,
|
|
0x51 => 0x0051,
|
|
0x52 => 0x0052,
|
|
0x53 => 0x0053,
|
|
0x54 => 0x0054,
|
|
0x55 => 0x0055,
|
|
0x56 => 0x0056,
|
|
0x57 => 0x0057,
|
|
0x58 => 0x0058,
|
|
0x59 => 0x0059,
|
|
0x5a => 0x005a,
|
|
0x5b => 0x005b,
|
|
0x5c => 0x005c,
|
|
0x5d => 0x005d,
|
|
0x5e => 0x005e,
|
|
0x5f => 0x005f,
|
|
0x60 => 0x0060,
|
|
0x61 => 0x0061,
|
|
0x62 => 0x0062,
|
|
0x63 => 0x0063,
|
|
0x64 => 0x0064,
|
|
0x65 => 0x0065,
|
|
0x66 => 0x0066,
|
|
0x67 => 0x0067,
|
|
0x68 => 0x0068,
|
|
0x69 => 0x0069,
|
|
0x6a => 0x006a,
|
|
0x6b => 0x006b,
|
|
0x6c => 0x006c,
|
|
0x6d => 0x006d,
|
|
0x6e => 0x006e,
|
|
0x6f => 0x006f,
|
|
0x70 => 0x0070,
|
|
0x71 => 0x0071,
|
|
0x72 => 0x0072,
|
|
0x73 => 0x0073,
|
|
0x74 => 0x0074,
|
|
0x75 => 0x0075,
|
|
0x76 => 0x0076,
|
|
0x77 => 0x0077,
|
|
0x78 => 0x0078,
|
|
0x79 => 0x0079,
|
|
0x7a => 0x007a,
|
|
0x7b => 0x007b,
|
|
0x7c => 0x007c,
|
|
0x7d => 0x007d,
|
|
0x7e => 0x007e,
|
|
0x7f => 0x007f,
|
|
0x80 => 0x00c7,
|
|
0x81 => 0x00fc,
|
|
0x82 => 0x00e9,
|
|
0x83 => 0x00e2,
|
|
0x84 => 0x00e4,
|
|
0x85 => 0x00e0,
|
|
0x86 => 0x00e5,
|
|
0x87 => 0x00e7,
|
|
0x88 => 0x00ea,
|
|
0x89 => 0x00eb,
|
|
0x8a => 0x00e8,
|
|
0x8b => 0x00ef,
|
|
0x8c => 0x00ee,
|
|
0x8d => 0x00ec,
|
|
0x8e => 0x00c4,
|
|
0x8f => 0x00c5,
|
|
0x90 => 0x00c9,
|
|
0x91 => 0x00e6,
|
|
0x92 => 0x00c6,
|
|
0x93 => 0x00f4,
|
|
0x94 => 0x00f6,
|
|
0x95 => 0x00f2,
|
|
0x96 => 0x00fb,
|
|
0x97 => 0x00f9,
|
|
0x98 => 0x00ff,
|
|
0x99 => 0x00d6,
|
|
0x9a => 0x00dc,
|
|
0x9b => 0x00a2,
|
|
0x9c => 0x00a3,
|
|
0x9d => 0x00a5,
|
|
0x9e => 0x20a7,
|
|
0x9f => 0x0192,
|
|
0xa0 => 0x00e1,
|
|
0xa1 => 0x00ed,
|
|
0xa2 => 0x00f3,
|
|
0xa3 => 0x00fa,
|
|
0xa4 => 0x00f1,
|
|
0xa5 => 0x00d1,
|
|
0xa6 => 0x00aa,
|
|
0xa7 => 0x00ba,
|
|
0xa8 => 0x00bf,
|
|
0xa9 => 0x2310,
|
|
0xaa => 0x00ac,
|
|
0xab => 0x00bd,
|
|
0xac => 0x00bc,
|
|
0xad => 0x00a1,
|
|
0xae => 0x00ab,
|
|
0xaf => 0x00bb,
|
|
0xb0 => 0x2591,
|
|
0xb1 => 0x2592,
|
|
0xb2 => 0x2593,
|
|
0xb3 => 0x2502,
|
|
0xb4 => 0x2524,
|
|
0xb5 => 0x2561,
|
|
0xb6 => 0x2562,
|
|
0xb7 => 0x2556,
|
|
0xb8 => 0x2555,
|
|
0xb9 => 0x2563,
|
|
0xba => 0x2551,
|
|
0xbb => 0x2557,
|
|
0xbc => 0x255d,
|
|
0xbd => 0x255c,
|
|
0xbe => 0x255b,
|
|
0xbf => 0x2510,
|
|
0xc0 => 0x2514,
|
|
0xc1 => 0x2534,
|
|
0xc2 => 0x252c,
|
|
0xc3 => 0x251c,
|
|
0xc4 => 0x2500,
|
|
0xc5 => 0x253c,
|
|
0xc6 => 0x255e,
|
|
0xc7 => 0x255f,
|
|
0xc8 => 0x255a,
|
|
0xc9 => 0x2554,
|
|
0xca => 0x2569,
|
|
0xcb => 0x2566,
|
|
0xcc => 0x2560,
|
|
0xcd => 0x2550,
|
|
0xce => 0x256c,
|
|
0xcf => 0x2567,
|
|
0xd0 => 0x2568,
|
|
0xd1 => 0x2564,
|
|
0xd2 => 0x2565,
|
|
0xd3 => 0x2559,
|
|
0xd4 => 0x2558,
|
|
0xd5 => 0x2552,
|
|
0xd6 => 0x2553,
|
|
0xd7 => 0x256b,
|
|
0xd8 => 0x256a,
|
|
0xd9 => 0x2518,
|
|
0xda => 0x250c,
|
|
0xdb => 0x2588,
|
|
0xdc => 0x2584,
|
|
0xdd => 0x258c,
|
|
0xde => 0x2590,
|
|
0xdf => 0x2580,
|
|
0xe0 => 0x03b1,
|
|
0xe1 => 0x00df,
|
|
0xe2 => 0x0393,
|
|
0xe3 => 0x03c0,
|
|
0xe4 => 0x03a3,
|
|
0xe5 => 0x03c3,
|
|
0xe6 => 0x00b5,
|
|
0xe7 => 0x03c4,
|
|
0xe8 => 0x03a6,
|
|
0xe9 => 0x0398,
|
|
0xea => 0x03a9,
|
|
0xeb => 0x03b4,
|
|
0xec => 0x221e,
|
|
0xed => 0x03c6,
|
|
0xee => 0x03b5,
|
|
0xef => 0x2229,
|
|
0xf0 => 0x2261,
|
|
0xf1 => 0x00b1,
|
|
0xf2 => 0x2265,
|
|
0xf3 => 0x2264,
|
|
0xf4 => 0x2320,
|
|
0xf5 => 0x2321,
|
|
0xf6 => 0x00f7,
|
|
0xf7 => 0x2248,
|
|
0xf8 => 0x00b0,
|
|
0xf9 => 0x2219,
|
|
0xfa => 0x00b7,
|
|
0xfb => 0x221a,
|
|
0xfc => 0x207f,
|
|
0xfd => 0x00b2,
|
|
0xfe => 0x25a0,
|
|
0xff => 0x00a0,
|
|
_ => 0xfffd,
|
|
};
|
|
::std::char::from_u32(output).unwrap()
|
|
}
|
|
|
|
fn from_char(input: char) -> u8
|
|
{
|
|
let output = match input as u32
|
|
{
|
|
0x0000 => 0x00,
|
|
0x0001 => 0x01,
|
|
0x0002 => 0x02,
|
|
0x0003 => 0x03,
|
|
0x0004 => 0x04,
|
|
0x0005 => 0x05,
|
|
0x0006 => 0x06,
|
|
0x0007 => 0x07,
|
|
0x0008 => 0x08,
|
|
0x0009 => 0x09,
|
|
0x000a => 0x0a,
|
|
0x000b => 0x0b,
|
|
0x000c => 0x0c,
|
|
0x000d => 0x0d,
|
|
0x000e => 0x0e,
|
|
0x000f => 0x0f,
|
|
0x0010 => 0x10,
|
|
0x0011 => 0x11,
|
|
0x0012 => 0x12,
|
|
0x0013 => 0x13,
|
|
0x0014 => 0x14,
|
|
0x0015 => 0x15,
|
|
0x0016 => 0x16,
|
|
0x0017 => 0x17,
|
|
0x0018 => 0x18,
|
|
0x0019 => 0x19,
|
|
0x001a => 0x1a,
|
|
0x001b => 0x1b,
|
|
0x001c => 0x1c,
|
|
0x001d => 0x1d,
|
|
0x001e => 0x1e,
|
|
0x001f => 0x1f,
|
|
0x0020 => 0x20,
|
|
0x0021 => 0x21,
|
|
0x0022 => 0x22,
|
|
0x0023 => 0x23,
|
|
0x0024 => 0x24,
|
|
0x0025 => 0x25,
|
|
0x0026 => 0x26,
|
|
0x0027 => 0x27,
|
|
0x0028 => 0x28,
|
|
0x0029 => 0x29,
|
|
0x002a => 0x2a,
|
|
0x002b => 0x2b,
|
|
0x002c => 0x2c,
|
|
0x002d => 0x2d,
|
|
0x002e => 0x2e,
|
|
0x002f => 0x2f,
|
|
0x0030 => 0x30,
|
|
0x0031 => 0x31,
|
|
0x0032 => 0x32,
|
|
0x0033 => 0x33,
|
|
0x0034 => 0x34,
|
|
0x0035 => 0x35,
|
|
0x0036 => 0x36,
|
|
0x0037 => 0x37,
|
|
0x0038 => 0x38,
|
|
0x0039 => 0x39,
|
|
0x003a => 0x3a,
|
|
0x003b => 0x3b,
|
|
0x003c => 0x3c,
|
|
0x003d => 0x3d,
|
|
0x003e => 0x3e,
|
|
0x003f => 0x3f,
|
|
0x0040 => 0x40,
|
|
0x0041 => 0x41,
|
|
0x0042 => 0x42,
|
|
0x0043 => 0x43,
|
|
0x0044 => 0x44,
|
|
0x0045 => 0x45,
|
|
0x0046 => 0x46,
|
|
0x0047 => 0x47,
|
|
0x0048 => 0x48,
|
|
0x0049 => 0x49,
|
|
0x004a => 0x4a,
|
|
0x004b => 0x4b,
|
|
0x004c => 0x4c,
|
|
0x004d => 0x4d,
|
|
0x004e => 0x4e,
|
|
0x004f => 0x4f,
|
|
0x0050 => 0x50,
|
|
0x0051 => 0x51,
|
|
0x0052 => 0x52,
|
|
0x0053 => 0x53,
|
|
0x0054 => 0x54,
|
|
0x0055 => 0x55,
|
|
0x0056 => 0x56,
|
|
0x0057 => 0x57,
|
|
0x0058 => 0x58,
|
|
0x0059 => 0x59,
|
|
0x005a => 0x5a,
|
|
0x005b => 0x5b,
|
|
0x005c => 0x5c,
|
|
0x005d => 0x5d,
|
|
0x005e => 0x5e,
|
|
0x005f => 0x5f,
|
|
0x0060 => 0x60,
|
|
0x0061 => 0x61,
|
|
0x0062 => 0x62,
|
|
0x0063 => 0x63,
|
|
0x0064 => 0x64,
|
|
0x0065 => 0x65,
|
|
0x0066 => 0x66,
|
|
0x0067 => 0x67,
|
|
0x0068 => 0x68,
|
|
0x0069 => 0x69,
|
|
0x006a => 0x6a,
|
|
0x006b => 0x6b,
|
|
0x006c => 0x6c,
|
|
0x006d => 0x6d,
|
|
0x006e => 0x6e,
|
|
0x006f => 0x6f,
|
|
0x0070 => 0x70,
|
|
0x0071 => 0x71,
|
|
0x0072 => 0x72,
|
|
0x0073 => 0x73,
|
|
0x0074 => 0x74,
|
|
0x0075 => 0x75,
|
|
0x0076 => 0x76,
|
|
0x0077 => 0x77,
|
|
0x0078 => 0x78,
|
|
0x0079 => 0x79,
|
|
0x007a => 0x7a,
|
|
0x007b => 0x7b,
|
|
0x007c => 0x7c,
|
|
0x007d => 0x7d,
|
|
0x007e => 0x7e,
|
|
0x007f => 0x7f,
|
|
0x00c7 => 0x80,
|
|
0x00fc => 0x81,
|
|
0x00e9 => 0x82,
|
|
0x00e2 => 0x83,
|
|
0x00e4 => 0x84,
|
|
0x00e0 => 0x85,
|
|
0x00e5 => 0x86,
|
|
0x00e7 => 0x87,
|
|
0x00ea => 0x88,
|
|
0x00eb => 0x89,
|
|
0x00e8 => 0x8a,
|
|
0x00ef => 0x8b,
|
|
0x00ee => 0x8c,
|
|
0x00ec => 0x8d,
|
|
0x00c4 => 0x8e,
|
|
0x00c5 => 0x8f,
|
|
0x00c9 => 0x90,
|
|
0x00e6 => 0x91,
|
|
0x00c6 => 0x92,
|
|
0x00f4 => 0x93,
|
|
0x00f6 => 0x94,
|
|
0x00f2 => 0x95,
|
|
0x00fb => 0x96,
|
|
0x00f9 => 0x97,
|
|
0x00ff => 0x98,
|
|
0x00d6 => 0x99,
|
|
0x00dc => 0x9a,
|
|
0x00a2 => 0x9b,
|
|
0x00a3 => 0x9c,
|
|
0x00a5 => 0x9d,
|
|
0x20a7 => 0x9e,
|
|
0x0192 => 0x9f,
|
|
0x00e1 => 0xa0,
|
|
0x00ed => 0xa1,
|
|
0x00f3 => 0xa2,
|
|
0x00fa => 0xa3,
|
|
0x00f1 => 0xa4,
|
|
0x00d1 => 0xa5,
|
|
0x00aa => 0xa6,
|
|
0x00ba => 0xa7,
|
|
0x00bf => 0xa8,
|
|
0x2310 => 0xa9,
|
|
0x00ac => 0xaa,
|
|
0x00bd => 0xab,
|
|
0x00bc => 0xac,
|
|
0x00a1 => 0xad,
|
|
0x00ab => 0xae,
|
|
0x00bb => 0xaf,
|
|
0x2591 => 0xb0,
|
|
0x2592 => 0xb1,
|
|
0x2593 => 0xb2,
|
|
0x2502 => 0xb3,
|
|
0x2524 => 0xb4,
|
|
0x2561 => 0xb5,
|
|
0x2562 => 0xb6,
|
|
0x2556 => 0xb7,
|
|
0x2555 => 0xb8,
|
|
0x2563 => 0xb9,
|
|
0x2551 => 0xba,
|
|
0x2557 => 0xbb,
|
|
0x255d => 0xbc,
|
|
0x255c => 0xbd,
|
|
0x255b => 0xbe,
|
|
0x2510 => 0xbf,
|
|
0x2514 => 0xc0,
|
|
0x2534 => 0xc1,
|
|
0x252c => 0xc2,
|
|
0x251c => 0xc3,
|
|
0x2500 => 0xc4,
|
|
0x253c => 0xc5,
|
|
0x255e => 0xc6,
|
|
0x255f => 0xc7,
|
|
0x255a => 0xc8,
|
|
0x2554 => 0xc9,
|
|
0x2569 => 0xca,
|
|
0x2566 => 0xcb,
|
|
0x2560 => 0xcc,
|
|
0x2550 => 0xcd,
|
|
0x256c => 0xce,
|
|
0x2567 => 0xcf,
|
|
0x2568 => 0xd0,
|
|
0x2564 => 0xd1,
|
|
0x2565 => 0xd2,
|
|
0x2559 => 0xd3,
|
|
0x2558 => 0xd4,
|
|
0x2552 => 0xd5,
|
|
0x2553 => 0xd6,
|
|
0x256b => 0xd7,
|
|
0x256a => 0xd8,
|
|
0x2518 => 0xd9,
|
|
0x250c => 0xda,
|
|
0x2588 => 0xdb,
|
|
0x2584 => 0xdc,
|
|
0x258c => 0xdd,
|
|
0x2590 => 0xde,
|
|
0x2580 => 0xdf,
|
|
0x03b1 => 0xe0,
|
|
0x00df => 0xe1,
|
|
0x0393 => 0xe2,
|
|
0x03c0 => 0xe3,
|
|
0x03a3 => 0xe4,
|
|
0x03c3 => 0xe5,
|
|
0x00b5 => 0xe6,
|
|
0x03c4 => 0xe7,
|
|
0x03a6 => 0xe8,
|
|
0x0398 => 0xe9,
|
|
0x03a9 => 0xea,
|
|
0x03b4 => 0xeb,
|
|
0x221e => 0xec,
|
|
0x03c6 => 0xed,
|
|
0x03b5 => 0xee,
|
|
0x2229 => 0xef,
|
|
0x2261 => 0xf0,
|
|
0x00b1 => 0xf1,
|
|
0x2265 => 0xf2,
|
|
0x2264 => 0xf3,
|
|
0x2320 => 0xf4,
|
|
0x2321 => 0xf5,
|
|
0x00f7 => 0xf6,
|
|
0x2248 => 0xf7,
|
|
0x00b0 => 0xf8,
|
|
0x2219 => 0xf9,
|
|
0x00b7 => 0xfa,
|
|
0x221a => 0xfb,
|
|
0x207f => 0xfc,
|
|
0x00b2 => 0xfd,
|
|
0x25a0 => 0xfe,
|
|
0x00a0 => 0xff,
|
|
_ => 0x3f, // For safety, us the question mark '?'
|
|
};
|
|
output
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod test
|
|
{
|
|
#[test]
|
|
fn to_char_valid()
|
|
{
|
|
for i in ::std::iter::range_inclusive(0x00, 0xFF)
|
|
{
|
|
super::to_char(i);
|
|
}
|
|
}
|
|
}
|