source: icXML/icXML-devel/src/icxmlc/XMLSymbol.c @ 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.c 207 2012-12-02 20:38:22Z robc $
10 *
11 */
12
13#include <icxmlc/XMLSymbol.hpp>
14#include <icxmlc/XMLNamespaceResolver.hpp>
15
16XERCES_CPP_NAMESPACE_BEGIN
17
18bool
19XMLSymbol::isQualified() const
20{
21        return (getPrefixId() != XMLNamespaceResolver::fEmptyUriId);
22}
23
24#ifdef __GNUC__
25// #warning "getElemDecl and setElemDecl ought to repoint the element decl's QName to the symbol's QName"
26#endif
27
28IDISA_ALWAYS_INLINE
29XMLElementDecl *
30XMLSymbol::getElemDecl(unsigned int uriId, unsigned int scope, Grammar *& grammar) const
31{
32        const XMLElementDeclListItem * item = &fElemDeclList;
33        XMLElementDeclListItem * new_item;
34
35    #if defined(PRINT_DEBUG_MESSAGE) && !defined(PRINT_DEBUG_IGNORE_GRAMMAR_MESSAGES)
36    std::clog << (*this) << "->getElemDecl(uriId=" << uriId << ",scope=" << scope
37                          << ",grammar=\"" << grammar->getTargetNamespace() << "\")=";
38        #endif
39
40        for (;;)
41        {
42                if ((item->uriId == uriId) && (item->scope == scope))
43                {
44                        #if defined(PRINT_DEBUG_MESSAGE) && !defined(PRINT_DEBUG_IGNORE_GRAMMAR_MESSAGES)
45                        std::clog << (item->elemDecl != NULL) << std::endl;
46                        #endif
47                        grammar = item->grammar;
48                        return item->elemDecl;
49                }
50
51                if (unlikely(item->elemDecl == NULL))
52                {
53                        new_item = const_cast<XMLElementDeclListItem *>(item);
54                        break;
55                }
56
57                if (likely(item->next != NULL))
58                {
59                        item = item->next;
60                }
61                else
62                {
63                        new_item = new XMLElementDeclListItem;
64                        const_cast<XMLElementDeclListItem *>(item)->next = new_item;
65                        new_item->next = NULL;
66                        break;
67                }
68        }
69
70        XMLElementDecl * elemDecl =
71                grammar->getElemDecl(uriId, fQName->getLocalPart(), fQName->getRawName(), scope);
72
73        if (elemDecl)
74        {
75                new_item->uriId = uriId;
76                new_item->scope = scope;
77                new_item->grammar = grammar;
78                new_item->elemDecl = elemDecl;
79        }
80
81        #if defined(PRINT_DEBUG_MESSAGE) && !defined(PRINT_DEBUG_IGNORE_GRAMMAR_MESSAGES)
82        std::clog << (elemDecl != NULL) << '*' << std::endl;
83        #endif
84
85        return elemDecl;
86}
87
88IDISA_ALWAYS_INLINE
89void
90XMLSymbol::setElemDecl(unsigned int uriId, unsigned int scope, XMLElementDecl * elemDecl, Grammar * grammar) const
91{
92        const XMLElementDeclListItem * item = &fElemDeclList;
93        for (;;)
94        {
95                if ((item->uriId == uriId) && (item->scope == scope))
96                {
97            XMLElementDeclListItem * this_item = const_cast<XMLElementDeclListItem *>(item);
98                        this_item->grammar = grammar;
99                        this_item->elemDecl = elemDecl;
100                        break;
101                }
102                if (unlikely(item->next == NULL))
103                {
104                        break;
105                }
106                item = item->next;
107        }
108}
109
110IDISA_ALWAYS_INLINE
111XMLElementDecl *
112XMLSymbol::getElemDecl() const
113{
114        return fElemDeclList.elemDecl;
115}
116
117IDISA_ALWAYS_INLINE
118void
119XMLSymbol::setElemDecl(XMLElementDecl * elemDecl) const
120{
121        const_cast<XMLElementDeclListItem &>(fElemDeclList).elemDecl = elemDecl;
122}
123
124IDISA_ALWAYS_INLINE
125void
126XMLSymbol::resetElemDeclList()
127{
128        XMLElementDeclListItem * item = &fElemDeclList;
129        do
130        {
131                item->elemDecl = NULL;
132                item->grammar = NULL;
133                item->uriId = XMLNamespaceResolver::fUnknownUriId;
134                item->scope = 0;
135                item = item->next;
136        }
137        while (item);
138}
139
140XMLSymbol::XMLSymbol() :
141          fRawLength(0)
142        , fRawSymbol(0)
143        , fFlags(0)
144        , fLastOccurence(0)
145        , fAttr(NULL)
146        , fName(NULL)
147        , fQName(NULL)
148        , fPrefixId(XMLNamespaceResolver::fUnknownUriId)
149{
150
151}
152
153XMLSymbol::~XMLSymbol()
154{
155        XMLElementDeclListItem * item = fElemDeclList.next;
156        while (item)
157        {
158                XMLElementDeclListItem * next = item->next;
159                delete item;
160                item = next;
161        }
162        fElemDeclList.next = 0;
163}
164
165XMLElementDeclListItem::XMLElementDeclListItem()
166: uriId(XMLNamespaceResolver::fUnknownUriId)
167, scope(0)
168, elemDecl(0)
169, grammar(0)
170, next(0)
171{
172
173}
174
175XMLElementDeclListItem::~XMLElementDeclListItem()
176{
177
178}
179
180XERCES_CPP_NAMESPACE_END
Note: See TracBrowser for help on using the repository browser.