(map_case): Create destination case instead of leaving it
[pspp-builds.git] / src / libpspp / legacy-encoding.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2006 Free Software Foundation, Inc.
3
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.
8
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.
13
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/>. */
16
17 #include <config.h>
18
19 #include <libpspp/legacy-encoding.h>
20
21 #include "str.h"
22
23 static const char ascii_to_ebcdic[256];
24 static const char ebcdic_to_ascii[256];
25
26 void
27 legacy_recode (enum legacy_encoding from, const char *src,
28              enum legacy_encoding to, char *dst,
29              size_t size)
30 {
31   if (from != to)
32     {
33       const char *table;
34       size_t i;
35
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]];
39     }
40   else
41     {
42       if (src != dst)
43         memcpy (dst, src, size);
44     }
45 }
46
47 char
48 legacy_to_native (enum legacy_encoding from, char c)
49 {
50   legacy_recode (from, &c, LEGACY_NATIVE, &c, 1);
51   return c;
52 }
53
54 char
55 legacy_from_native (enum legacy_encoding to, char c)
56 {
57   legacy_recode (LEGACY_NATIVE, &c, to, &c, 1);
58   return c;
59 }
60
61 static const char ascii_to_ebcdic[256] =
62   {
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,
95   };
96
97 static const char ebcdic_to_ascii[256] =
98   {
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,
131   };
132