source: trunk/src/xmlmodel.c @ 135

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

SymbolTable? class and end tag checking.

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