source: trunk/src/xmlmodel.c @ 126

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

Use NameID vs. name string as key for element, attribute, ... maps.

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