You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by ca...@apache.org on 2005/02/21 19:19:46 UTC

cvs commit: xml-xerces/c/src/xercesc/validators/schema TraverseSchema.cpp

cargilld    2005/02/21 10:19:46

  Modified:    c/src/xercesc/dom/impl DOMNodeVector.cpp DOMNodeVector.hpp
               c/src/xercesc/internal IGXMLScanner.cpp IGXMLScanner2.cpp
                        SGXMLScanner.cpp XMLReader.cpp
               c/src/xercesc/util KVStringPair.cpp KVStringPair.hpp
               c/src/xercesc/validators/schema TraverseSchema.cpp
  Log:
  Performance fixes from Christian Will.
  
  Revision  Changes    Path
  1.7       +1 -19     xml-xerces/c/src/xercesc/dom/impl/DOMNodeVector.cpp
  
  Index: DOMNodeVector.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMNodeVector.cpp,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- DOMNodeVector.cpp	8 Sep 2004 13:55:52 -0000	1.6
  +++ DOMNodeVector.cpp	21 Feb 2005 18:19:45 -0000	1.7
  @@ -88,19 +88,6 @@
       }
   }
   
  -	
  -DOMNode *DOMNodeVector::elementAt(XMLSize_t index) {
  -    if (index >= nextFreeSlot)
  -        return 0;
  -	return data[index];
  -}
  -
  -DOMNode *DOMNodeVector::lastElement() {
  -	if (nextFreeSlot == 0)
  -		return 0;
  -	return data[nextFreeSlot-1];
  -}
  -
   
   void DOMNodeVector::insertElementAt(DOMNode *elem, XMLSize_t index) {
   	XMLSize_t i;
  @@ -135,10 +122,5 @@
   }
   
   
  -XMLSize_t DOMNodeVector::size() {
  -	return nextFreeSlot;
  -}
  -		
  -
   XERCES_CPP_NAMESPACE_END
   
  
  
  
  1.6       +17 -1     xml-xerces/c/src/xercesc/dom/impl/DOMNodeVector.hpp
  
  Index: DOMNodeVector.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/dom/impl/DOMNodeVector.hpp,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- DOMNodeVector.hpp	8 Sep 2004 13:55:52 -0000	1.5
  +++ DOMNodeVector.hpp	21 Feb 2005 18:19:45 -0000	1.6
  @@ -65,6 +65,22 @@
       void           reset();
   };
   
  +inline DOMNode *DOMNodeVector::elementAt(XMLSize_t index) {
  +    if (index >= nextFreeSlot)
  +        return 0;
  +	return data[index];
  +}
  +
  +inline DOMNode *DOMNodeVector::lastElement() {
  +	if (nextFreeSlot == 0)
  +		return 0;
  +	return data[nextFreeSlot-1];
  +}
  +
  +inline XMLSize_t DOMNodeVector::size() {
  +	return nextFreeSlot;
  +}
  +
   XERCES_CPP_NAMESPACE_END
   
   #endif
  
  
  
  1.87      +17 -7     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.86
  retrieving revision 1.87
  diff -u -r1.86 -r1.87
  --- IGXMLScanner.cpp	19 Feb 2005 23:44:17 -0000	1.86
  +++ IGXMLScanner.cpp	21 Feb 2005 18:19:45 -0000	1.87
  @@ -632,6 +632,8 @@
                   return attCount;
               }
   
  +            const XMLCh* curAttNameBuf = fAttNameBuf.getRawBuffer();
  +
               // And next must be an equal sign
               if (!scanEq())
               {
  @@ -674,7 +676,7 @@
               //  Next should be the quoted attribute value. We just do a simple
               //  and stupid scan of this value. The only thing we do here
               //  is to expand entity references.
  -            if (!basicAttrValueScan(fAttNameBuf.getRawBuffer(), fAttValueBuf))
  +            if (!basicAttrValueScan(curAttNameBuf, fAttValueBuf))
               {
                   static const XMLCh tmpList[] =
                   {
  @@ -711,10 +713,10 @@
               //  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);
  +            const int colonFirst = XMLString::indexOf(curAttNameBuf, chColon);
               if (colonFirst != -1)
               {
  -                const int colonLast = XMLString::lastIndexOf(fAttNameBuf.getRawBuffer(), chColon);
  +                const int colonLast = XMLString::lastIndexOf(chColon, curAttNameBuf, fAttNameBuf.getLen());
   
                   if (colonFirst != colonLast)
                   {
  @@ -737,16 +739,24 @@
               {
                   curPair = new (fMemoryManager) KVStringPair
                   (
  -                    fAttNameBuf.getRawBuffer()
  +                    curAttNameBuf
  +                    , fAttNameBuf.getLen()
                       , fAttValueBuf.getRawBuffer()
  +                    , fAttValueBuf.getLen()
                       , fMemoryManager
                   );
                   toFill.addElement(curPair);
               }
                else
               {
  -                curPair = toFill.elementAt(attCount);
  -                curPair->set(fAttNameBuf.getRawBuffer(), fAttValueBuf.getRawBuffer());
  +                curPair = toFill.elementAt(attCount);                
  +                curPair->set
  +                (
  +                    curAttNameBuf,
  +                    fAttNameBuf.getLen(),
  +                    fAttValueBuf.getRawBuffer(),
  +                    fAttValueBuf.getLen()
  +                );
               }
   
               // And bump the count of attributes we've gotten
  
  
  
  1.81      +59 -40    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.80
  retrieving revision 1.81
  diff -u -r1.80 -r1.81
  --- IGXMLScanner2.cpp	7 Jan 2005 08:33:15 -0000	1.80
  +++ IGXMLScanner2.cpp	21 Feb 2005 18:19:45 -0000	1.81
  @@ -900,48 +900,67 @@
       //  Loop through the chars of the source value and normalize it according
       //  to the type.
       States curState = InContent;
  -    bool escaped;
       bool firstNonWS = false;
       XMLCh nextCh;
       const XMLCh* srcPtr = value;
  -    while (*srcPtr)
  -    {
  -        //  Get the next character from the source. We have to watch for
  -        //  escaped characters (which are indicated by a 0xFFFF value followed
  -        //  by the char that was escaped.)
  -        nextCh = *srcPtr;
  -        escaped = (nextCh == 0xFFFF);
  -        if (escaped)
  -            nextCh = *++srcPtr;
  -
  -        //  If its not escaped, then make sure its not a < character, which is
  -        //  not allowed in attribute values.
  -        if (!escaped && (*srcPtr == chOpenAngle))
  -        {
  -            emitError(XMLErrs::BracketInAttrValue, attName);
  -            retVal = false;
  -        }
   
  -        if (type == XMLAttDef::CData || type > XMLAttDef::Notation)
  -        {
  -            if (!escaped)
  +    if (type == XMLAttDef::CData || type > XMLAttDef::Notation) {
  +        while (*srcPtr) {
  +            //  Get the next character from the source. We have to watch for
  +            //  escaped characters (which are indicated by a 0xFFFF value followed
  +            //  by the char that was escaped.)
  +            nextCh = *srcPtr;
  +            
  +            // Do we have an escaped character ?
  +            if (nextCh == 0xFFFF)
               {
  -                if ((nextCh == 0x09) || (nextCh == 0x0A) || (nextCh == 0x0D))
  -                {
  -                    // Check Validity Constraint for Standalone document declaration
  -                    // XML 1.0, Section 2.9
  -                    if (fStandalone && fValidate && isAttExternal)
  -                    {
  -                         // Can't have a standalone document declaration of "yes" if  attribute
  -                         // values are subject to normalisation
  -                         fValidator->emitError(XMLValid::NoAttNormForStandalone, attName);
  -                    }
  -                    nextCh = chSpace;
  +                nextCh = *++srcPtr;
  +            } 
  +            else if ( (nextCh <= 0x0D) && (nextCh == 0x09 || nextCh == 0x0A || nextCh == 0x0D) ) {
  +                // Check Validity Constraint for Standalone document declaration
  +                // XML 1.0, Section 2.9
  +                if (fStandalone && fValidate && isAttExternal)
  +                {
  +                     // Can't have a standalone document declaration of "yes" if  attribute
  +                     // values are subject to normalisation
  +                     fValidator->emitError(XMLValid::NoAttNormForStandalone, attName);
                   }
  +                nextCh = chSpace;
  +            }
  +            else if (nextCh == chOpenAngle) {
  +                //  If its not escaped, then make sure its not a < character, which is
  +                //  not allowed in attribute values.                                
  +                emitError(XMLErrs::BracketInAttrValue, attName);
  +                retVal = false;                
               }
  +
  +            // Add this char to the target buffer
  +            toFill.append(nextCh);
  +
  +            // And move up to the next character in the source
  +            srcPtr++;
           }
  -        else
  +    }
  +    else {
  +        while (*srcPtr)
           {
  +            //  Get the next character from the source. We have to watch for
  +            //  escaped characters (which are indicated by a 0xFFFF value followed
  +            //  by the char that was escaped.)
  +            nextCh = *srcPtr;
  +
  +            // Do we have an escaped character ?
  +            if (nextCh == 0xFFFF)
  +            {
  +                nextCh = *++srcPtr;
  +            } 
  +            else if (nextCh == chOpenAngle) { 
  +                //  If its not escaped, then make sure its not a < character, which is
  +                //  not allowed in attribute values.                               
  +                emitError(XMLErrs::BracketInAttrValue, attName);
  +                retVal = false;
  +            }
  +
               if (curState == InWhitespace)
               {
                   if (!fReaderMgr.getCurrentReader()->isWhitespace(nextCh))
  @@ -979,15 +998,15 @@
                   }
                   firstNonWS = true;
               }
  -        }
   
  -        // Add this char to the target buffer
  -        toFill.append(nextCh);
  +            // Add this char to the target buffer
  +            toFill.append(nextCh);
   
  -        // And move up to the next character in the source
  -        srcPtr++;
  +            // And move up to the next character in the source
  +            srcPtr++;
  +        }
       }
  -
  + 
       return retVal;
   }
   
  
  
  
  1.109     +76 -57    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.108
  retrieving revision 1.109
  diff -u -r1.108 -r1.109
  --- SGXMLScanner.cpp	19 Feb 2005 23:44:17 -0000	1.108
  +++ SGXMLScanner.cpp	21 Feb 2005 18:19:45 -0000	1.109
  @@ -563,6 +563,8 @@
                   return attCount;
               }
   
  +            const XMLCh* curAttNameBuf = fAttNameBuf.getRawBuffer();
  + 
               // And next must be an equal sign
               if (!scanEq())
               {
  @@ -605,7 +607,7 @@
               //  Next should be the quoted attribute value. We just do a simple
               //  and stupid scan of this value. The only thing we do here
               //  is to expand entity references.
  -            if (!basicAttrValueScan(fAttNameBuf.getRawBuffer(), fAttValueBuf))
  +            if (!basicAttrValueScan(curAttNameBuf, fAttValueBuf))
               {
                   static const XMLCh tmpList[] =
                   {
  @@ -642,10 +644,10 @@
               //  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);
  +            const int colonFirst = XMLString::indexOf(curAttNameBuf, chColon);
               if (colonFirst != -1)
               {
  -                const int colonLast = XMLString::lastIndexOf(fAttNameBuf.getRawBuffer(), chColon);
  +                const int colonLast = XMLString::lastIndexOf(chColon, curAttNameBuf, fAttNameBuf.getLen());
   
                   if (colonFirst != colonLast)
                   {
  @@ -668,8 +670,10 @@
               {
                   curPair = new (fMemoryManager) KVStringPair
                   (
  -                    fAttNameBuf.getRawBuffer()
  +                    curAttNameBuf
  +                    , fAttNameBuf.getLen()
                       , fAttValueBuf.getRawBuffer()
  +                    , fAttValueBuf.getLen()
                       , fMemoryManager
                   );
                   toFill.addElement(curPair);
  @@ -677,7 +681,13 @@
                else
               {
                   curPair = toFill.elementAt(attCount);
  -                curPair->set(fAttNameBuf.getRawBuffer(), fAttValueBuf.getRawBuffer());
  +                curPair->set
  +                (
  +                    curAttNameBuf
  +                    , fAttNameBuf.getLen()
  +                    , fAttValueBuf.getRawBuffer()
  +                    , fAttValueBuf.getLen()
  +                );
               }
   
               // And bump the count of attributes we've gotten
  @@ -2745,7 +2755,7 @@
   //  are legal if escaped only. And some escape chars are not subject to
   //  normalization rules.
   bool SGXMLScanner::normalizeAttValue( const   XMLAttDef* const    attDef
  -                                      , const XMLCh* const        attrName
  +                                      , const XMLCh* const        attName
                                         , const XMLCh* const        value
                                         ,       XMLBuffer&          toFill)
   {
  @@ -2772,54 +2782,68 @@
   
       //  Loop through the chars of the source value and normalize it according
       //  to the type.
  -    States curState = InContent;
  -    bool escaped;
  +    States curState = InContent;    
       bool firstNonWS = false;
       XMLCh nextCh;
       const XMLCh* srcPtr = value;
  -    while (*srcPtr)
  -    {
  -        //  Get the next character from the source. We have to watch for
  -        //  escaped characters (which are indicated by a 0xFFFF value followed
  -        //  by the char that was escaped.)
  -        nextCh = *srcPtr;
  -        escaped = (nextCh == 0xFFFF);
  -        if (escaped)
  -            nextCh = *++srcPtr;
   
  -        //  If its not escaped, then make sure its not a < character, which is
  -        //  not allowed in attribute values.
  -        if (!escaped && (*srcPtr == chOpenAngle))
  -        {
  -            emitError(XMLErrs::BracketInAttrValue, attrName);
  -            retVal = false;
  -        }
  -
  -        if (type == XMLAttDef::CData || type > XMLAttDef::Notation)
  -        {
  -            if (!escaped)
  +    if (type == XMLAttDef::CData || type > XMLAttDef::Notation) {
  +        while (*srcPtr) {
  +            //  Get the next character from the source. We have to watch for
  +            //  escaped characters (which are indicated by a 0xFFFF value followed
  +            //  by the char that was escaped.)
  +            nextCh = *srcPtr;
  +            
  +            // Do we have an escaped character ?
  +            if (nextCh == 0xFFFF)
               {
  -                if ((nextCh == 0x09) || (nextCh == 0x0A) || (nextCh == 0x0D))
  -                {
  -                    // Check Validity Constraint for Standalone document declaration
  -                    // XML 1.0, Section 2.9
  -                    if (fStandalone && fValidate && isAttExternal)
  -                    {
  -                        // Can't have a standalone document declaration of "yes" if  attribute
  -                        // values are subject to normalisation
  -                        fValidator->emitError(XMLValid::NoAttNormForStandalone, attrName);
  -                        if (getPSVIHandler())
  -                        {
  -                            // REVISIT:               
  -                            // PSVIAttribute->setValidity(PSVIItem::VALIDITY_INVALID);
  -                        }
  -                    }
  -                    nextCh = chSpace;
  +                nextCh = *++srcPtr;
  +            } 
  +            else if ( (nextCh <= 0x0D) && (nextCh == 0x09 || nextCh == 0x0A || nextCh == 0x0D) ) {
  +                // Check Validity Constraint for Standalone document declaration
  +                // XML 1.0, Section 2.9
  +                if (fStandalone && fValidate && isAttExternal)
  +                {
  +                     // Can't have a standalone document declaration of "yes" if  attribute
  +                     // values are subject to normalisation
  +                     fValidator->emitError(XMLValid::NoAttNormForStandalone, attName);
                   }
  +                nextCh = chSpace;
               }
  +            else if (nextCh == chOpenAngle) {
  +                //  If its not escaped, then make sure its not a < character, which is
  +                //  not allowed in attribute values.                                
  +                emitError(XMLErrs::BracketInAttrValue, attName);
  +                retVal = false;                
  +            }
  +
  +            // Add this char to the target buffer
  +            toFill.append(nextCh);
  +
  +            // And move up to the next character in the source
  +            srcPtr++;
           }
  -        else
  +    }
  +    else {
  +        while (*srcPtr)
           {
  +            //  Get the next character from the source. We have to watch for
  +            //  escaped characters (which are indicated by a 0xFFFF value followed
  +            //  by the char that was escaped.)
  +            nextCh = *srcPtr;
  +
  +            // Do we have an escaped character ?
  +            if (nextCh == 0xFFFF)
  +            {
  +                nextCh = *++srcPtr;
  +            } 
  +            else if (nextCh == chOpenAngle) { 
  +                //  If its not escaped, then make sure its not a < character, which is
  +                //  not allowed in attribute values.                               
  +                emitError(XMLErrs::BracketInAttrValue, attName);
  +                retVal = false;
  +            }
  +
               if (curState == InWhitespace)
               {
                   if (!fReaderMgr.getCurrentReader()->isWhitespace(nextCh))
  @@ -2850,25 +2874,20 @@
                           {
                               // Can't have a standalone document declaration of "yes" if  attribute
                               // values are subject to normalisation
  -                            fValidator->emitError(XMLValid::NoAttNormForStandalone, attrName);
  -                            if (getPSVIHandler())
  -                            {
  -                                // REVISIT:                
  -                                // PSVIAttribute->setValidity(PSVIItem::VALIDITY_INVALID);
  -                            }
  +                            fValidator->emitError(XMLValid::NoAttNormForStandalone, attName);
                           }
                       }
                       continue;
                   }
                   firstNonWS = true;
               }
  -        }
   
  -        // Add this char to the target buffer
  -        toFill.append(nextCh);
  +            // Add this char to the target buffer
  +            toFill.append(nextCh);
   
  -        // And move up to the next character in the source
  -        srcPtr++;
  +            // And move up to the next character in the source
  +            srcPtr++;
  +        }
       }
   
       return retVal;
  
  
  
  1.27      +53 -34    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.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- XMLReader.cpp	20 Dec 2004 15:50:42 -0000	1.26
  +++ XMLReader.cpp	21 Feb 2005 18:19:45 -0000	1.27
  @@ -591,6 +591,8 @@
               return false;
       }
   
  +    unsigned int fCharIndex_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
       //  if its a name and not a name token that they want.
  @@ -603,56 +605,73 @@
              if ((fCharBuf[fCharIndex+1] < 0xDC00) || (fCharBuf[fCharIndex+1] > 0xDFFF))
                  return false;
   
  -            // Looks ok, so lets eat it and put it in our buffer
  -            toFill.append(fCharBuf[fCharIndex++]);
  -            fCurCol++;
  -            toFill.append(fCharBuf[fCharIndex++]);
  -            fCurCol++;
  +            // Looks ok, so lets eat it
  +            fCharIndex += 2;
           }
           else {
               if (!isFirstNameChar(fCharBuf[fCharIndex]))
                   return false;
   
  -            // Looks ok, so lets eat it and put it in our buffer.  Update column also!
  -            toFill.append(fCharBuf[fCharIndex++]);
  -            fCurCol++;
  +            // 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.
  -    do {
  -
  -        while (fCharIndex < fCharsAvail)
  +    while (true)
  +    {
  +        if (fXMLVersion == XMLV1_1)
           {
  -            //  Check the current char and take it if its a name char. Else
  -            //  break out.
  -            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 !toFill.isEmpty();
  -
  -                toFill.append(fCharBuf[fCharIndex++]);
  -                fCurCol++;
  -                toFill.append(fCharBuf[fCharIndex++]);
  -                fCurCol++;
  -            }
  -            else {
  -                if (!isNameChar(fCharBuf[fCharIndex]))
  +            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) )
                   {
  -                    return !toFill.isEmpty();
  -                }
  +                    // 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;
   
  -                toFill.append(fCharBuf[fCharIndex++]);
  -                fCurCol++;
  +                } 
  +                else
  +                {
  +                    if (!isNameChar(fCharBuf[fCharIndex]))
  +                        break;
  +                    fCharIndex++;
  +                }
  +            }
  +        }
  +        else // XMLV1_0
  +        {
  +            while (fCharIndex < fCharsAvail)
  +            {
  +                if (!isNameChar(fCharBuf[fCharIndex]))
  +                    break;
  +                fCharIndex++;
               }
           }
   
  -    // If we don't get no more, then break out.
  -    } while (refreshCharBuffer());
  +        // we have to copy the accepted character(s), and update column
  +        if (fCharIndex != fCharIndex_start)
  +        {
  +            fCurCol += fCharIndex - fCharIndex_start;
  +            toFill.append(&fCharBuf[fCharIndex_start], fCharIndex - fCharIndex_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;
  +
  +        fCharIndex_start = fCharIndex;
  +    }
   
       return !toFill.isEmpty();
   }
  
  
  
  1.9       +32 -39    xml-xerces/c/src/xercesc/util/KVStringPair.cpp
  
  Index: KVStringPair.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/KVStringPair.cpp,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- KVStringPair.cpp	7 Jan 2005 15:12:10 -0000	1.8
  +++ KVStringPair.cpp	21 Feb 2005 18:19:45 -0000	1.9
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.9  2005/02/21 18:19:45  cargilld
  + * Performance fixes from Christian Will.
  + *
    * Revision 1.8  2005/01/07 15:12:10  amassari
    * Removed warnings
    *
  @@ -121,6 +124,35 @@
      set(key, value);
   }
   
  +KVStringPair::KVStringPair(const XMLCh* const key,
  +                           const XMLCh* const value,
  +                           const unsigned int valueLength,
  +                           MemoryManager* const manager)
  +:fKeyAllocSize(0)
  +,fValueAllocSize(0)
  +,fKey(0)
  +,fValue(0)
  +,fMemoryManager(manager)
  +{
  +    setKey(key);
  +    setValue(value, valueLength);
  +}
  +
  +KVStringPair::KVStringPair(const XMLCh* const key,
  +                           const unsigned int keyLength,
  +                           const XMLCh* const value,
  +                           const unsigned int valueLength,
  +                           MemoryManager* const manager)
  +:fKeyAllocSize(0)
  +,fValueAllocSize(0)
  +,fKey(0)
  +,fValue(0)
  +,fMemoryManager(manager)
  +{    
  +    setKey(key, keyLength);
  +    setValue(value, valueLength);
  +}
  +
   KVStringPair::KVStringPair(const KVStringPair& toCopy)
   :XSerializable(toCopy)
   ,XMemory(toCopy)
  @@ -139,45 +171,6 @@
       fMemoryManager->deallocate(fValue); //delete [] fValue;
   }
   
  -
  -// ---------------------------------------------------------------------------
  -//  KVStringPair: Setters
  -// ---------------------------------------------------------------------------
  -void KVStringPair::setKey(const XMLCh* const newKey)
  -{
  -    const unsigned int  len = XMLString::stringLen(newKey);
  -
  -    if (len >= fKeyAllocSize)
  -    {
  -        fMemoryManager->deallocate(fKey); //delete [] fKey;
  -        fKeyAllocSize = len + 1;
  -        fKey = (XMLCh*) fMemoryManager->allocate(fKeyAllocSize * sizeof(XMLCh)); //new XMLCh[fKeyAllocSize];
  -    }
  -
  -    XMLString::copyString(fKey, newKey);
  -}
  -
  -void KVStringPair::setValue(const XMLCh* const newValue)
  -{
  -    const unsigned int  len = XMLString::stringLen(newValue);
  -
  -    if (len >= fValueAllocSize)
  -    {
  -        fMemoryManager->deallocate(fValue); //delete [] fValue;
  -        fValueAllocSize = len + 1;
  -        fValue = (XMLCh*) fMemoryManager->allocate(fValueAllocSize * sizeof(XMLCh)); //new XMLCh[fValueAllocSize];
  -    }
  -
  -    XMLString::copyString(fValue, newValue);
  -}
  -
  -void KVStringPair::set(  const   XMLCh* const    newKey
  -                       , const   XMLCh* const    newValue)
  -{
  -    setKey(newKey);
  -    setValue(newValue);
  -}
  -
   /***
    * Support for Serialization/De-serialization
    ***/
  
  
  
  1.10      +93 -3     xml-xerces/c/src/xercesc/util/KVStringPair.hpp
  
  Index: KVStringPair.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/util/KVStringPair.hpp,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- KVStringPair.hpp	28 Oct 2004 20:14:41 -0000	1.9
  +++ KVStringPair.hpp	21 Feb 2005 18:19:45 -0000	1.10
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.10  2005/02/21 18:19:45  cargilld
  + * Performance fixes from Christian Will.
  + *
    * Revision 1.9  2004/10/28 20:14:41  peiyongz
    * Data member reshuffle
    *
  @@ -122,6 +125,21 @@
           , const XMLCh* const value
           , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
       );
  +    KVStringPair
  +    (
  +        const XMLCh* const key
  +        , const XMLCh* const value
  +        , const unsigned int valueLength
  +        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  +    );
  +    KVStringPair
  +    (
  +        const XMLCh* const key
  +        , const unsigned int keyLength
  +        , const XMLCh* const value
  +        , const unsigned int valueLength
  +        , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
  +    );
       KVStringPair(const KVStringPair& toCopy);
       ~KVStringPair();
   
  @@ -142,12 +160,28 @@
       // -----------------------------------------------------------------------
       void setKey(const XMLCh* const newKey);
       void setValue(const XMLCh* const newValue);
  +    void setKey
  +    (
  +        const   XMLCh* const newKey
  +        , const unsigned int newKeyLength
  +    );
  +    void setValue
  +    (
  +        const   XMLCh* const newValue
  +        , const unsigned int newValueLength
  +    );
       void set
       (
  -        const   XMLCh* const    newKey
  -        , const XMLCh* const    newValue
  +        const   XMLCh* const newKey
  +        , const XMLCh* const newValue
  +    );
  +    void set
  +    (
  +        const     XMLCh* const newKey
  +        , const   unsigned int newKeyLength
  +        , const   XMLCh* const newValue
  +        , const   unsigned int newValueLength
       );
  -
   
       /***
        * Support for Serialization/De-serialization
  @@ -204,6 +238,62 @@
       return fValue;
   }
   
  +// ---------------------------------------------------------------------------
  +//  KVStringPair: Setters
  +// ---------------------------------------------------------------------------
  +inline void KVStringPair::setKey(const XMLCh* const newKey)
  +{
  +    setKey(newKey, XMLString::stringLen(newKey));
  +}
  +
  +inline void KVStringPair::setValue(const XMLCh* const newValue)
  +{
  +    setValue(newValue, XMLString::stringLen(newValue));
  +}
  +
  +inline void KVStringPair::setKey(  const XMLCh* const newKey
  +                                 , const unsigned int newKeyLength)
  +{
  +    if (newKeyLength >= fKeyAllocSize)
  +    {
  +        fMemoryManager->deallocate(fKey); //delete [] fKey;
  +        fKeyAllocSize = newKeyLength + 1;
  +        fKey = (XMLCh*) fMemoryManager->allocate(fKeyAllocSize * sizeof(XMLCh)); //new XMLCh[fKeyAllocSize];
  +    }
  +
  +    memcpy(fKey, newKey, (newKeyLength+1) * sizeof(XMLCh)); // len+1 because of the 0 at the end
  +}
  +
  +inline void KVStringPair::setValue(  const XMLCh* const newValue
  +                                   , const unsigned int newValueLength)
  +{
  +    if (newValueLength >= fValueAllocSize)
  +    {
  +        fMemoryManager->deallocate(fValue); //delete [] fValue;
  +        fValueAllocSize = newValueLength + 1;
  +        fValue = (XMLCh*) fMemoryManager->allocate(fValueAllocSize * sizeof(XMLCh)); //new XMLCh[fValueAllocSize];
  +    }
  +
  +    memcpy(fValue, newValue, (newValueLength+1) * sizeof(XMLCh)); // len+1 because of the 0 at the end
  +}
  +
  +inline void KVStringPair::set(  const   XMLCh* const    newKey
  +                              , const   XMLCh* const    newValue)
  +{
  +    setKey(newKey, XMLString::stringLen(newKey));
  +    setValue(newValue, XMLString::stringLen(newValue));
  +}
  +
  +inline void KVStringPair::set(  const   XMLCh* const newKey
  +                              , const   unsigned int newKeyLength
  +                              , const   XMLCh* const newValue
  +                              , const   unsigned int newValueLength)
  +{
  +    setKey(newKey, newKeyLength);
  +    setValue(newValue, newValueLength);
  +}
  +
  +
   XERCES_CPP_NAMESPACE_END
   
   #endif
  
  
  
  1.130     +3 -2      xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp
  
  Index: TraverseSchema.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp,v
  retrieving revision 1.129
  retrieving revision 1.130
  diff -u -r1.129 -r1.130
  --- TraverseSchema.cpp	14 Dec 2004 02:06:40 -0000	1.129
  +++ TraverseSchema.cpp	21 Feb 2005 18:19:45 -0000	1.130
  @@ -3210,7 +3210,7 @@
   
           if (!pattern.isEmpty()) {
   
  -            KVStringPair* kv = new (fGrammarPoolMemoryManager) KVStringPair(SchemaSymbols::fgELT_PATTERN, pattern.getRawBuffer(), fGrammarPoolMemoryManager);
  +            KVStringPair* kv = new (fGrammarPoolMemoryManager) KVStringPair(SchemaSymbols::fgELT_PATTERN, pattern.getRawBuffer(), pattern.getLen(), fGrammarPoolMemoryManager);
               if (!janPatternAnnot.isDataNull())
                   fSchemaGrammar->putAnnotation(kv, janPatternAnnot.release());
               facets->put((void*) SchemaSymbols::fgELT_PATTERN, kv);
  @@ -3705,6 +3705,7 @@
                               (
                                   SchemaSymbols::fgELT_PATTERN
                                   , pattern.getRawBuffer()
  +                                , pattern.getLen()
                                   , fGrammarPoolMemoryManager
                               )
                       );
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org