source: icXML/icXML-devel/src/icxmlc/XMLSymbolTable.cpp @ 2731

Last change on this file since 2731 was 2731, checked in by cameron, 6 years ago

Updates

File size: 5.6 KB
Line 
1/*
2 *  Copyright © 2012 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icXML is a trademark of International Characters.
5 */
6
7/*
8 * @author Nigel Medforth, nigelm -at- interational-characters.com
9 * @version $Id: XMLSymbolTable.cpp 209 2012-12-02 21:17:04Z robc $
10 *
11 */
12
13#include <icxmlc/XMLSymbolTable.hpp>
14#include <icxmlc/XMLNameChars.hpp>
15#include <icxmlc/XMLNamespaceResolver.hpp>
16#include <icxmlc/XMLReferenceTable.c>
17#include <icxercesc/internal/XMLScanner.hpp>
18#include <icxercesc/framework/XMLBuffer.hpp>
19// #include <icxercesc/internal/XMLReader.hpp>
20#include <icxercesc/validators/schema/SchemaSymbols.hpp>
21#include <icxmlc/XMLConfig.hpp>
22
23XERCES_CPP_NAMESPACE_BEGIN
24
25gid_t XMLSymbolTable::add
26(
27    const XMLByte                       * const key
28    , const XMLSize_t                           length
29)
30{
31    DEBUG_SYMBOL_MESSAGE("XMLSymbolTable::add(" << key << ',' << length << ')')
32
33    XMLSymbol entry;
34    entry.fFlags = 0;
35    entry.fRawLength = length;
36    entry.fRawSymbol = fSymbolPool.insert(key, length);
37
38    XMLBuffer symbol(length, fMemoryManager);
39    fTranscoder->transcodeFrom(key, length, symbol);
40    const XMLCh * symbolName = symbol.getRawBuffer();
41
42    DEBUG_SYMBOL_MESSAGE(" -- symbolName=" << symbolName)
43
44    /// VERIFY THAT THE CHARACTERS IN THE SYMBOL ARE LEGAL ACCORDING TO XML SPECIFICATIONS
45    if (unlikely(!XMLNameChar().test(symbolName, symbol.getLen())))
46    {
47        fScanner->emitError(XMLErrs::ExpectedElementName);
48    }
49
50    /**
51     Is this a processing instruction?
52     **/
53    if (unlikely(symbolName[0] == chQuestion))
54    {
55        entry.fQName = NULL;
56        entry.fName = XMLString::replicate(&symbolName[1], fMemoryManager);
57
58        entry.fFlags = XMLSymbol::IS_PROCESSING_INSTRUCTION;
59        if (likely(XMLStringU::isXML(entry.fName)))
60        {
61            entry.fFlags |= XMLSymbol::XML;
62        }
63    }
64    else
65    {
66        entry.fQName = new QName(symbolName, XMLNamespaceResolver::fEmptyUriId, fMemoryManager);
67        entry.fName = entry.fQName->getRawName();       
68        if (fScanner->getDoNamespaces())
69        {
70            const XMLSize_t length = symbol.getLen();
71            int colon;
72            entry.fPrefixId = fNamespaceResolver->resolvePrefixId(symbolName, length, colon);
73            if (entry.fPrefixId < XMLNamespaceResolver::fPredefinedCount)
74            {
75                switch (entry.fPrefixId)
76                {
77                    case XMLNamespaceResolver::fEmptyUriId:
78                        if (unlikely(XMLStringU::isXMLNS(symbolName)))
79                        {
80                            entry.fFlags |= XMLSymbol::XMLNS;
81                        }
82                        break;
83                    case XMLNamespaceResolver::fXMLUriId:
84                        entry.fFlags |= XMLSymbol::XML;
85                        break;
86                    case XMLNamespaceResolver::fXMLNSUriId:
87                        entry.fFlags |= XMLSymbol::XMLNS;
88                        ++colon;
89                        entry.fPrefixId = fNamespaceResolver->resolvePrefixId(&symbolName[colon], length - colon);
90                        if (unlikely(entry.fPrefixId == XMLNamespaceResolver::fXMLNSUriId))
91                        {
92                            fScanner->emitError(XMLErrs::NoUseOfxmlnsAsPrefix);
93                        }
94                        break;
95                }
96            }
97        }
98    }
99
100    return fSymbolTable.add(entry);
101}
102
103gid_t
104XMLSymbolTable::addInternal
105(
106    const XMLCh                         * const key
107    , const XMLSize_t                           length
108    , const XMLByte         * const unencodedKey
109    , const XMLSize_t               unencodedLength
110)
111{
112    XMLSymbol entry;
113    entry.fFlags = 0;
114    entry.fRawLength = unencodedLength;
115    entry.fRawSymbol = fSymbolPool.insert(unencodedKey, unencodedLength);
116
117    /// VERIFY THAT THE CHARACTERS IN THE SYMBOL ARE LEGAL ACCORDING TO XML SPECIFICATIONS
118    if (unlikely(!XMLNameChar().test(key, length)))
119    {
120        fScanner->emitError(XMLErrs::ExpectedElementName);
121    }
122
123    XMLCh * symbolName = XMLString::replicate(key, length, fMemoryManager);
124    symbolName[length] = 0;
125
126    /**
127     Is this a processing instruction?
128     **/
129    if (unlikely(symbolName[0] == chQuestion))
130    {
131        entry.fQName = NULL;
132        entry.fName = XMLString::replicate(&symbolName[1], fMemoryManager);
133
134        entry.fFlags = XMLSymbol::IS_PROCESSING_INSTRUCTION;
135        if (likely(XMLStringU::isXML(entry.fName)))
136        {
137            entry.fFlags |= XMLSymbol::XML;
138        }
139    }
140    else
141    {
142        entry.fQName = new QName(symbolName, XMLNamespaceResolver::fEmptyUriId, fMemoryManager);
143        entry.fName = entry.fQName->getRawName();
144
145        int colon;
146        entry.fPrefixId = fNamespaceResolver->resolvePrefixId(symbolName, length, colon);
147        if (entry.fPrefixId < XMLNamespaceResolver::fPredefinedCount)
148        {
149            switch (entry.fPrefixId)
150            {
151                case XMLNamespaceResolver::fEmptyUriId:
152                    if (unlikely(XMLStringU::isXMLNS(symbolName)))
153                    {
154                        entry.fFlags |= XMLSymbol::XMLNS;
155                    }
156                    break;
157                case XMLNamespaceResolver::fXMLUriId:
158                    entry.fFlags |= XMLSymbol::XML;
159                    break;
160                case XMLNamespaceResolver::fXMLNSUriId:
161                    entry.fFlags |= XMLSymbol::XMLNS;
162                    ++colon;
163                    entry.fPrefixId = fNamespaceResolver->resolvePrefixId(&symbolName[colon], length - colon);
164                    break;
165            }
166        }
167    }
168
169    return fSymbolTable.add(entry);
170}
171
172
173XERCES_CPP_NAMESPACE_END
Note: See TracBrowser for help on using the repository browser.