Regenerate a few more of the ASN.1 dissectors
[obnox/wireshark/wip.git] / epan / charsets.c
1 /* charsets.c
2  * Routines for handling character sets
3  *
4  * $Id$
5  *
6  * Wireshark - Network traffic analyzer
7  * By Gerald Combs <gerald@wireshark.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  */
24
25 #ifdef HAVE_CONFIG_H
26 # include "config.h"
27 #endif
28
29 #include <glib.h>
30
31 #include "charsets.h"
32
33 /* ASCII/EBCDIC conversion tables from
34  * http://www.room42.com/store/computer_center/code_tables.shtml
35  */
36 #if 0
37 static guint8 ASCII_translate_EBCDIC [ 256 ] = {
38     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
39     0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
40     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
41     0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
42     0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, 0x4D,
43     0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
44     0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8,
45     0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
46     0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8,
47     0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
48     0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,
49     0xE8, 0xE9, 0xAD, 0xE0, 0xBD, 0x5F, 0x6D,
50     0x7D, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88,
51     0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
52     0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7,
53     0xA8, 0xA9, 0xC0, 0x6A, 0xD0, 0xA1, 0x4B,
54     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
55     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
56     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
57     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
58     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
59     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
60     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
61     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
62     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
63     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
64     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
65     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
66     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
67     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
68     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B,
69     0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B, 0x4B
70 };
71
72 void
73 ASCII_to_EBCDIC(guint8 *buf, guint bytes)
74 {
75         guint   i;
76         guint8  *bufptr;
77
78         bufptr = buf;
79
80         for (i = 0; i < bytes; i++, bufptr++) {
81                 *bufptr = ASCII_translate_EBCDIC[*bufptr];
82         }
83 }
84
85 guint8
86 ASCII_to_EBCDIC1(guint8 c)
87 {
88         return ASCII_translate_EBCDIC[c];
89 }
90 #endif
91
92 static guint8 EBCDIC_translate_ASCII [ 256 ] = {
93     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
94     0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
95     0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
96     0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,
97     0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
98     0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
99     0x2E, 0x2E, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
100     0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x2E, 0x3F,
101     0x20, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,
102     0x2E, 0x2E, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
103     0x26, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,
104     0x2E, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
105     0x2D, 0x2F, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,
106     0x2E, 0x7C, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
107     0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,
108     0x2E, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
109     0x2E, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
110     0x69, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,
111     0x2E, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71,
112     0x72, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,
113     0x2E, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
114     0x7A, 0x2E, 0x2E, 0x2E, 0x5B, 0x2E, 0x2E,
115     0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,
116     0x2E, 0x2E, 0x2E, 0x2E, 0x5D, 0x2E, 0x2E,
117     0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
118     0x49, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,
119     0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,
120     0x52, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,
121     0x5C, 0x2E, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
122     0x5A, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E,
123     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38,
124     0x39, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E, 0x2E
125 };
126
127 void
128 EBCDIC_to_ASCII(guint8 *buf, guint bytes)
129 {
130         guint   i;
131         guint8  *bufptr;
132
133         bufptr = buf;
134
135         for (i = 0; i < bytes; i++, bufptr++) {
136                 *bufptr = EBCDIC_translate_ASCII[*bufptr];
137         }
138 }
139
140 guint8
141 EBCDIC_to_ASCII1(guint8 c)
142 {
143         return EBCDIC_translate_ASCII[c];
144 }