source: trunk/src/xmlmodel.c @ 124

Last change on this file since 124 was 102, checked in by cameron, 11 years ago

Initialize predefined entities lt, gt, amp, apos, quot.

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