source: trunk/src/xmlmodel.c @ 100

Last change on this file since 100 was 100, checked in by lindanl, 11 years ago

Parsers for internal and external entities.

File size: 3.6 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        ElementAttributeData.push_back(vector<ATT_info *>());
14        globalElementCount = 0;
15        globalAttributeCount = 0;
16}
17
18Model_Info::~Model_Info() {
19}
20
21Entity_Info::Entity_Info() {
22}
23Entity_Info::~Entity_Info() {
24        free(encoding);
25}
26
27/* Signature-based character set family detection in accord with
28   Appendix F of the XML 1.0 and 1.1 specifications. */
29
30/* These definitions use b2int16 to determine appropriate doublebyte
31   values based on endianness of the underlying architecture. */
32static const int x0000 = b2int16<0x00, 0x00>::value;
33static const int xFEFF = b2int16<0xFE, 0xFF>::value;
34static const int xFFFE = b2int16<0xFF, 0xFE>::value;
35static const int x003C = b2int16<0x00, 0x3C>::value;
36static const int x3C00 = b2int16<0x3C, 0x00>::value;
37static const int x4C6F = b2int16<0x4C, 0x6F>::value;
38static const int xA794 = b2int16<0xA7, 0x94>::value;
39static const int xEFBE = b2int16<0xEF, 0xBE>::value;
40
41void Entity_Info::AnalyzeSignature(unsigned char * signature) {
42        uint16_t * XML_dbl_byte = (uint16_t *) signature;
43        switch (XML_dbl_byte[0]) {
44                case x0000:
45                        switch (XML_dbl_byte[1]) {
46                                case xFEFF: set_charset_family(ASCII, QuadByte, BigEndian, 1);break;
47                                case xFFFE: set_charset_family(ASCII, QuadByte, Unusual_2143, 1);break;
48                                case x3C00: set_charset_family(ASCII, QuadByte, Unusual_2143, 0);break;
49                                default: set_charset_family(ASCII, QuadByte, BigEndian, 0);
50                        }
51                        break;
52                case xFEFF:
53                        if (XML_dbl_byte[1] == x0000)
54                                set_charset_family(ASCII, QuadByte, Unusual_3412, 1);
55                        else set_charset_family(ASCII, DoubleByte, BigEndian, 1);
56                        break;
57                case xFFFE:
58                        if (XML_dbl_byte[1] == x0000)
59                                set_charset_family(ASCII, QuadByte, LittleEndian, 1);
60                        else set_charset_family(ASCII, DoubleByte, LittleEndian, 1);
61                        break;
62                case x003C:
63                        if (XML_dbl_byte[1] == x0000)
64                                set_charset_family(ASCII, QuadByte, Unusual_3412, 0);
65                        else set_charset_family(ASCII, DoubleByte, BigEndian, 0);
66                        break;
67                case x3C00:
68                        if (XML_dbl_byte[1] == x0000)
69                                set_charset_family(ASCII, QuadByte, LittleEndian, 0);
70                        else set_charset_family(ASCII, DoubleByte, LittleEndian, 0);
71                        break;
72                case x4C6F:
73                        if (XML_dbl_byte[1] == xA794)
74                                set_charset_family(EBCDIC, SingleByte, BigEndian, 0);
75                        else set_charset_family(ASCII, SingleByte, BigEndian, 0);
76                        break;
77                case xEFBE:
78                        if (signature[2] == 0xBF)
79                                set_charset_family(ASCII, SingleByte, BigEndian, 3);
80                        else set_charset_family(ASCII, SingleByte, BigEndian, 0);
81                        break;
82                default:
83                        set_charset_family(ASCII, SingleByte, BigEndian, 0);
84        }
85}
86void Entity_Info::set_charset_family(CodeUnit_Base C, CodeUnit_Size S, CodeUnit_ByteOrder O, int B){
87                code_unit_base = C;
88                code_unit_size = S;
89                byte_order = O;
90                BOM_units = B;
91 }
92int Model_Info::getOrInsertGlobalElement(unsigned char * elem_name, int lgth) {
93        int elemID;
94        char *s = new char[lgth+1];
95        memcpy(s, elem_name, lgth);
96        s[lgth] = '\0';
97        elemID = GlobalElementTable[s];
98        if(elemID==0){ 
99                GlobalElementTable[s]=++(globalElementCount);
100                elemID = globalElementCount;
101               
102                ElementAttributeData.push_back(vector<ATT_info *>());
103        }
104        return elemID;
105}
106
107int Model_Info::getOrInsertGlobalAttName(unsigned char * att_name, int lgth){
108       
109        char *s = new char[lgth+1];
110        memcpy(s, att_name, lgth);
111        s[lgth] = '\0';
112       
113        int attID = GlobalAttributeTable[s];
114        if(attID==0){   
115                GlobalAttributeTable[s]=++(globalAttributeCount);
116                attID = globalAttributeCount;
117        }
118        return attID;
119}
Note: See TracBrowser for help on using the repository browser.