1 /* PSPP - a program for statistical analysis.
2 Copyright (C) 2006 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 #include <libpspp/legacy-encoding.h>
23 static const char ascii_to_ebcdic[256];
24 static const char ebcdic_to_ascii[256];
27 legacy_recode (enum legacy_encoding from, const char *src,
28 enum legacy_encoding to, char *dst,
36 table = from == LEGACY_ASCII ? ascii_to_ebcdic : ebcdic_to_ascii;
37 for (i = 0; i < size; i++)
38 dst[i] = table[(unsigned char) src[i]];
43 memcpy (dst, src, size);
48 legacy_to_native (enum legacy_encoding from, char c)
50 legacy_recode (from, &c, LEGACY_NATIVE, &c, 1);
55 legacy_from_native (enum legacy_encoding to, char c)
57 legacy_recode (LEGACY_NATIVE, &c, to, &c, 1);
61 static const char ascii_to_ebcdic[256] =
63 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f,
64 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
65 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26,
66 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f,
67 0x40, 0x5a, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d,
68 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61,
69 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
70 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f,
71 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
72 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6,
73 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6,
74 0xe7, 0xe8, 0xe9, 0xad, 0xe0, 0xbd, 0x9a, 0x6d,
75 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
76 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
77 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,
78 0xa7, 0xa8, 0xa9, 0xc0, 0x4f, 0xd0, 0x5f, 0x07,
79 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17,
80 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b,
81 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08,
82 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1,
83 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
84 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
85 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
86 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
87 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d,
88 0x8e, 0x8f, 0x90, 0x6a, 0x9b, 0x9c, 0x9d, 0x9e,
89 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0x4a, 0xae, 0xaf,
90 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
91 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xa1, 0xbe, 0xbf,
92 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb,
93 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed,
94 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
97 static const char ebcdic_to_ascii[256] =
99 0x00, 0x01, 0x02, 0x03, 0x9c, 0x09, 0x86, 0x7f,
100 0x97, 0x8d, 0x8e, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
101 0x10, 0x11, 0x12, 0x13, 0x9d, 0x85, 0x08, 0x87,
102 0x18, 0x19, 0x92, 0x8f, 0x1c, 0x1d, 0x1e, 0x1f,
103 0x80, 0x81, 0x82, 0x83, 0x84, 0x0a, 0x17, 0x1b,
104 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x05, 0x06, 0x07,
105 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04,
106 0x98, 0x99, 0x9a, 0x9b, 0x14, 0x15, 0x9e, 0x1a,
107 0x20, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6,
108 0xa7, 0xa8, 0xd5, 0x2e, 0x3c, 0x28, 0x2b, 0x7c,
109 0x26, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
110 0xb0, 0xb1, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x7e,
111 0x2d, 0x2f, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
112 0xb8, 0xb9, 0xcb, 0x2c, 0x25, 0x5f, 0x3e, 0x3f,
113 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1,
114 0xc2, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22,
115 0xc3, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
116 0x68, 0x69, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9,
117 0xca, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70,
118 0x71, 0x72, 0x5e, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
119 0xd1, 0xe5, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
120 0x79, 0x7a, 0xd2, 0xd3, 0xd4, 0x5b, 0xd6, 0xd7,
121 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
122 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0x5d, 0xe6, 0xe7,
123 0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
124 0x48, 0x49, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed,
125 0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
126 0x51, 0x52, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3,
127 0x5c, 0x9f, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
128 0x59, 0x5a, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9,
129 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
130 0x38, 0x39, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,