2 * Routines for handling DVB-SI character tables (as defined in EN 300 468)
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
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.
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.
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
29 #include <epan/proto.h>
30 #include <epan/tvbuff.h>
31 #include <epan/value_string.h>
33 #include "dvb_chartbl.h"
36 static const value_string dvb_string_encoding_vals[] = {
37 { DVB_ENCODING_INVALID, "Incorrect length for encoding" },
38 { DVB_ENCODING_RESERVED, "Reserved for future use" },
39 { DVB_ENCODING_UNKNOWN, "Unknown/undefined encoding" },
41 { DVB_ENCODING_LATIN, "Latin (default table)" },
43 { DVB_ENCODING_ISO_8859_1, "ISO/IEC 8859-1 (West European)" },
44 { DVB_ENCODING_ISO_8859_2, "ISO/IEC 8859-2 (East European)" },
45 { DVB_ENCODING_ISO_8859_3, "ISO/IEC 8859-3 (South European)" },
46 { DVB_ENCODING_ISO_8859_4, "ISO/IEC 8859-4 (North and North-East European)" },
47 { DVB_ENCODING_ISO_8859_5, "ISO/IEC 8859-5 (Latin/Cyrillic)" },
48 { DVB_ENCODING_ISO_8859_6, "ISO/IEC 8859-6 (Latin/Arabic)" },
49 { DVB_ENCODING_ISO_8859_7, "ISO/IEC 8859-7 (Latin/Greek)" },
50 { DVB_ENCODING_ISO_8859_8, "ISO/IEC 8859-8 (Latin/Hebrew)" },
51 { DVB_ENCODING_ISO_8859_9, "ISO/IEC 8859-9 (West European & Turkish)" },
52 { DVB_ENCODING_ISO_8859_10, "ISO/IEC 8859-10 (North European)" },
53 { DVB_ENCODING_ISO_8859_11, "ISO/IEC 8859-11 (Thai)" },
54 { DVB_ENCODING_ISO_8859_13, "ISO/IEC 8859-13 (Baltic)" },
55 { DVB_ENCODING_ISO_8859_14, "ISO/IEC 8859-14 (Celtic)" },
56 { DVB_ENCODING_ISO_8859_15, "ISO/IEC 8859-15 (West European)" },
57 { DVB_ENCODING_ISO_10646_BMP, "ISO/IEC 10646 Basic Multilingual Plane" },
58 { DVB_ENCODING_KSX_1001, "KSX 1001-2004 (Korean character set)" },
59 { DVB_ENCODING_GB_2312, "GB-2312-1980 (Simplified Chinese)" },
60 { DVB_ENCODING_ISO_10646_BIG5, "ISO/IEC 10646 BIG5 subset" },
61 { DVB_ENCODING_ISO_10646_UTF8_BMP,
62 "ISO/IEC 10646 Basic Multilingual Plane, UTF-8 encoded" },
69 dvb_analyze_string_charset0(guint8 byte0)
73 return DVB_ENCODING_ISO_8859_5;
75 return DVB_ENCODING_ISO_8859_6;
77 return DVB_ENCODING_ISO_8859_7;
79 return DVB_ENCODING_ISO_8859_8;
81 return DVB_ENCODING_ISO_8859_9;
83 return DVB_ENCODING_ISO_8859_10;
85 return DVB_ENCODING_ISO_8859_11;
87 return DVB_ENCODING_RESERVED; /* was reserved for ISO-8859-12 */
89 return DVB_ENCODING_ISO_8859_13;
91 return DVB_ENCODING_ISO_8859_14;
93 return DVB_ENCODING_ISO_8859_15;
95 return DVB_ENCODING_ISO_10646_BMP;
97 return DVB_ENCODING_KSX_1001;
99 return DVB_ENCODING_GB_2312;
101 return DVB_ENCODING_ISO_10646_BIG5;
103 return DVB_ENCODING_ISO_10646_UTF8_BMP;
106 return DVB_ENCODING_UNKNOWN;
111 static dvb_encoding_e
112 dvb_analyze_string_charset0_10(guint16 byte12)
116 return DVB_ENCODING_RESERVED;
118 return DVB_ENCODING_ISO_8859_1;
120 return DVB_ENCODING_ISO_8859_2;
122 return DVB_ENCODING_ISO_8859_3;
124 return DVB_ENCODING_ISO_8859_4;
126 return DVB_ENCODING_ISO_8859_5;
128 return DVB_ENCODING_ISO_8859_6;
130 return DVB_ENCODING_ISO_8859_7;
132 return DVB_ENCODING_ISO_8859_8;
134 return DVB_ENCODING_ISO_8859_9;
136 return DVB_ENCODING_ISO_8859_10;
138 return DVB_ENCODING_ISO_8859_11;
140 return DVB_ENCODING_RESERVED;
142 return DVB_ENCODING_ISO_8859_13;
144 return DVB_ENCODING_ISO_8859_14;
146 return DVB_ENCODING_ISO_8859_15;
148 default: /* 0x10 XX XX */
149 return DVB_ENCODING_UNKNOWN;
154 static dvb_encoding_e
155 dvb_analyze_string_charset0_1F(guint8 byte1)
157 /* http://www.dvbservices.com/identifiers/encoding_type_id */
160 case 0x00: /* 0x1F 0x00 */
161 return DVB_ENCODING_RESERVED;
167 return DVB_ENCODING_RESERVED;
170 /* XXX: Malaysian Technical Standards Forum Bhd */
171 return DVB_ENCODING_RESERVED;
173 default: /* 0x1F XX */
174 return DVB_ENCODING_RESERVED;
180 dvb_analyze_string_charset(tvbuff_t *tvb, int offset, int length, dvb_encoding_e *encoding)
183 guint8 byte0 = tvb_get_guint8(tvb, offset + 0);
186 /* the first byte is a normal character, not the number of a character table */
187 *encoding = DVB_ENCODING_LATIN;
190 } else if (byte0 == 0x1F) {
192 *encoding = dvb_analyze_string_charset0_1F(tvb_get_guint8(tvb, offset + 1));
195 *encoding = DVB_ENCODING_INVALID;
198 } else if (byte0 >= 0x16) { /* 16 ... 1E */
199 *encoding = DVB_ENCODING_RESERVED;
202 } else if (byte0 == 0x10) {
204 *encoding = dvb_analyze_string_charset0_10(tvb_get_ntohs(tvb, offset + 1));
207 *encoding = DVB_ENCODING_INVALID;
210 } else if ((byte0 >= 0x0C && byte0 <= 0x0F)) {
211 *encoding = DVB_ENCODING_RESERVED;
214 *encoding = dvb_analyze_string_charset0(byte0);
218 *encoding = DVB_ENCODING_LATIN;
225 dvb_enc_to_item_enc(dvb_encoding_e encoding)
227 /* XXX: take ISO control codes into account,
228 e.g. 0x86 - turn emphasis on ; 0x87 - turn emphasis off */
231 case DVB_ENCODING_ISO_8859_1:
232 return ENC_ISO_8859_1 | ENC_NA;
234 case DVB_ENCODING_ISO_8859_2:
235 return ENC_ISO_8859_2 | ENC_NA;
237 case DVB_ENCODING_ISO_8859_3:
238 return ENC_ISO_8859_3 | ENC_NA;
240 case DVB_ENCODING_ISO_8859_4:
241 return ENC_ISO_8859_4 | ENC_NA;
243 case DVB_ENCODING_ISO_8859_5:
244 return ENC_ISO_8859_5 | ENC_NA;
246 case DVB_ENCODING_ISO_8859_6:
247 return ENC_ISO_8859_6 | ENC_NA;
249 case DVB_ENCODING_ISO_8859_7:
250 return ENC_ISO_8859_7 | ENC_NA;
252 case DVB_ENCODING_ISO_8859_8:
253 return ENC_ISO_8859_8 | ENC_NA;
255 case DVB_ENCODING_ISO_8859_9:
256 return ENC_ISO_8859_9 | ENC_NA;
258 case DVB_ENCODING_ISO_8859_10:
259 return ENC_ISO_8859_10 | ENC_NA;
261 case DVB_ENCODING_ISO_8859_11:
262 return ENC_ISO_8859_11 | ENC_NA;
264 case DVB_ENCODING_ISO_8859_13:
265 return ENC_ISO_8859_13 | ENC_NA;
267 case DVB_ENCODING_ISO_8859_14:
268 return ENC_ISO_8859_14 | ENC_NA;
270 case DVB_ENCODING_ISO_8859_15:
271 return ENC_ISO_8859_15 | ENC_NA;
273 case DVB_ENCODING_ISO_10646_UTF8_BMP:
274 return ENC_UTF_8 | ENC_NA;
276 default: /* not supported */
277 return ENC_ASCII | ENC_NA;
283 dvb_add_chartbl(proto_tree *tree, int hf,
284 tvbuff_t *tvb, gint offset, gint length, dvb_encoding_e encoding)
289 pi = proto_tree_add_text(tree, NULL, 0, 0,
290 "Default character table (Latin)");
291 PROTO_ITEM_SET_GENERATED(pi);
294 proto_tree_add_bytes_format_value(tree, hf,
295 tvb, offset, length, NULL, "%s (%s)",
296 val_to_str_const(encoding, dvb_string_encoding_vals, "Unknown"),
297 bytes_to_ep_str_punct(
298 tvb_get_ptr(tvb, offset, length), length, ' '));
303 * Editor modelines - http://www.wireshark.org/tools/modelines.html
308 * indent-tabs-mode: nil
311 * vi: set shiftwidth=4 tabstop=8 expandtab:
312 * :indentSize=4:tabSize=8:noTabs=true: