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