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