1 /*
2    BAREOS® - Backup Archiving REcovery Open Sourced
3 
4    Copyright (C) 2006-2006 Free Software Foundation Europe e.V.
5    Copyright (C) 2016-2016 Bareos GmbH & Co. KG
6 
7    This program is Free Software; you can redistribute it and/or
8    modify it under the terms of version three of the GNU Affero General Public
9    License as published by the Free Software Foundation and included
10    in the file LICENSE.
11 
12    This program is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15    Affero General Public License for more details.
16 
17    You should have received a copy of the GNU Affero General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20    02110-1301, USA.
21 */
22 
23 /*
24  * Taken from the public domain ansitape program for
25  *   integration into Bareos. KES - Mar 2005
26  */
27 /**
28  * @file
29  * ebcdic <-> ascii conversion routines
30  */
31 
32 namespace storagedaemon {
33 
34 /* Mapping of EBCDIC codes to ASCII equivalents. */
35 static char to_ascii_table[256] = {
36     '\000', '\001', '\002', '\003', '\234', '\011', '\206', '\177', '\227',
37     '\215', '\216', '\013', '\014', '\015', '\016', '\017', '\020', '\021',
38     '\022', '\023', '\235', '\205', '\010', '\207', '\030', '\031', '\222',
39     '\217', '\034', '\035', '\036', '\037', '\200', '\201', '\202', '\203',
40     '\204', '\012', '\027', '\033', '\210', '\211', '\212', '\213', '\214',
41     '\005', '\006', '\007', '\220', '\221', '\026', '\223', '\224', '\225',
42     '\226', '\004', '\230', '\231', '\232', '\233', '\024', '\025', '\236',
43     '\032', '\040', '\240', '\241', '\242', '\243', '\244', '\245', '\246',
44     '\247', '\250', '\133', '\056', '\074', '\050', '\053', '\041', '\046',
45     '\251', '\252', '\253', '\254', '\255', '\256', '\257', '\260', '\261',
46     '\135', '\044', '\052', '\051', '\073', '\136', '\055', '\057', '\262',
47     '\263', '\264', '\265', '\266', '\267', '\270', '\271', '\174', '\054',
48     '\045', '\137', '\076', '\077', '\272', '\273', '\274', '\275', '\276',
49     '\277', '\300', '\301', '\302', '\140', '\072', '\043', '\100', '\047',
50     '\075', '\042', '\303', '\141', '\142', '\143', '\144', '\145', '\146',
51     '\147', '\150', '\151', '\304', '\305', '\306', '\307', '\310', '\311',
52     '\312', '\152', '\153', '\154', '\155', '\156', '\157', '\160', '\161',
53     '\162', '\313', '\314', '\315', '\316', '\317', '\320', '\321', '\176',
54     '\163', '\164', '\165', '\166', '\167', '\170', '\171', '\172', '\322',
55     '\323', '\324', '\325', '\326', '\327', '\330', '\331', '\332', '\333',
56     '\334', '\335', '\336', '\337', '\340', '\341', '\342', '\343', '\344',
57     '\345', '\346', '\347', '\173', '\101', '\102', '\103', '\104', '\105',
58     '\106', '\107', '\110', '\111', '\350', '\351', '\352', '\353', '\354',
59     '\355', '\175', '\112', '\113', '\114', '\115', '\116', '\117', '\120',
60     '\121', '\122', '\356', '\357', '\360', '\361', '\362', '\363', '\134',
61     '\237', '\123', '\124', '\125', '\126', '\127', '\130', '\131', '\132',
62     '\364', '\365', '\366', '\367', '\370', '\371', '\060', '\061', '\062',
63     '\063', '\064', '\065', '\066', '\067', '\070', '\071', '\372', '\373',
64     '\374', '\375', '\376', '\377'};
65 
66 
67 /* Mapping of ASCII codes to EBCDIC equivalents. */
68 static char to_ebcdic_table[256] = {
69     '\000', '\001', '\002', '\003', '\067', '\055', '\056', '\057', '\026',
70     '\005', '\045', '\013', '\014', '\015', '\016', '\017', '\020', '\021',
71     '\022', '\023', '\074', '\075', '\062', '\046', '\030', '\031', '\077',
72     '\047', '\034', '\035', '\036', '\037', '\100', '\117', '\177', '\173',
73     '\133', '\154', '\120', '\175', '\115', '\135', '\134', '\116', '\153',
74     '\140', '\113', '\141', '\360', '\361', '\362', '\363', '\364', '\365',
75     '\366', '\367', '\370', '\371', '\172', '\136', '\114', '\176', '\156',
76     '\157', '\174', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
77     '\310', '\311', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
78     '\330', '\331', '\342', '\343', '\344', '\345', '\346', '\347', '\350',
79     '\351', '\112', '\340', '\132', '\137', '\155', '\171', '\201', '\202',
80     '\203', '\204', '\205', '\206', '\207', '\210', '\211', '\221', '\222',
81     '\223', '\224', '\225', '\226', '\227', '\230', '\231', '\242', '\243',
82     '\244', '\245', '\246', '\247', '\250', '\251', '\300', '\152', '\320',
83     '\241', '\007', '\040', '\041', '\042', '\043', '\044', '\025', '\006',
84     '\027', '\050', '\051', '\052', '\053', '\054', '\011', '\012', '\033',
85     '\060', '\061', '\032', '\063', '\064', '\065', '\066', '\010', '\070',
86     '\071', '\072', '\073', '\004', '\024', '\076', '\341', '\101', '\102',
87     '\103', '\104', '\105', '\106', '\107', '\110', '\111', '\121', '\122',
88     '\123', '\124', '\125', '\126', '\127', '\130', '\131', '\142', '\143',
89     '\144', '\145', '\146', '\147', '\150', '\151', '\160', '\161', '\162',
90     '\163', '\164', '\165', '\166', '\167', '\170', '\200', '\212', '\213',
91     '\214', '\215', '\216', '\217', '\220', '\232', '\233', '\234', '\235',
92     '\236', '\237', '\240', '\252', '\253', '\254', '\255', '\256', '\257',
93     '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267', '\270',
94     '\271', '\272', '\273', '\274', '\275', '\276', '\277', '\312', '\313',
95     '\314', '\315', '\316', '\317', '\332', '\333', '\334', '\335', '\336',
96     '\337', '\352', '\353', '\354', '\355', '\356', '\357', '\372', '\373',
97     '\374', '\375', '\376', '\377'};
98 
99 
100 /**
101  * Convert from ASCII to EBCDIC
102  */
AsciiToEbcdic(char * dst,char * src,int count)103 void AsciiToEbcdic(char* dst, char* src, int count)
104 {
105   while (count--) { *dst++ = to_ebcdic_table[0377 & *src++]; }
106 }
107 
108 
109 /**
110  * Convert from EBCDIC to ASCII
111  */
EbcdicToAscii(char * dst,char * src,int count)112 void EbcdicToAscii(char* dst, char* src, int count)
113 {
114   while (count--) { *dst++ = to_ascii_table[0377 & *src++]; }
115 }
116 
117 } /* namespace storagedaemon */
118