source: icXML/icXML-devel/src/icxmlc/XMLSymbol.hpp @ 2720

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

Initial check-in of icXML 0.8 source files

File size: 3.8 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: XMLSymbol.hpp 207 2012-12-02 20:38:22Z robc $
10 *
11 */
12
13#ifndef XMLSYMBOL_HPP
14#define XMLSYMBOL_HPP
15
16#include <xercesc/validators/common/Grammar.hpp>
17#include <xercesc/framework/XMLElementDecl.hpp>
18#include <icxmlc/XMLStringU.hpp>
19#ifdef PRINT_DEBUG_MESSAGE
20#include <icxmlc/stringpool.h>
21#endif
22#include <icxmlc/XMLConfig.hpp>
23
24XERCES_CPP_NAMESPACE_BEGIN
25
26class XMLElementDecl;
27class XMLAttr;
28class QName;
29struct XMLSymbol;
30
31struct XMLElementDeclListItem
32{
33        friend struct XMLSymbol;
34
35        unsigned int             uriId;
36        unsigned int             scope;
37        XMLElementDecl *         elemDecl;
38        Grammar *                                grammar;
39        XMLElementDeclListItem * next;
40
41
42        inline XMLElementDeclListItem();
43
44        inline ~XMLElementDeclListItem();
45
46        inline XMLElementDeclListItem & operator=(const XMLElementDeclListItem & item)
47        {
48                uriId = item.uriId;
49                scope = item.scope;
50                elemDecl = item.elemDecl;
51                next = item.next;
52                return *this;
53        }
54
55};
56
57struct XMLSymbol
58{
59        enum
60        {
61                XML                                                             = 0x0001
62                , XMLNS                                                 = 0x0002
63                , XSI                                                   = 0x0004
64//              , SCHEMALOCATION                                = 0x0008
65//              , NONAMESPACESCHEMALOCATION             = 0x0010
66//              , TARGETNAMESPACE                               = 0x0020
67                , IS_QUALIFIED_NAME                             = 0x8000
68                , IS_PROCESSING_INSTRUCTION             = 0x4000
69        };
70
71        XMLCh                                   *       fName;
72    QName                                       *       fQName;
73    XMLAttr                                     *       fAttr;
74        XMLElementDeclListItem          fElemDeclList;
75
76        unsigned int                            fRawLength;
77        const XMLByte                   *       fRawSymbol;
78        unsigned int                            fFlags;
79        unsigned int                            fLastOccurence;
80        unsigned int                            fPrefixId;
81
82        inline XMLSymbol();
83
84        inline ~XMLSymbol();
85
86        XMLSymbol & operator=(const XMLSymbol & symbol)
87        {
88                fRawLength = symbol.fRawLength;
89                fRawSymbol = symbol.fRawSymbol;
90                fFlags = symbol.fFlags;
91                fLastOccurence = symbol.fLastOccurence;
92                fAttr = symbol.fAttr;
93                fQName = symbol.fQName;
94                fName = symbol.fName;
95                fElemDeclList = symbol.fElemDeclList;
96                fPrefixId = symbol.fPrefixId;
97                return *this;
98        }
99
100        IDISA_ALWAYS_INLINE
101        const XMLByte * getKey() const { return fRawSymbol; }
102
103        IDISA_ALWAYS_INLINE
104        unsigned int getLength() const { return fRawLength; }
105
106        IDISA_ALWAYS_INLINE
107        const XMLCh * getName() const { return fName; }
108
109        IDISA_ALWAYS_INLINE
110    const XMLSize_t getNameLength() const { return fQName->getRawLength(); }
111
112        IDISA_ALWAYS_INLINE
113    QName * getQName() { return fQName; }
114
115        IDISA_ALWAYS_INLINE
116    const QName * getQName() const { return fQName; }
117
118        IDISA_ALWAYS_INLINE
119        bool isXMLNS() const { return (fFlags & XMLNS); }
120
121        IDISA_ALWAYS_INLINE
122        bool isXSI() const { return (fFlags & XSI); }
123
124        IDISA_ALWAYS_INLINE
125        bool isXML() const { return (fFlags & XML); }
126
127        IDISA_ALWAYS_INLINE
128        bool isQualified() const;
129
130        IDISA_ALWAYS_INLINE
131        unsigned int getPrefixId() const { return fPrefixId; }
132
133        XMLElementDecl * getElemDecl(unsigned int uriId, unsigned int scope, Grammar *& grammar) const;
134
135        void setElemDecl(unsigned int uriId, unsigned int scope, XMLElementDecl * elemDecl, Grammar * grammar) const;
136
137        XMLElementDecl * getElemDecl() const;
138
139        void setElemDecl(XMLElementDecl * elemDecl) const;
140
141        void resetElemDeclList();
142
143        IDISA_ALWAYS_INLINE
144        bool equals(const XMLByte * otherKey, const unsigned int length) const
145        {
146                return (getLength() == length) && (XMLStringU::equals(getKey(), otherKey, length));
147        }
148};
149
150#ifdef PRINT_DEBUG_MESSAGE
151static std::ostream & operator << (std::ostream & out, const XMLSymbol & symbol)
152{
153    out << symbol.fName;
154    return out;
155}
156
157static std::ostream & operator << (std::ostream & out, const XMLSymbol * symbol)
158{
159    if (likely(symbol != 0))
160    {
161        out << *symbol;
162    }
163    return out;
164}
165#endif
166
167XERCES_CPP_NAMESPACE_END
168
169#if !defined(XERCES_TMPLSINC)
170#include <icxmlc/XMLSymbol.c>
171#endif
172
173#endif // XMLSYMBOL_HPP
Note: See TracBrowser for help on using the repository browser.