/*
 * Der ZConnect Zeichensatz ist eine Untermenge des IBM-PC Zeichensatzes,
 * CodePage 437. Erlaubt sind die folgenden Zeichen:
 * <Tab>       (009)
 * <LineFeed>  (010)
 * <FormFeed>  (012)
 * <CR>        (013)
 * <???>       (020)
 * <Paragraph> (021)
 * sowie die Zeichen von 32-255.
 *
 * Die Konvertierung von und nach ISO 8859-1 (z.B. bei RFC-Relays)
 * geschieht nach den folgenden Tabellen.
 */

#include <sys/types.h>
 
/* BAD changed from 160 to 32 (Space) */

#define BAD 32

/*
 * Table converting IBM Code Page 437 (CP437) to ISO 8859-1
 *
 * 0-31 changed to BAD except Tab,LF,FF,CR,20 and Paragraph
 * 201  changed from '-' to '+'
 * 203  changed from '|' to '-'
 * 237  changed from 'O' to 248
 */

static  unsigned char pc437xiso [] =                    /* 000-255 */
{
BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,         /* 000-007 */
BAD,   9,  10, BAD,  12,  13, BAD, BAD,         /* 008-015 */
BAD, BAD, BAD, BAD, 182, 167, BAD, BAD,         /* 016-023 */
BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,         /* 024-031 */

' ', '!',  34, '#', '$',  37, '&',  39,         /* 032-039 */
'(', ')', '*', '+', ',', '-', '.', '/',         /* 040-047 */
'0', '1', '2', '3', '4', '5', '6', '7',         /* 048-055 */
'8', '9', ':', ';', '<', '=', '>', '?',         /* 056-063 */
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',         /* 064-071 */
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',         /* 072-079 */
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',         /* 080-087 */
'X', 'Y', 'Z', '[',  92, ']', '^', '_',         /* 088-095 */
 96, 'a', 'b', 'c', 'd', 'e', 'f', 'g',         /* 096-103 */
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',         /* 104-111 */
'p', 'q', 'r', 's', 't', 'u', 'v', 'w',         /* 112-119 */
'x', 'y', 'z', '{', '|', '}', 126, 127,         /* 120-127 */

199, 252, 233, 226, 228, 224, 229, 231,         /* 128-135 */
234, 235, 232, 239, 238, 236, 196, 197,         /* 136-143 */
201, 230, 198, 244, 246, 242, 251, 249,         /* 144-151 */
255, 214, 220, 162, 163, 165, 'P', 'f',         /* 152-159 */
225, 237, 243, 250, 241, 209, 170, 186,         /* 160-167 */
191, '-', 172, 189, 188, 161, 171, 187,         /* 168-175 */

'#', '#', '#', '|', '|', '|', '|', '+',         /* 176-183 */
'+', '|', '|', '+', '+', '+', '+', '+',         /* 184-191 */
'+', '-', '-', '|', 173, '+', '|', '|',         /* 192-199 */
'+', '+', '-', '-', '|', '-', '+', '-',         /* 200-207 */
'-', '-', '-', '+', '+', '+', '+', '+',         /* 208-215 */
'+', '+', '+', '#', '#', '#', '#', '#',         /* 216-223 */

'a', 223, 'G', 'n', 'S', 's', 181, 't',         /* 224-231 */
'O', 'O', 'O', 'd', BAD, 'O', 'e', BAD,         /* 232-239 */
'=', 177, BAD, BAD, BAD, BAD, 247, '=',         /* 240-247 */
176, 183, 183, 'V', 'n', 178, 183, ' '          /* 248-255 */
} ;

void pc2iso(unsigned char *buffer, size_t len)
{
unsigned char c;

while (len--) {
c = pc437xiso[*buffer];
*buffer++ = c;
}
}


/*
 * Table converting ISO 8859-1 to IBM Code Page 437 (CP437)
 *
 * 0-31  changed to BAD except Tab,LF,FF,CR
 * 173   changed from '-' to 196
 * 248   changed from 'o' to 237
 */

static unsigned char isoxpc437 [] =                     /* 000-255 */
{
BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,         /* 000-007 */
BAD,   9,  10, BAD,  12,  13, BAD, BAD,         /* 008-015 */
BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,         /* 016-023 */
BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,         /* 024-031 */

' ', '!',  34, '#', '$',  37, '&',  39,         /* 032-039 */
'(', ')', '*', '+', ',', '-', '.', '/',         /* 040-047 */
'0', '1', '2', '3', '4', '5', '6', '7',         /* 048-055 */
'8', '9', ':', ';', '<', '=', '>', '?',         /* 056-063 */
'@', 'A', 'B', 'C', 'D', 'E', 'F', 'G',         /* 064-071 */
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',         /* 072-079 */
'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',         /* 080-087 */
'X', 'Y', 'Z', '[',  92, ']', '^', '_',         /* 088-095 */
 96, 'a', 'b', 'c', 'd', 'e', 'f', 'g',         /* 096-103 */
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',         /* 104-111 */
'p', 'q', 'r', 's', 't', 'u', 'v', 'w',         /* 112-119 */
'x', 'y', 'z', '{', '|', '}', 126, 127,         /* 120-127 */

BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,         /* 128-135 */
BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,         /* 136-143 */
BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,         /* 144-151 */
BAD, BAD, BAD, BAD, BAD, BAD, BAD, BAD,         /* 152-159 */

' ', 173, 155, 156, 'o', 157, '|',  21,         /* 160-167 */
 34, 'C', 166, 174, 170, 196, 'R', '-',         /* 168-175 */
248, 241, 253, '3',  39, 230,  20, 250,         /* 176-183 */
',', '1', 167, 175, 172, 171, BAD, 168,         /* 184-191 */
'A', 'A', 'A', 'A', 142, 143, 146, 128,         /* 192-199 */
'E', 144, 'E', 'E', 'I', 'I', 'I', 'I',         /* 200-207 */
'D', 165, 'O', 'O', 'O', 'O', 153, 'x',         /* 208-215 */
'O', 'U', 'U', 'U', 154, 'Y', 'P', 225,         /* 216-223 */
133, 160, 131, 'a', 132, 134, 145, 135,         /* 224-231 */
138, 130, 136, 137, 141, 161, 140, 139,         /* 232-239 */
'd', 164, 149, 162, 147, 'o', 148, 246,         /* 240-247 */
237, 151, 163, 150, 129, 'y', 'p', 152          /* 248-255 */
} ;

void iso2pc(unsigned char *buffer, size_t len)
{
unsigned char c;

while (len--) {
c = isoxpc437[*buffer];
*buffer++ = c;
}
}
