secureswitools/swisistools/source/xmlparser/xerces/include/xercesc/internal/ElemStack.hpp
changeset 3 127731b7107d
--- /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