cargilld    2005/04/04 08:11:38

  Modified:    c/src/xercesc/internal DGXMLScanner.cpp IGXMLScanner.cpp
                        IGXMLScanner.hpp IGXMLScanner2.cpp ReaderMgr.hpp
                        SGXMLScanner.cpp SGXMLScanner.hpp WFXMLScanner.cpp
                        XMLReader.cpp XMLReader.hpp XSAXMLScanner.cpp
  Log:
  Fix a problem where illegal qualified names were not reported as errors.  
Also store the colon position when searching for a qualified name to avoid 
looking it up again.
  
  Revision  Changes    Path
  1.62      +19 -30    xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp
  
  Index: DGXMLScanner.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/DGXMLScanner.cpp,v
  retrieving revision 1.61
  retrieving revision 1.62
  diff -u -r1.61 -r1.62
  --- DGXMLScanner.cpp  12 Jan 2005 10:36:43 -0000      1.61
  +++ DGXMLScanner.cpp  4 Apr 2005 15:11:37 -0000       1.62
  @@ -786,8 +786,10 @@
   
       //  Get a name from the input, which should be the name of the root
       //  element of the upcoming content.
  -    fReaderMgr.getName(bbRootName.getBuffer());
  -    if (bbRootName.isEmpty())
  +    int  colonPosition;
  +    bool validName = fDoNamespaces ? 
fReaderMgr.getQName(bbRootName.getBuffer(), &colonPosition) :
  +                                     
fReaderMgr.getName(bbRootName.getBuffer());
  +    if (!validName)
       {
           emitError(XMLErrs::NoRootElemInDOCTYPE);
           fReaderMgr.skipPastChar(chCloseAngle);
  @@ -1094,7 +1096,11 @@
   
       //  Get the QName. In this case, we are not doing namespaces, so we just
       //  use it as is and don't have to break it into parts.
  -    if (!fReaderMgr.getName(fQNameBuf))
  +
  +    int  colonPosition;
  +    bool validName = fDoNamespaces ? fReaderMgr.getQName(fQNameBuf, 
&colonPosition) :
  +                                     fReaderMgr.getName(fQNameBuf);
  +    if (!validName)
       {
           emitError(XMLErrs::ExpectedElementName);
           fReaderMgr.skipToChar(chOpenAngle);
  @@ -1244,7 +1250,10 @@
           {
               //  Assume its going to be an attribute, so get a name from
               //  the input.
  -            if (!fReaderMgr.getName(fAttNameBuf))
  +    
  +            validName = fDoNamespaces ? fReaderMgr.getQName(fAttNameBuf, 
&colonPosition) :
  +                                        fReaderMgr.getName(fAttNameBuf);     
           
  +            if (!validName)            
               {
                   emitError(XMLErrs::ExpectedAttrName);
                   fReaderMgr.skipPastChar(chCloseAngle);
  @@ -1472,30 +1481,6 @@
                   }
               }
   
  -            if (fDoNamespaces)
  -            {
  -                //  Make sure that the name is basically well formed for 
namespace
  -                //  enabled rules. It either has no colons, or it has one 
which
  -                //  is neither the first or last char.
  -                const int colonFirst = 
XMLString::indexOf(fAttNameBuf.getRawBuffer(), chColon);
  -                if (colonFirst != -1)
  -                {
  -                    const int colonLast = 
XMLString::lastIndexOf(fAttNameBuf.getRawBuffer(), chColon);
  -
  -                    if (colonFirst != colonLast)
  -                    {
  -                        emitError(XMLErrs::TooManyColonsInName);
  -                        continue;
  -                    }
  -                    else if ((colonFirst == 0)
  -                          ||  (colonLast == (int)fAttNameBuf.getLen() - 1))
  -                    {
  -                        emitError(XMLErrs::InvalidColonPos);
  -                        continue;
  -                    }
  -                }
  -            }
  -
               attCount++;
   
               // And jump back to the top of the loop
  @@ -3163,7 +3148,11 @@
   
       // Expand it since its a normal entity ref
       XMLBufBid bbName(&fBufMgr);
  -    if (!fReaderMgr.getName(bbName.getBuffer()))
  +
  +    int  colonPosition;
  +    bool validName = fDoNamespaces ? fReaderMgr.getQName(bbName.getBuffer(), 
&colonPosition) :
  +                                     fReaderMgr.getName(bbName.getBuffer()); 
  +    if (!validName)    
       {
           emitError(XMLErrs::ExpectedEntityRefName);
           return EntityExp_Failed;
  
  
  
  1.88      +61 -34    xml-xerces/c/src/xercesc/internal/IGXMLScanner.cpp
  
  Index: IGXMLScanner.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner.cpp,v
  retrieving revision 1.87
  retrieving revision 1.88
  diff -u -r1.87 -r1.88
  --- IGXMLScanner.cpp  21 Feb 2005 18:19:45 -0000      1.87
  +++ IGXMLScanner.cpp  4 Apr 2005 15:11:37 -0000       1.88
  @@ -61,6 +61,8 @@
       , fElemState(0)
       , fContent(1023, manager)
       , fRawAttrList(0)
  +    , fRawAttrColonListSize(32)
  +    , fRawAttrColonList(0)
       , fDTDValidator(0)
       , fSchemaValidator(0)
       , fDTDGrammar(0)
  @@ -111,6 +113,8 @@
       , fElemState(0)
       , fContent(1023, manager)
       , fRawAttrList(0)
  +    , fRawAttrColonListSize(32)
  +    , fRawAttrColonList(0)    
       , fDTDValidator(0)
       , fSchemaValidator(0)
       , fDTDGrammar(0)
  @@ -516,6 +520,10 @@
       //  And we need one for the raw attribute scan. This just stores key/
       //  value string pairs (prior to any processing.)
       fRawAttrList = new (fMemoryManager) RefVectorOf<KVStringPair>(32, true, 
fMemoryManager);
  +    fRawAttrColonList = (int*) fMemoryManager->allocate
  +    (
  +        fRawAttrColonListSize * sizeof(int)
  +    );
   
       //  Create the Validator and init them
       fDTDValidator = new (fMemoryManager) DTDValidator();
  @@ -550,6 +558,7 @@
   {
       fMemoryManager->deallocate(fElemState); //delete [] fElemState;
       delete fRawAttrList;
  +    fMemoryManager->deallocate(fRawAttrColonList);
       delete fDTDValidator;
       delete fSchemaValidator;
       delete fICHandler;
  @@ -625,7 +634,8 @@
           {
               //  Assume its going to be an attribute, so get a name from
               //  the input.
  -            if (!fReaderMgr.getName(fAttNameBuf))
  +            int colonPosition;
  +            if (!fReaderMgr.getQName(fAttNameBuf, &colonPosition))
               {
                   emitError(XMLErrs::ExpectedAttrName);
                   fReaderMgr.skipPastChar(chCloseAngle);
  @@ -710,27 +720,6 @@
                   }
               }
   
  -            //  Make sure that the name is basically well formed for 
namespace
  -            //  enabled rules. It either has no colons, or it has one which
  -            //  is neither the first or last char.
  -            const int colonFirst = XMLString::indexOf(curAttNameBuf, 
chColon);
  -            if (colonFirst != -1)
  -            {
  -                const int colonLast = XMLString::lastIndexOf(chColon, 
curAttNameBuf, fAttNameBuf.getLen());
  -
  -                if (colonFirst != colonLast)
  -                {
  -                    emitError(XMLErrs::TooManyColonsInName);
  -                    continue;
  -                }
  -                else if ((colonFirst == 0)
  -                      ||  (colonLast == (int)fAttNameBuf.getLen() - 1))
  -                {
  -                    emitError(XMLErrs::InvalidColonPos);
  -                    continue;
  -                }
  -            }
  -
               //  And now lets add it to the passed collection. If we have not
               //  filled it up yet, then we use the next element. Else we add
               //  a new one.
  @@ -745,9 +734,9 @@
                       , fAttValueBuf.getLen()
                       , fMemoryManager
                   );
  -                toFill.addElement(curPair);
  +                toFill.addElement(curPair);                
               }
  -             else
  +            else
               {
                   curPair = toFill.elementAt(attCount);                
                   curPair->set
  @@ -756,8 +745,14 @@
                       fAttNameBuf.getLen(),
                       fAttValueBuf.getRawBuffer(),
                       fAttValueBuf.getLen()
  -                );
  +                );                
  +            }
  +
  +            if (attCount >= fRawAttrColonListSize) {
  +                resizeRawAttrColonList();
               }
  +            fRawAttrColonList[attCount] = colonPosition;
  +            
   
               // And bump the count of attributes we've gotten
               attCount++;
  @@ -1244,8 +1239,10 @@
   
       //  Get a name from the input, which should be the name of the root
       //  element of the upcoming content.
  -    fReaderMgr.getName(bbRootName.getBuffer());
  -    if (bbRootName.isEmpty())
  +    int  colonPosition;
  +    bool validName = fDoNamespaces ? 
