source: trunk/src/xmlmodel.c @ 91

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

ATTLIST semantics

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