source: trunk/src/xmlmodel.c @ 84

Last change on this file since 84 was 67, checked in by cameron, 11 years ago

Model Processor refactoring

File size: 2.8 KB
Line 
1/*  xmlmodel.c - XML Model Processor
2    Copyright (c) 2007, 2008 Robert D. Cameron
3    Licensed to the public under the Open Software License 3.0.
4    Licensed to International Characters, Inc., under the Academic
5    Free License 3.0.
6*/
7
8
9#include "multiliteral.h"
10#include "xmlmodel.h"
11
12Model_Info::~Model_Info() {
13        free(encoding);
14}
15
16/* Signature-based character set family detection in accord with
17   Appendix F of the XML 1.0 and 1.1 specifications. */
18
19/* These definitions use b2int16 to determine appropriate doublebyte
20   values based on endianness of the underlying architecture. */
21static const int x0000 = b2int16<0x00, 0x00>::value;
22static const int xFEFF = b2int16<0xFE, 0xFF>::value;
23static const int xFFFE = b2int16<0xFF, 0xFE>::value;
24static const int x003C = b2int16<0x00, 0x3C>::value;
25static const int x3C00 = b2int16<0x3C, 0x00>::value;
26static const int x4C6F = b2int16<0x4C, 0x6F>::value;
27static const int xA794 = b2int16<0xA7, 0x94>::value;
28static const int xEFBE = b2int16<0xEF, 0xBE>::value;
29
30void Model_Info::AnalyzeSignature(unsigned char * signature) {
31        uint16_t * XML_dbl_byte = (uint16_t *) signature;
32        switch (XML_dbl_byte[0]) {
33                case x0000:
34                        switch (XML_dbl_byte[1]) {
35                                case xFEFF: set_charset_family(ASCII, QuadByte, BigEndian, 1);break;
36                                case xFFFE: set_charset_family(ASCII, QuadByte, Unusual_2143, 1);break;
37                                case x3C00: set_charset_family(ASCII, QuadByte, Unusual_2143, 0);break;
38                                default: set_charset_family(ASCII, QuadByte, BigEndian, 0);
39                        }
40                        break;
41                case xFEFF:
42                        if (XML_dbl_byte[1] == x0000)
43                                set_charset_family(ASCII, QuadByte, Unusual_3412, 1);
44                        else set_charset_family(ASCII, DoubleByte, BigEndian, 1);
45                        break;
46                case xFFFE:
47                        if (XML_dbl_byte[1] == x0000)
48                                set_charset_family(ASCII, QuadByte, LittleEndian, 1);
49                        else set_charset_family(ASCII, DoubleByte, LittleEndian, 1);
50                        break;
51                case x003C:
52                        if (XML_dbl_byte[1] == x0000)
53                                set_charset_family(ASCII, QuadByte, Unusual_3412, 0);
54                        else set_charset_family(ASCII, DoubleByte, BigEndian, 0);
55                        break;
56                case x3C00:
57                        if (XML_dbl_byte[1] == x0000)
58                                set_charset_family(ASCII, QuadByte, LittleEndian, 0);
59                        else set_charset_family(ASCII, DoubleByte, LittleEndian, 0);
60                        break;
61                case x4C6F:
62                        if (XML_dbl_byte[1] == xA794)
63                                set_charset_family(EBCDIC, SingleByte, BigEndian, 0);
64                        else set_charset_family(ASCII, SingleByte, BigEndian, 0);
65                        break;
66                case xEFBE:
67                        if (signature[2] == 0xBF)
68                                set_charset_family(ASCII, SingleByte, BigEndian, 3);
69                        else set_charset_family(ASCII, SingleByte, BigEndian, 0);
70                        break;
71                default:
72                        set_charset_family(ASCII, SingleByte, BigEndian, 0);
73        }
74}
75void Model_Info::set_charset_family(CodeUnit_Base C, CodeUnit_Size S, CodeUnit_ByteOrder O, int B){
76                code_unit_base = C;
77                code_unit_size = S;
78                byte_order = O;
79                BOM_units = B;
80 }
Note: See TracBrowser for help on using the repository browser.