Delete trailing whitespace at end of lines.
[pspp-builds.git] / src / libpspp / legacy-encoding.c
1 /* PSPP - computes sample statistics.
2    Copyright (C) 2006 Free Software Foundation, Inc.
3
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.
8
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.
13
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
17    02110-1301, USA. */
18
19 #include <config.h>
20
21 #include <libpspp/legacy-encoding.h>
22
23 #include "str.h"
24
25 static const char ascii_to_ebcdic[256];
26 static const char ebcdic_to_ascii[256];
27
28 void
29 legacy_recode (enum legacy_encoding from, const char *src,
30              enum legacy_encoding to, char *dst,
31              size_t size)
32 {
33   if (from != to)
34     {
35       const char *table;
36       size_t i;
37
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]];
41     }
42   else
43     {
44       if (src != dst)
45         memcpy (dst, src, size);
46     }
47 }
48
49 char
50 legacy_to_native (enum legacy_encoding from, char c)
51 {
52   legacy_recode (from, &c, LEGACY_NATIVE, &c, 1);
53   return c;
54 }
55
56 char
57 legacy_from_native (enum legacy_encoding to, char c)
58 {
59   legacy_recode (LEGACY_NATIVE, &c, to, &c, 1);
60   return c;
61 }
62
63 static const char ascii_to_ebcdic[256] =
64   {
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,
97   };
98
99 static const char ebcdic_to_ascii[256] =
100   {
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,
133   };
134