bcc1deafacb5772d97069e1b24fb12792867fcc8
[pspp] / src / libpspp / legacy-encoding.c
1 /* PSPP - computes sample statistics.
2    Copyright (C) 2006 Free Software Foundation, Inc.
3    Written by Ben Pfaff <blp@gnu.org>.
4
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.
9
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.
14
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
18    02110-1301, USA. */
19
20 #include <config.h>
21
22 #include <libpspp/legacy-encoding.h>
23
24 #include "str.h"
25
26 static const char ascii_to_ebcdic[256];
27 static const char ebcdic_to_ascii[256];
28
29 void
30 legacy_recode (enum legacy_encoding from, const char *src,
31              enum legacy_encoding to, char *dst,
32              size_t size) 
33 {
34   if (from != to) 
35     {
36       const char *table;
37       size_t i;
38
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]];
42     }
43   else 
44     {
45       if (src != dst)
46         memcpy (dst, src, size);
47     }
48 }
49
50 char
51 legacy_to_native (enum legacy_encoding from, char c) 
52 {
53   legacy_recode (from, &c, LEGACY_NATIVE, &c, 1);
54   return c;
55 }
56
57 char
58 legacy_from_native (enum legacy_encoding to, char c) 
59 {
60   legacy_recode (LEGACY_NATIVE, &c, to, &c, 1);
61   return c;
62 }
63
64 static const char ascii_to_ebcdic[256] = 
65   {
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, 
98   };
99
100 static const char ebcdic_to_ascii[256] = 
101   {
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, 
134   };
135