--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/xmlparser/xerces/include/xercesc/internal/ElemStack.hpp Fri Jan 22 09:56:12 2010 +0200
@@ -0,0 +1,587 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * $Id: ElemStack.hpp 568078 2007-08-21 11:43:25Z amassari $
+ */
+
+#if !defined(ELEMSTACK_HPP)
+#define ELEMSTACK_HPP
+
+#include <xercesc/util/StringPool.hpp>
+#include <xercesc/util/QName.hpp>
+#include <xercesc/util/ValueVectorOf.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+class XMLElementDecl;
+class Grammar;
+
+struct PrefMapElem : public XMemory
+{
+ unsigned int fPrefId;
+ unsigned int fURIId;
+};
+
+//
+// During the scan of content, we have to keep up with the nesting of
+// elements (for validation and wellformedness purposes) and we have to
+// have places to remember namespace (prefix to URI) mappings.
+//
+// We only have to keep a stack of the current path down through the tree
+// that we are currently scanning, and keep track of any children of any
+// elements along that path.
+//
+// So, this data structure is a stack, which represents the current path
+// through the tree that we've worked our way down to. For each node in
+// the stack, there is an array of element ids that represent the ids of
+// the child elements scanned so far. Upon exit from that element, its
+// array of child elements is validated.
+//
+// Since we have the actual XMLElementDecl in the stack nodes, when its time
+// to validate, we just extract the content model from that element decl
+// and validate. All the required data falls easily to hand. Note that we
+// actually have some derivative of XMLElementDecl, which is specific to
+// the validator used, but the abstract API is sufficient for the needs of
+// the scanner.
+//
+// Since the namespace support also requires the storage of information on
+// a nested element basis, this structure also holds the namespace info. For
+// each level, the prefixes defined at that level (and the namespaces that
+// they map to) are stored.
+//
+class XMLPARSER_EXPORT ElemStack : public XMemory
+{
+public :
+ // -----------------------------------------------------------------------
+ // Class specific data types
+ //
+ // These really should be private, but some of the compilers we have to
+ // support are too dumb to deal with that.
+ //
+ // PrefMapElem
+ // fURIId is the id of the URI from the validator's URI map. The
+ // fPrefId is the id of the prefix from our own prefix pool. The
+ // namespace stack consists of these elements.
+ //
+ // StackElem
+ // fThisElement is the basic element decl for the current element.
+ // The fRowCapacity is how large fChildIds has grown so far.
+ // fChildCount is how many of them are valid right now.
+ //
+ // The fMapCapacity is how large fMap has grown so far. fMapCount
+ // is how many of them are valid right now.
+ //
+ // Note that we store the reader number we were in when we found the
+ // start tag. We'll use this at the end tag to test for unbalanced
+ // markup in entities.
+ //
+ // MapModes
+ // When a prefix is mapped to a namespace id, it matters whether the
+ // QName being mapped is an attribute or name. Attributes are not
+ // affected by an sibling xmlns attributes, whereas elements are
+ // affected by its own xmlns attributes.
+ // -----------------------------------------------------------------------
+ struct StackElem : public XMemory
+ {
+ XMLElementDecl* fThisElement;
+ unsigned int fReaderNum;
+
+ unsigned int fChildCapacity;
+ unsigned int fChildCount;
+ QName** fChildren;
+
+ PrefMapElem* fMap;
+ unsigned int fMapCapacity;
+ unsigned int fMapCount;
+
+ bool fValidationFlag;
+ bool fCommentOrPISeen;
+ bool fReferenceEscaped;
+ int fCurrentScope;
+ Grammar* fCurrentGrammar;
+ unsigned int fCurrentURI;
+ XMLCh * fSchemaElemName;
+ unsigned int fSchemaElemNameMaxLen;
+
+ int fPrefixColonPos;
+ };
+
+ enum MapModes
+ {
+ Mode_Attribute
+ , Mode_Element
+ };
+
+
+ // -----------------------------------------------------------------------
+ // Constructors and Destructor
+ // -----------------------------------------------------------------------
+ ElemStack(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
+ ~ElemStack();
+
+
+ // -----------------------------------------------------------------------
+ // Stack access
+ // -----------------------------------------------------------------------
+ unsigned int addLevel();
+ unsigned int addLevel(XMLElementDecl* const toSet, const unsigned int readerNum);
+ const StackElem* popTop();
+
+
+ // -----------------------------------------------------------------------
+ // Stack top access
+ // -----------------------------------------------------------------------
+ unsigned int addChild(QName* const child, const bool toParent);
+ const StackElem* topElement() const;
+ void setElement(XMLElementDecl* const toSet, const unsigned int readerNum);
+
+ void setValidationFlag(bool validationFlag);
+ bool getValidationFlag();
+
+ inline void setCommentOrPISeen();
+ inline bool getCommentOrPISeen() const;
+
+ inline void setReferenceEscaped();
+ inline bool getReferenceEscaped() const;
+
+ void setCurrentScope(int currentScope);
+ int getCurrentScope();
+
+ void setCurrentGrammar(Grammar* currentGrammar);
+ Grammar* getCurrentGrammar();
+
+ void setCurrentURI(unsigned int uri);
+ unsigned int getCurrentURI();
+
+ inline void setCurrentSchemaElemName(const XMLCh * const schemaElemName);
+ inline XMLCh *getCurrentSchemaElemName();
+
+ void setPrefixColonPos(int colonPos);
+ int getPrefixColonPos() const;
+
+ // -----------------------------------------------------------------------
+ // Prefix map methods
+ // -----------------------------------------------------------------------
+ void addPrefix
+ (
+ const XMLCh* const prefixToAdd
+ , const unsigned int uriId
+ );
+ unsigned int mapPrefixToURI
+ (
+ const XMLCh* const prefixToMap
+ , const MapModes mode
+ , bool& unknown
+ ) const;
+ ValueVectorOf<PrefMapElem*>* getNamespaceMap() const;
+ unsigned int getPrefixId(const XMLCh* const prefix) const;
+ const XMLCh* getPrefixForId(unsigned int prefId) const;
+
+ // -----------------------------------------------------------------------
+ // Miscellaneous methods
+ // -----------------------------------------------------------------------
+ bool isEmpty() const;
+ void reset
+ (
+ const unsigned int emptyId
+ , const unsigned int unknownId
+ , const unsigned int xmlId
+ , const unsigned int xmlNSId
+ );
+
+
+private :
+ // -----------------------------------------------------------------------
+ // Unimplemented constructors and operators
+ // -----------------------------------------------------------------------
+ ElemStack(const ElemStack&);
+ ElemStack& operator=(const ElemStack&);
+
+
+ // -----------------------------------------------------------------------
+ // Private helper methods
+ // -----------------------------------------------------------------------
+ void expandMap(StackElem* const toExpand);
+ void expandStack();
+
+
+ // -----------------------------------------------------------------------
+ // Data members
+ //
+ // fEmptyNamespaceId
+ // This is the special URI id for the "" namespace, which is magic
+ // because of the xmlns="" operation.
+ //
+ // fGlobalPoolId
+ // This is a special URI id that is returned when the namespace
+ // prefix is "" and no one has explicitly mapped that prefix to an
+ // explicit URI (or when they explicitly clear any such mapping,
+ // which they can also do.) And also its prefix pool id, which is
+ // stored here for fast access.
+ //
+ // fPrefixPool
+ // This is the prefix pool where prefixes are hashed and given unique
+ // ids. These ids are used to track prefixes in the element stack.
+ //
+ // fStack
+ // fStackCapacity
+ // fStackTop
+ // This the stack array. Its an array of pointers to StackElem
+ // structures. The capacity is the current high water mark of the
+ // stack. The top is the current top of stack (i.e. the part of it
+ // being used.)
+ //
+ // fUnknownNamespaceId
+ // This is the URI id for the special URI that is assigned to any
+ // prefix which has not been mapped. This lets us keep going after
+ // issuing the error.
+ //
+ // fXMLNamespaceId
+ // fXMLPoolId
+ // fXMLNSNamespaceId
+ // fXMLNSPoolId
+ // These are the URI ids for the special URIs that are assigned to
+ // the 'xml' and 'xmlns' namespaces. And also its prefix pool id,
+ // which is stored here for fast access.
+ // -----------------------------------------------------------------------
+ unsigned int fEmptyNamespaceId;
+ unsigned int fGlobalPoolId;
+ XMLStringPool fPrefixPool;
+ StackElem** fStack;
+ unsigned int fStackCapacity;
+ unsigned int fStackTop;
+ unsigned int fUnknownNamespaceId;
+ unsigned int fXMLNamespaceId;
+ unsigned int fXMLPoolId;
+ unsigned int fXMLNSNamespaceId;
+ unsigned int fXMLNSPoolId;
+ ValueVectorOf<PrefMapElem*>* fNamespaceMap;
+ MemoryManager* fMemoryManager;
+};
+
+
+class XMLPARSER_EXPORT WFElemStack : public XMemory
+{
+public :
+ // -----------------------------------------------------------------------
+ // Class specific data types
+ //
+ // These really should be private, but some of the compilers we have to
+ // support are too dumb to deal with that.
+ //
+ // PrefMapElem
+ // fURIId is the id of the URI from the validator's URI map. The
+ // fPrefId is the id of the prefix from our own prefix pool. The
+ // namespace stack consists of these elements.
+ //
+ // StackElem
+ // fThisElement is the basic element decl for the current element.
+ // The fRowCapacity is how large fChildIds has grown so far.
+ // fChildCount is how many of them are valid right now.
+ //
+ // The fMapCapacity is how large fMap has grown so far. fMapCount
+ // is how many of them are valid right now.
+ //
+ // Note that we store the reader number we were in when we found the
+ // start tag. We'll use this at the end tag to test for unbalanced
+ // markup in entities.
+ //
+ // MapModes
+ // When a prefix is mapped to a namespace id, it matters whether the
+ // QName being mapped is an attribute or name. Attributes are not
+ // affected by an sibling xmlns attributes, whereas elements are
+ // affected by its own xmlns attributes.
+ // -----------------------------------------------------------------------
+ struct StackElem : public XMemory
+ {
+ int fTopPrefix;
+ unsigned int fCurrentURI;
+ unsigned int fReaderNum;
+ unsigned int fElemMaxLength;
+ XMLCh* fThisElement;
+ };
+
+ enum MapModes
+ {
+ Mode_Attribute
+ , Mode_Element
+ };
+
+
+ // -----------------------------------------------------------------------
+ // Constructors and Destructor
+ // -----------------------------------------------------------------------
+ WFElemStack(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
+ ~WFElemStack();
+
+
+ // -----------------------------------------------------------------------
+ // Stack access
+ // -----------------------------------------------------------------------
+ unsigned int addLevel();
+ unsigned int addLevel(const XMLCh* const toSet, const unsigned int toSetLen,
+ const unsigned int readerNum);
+ const StackElem* popTop();
+
+
+ // -----------------------------------------------------------------------
+ // Stack top access
+ // -----------------------------------------------------------------------
+ const StackElem* topElement() const;
+ void setElement(const XMLCh* const toSet, const unsigned int toSetLen,
+ const unsigned int readerNum);
+
+ void setCurrentURI(unsigned int uri);
+ unsigned int getCurrentURI();
+
+ // -----------------------------------------------------------------------
+ // Prefix map methods
+ // -----------------------------------------------------------------------
+ void addPrefix
+ (
+ const XMLCh* const prefixToAdd
+ , const unsigned int uriId
+ );
+ unsigned int mapPrefixToURI
+ (
+ const XMLCh* const prefixToMap
+ , const MapModes mode
+ , bool& unknown
+ ) const;
+
+
+ // -----------------------------------------------------------------------
+ // Miscellaneous methods
+ // -----------------------------------------------------------------------
+ bool isEmpty() const;
+ void reset
+ (
+ const unsigned int emptyId
+ , const unsigned int unknownId
+ , const unsigned int xmlId
+ , const unsigned int xmlNSId
+ );
+
+
+private :
+ // -----------------------------------------------------------------------
+ // Unimplemented constructors and operators
+ // -----------------------------------------------------------------------
+ WFElemStack(const WFElemStack&);
+ WFElemStack& operator=(const WFElemStack&);
+
+
+ // -----------------------------------------------------------------------
+ // Private helper methods
+ // -----------------------------------------------------------------------
+ void expandMap();
+ void expandStack();
+
+
+ // -----------------------------------------------------------------------
+ // Data members
+ //
+ // fEmptyNamespaceId
+ // This is the special URI id for the "" namespace, which is magic
+ // because of the xmlns="" operation.
+ //
+ // fGlobalPoolId
+ // This is a special URI id that is returned when the namespace
+ // prefix is "" and no one has explicitly mapped that prefix to an
+ // explicit URI (or when they explicitly clear any such mapping,
+ // which they can also do.) And also its prefix pool id, which is
+ // stored here for fast access.
+ //
+ // fPrefixPool
+ // This is the prefix pool where prefixes are hashed and given unique
+ // ids. These ids are used to track prefixes in the element stack.
+ //
+ // fStack
+ // fStackCapacity
+ // fStackTop
+ // This the stack array. Its an array of pointers to StackElem
+ // structures. The capacity is the current high water mark of the
+ // stack. The top is the current top of stack (i.e. the part of it
+ // being used.)
+ //
+ // fUnknownNamespaceId
+ // This is the URI id for the special URI that is assigned to any
+ // prefix which has not been mapped. This lets us keep going after
+ // issuing the error.
+ //
+ // fXMLNamespaceId
+ // fXMLPoolId
+ // fXMLNSNamespaceId
+ // fXMLNSPoolId
+ // These are the URI ids for the special URIs that are assigned to
+ // the 'xml' and 'xmlns' namespaces. And also its prefix pool id,
+ // which is stored here for fast access.
+ // -----------------------------------------------------------------------
+ unsigned int fEmptyNamespaceId;
+ unsigned int fGlobalPoolId;
+ unsigned int fStackCapacity;
+ unsigned int fStackTop;
+ unsigned int fUnknownNamespaceId;
+ unsigned int fXMLNamespaceId;
+ unsigned int fXMLPoolId;
+ unsigned int fXMLNSNamespaceId;
+ unsigned int fXMLNSPoolId;
+ unsigned int fMapCapacity;
+ PrefMapElem* fMap;
+ StackElem** fStack;
+ XMLStringPool fPrefixPool;
+ MemoryManager* fMemoryManager;
+};
+
+
+// ---------------------------------------------------------------------------
+// ElemStack: Miscellaneous methods
+// ---------------------------------------------------------------------------
+inline bool ElemStack::isEmpty() const
+{
+ return (fStackTop == 0);
+}
+
+inline bool ElemStack::getValidationFlag()
+{
+ return fStack[fStackTop-1]->fValidationFlag;
+}
+
+inline void ElemStack::setValidationFlag(bool validationFlag)
+{
+ fStack[fStackTop-1]->fValidationFlag = validationFlag;
+ return;
+}
+
+inline bool ElemStack::getCommentOrPISeen() const
+{
+ return fStack[fStackTop-1]->fCommentOrPISeen;
+}
+
+inline void ElemStack::setCommentOrPISeen()
+{
+ fStack[fStackTop-1]->fCommentOrPISeen = true;
+ return;
+}
+
+inline bool ElemStack::getReferenceEscaped() const
+{
+ return fStack[fStackTop-1]->fReferenceEscaped;
+}
+
+inline void ElemStack::setReferenceEscaped()
+{
+ fStack[fStackTop-1]->fReferenceEscaped = true;
+ return;
+}
+
+inline void ElemStack::setCurrentSchemaElemName(const XMLCh * const schemaElemName)
+{
+ unsigned int schemaElemNameLen = XMLString::stringLen(schemaElemName);
+ unsigned int stackPos = fStackTop-1;
+
+ if(fStack[stackPos]->fSchemaElemNameMaxLen <= schemaElemNameLen)
+ {
+ XMLCh *tempStr = fStack[stackPos]->fSchemaElemName;
+ fStack[stackPos]->fSchemaElemNameMaxLen = schemaElemNameLen << 1;
+ fStack[stackPos]->fSchemaElemName = (XMLCh *)fMemoryManager->allocate((fStack[stackPos]->fSchemaElemNameMaxLen)*sizeof(XMLCh));
+ fMemoryManager->deallocate(tempStr);
+ }
+ XMLString::copyString(fStack[stackPos]->fSchemaElemName, schemaElemName);
+}
+
+inline XMLCh *ElemStack::getCurrentSchemaElemName()
+{
+ return fStack[fStackTop-1]->fSchemaElemName;
+}
+
+inline int ElemStack::getCurrentScope()
+{
+ return fStack[fStackTop-1]->fCurrentScope;
+}
+
+inline void ElemStack::setCurrentScope(int currentScope)
+{
+ fStack[fStackTop-1]->fCurrentScope = currentScope;
+ return;
+}
+
+inline Grammar* ElemStack::getCurrentGrammar()
+{
+ return fStack[fStackTop-1]->fCurrentGrammar;
+}
+
+inline void ElemStack::setCurrentGrammar(Grammar* currentGrammar)
+{
+ fStack[fStackTop-1]->fCurrentGrammar = currentGrammar;
+ return;
+}
+
+inline unsigned int ElemStack::getCurrentURI()
+{
+ return fStack[fStackTop-1]->fCurrentURI;
+}
+
+inline void ElemStack::setCurrentURI(unsigned int uri)
+{
+ fStack[fStackTop-1]->fCurrentURI = uri;
+ return;
+}
+
+inline unsigned int ElemStack::getPrefixId(const XMLCh* const prefix) const
+{
+ return fPrefixPool.getId(prefix);
+}
+
+inline const XMLCh* ElemStack::getPrefixForId(unsigned int prefId) const
+{
+ return fPrefixPool.getValueForId(prefId);
+}
+
+inline void ElemStack::setPrefixColonPos(int colonPos)
+{
+ fStack[fStackTop-1]->fPrefixColonPos = colonPos;
+}
+
+inline int ElemStack::getPrefixColonPos() const {
+ return fStack[fStackTop-1]->fPrefixColonPos;
+}
+
+// ---------------------------------------------------------------------------
+// WFElemStack: Miscellaneous methods
+// ---------------------------------------------------------------------------
+inline bool WFElemStack::isEmpty() const
+{
+ return (fStackTop == 0);
+}
+
+inline unsigned int WFElemStack::getCurrentURI()
+{
+ return fStack[fStackTop-1]->fCurrentURI;
+}
+
+inline void WFElemStack::setCurrentURI(unsigned int uri)
+{
+ fStack[fStackTop-1]->fCurrentURI = uri;
+ return;
+}
+
+
+XERCES_CPP_NAMESPACE_END
+
+#endif