fReaderMgr.getQName(bbRootName.getBuffer(), &colonPosition) :
  +                                     
fReaderMgr.getName(bbRootName.getBuffer());
  +    if (!validName)
       {
           emitError(XMLErrs::NoRootElemInDOCTYPE);
           fReaderMgr.skipPastChar(chCloseAngle);
  @@ -2125,7 +2122,8 @@
   
       //  The current position is after the open bracket, so we need to read in
       //  in the element name.
  -    if (!fReaderMgr.getName(fQNameBuf))
  +    int prefixColonPos;
  +    if (!fReaderMgr.getQName(fQNameBuf, &prefixColonPos))
       {
           emitError(XMLErrs::ExpectedElementName);
           fReaderMgr.skipToChar(chOpenAngle);
  @@ -2252,10 +2250,9 @@
   
       //  Resolve the qualified name to a URI and name so that we can look up
       //  the element decl for this element. We have now update the prefix to
  -    //  namespace map so we should get the correct element now.
  -    int prefixColonPos = -1;
  +    //  namespace map so we should get the correct element now.   
       const XMLCh* qnameRawBuf = fQNameBuf.getRawBuffer();
  -    unsigned int uriId = resolveQName
  +    unsigned int uriId = resolveQNameWithColon
       (
           qnameRawBuf
           , fPrefixBuf
  @@ -2967,15 +2964,25 @@
   }
   
   
  +
   unsigned int
   IGXMLScanner::resolveQName(const   XMLCh* const qName
                              ,       XMLBuffer&   prefixBuf
                              , const short        mode
                              ,       int&         prefixColonPos)
   {
  -    //  Lets split out the qName into a URI and name buffer first. The URI
  -    //  can be empty.
       prefixColonPos = XMLString::indexOf(qName, chColon);
  +    return resolveQNameWithColon(qName, prefixBuf, mode, prefixColonPos);
  +}
  +
  +unsigned int 
  +IGXMLScanner::resolveQNameWithColon(const   XMLCh* const qName
  +                                    ,       XMLBuffer&   prefixBuf
  +                                    , const short        mode
  +                                    , const int          prefixColonPos)
  +{
  +    //  Lets split out the qName into a URI and name buffer first. The URI
  +    //  can be empty.    
       if (prefixColonPos == -1)
       {
           //  Its all name with no prefix, so put the whole thing into the name
  @@ -3048,6 +3055,26 @@
       fElemStateSize = newSize;
   }
   
  +void IGXMLScanner::resizeRawAttrColonList() {
  +
  +    unsigned int newSize = fRawAttrColonListSize * 2;
  +    int* newRawAttrColonList = (int*) fMemoryManager->allocate
  +    (
  +        newSize * sizeof(int)
  +    ); //new int[newSize];
  +
  +    // Copy the existing values
  +    unsigned int index = 0;
  +    for (; index < fRawAttrColonListSize; index++)
  +        newRawAttrColonList[index] = fRawAttrColonList[index];
  +
  +    // Delete the old array and udpate our members
  +    fMemoryManager->deallocate(fRawAttrColonList); //delete [] 
fRawAttrColonList;
  +    fRawAttrColonList = newRawAttrColonList;
  +    fRawAttrColonListSize = newSize;
  +}
  +
  +
   // 
---------------------------------------------------------------------------
   //  IGXMLScanner: Grammar preparsing
   // 
---------------------------------------------------------------------------
  
  
  
  1.26      +20 -0     xml-xerces/c/src/xercesc/internal/IGXMLScanner.hpp
  
  Index: IGXMLScanner.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner.hpp,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- IGXMLScanner.hpp  14 Dec 2004 16:16:36 -0000      1.25
  +++ IGXMLScanner.hpp  4 Apr 2005 15:11:37 -0000       1.26
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.26  2005/04/04 15:11:37  cargilld
  + * Fix a problem where illegal qualified names were not reported as errors.  
Also store the colon position when searching for a qualified name to avoid 
looking it up again.
  + *
    * Revision 1.25  2004/12/14 16:16:36  cargilld
    * Fix for xercesc-684: Add accessor to XMLScanner to get the current 
grammar type.
    *
  @@ -240,7 +243,13 @@
       void updateNSMap
       (
           const   XMLCh* const    attrName
  +        , const XMLCh* const    attrValue        
  +    );
  +    void updateNSMap
  +    (
  +        const   XMLCh* const    attrName
           , const XMLCh* const    attrValue
  +        , const int             colonPosition
       );
       void scanRawAttrListforNameSpaces(int attCount);
       void parseSchemaLocation(const XMLCh* const schemaLocationStr);
  @@ -256,6 +265,15 @@
       void resizeElemState();
       void processSchemaLocation(XMLCh* const schemaLoc);
   
  +    void resizeRawAttrColonList();
  +
  +    unsigned int resolveQNameWithColon
  +    (
  +        const   XMLCh* const        qName
  +        ,       XMLBuffer&          prefixBufToFill
  +        , const short               mode
  +        , const int                 prefixColonPos
  +    );
       // 
-----------------------------------------------------------------------
       //  Private scanning methods
       // 
-----------------------------------------------------------------------
  @@ -347,6 +365,8 @@
       unsigned int*                           fElemState;
       XMLBuffer                               fContent;
       RefVectorOf<KVStringPair>*              fRawAttrList;
  +    unsigned int                            fRawAttrColonListSize;
  +    int*                                    fRawAttrColonList;
       DTDValidator*                           fDTDValidator;
       SchemaValidator*                        fSchemaValidator;
       DTDGrammar*                             fDTDGrammar;
  
  
  
  1.83      +16 -7     xml-xerces/c/src/xercesc/internal/IGXMLScanner2.cpp
  
  Index: IGXMLScanner2.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/IGXMLScanner2.cpp,v
  retrieving revision 1.82
  retrieving revision 1.83
  diff -u -r1.82 -r1.83
  --- IGXMLScanner2.cpp 11 Mar 2005 17:06:28 -0000      1.82
  +++ IGXMLScanner2.cpp 4 Apr 2005 15:11:37 -0000       1.83
  @@ -143,7 +143,7 @@
           // use a stack-based buffer when possible.
           XMLCh tempBuffer[100];
   
  -        const int colonInd = XMLString::indexOf(namePtr, chColon);
  +        const int colonInd = fRawAttrColonList[index];
           const XMLCh* prefPtr = XMLUni::fgZeroLenString;
           const XMLCh* suffPtr = XMLUni::fgZeroLenString;
           if (colonInd != -1)
  @@ -1488,6 +1488,13 @@
   void IGXMLScanner::updateNSMap(const  XMLCh* const    attrName
                               , const XMLCh* const    attrValue)
   {
  +    updateNSMap(attrName, attrValue, XMLString::indexOf(attrName, chColon));
  +}
  +
  +void IGXMLScanner::updateNSMap(const  XMLCh* const    attrName
  +                            , const XMLCh* const    attrValue
  +                            , const int colonOfs)
  +{
       // We need a buffer to normalize the attribute value into
       XMLBufBid bbNormal(&fBufMgr);
       XMLBuffer& normalBuf = bbNormal.getBuffer();
  @@ -1507,8 +1514,7 @@
       //        2. if xxx is xml, then yyy must match XMLUni::fgXMLURIName, 
and vice versa
       //        3. yyy is not XMLUni::fgXMLNSURIName
       //        4. if xxx is not null, then yyy cannot be an empty string.
  -    const XMLCh* prefPtr = XMLUni::fgZeroLenString;
  -    const int colonOfs = XMLString::indexOf(attrName, chColon);
  +    const XMLCh* prefPtr = XMLUni::fgZeroLenString;    
       if (colonOfs != -1) {
           prefPtr = &attrName[colonOfs + 1];
   
  @@ -1563,7 +1569,7 @@
           {
               const XMLCh* valuePtr = curPair->getValue();
   
  -            updateNSMap(rawPtr, valuePtr);
  +            updateNSMap(rawPtr, valuePtr, fRawAttrColonList[index]);
   
               // if the schema URI is seen in the the valuePtr, set the 
boolean seeXsi
               if (XMLString::equals(valuePtr, SchemaSymbols::fgURI_XSI)) {
  @@ -1585,7 +1591,7 @@
               const KVStringPair* curPair = fRawAttrList->elementAt(index);
               const XMLCh* rawPtr = curPair->getKey();
               const XMLCh* prefPtr = XMLUni::fgZeroLenString;
  -            int   colonInd = XMLString::indexOf(rawPtr, chColon);
  +            int   colonInd = fRawAttrColonList[index];
   
               if (colonInd != -1) {
   
  @@ -2857,7 +2863,10 @@
   
       // Expand it since its a normal entity ref
       XMLBufBid bbName(&fBufMgr);
  -    if (!fReaderMgr.getName(bbName.getBuffer()))
  +    int  colonPosition;
  +    bool validName = fDoNamespaces ? fReaderMgr.getQName(bbName.getBuffer(), 
&colonPosition) :
  +                                     fReaderMgr.getName(bbName.getBuffer());
  +    if (!validName)    
       {
           emitError(XMLErrs::ExpectedEntityRefName);
           return EntityExp_Failed;
  
  
  
  1.17      +10 -0     xml-xerces/c/src/xercesc/internal/ReaderMgr.hpp
  
  Index: ReaderMgr.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/ReaderMgr.hpp,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- ReaderMgr.hpp     9 Mar 2005 16:07:11 -0000       1.16
  +++ ReaderMgr.hpp     4 Apr 2005 15:11:38 -0000       1.17
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.17  2005/04/04 15:11:38  cargilld
  + * Fix a problem where illegal qualified names were not reported as errors.  
Also store the colon position when searching for a qualified name to avoid 
looking it up again.
  + *
    * Revision 1.16  2005/03/09 16:07:11  amassari
    * Protected getSrcOffset to avoid crashing when parsing has finished; 
updated documentation
    *
  @@ -183,6 +186,7 @@
       // 
-----------------------------------------------------------------------
       bool atEOF() const;
       bool getName(XMLBuffer& toFill);
  +    bool getQName(XMLBuffer& toFill, int* colonPosition);
       bool getNameToken(XMLBuffer& toFill);
       XMLCh getNextChar();
       bool getNextCharIfNot(const XMLCh chNotToGet, XMLCh& chGotten);
  @@ -392,6 +396,12 @@
       return fCurReader->getName(toFill, false);
   }
   
  +inline bool ReaderMgr::getQName(XMLBuffer& toFill, int *colonPosition)
  +{
  +    toFill.reset();
  +    return fCurReader->getQName(toFill, colonPosition);
  +}
  +
   inline bool ReaderMgr::getNameToken(XMLBuffer& toFill)
   {
       toFill.reset();
  
  
  
  1.110     +63 -35    xml-xerces/c/src/xercesc/internal/SGXMLScanner.cpp
  
  Index: SGXMLScanner.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/SGXMLScanner.cpp,v
  retrieving revision 1.109
  retrieving revision 1.110
  diff -u -r1.109 -r1.110
  --- SGXMLScanner.cpp  21 Feb 2005 18:19:45 -0000      1.109
  +++ SGXMLScanner.cpp  4 Apr 2005 15:11:38 -0000       1.110
  @@ -66,6 +66,8 @@
       , fContent(1023, manager)
       , fEntityTable(0)
       , fRawAttrList(0)
  +    , fRawAttrColonListSize(32)
  +    , fRawAttrColonList(0)
       , fSchemaGrammar(0)
       , fSchemaValidator(0)
       , fICHandler(0)
  @@ -119,6 +121,8 @@
       , fContent(1023, manager)
       , fEntityTable(0)
       , fRawAttrList(0)
  +    , fRawAttrColonListSize(32)
  +    , fRawAttrColonList(0)
       , fSchemaGrammar(0)
       , fSchemaValidator(0)
       , fICHandler(0)
  @@ -556,7 +560,8 @@
           {
               //  Assume its going to be an attribute, so get a name from
               //  the input.
  -            if (!fReaderMgr.getName(fAttNameBuf))
  +            int colonPosition;
  +            if (!fReaderMgr.getQName(fAttNameBuf, &colonPosition))
               {
                   emitError(XMLErrs::ExpectedAttrName);
                   fReaderMgr.skipPastChar(chCloseAngle);
  @@ -641,27 +646,6 @@
                   }
               }
   
  -            //  Make sure that the name is basically well formed for 
namespace
  -            //  enabled rules. It either has no colons, or it has one which
  -            //  is neither the first or last char.
  -            const int colonFirst = XMLString::indexOf(curAttNameBuf, 
chColon);
  -            if (colonFirst != -1)
  -            {
  -                const int colonLast = XMLString::lastIndexOf(chColon, 
curAttNameBuf, fAttNameBuf.getLen());
  -
  -                if (colonFirst != colonLast)
  -                {
  -                    emitError(XMLErrs::TooManyColonsInName);
  -                    continue;
  -                }
  -                else if ((colonFirst == 0)
  -                      ||  (colonLast == (int)fAttNameBuf.getLen() - 1))
  -                {
  -                    emitError(XMLErrs::InvalidColonPos);
  -                    continue;
  -                }
  -            }
  -
               //  And now lets add it to the passed collection. If we have not
               //  filled it up yet, then we use the next element. Else we add
               //  a new one.
  @@ -689,6 +673,10 @@
                       , fAttValueBuf.getLen()
                   );
               }
  +            if (attCount >= fRawAttrColonListSize) {
  +                resizeRawAttrColonList();
  +            }
  +            fRawAttrColonList[attCount] = colonPosition;
   
               // And bump the count of attributes we've gotten
               attCount++;
  @@ -1091,7 +1079,8 @@
   
       //  The current position is after the open bracket, so we need to read in
       //  in the element name.
  -    if (!fReaderMgr.getName(fQNameBuf))
  +    int prefixColonPos;
  +    if (!fReaderMgr.getQName(fQNameBuf, &prefixColonPos))
       {
           emitError(XMLErrs::ExpectedElementName);
           fReaderMgr.skipToChar(chOpenAngle);
  @@ -1179,9 +1168,8 @@
   
       //  Resolve the qualified name to a URI and name so that we can look up
       //  the element decl for this element. We have now update the prefix to
  -    //  namespace map so we should get the correct element now.
  -    int prefixColonPos = -1;
  -    unsigned int uriId = resolveQName
  +    //  namespace map so we should get the correct element now.    
  +    unsigned int uriId = resolveQNameWithColon
       (
           qnameRawBuf
           , fPrefixBuf
  @@ -1818,9 +1806,18 @@
                              , const short        mode
                              ,       int&         prefixColonPos)
   {
  -    //  Lets split out the qName into a URI and name buffer first. The URI
  -    //  can be empty.
       prefixColonPos = XMLString::indexOf(qName, chColon);
  +    return resolveQNameWithColon(qName, prefixBuf, mode, prefixColonPos);
  +}
  +
  +unsigned int 
  +SGXMLScanner::resolveQNameWithColon(const   XMLCh* const qName
  +                                    ,       XMLBuffer&   prefixBuf
  +                                    , const short        mode
  +                                    , const int          prefixColonPos)
  +{
  +    //  Lets split out the qName into a URI and name buffer first. The URI
  +    //  can be empty.    
       if (prefixColonPos == -1)
       {
           //  Its all name with no prefix, so put the whole thing into the name
  @@ -1992,6 +1989,10 @@
       //  And we need one for the raw attribute scan. This just stores key/
       //  value string pairs (prior to any processing.)
       fRawAttrList = new (fMemoryManager) RefVectorOf<KVStringPair>(32, true, 
fMemoryManager);
  +    fRawAttrColonList = (int*) fMemoryManager->allocate
  +    (
  +        fRawAttrColonListSize * sizeof(int)
  +    );
   
       //  Create the Validator and init them
       fSchemaValidator = new (fMemoryManager) SchemaValidator(0, 
fMemoryManager);
  @@ -2026,6 +2027,7 @@
       delete fSchemaGrammar;
       delete fEntityTable;
       delete fRawAttrList;
  +    fMemoryManager->deallocate(fRawAttrColonList);
       delete fSchemaValidator;
       delete fICHandler;
       delete fElemNonDeclPool;
  @@ -2061,6 +2063,25 @@
       fElemStateSize = newSize;
   }
   
  +void SGXMLScanner::resizeRawAttrColonList() {
  +
  +    unsigned int newSize = fRawAttrColonListSize * 2;
  +    int* newRawAttrColonList = (int*) fMemoryManager->allocate
  +    (
  +        newSize * sizeof(int)
  +    ); //new int[newSize];
  +
  +    // Copy the existing values
  +    unsigned int index = 0;
  +    for (; index < fRawAttrColonListSize; index++)
  +        newRawAttrColonList[index] = fRawAttrColonList[index];
  +
  +    // Delete the old array and udpate our members
  +    fMemoryManager->deallocate(fRawAttrColonList); //delete [] 
fRawAttrColonList;
  +    fRawAttrColonList = newRawAttrColonList;
  +    fRawAttrColonListSize = newSize;
  +}
  +
   //  This method is called from scanStartTag() to build up the list of
   //  XMLAttr objects that will be passed out in the start tag callout. We
   //  get the key/value pairs from the raw scan of explicitly provided attrs,
  @@ -2128,7 +2149,7 @@
           // use a stack-based buffer when possible.
           XMLCh tempBuffer[100];
   
  -        const int colonInd = XMLString::indexOf(namePtr, chColon);
  +        const int colonInd = fRawAttrColonList[index];
           const XMLCh* prefPtr = XMLUni::fgZeroLenString;
           const XMLCh* suffPtr = XMLUni::fgZeroLenString;
           if (colonInd != -1)
  @@ -3320,6 +3341,13 @@
   void SGXMLScanner::updateNSMap(const  XMLCh* const    attrName
                                 , const XMLCh* const    attrValue)
   {
  +    updateNSMap(attrName, attrValue, XMLString::indexOf(attrName, chColon));
  +}
  +
  +void SGXMLScanner::updateNSMap(const  XMLCh* const    attrName
  +                              , const XMLCh* const    attrValue
  +                              , const int colonOfs)
  +{
       // We need a buffer to normalize the attribute value into
       XMLBufBid bbNormal(&fBufMgr);
       XMLBuffer& normalBuf = bbNormal.getBuffer();
  @@ -3339,8 +3367,7 @@
       //        2. if xxx is xml, then yyy must match XMLUni::fgXMLURIName, 
and vice versa
       //        3. yyy is not XMLUni::fgXMLNSURIName
       //        4. if xxx is not null, then yyy cannot be an empty string.
  -    const XMLCh* prefPtr = XMLUni::fgZeroLenString;
  -    const int colonOfs = XMLString::indexOf(attrName, chColon);
  +    const XMLCh* prefPtr = XMLUni::fgZeroLenString;    
       if (colonOfs != -1) {
           prefPtr = &attrName[colonOfs + 1];
   
  @@ -3381,7 +3408,7 @@
       //  schema attributes.
       //  When we find one, send it off to be used to update the element 
stack's
       //  namespace mappings.
  -    int index = 0;
  +    int index;
       for (index = 0; index < attCount; index++)
       {
           // each attribute has the prefix:suffix="value"
  @@ -3395,7 +3422,7 @@
           {
               const XMLCh* valuePtr = curPair->getValue();
   
  -            updateNSMap(rawPtr, valuePtr);
  +            updateNSMap(rawPtr, valuePtr, fRawAttrColonList[index]);
   
               // if the schema URI is seen in the the valuePtr, set the 
boolean seeXsi
               if (XMLString::equals(valuePtr, SchemaSymbols::fgURI_XSI)) {
  @@ -4411,7 +4438,8 @@
   
       // Expand it since its a normal entity ref
       XMLBufBid bbName(&fBufMgr);
  -    if (!fReaderMgr.getName(bbName.getBuffer()))
  +    int colonPosition;
  +    if (!fReaderMgr.getQName(bbName.getBuffer(), &colonPosition))
       {
           emitError(XMLErrs::ExpectedEntityRefName);
           return EntityExp_Failed;
  
  
  
  1.24      +19 -1     xml-xerces/c/src/xercesc/internal/SGXMLScanner.hpp
  
  Index: SGXMLScanner.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/SGXMLScanner.hpp,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- SGXMLScanner.hpp  14 Dec 2004 16:16:36 -0000      1.23
  +++ SGXMLScanner.hpp  4 Apr 2005 15:11:38 -0000       1.24
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.24  2005/04/04 15:11:38  cargilld
  + * Fix a problem where illegal qualified names were not reported as errors.  
Also store the colon position when searching for a qualified name to avoid 
looking it up again.
  + *
    * Revision 1.23  2004/12/14 16:16:36  cargilld
    * Fix for xercesc-684: Add accessor to XMLScanner to get the current 
grammar type.
    *
  @@ -209,7 +212,20 @@
       );
       void resizeElemState();
   
  -
  +    void updateNSMap
  +    (
  +        const   XMLCh* const    attrName
  +        , const XMLCh* const    attrValue
  +        , const int             colonPosition
  +    );
  +    void resizeRawAttrColonList();
  +    unsigned int resolveQNameWithColon
  +    (
  +        const   XMLCh* const        qName
  +        ,       XMLBuffer&          prefixBufToFill
  +        , const short               mode
  +        , const int                 prefixColonPos
  +    );
       // 
-----------------------------------------------------------------------
       //  Data members
       //
  @@ -252,6 +268,8 @@
       XMLBuffer                               fContent;
       ValueHashTableOf<XMLCh>*                fEntityTable;
       RefVectorOf<KVStringPair>*              fRawAttrList;
  +    unsigned int                            fRawAttrColonListSize;
  +    int*                                    fRawAttrColonList;
       SchemaGrammar*                          fSchemaGrammar;
       SchemaValidator*                        fSchemaValidator;
       IdentityConstraintHandler*              fICHandler;
  
  
  
  1.29      +5 -24     xml-xerces/c/src/xercesc/internal/WFXMLScanner.cpp
  
  Index: WFXMLScanner.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/WFXMLScanner.cpp,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- WFXMLScanner.cpp  12 Jan 2005 10:37:32 -0000      1.28
  +++ WFXMLScanner.cpp  4 Apr 2005 15:11:38 -0000       1.29
  @@ -1097,7 +1097,8 @@
   
       //  The current position is after the open bracket, so we need to read in
       //  in the element name.
  -    if (!fReaderMgr.getName(fQNameBuf))
  +    int colonPosition;
  +    if (!fReaderMgr.getQName(fQNameBuf, &colonPosition))
       {
           emitError(XMLErrs::ExpectedElementName);
           fReaderMgr.skipToChar(chOpenAngle);
  @@ -1182,7 +1183,8 @@
           {
               //  Assume its going to be an attribute, so get a name from
               //  the input.
  -            if (!fReaderMgr.getName(fAttNameBuf))
  +            int colonPosition;
  +            if (!fReaderMgr.getQName(fAttNameBuf, &colonPosition))
               {
                   emitError(XMLErrs::ExpectedAttrName);
                   fReaderMgr.skipPastChar(chCloseAngle);
  @@ -1322,27 +1324,6 @@
                   fAttrNameHashList->setElementAt(attNameHash, attCount);
               }
   
  -            // Make sure that the name is basically well formed for namespace
  -            //  enabled rules. It either has no colons, or it has one which
  -            //  is neither the first or last char.
  -            const int colonFirst = XMLString::indexOf(attNameRawBuf, 
chColon);
  -            if (colonFirst != -1)
  -            {
  -                const int colonLast = XMLString::lastIndexOf(attNameRawBuf, 
chColon);
  -
  -                if (colonFirst != colonLast)
  -                {
  -                    emitError(XMLErrs::TooManyColonsInName);
  -                    continue;
  -                }
  -                else if ((colonFirst == 0)
  -                      ||  (colonLast == (int)fAttNameBuf.getLen() - 1))
  -                {
  -                    emitError(XMLErrs::InvalidColonPos);
  -                    continue;
  -                }
  -            }
  -
               // Map prefix to namespace
               const XMLCh* attPrefix = curAtt->getPrefix();
               const XMLCh* attLocalName = curAtt->getName();
  
  
  
  1.30      +164 -6    xml-xerces/c/src/xercesc/internal/XMLReader.cpp
  
  Index: XMLReader.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLReader.cpp,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- XMLReader.cpp     22 Mar 2005 20:43:27 -0000      1.29
  +++ XMLReader.cpp     4 Apr 2005 15:11:38 -0000       1.30
  @@ -408,6 +408,7 @@
       }
   
       if( fCharIndex < fCharsAvail ) {
  + 
           return (fSrcOfsBase + fCharOfsBuf[fCharIndex]);
       }
   
  @@ -591,7 +592,7 @@
               return false;
       }
   
  -    unsigned int fCharIndex_start = fCharIndex;
  +    unsigned int charIndex_start = fCharIndex;
   
       //  Lets check the first char for being a first name char. If not, then
       //  what's the point in living mannnn? Just give up now. We only do this
  @@ -658,10 +659,10 @@
           }
   
           // we have to copy the accepted character(s), and update column
  -        if (fCharIndex != fCharIndex_start)
  +        if (fCharIndex != charIndex_start)
           {
  -            fCurCol += fCharIndex - fCharIndex_start;
  -            toFill.append(&fCharBuf[fCharIndex_start], fCharIndex - 
fCharIndex_start);
  +            fCurCol += fCharIndex - charIndex_start;
  +            toFill.append(&fCharBuf[charIndex_start], fCharIndex - 
charIndex_start);
           }
   
           // something is wrong if there is still something in the buffer
  @@ -670,12 +671,169 @@
                !refreshCharBuffer())
               break;
   
  -        fCharIndex_start = fCharIndex;
  +        charIndex_start = fCharIndex;
       }
   
       return !toFill.isEmpty();
   }
   
  +bool XMLReader::getQName(XMLBuffer& toFill, int* colonPosition)
  +{
  +    //  Ok, first lets see if we have chars in the buffer. If not, then lets
  +    //  reload.
  +    if (fCharIndex == fCharsAvail)
  +    {
  +        if (!refreshCharBuffer())
  +            return false;
  +    }
  +
  +    unsigned int charIndex_start = fCharIndex;
  +    *colonPosition = -1;
  +    bool checkNextCharacterForFirstNCName = false;
  +
  +    //  Lets check the first char for being a first name char. If not, then
  +    //  what's the point in living mannnn? Just give up now. We only do this
  +    //  if its a name and not a name token that they want.
  +    if (fXMLVersion == XMLV1_1 && ((fCharBuf[fCharIndex] >= 0xD800) && 
(fCharBuf[fCharIndex] <= 0xDB7F))) {
  +        // make sure one more char is in the buffer, the transcoder
  +        // should put only a complete surrogate pair into the buffer
  +        assert(fCharIndex+1 < fCharsAvail);
  +        if ((fCharBuf[fCharIndex+1] < 0xDC00) || (fCharBuf[fCharIndex+1] > 
0xDFFF))
  +            return false;
  +
  +        // Looks ok, so lets eat it
  +        fCharIndex += 2;
  +    }
  +    else {
  +        if (!isFirstNameChar(fCharBuf[fCharIndex]))
  +            return false;
  +        if (fCharBuf[fCharIndex] == chColon)
  +            return false;
  +        // Looks ok, so lets eat it
  +        fCharIndex ++;
  +    }
  +
  +    //  And now we loop until we run out of data in this reader or we hit
  +    //  a non-name char.
  +    while (true)
  +    {
  +        if (checkNextCharacterForFirstNCName) {
  +            checkNextCharacterForFirstNCName = false;
  +            if (fXMLVersion == XMLV1_1) {
  +                if ( !((fCharBuf[fCharIndex] >= 0xD800) && 
(fCharBuf[fCharIndex] <= 0xDB7F)) )
  +                {
  +                    if (!isFirstNameChar(fCharBuf[fCharIndex]))
  +                        return false;
  +                    if (fCharBuf[fCharIndex] == chColon)
  +                        return false;
  +                    fCharIndex++;
  +                }                
  +            }
  +            else {
  +                if (!isFirstNameChar(fCharBuf[fCharIndex]))
  +                    return false;
  +                if (fCharBuf[fCharIndex] == chColon)
  +                    return false;
  +                fCharIndex++;
  +            }
  +
  +        }
  +
  +        if (fXMLVersion == XMLV1_1)
  +        {
  +            while (fCharIndex < fCharsAvail)
  +            {
  +                //  Check the current char and take it if its a name char. 
Else
  +                //  break out.
  +                if ( (fCharBuf[fCharIndex] >= 0xD800) && 
(fCharBuf[fCharIndex] <= 0xDB7F) )
  +                {
  +                    // make sure one more char is in the buffer, the 
transcoder
  +                    // should put only a complete surrogate pair into the 
buffer
  +                    assert(fCharIndex+1 < fCharsAvail);
  +                    if ( (fCharBuf[fCharIndex+1] < 0xDC00) ||
  +                         (fCharBuf[fCharIndex+1] > 0xDFFF)  )
  +                        break;
  +                    fCharIndex += 2;
  +
  +                } 
  +                else
  +                {
  +                    if (!isNameChar(fCharBuf[fCharIndex]))
  +                        break;
  +                    if (fCharBuf[fCharIndex] == chColon) {
  +                        if (*colonPosition != -1) {
  +                            return false;
  +                        }
  +                        // update the buffer to get the colon Offset position
  +                        fCurCol += fCharIndex - charIndex_start;
  +                        toFill.append(&fCharBuf[charIndex_start], fCharIndex 
- charIndex_start);
  +                        charIndex_start = fCharIndex;
  +                        *colonPosition = toFill.getLen();
  +                        if (fCharIndex + 1 < fCharsAvail) {
  +                            fCharIndex++;
  +                            if (!isFirstNameChar(fCharBuf[fCharIndex]))
  +                                return false;
  +                            if (fCharBuf[fCharIndex] == chColon)
  +                                return false;
  +                        }
  +                        else {
  +                            checkNextCharacterForFirstNCName = true;
  +                        }                                                
  +                    }
  +                    fCharIndex++;
  +                }
  +            }
  +        }
  +        else // XMLV1_0
  +        {
  +            while (fCharIndex < fCharsAvail)
  +            {
  +                if (!isNameChar(fCharBuf[fCharIndex]))
  +                    break;
  +                if (fCharBuf[fCharIndex] == chColon) {
  +                    if (*colonPosition != -1) {
  +                        return false;
  +                    }
  +                    // update the buffer to get the colon Offset position
  +                    fCurCol += fCharIndex - charIndex_start;
  +                    toFill.append(&fCharBuf[charIndex_start], fCharIndex - 
charIndex_start);
  +                    charIndex_start = fCharIndex;
  +                    *colonPosition = toFill.getLen();
  +                    if (fCharIndex + 1 < fCharsAvail) {
  +                        fCharIndex++;
  +                        if (!isFirstNameChar(fCharBuf[fCharIndex]))
  +                            return false;
  +                        if (fCharBuf[fCharIndex] == chColon)
  +                            return false;
  +                    }
  +                    else {
  +                        checkNextCharacterForFirstNCName = true;
  +                    }                    
  +                }
  +                fCharIndex++;
  +            }
  +        }
  +
  +        // we have to copy the accepted character(s), and update column
  +        if (fCharIndex != charIndex_start)
  +        {
  +            fCurCol += fCharIndex - charIndex_start;
  +            toFill.append(&fCharBuf[charIndex_start], fCharIndex - 
charIndex_start);
  +        }
  +
  +        // something is wrong if there is still something in the buffer
  +        // or if we don't get no more, then break out.
  +        if ((fCharIndex < fCharsAvail) ||
  +             !refreshCharBuffer())
  +            break;
  +
  +        charIndex_start = fCharIndex;
  +    }
  +    
  +    if (checkNextCharacterForFirstNCName)
  +        return false;
  +    return !toFill.isEmpty();
  +}
   
   bool XMLReader::getSpaces(XMLBuffer& toFill)
   {
  
  
  
  1.22      +5 -1      xml-xerces/c/src/xercesc/internal/XMLReader.hpp
  
  Index: XMLReader.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLReader.hpp,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- XMLReader.hpp     22 Mar 2005 20:43:27 -0000      1.21
  +++ XMLReader.hpp     4 Apr 2005 15:11:38 -0000       1.22
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.22  2005/04/04 15:11:38  cargilld
  + * Fix a problem where illegal qualified names were not reported as errors.  
Also store the colon position when searching for a qualified name to avoid 
looking it up again.
  + *
    * Revision 1.21  2005/03/22 20:43:27  cargilld
    * Check in Christian's patches for Xercesc-1369 and 1370.
    *
  @@ -233,7 +236,7 @@
   
       bool isXMLLetter(const XMLCh toCheck) const;
       bool isFirstNameChar(const XMLCh toCheck) const;
  -    bool isNameChar(const XMLCh toCheck) const;
  +    bool isNameChar(const XMLCh toCheck) const;    
       bool isPlainContentChar(const XMLCh toCheck) const;
       bool isSpecialStartTagChar(const XMLCh toCheck) const;
       bool isXMLChar(const XMLCh toCheck) const;
  @@ -302,6 +305,7 @@
       //  Scanning methods
       // 
-----------------------------------------------------------------------
       bool getName(XMLBuffer& toFill, const bool token);
  +    bool getQName(XMLBuffer& toFill, int* colonPosition);
       bool getNextChar(XMLCh& chGotten);
       bool getNextCharIfNot(const XMLCh chNotToGet, XMLCh& chGotten);
       void movePlainContentChars(XMLBuffer &dest);
  
  
  
  1.7       +6 -6      xml-xerces/c/src/xercesc/internal/XSAXMLScanner.cpp
  
  Index: XSAXMLScanner.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSAXMLScanner.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- XSAXMLScanner.cpp 19 Feb 2005 23:44:17 -0000      1.6
  +++ XSAXMLScanner.cpp 4 Apr 2005 15:11:38 -0000       1.7
  @@ -192,7 +192,8 @@
   
       //  The current position is after the open bracket, so we need to read in
       //  in the element name.
  -    if (!fReaderMgr.getName(fQNameBuf))
  +    int prefixColonPos;
  +    if (!fReaderMgr.getQName(fQNameBuf, &prefixColonPos))
       {
           emitError(XMLErrs::ExpectedElementName);
           fReaderMgr.skipToChar(chOpenAngle);
  @@ -263,9 +264,8 @@
   
       //  Resolve the qualified name to a URI and name so that we can look up
       //  the element decl for this element. We have now update the prefix to
  -    //  namespace map so we should get the correct element now.
  -    int prefixColonPos = -1;
  -    unsigned int uriId = resolveQName
  +    //  namespace map so we should get the correct element now.    
  +    unsigned int uriId = resolveQNameWithColon
       (
           qnameRawBuf, fPrefixBuf, ElemStack::Mode_Element, prefixColonPos
       );
  @@ -612,7 +612,7 @@
           {
               const XMLCh* valuePtr = curPair->getValue();
   
  -            updateNSMap(rawPtr, valuePtr);
  +            updateNSMap(rawPtr, valuePtr, fRawAttrColonList[index]);
   
               // if the schema URI is seen in the the valuePtr, set the 
boolean seeXsi
               if (XMLString::equals(valuePtr, SchemaSymbols::fgURI_XSI)) {
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to