knoaman     2004/12/09 12:31:39

  Modified:    c/src/xercesc/internal IGXMLScanner2.cpp SGXMLScanner.cpp
                        XMLScanner.cpp XMLScanner.hpp
  Log:
  DOM L3: pass schema normalized value only when datatype-normalization feature
  is enabled.
  
  Revision  Changes    Path
  1.77      +100 -102  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.76
  retrieving revision 1.77
  diff -u -r1.76 -r1.77
  --- IGXMLScanner2.cpp 3 Dec 2004 19:40:30 -0000       1.76
  +++ IGXMLScanner2.cpp 9 Dec 2004 20:31:39 -0000       1.77
  @@ -420,36 +420,27 @@
               //  don't care about the return status here. If it failed, an 
error
               //  was issued, which is all we care about.
               if (attDefForWildCard) {
  -                normalizeAttValue
  -                (
  -                    attDefForWildCard
  -                    , namePtr
  -                    , curPair->getValue()
  -                    , normBuf
  +                normalizeAttValue(
  +                    attDefForWildCard, namePtr, curPair->getValue(), normBuf
                   );
   
                   //  If we found an attdef for this one, then lets validate 
it.
  -                if (fNormalizeData)
  -                {
  -                    DatatypeValidator* tempDV = ((SchemaAttDef*) 
attDefForWildCard)->getDatatypeValidator();
  -                    if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  -                    {
  -                        // normalize the attribute according to schema 
whitespace facet
  -                        XMLBufBid bbtemp(&fBufMgr);
  -                        XMLBuffer& tempBuf = bbtemp.getBuffer();
  +                const XMLCh* xsNormalized = normBuf.getRawBuffer();
  +                DatatypeValidator* tempDV = ((SchemaAttDef*) 
attDefForWildCard)->getDatatypeValidator();
  +                if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  +                {
  +                    // normalize the attribute according to schema 
whitespace facet
  +                    ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf);
  +                    xsNormalized = fWSNormalizeBuf.getRawBuffer();
   
  -                        ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, normBuf.getRawBuffer(), tempBuf);
  -                        normBuf.set(tempBuf.getRawBuffer());
  +                    if (fNormalizeData && fValidate) {
  +                        normBuf.set(xsNormalized);
                       }
                   }
   
                   if (fValidate ) {
  -                    fValidator->validateAttrValue
  -                    (
  -                        attDefForWildCard
  -                        , normBuf.getRawBuffer()
  -                        , false
  -                        , elemDecl
  +                    fValidator->validateAttrValue(
  +                        attDefForWildCard, xsNormalized, false, elemDecl
                       );
                       attrValidator = 
((SchemaValidator*)fValidator)->getMostRecentAttrValidator();
                       if(((SchemaValidator *)fValidator)->getErrorOccurred())
  @@ -459,46 +450,40 @@
                               attrValid = PSVIItem::VALIDITY_INVALID;
                       }
                   }
  -                else // no decl; default DOMTypeInfo to anySimpleType
  +                else { // no decl; default DOMTypeInfo to anySimpleType
                       attrValidator = 
DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYSIMPLETYPE);
  +                }
   
                   // Save the type for later use
                   attType = attDefForWildCard->getType();
               }
               else {
  -                normalizeAttValue
  -                (
  -                    attDef
  -                    , namePtr
  -                    , curPair->getValue()
  -                    , normBuf
  +                normalizeAttValue(
  +                    attDef, namePtr, curPair->getValue(), normBuf
                   );
   
                   //  If we found an attdef for this one, then lets validate 
it.
                   if (attDef)
                   {
  -                    if (fNormalizeData && (fGrammarType == 
Grammar::SchemaGrammarType))
  +                    const XMLCh* xsNormalized = normBuf.getRawBuffer();
  +                    if (fGrammarType == Grammar::SchemaGrammarType)
                       {
                           DatatypeValidator* tempDV = ((SchemaAttDef*) 
attDef)->getDatatypeValidator();
                           if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
                           {
                               // normalize the attribute according to schema 
whitespace facet
  -                            XMLBufBid bbtemp(&fBufMgr);
  -                            XMLBuffer& tempBuf = bbtemp.getBuffer();
  -
  -                            ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, normBuf.getRawBuffer(), tempBuf);
  -                            normBuf.set(tempBuf.getRawBuffer());
  +                            ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf);
  +                            xsNormalized = fWSNormalizeBuf.getRawBuffer();
  +                            if (fNormalizeData && fValidate && !skipThisOne) 
{
  +                                normBuf.set(xsNormalized);
  +                            }
                           }
                       }
   
                       if (fValidate && !skipThisOne)
                       {
  -                        fValidator->validateAttrValue
  -                        (
  -                            attDef
  -                            , normBuf.getRawBuffer()
  -                            , false
  -                            , elemDecl
  +                        fValidator->validateAttrValue(
  +                            attDef, xsNormalized, false, elemDecl
                           );
   
                           if(fGrammarType == Grammar::SchemaGrammarType)
  @@ -512,13 +497,15 @@
                               }
                           }
                       }
  -                    else if(fGrammarType == Grammar::SchemaGrammarType)
  +                    else if(fGrammarType == Grammar::SchemaGrammarType) {
                           attrValidator = 
DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYSIMPLETYPE);
  +                    }
                   }
                   else // no attDef at all; default to anySimpleType
                   {
  -                    if(fGrammarType == Grammar::SchemaGrammarType) 
  +                    if(fGrammarType == Grammar::SchemaGrammarType) {
                           attrValidator = 
DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYSIMPLETYPE);
  +                    }
                   }
   
                   // Save the type for later use
  @@ -1310,7 +1297,7 @@
       if (fValidate)
       {
           // Get the raw data we need for the callback
  -        XMLCh* rawBuf = toSend.getRawBuffer();
  +        const XMLCh* rawBuf = toSend.getRawBuffer();
           unsigned int len = toSend.getLen();
   
           // And see if the current element is a 'Children' style content model
  @@ -1364,31 +1351,38 @@
                   }
                   else
                   {
  +                    unsigned int xsLen;
  +                    const XMLCh* xsNormalized;
                       SchemaValidator *schemaValidator = (SchemaValidator 
*)fValidator;
  -                    if (fNormalizeData) {
  -
  -                        DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  -                        if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  -                        {
  -                            // normalize the character according to schema 
whitespace facet
  -                            XMLBufBid bbtemp(&fBufMgr);
  -                            XMLBuffer& tempBuf = bbtemp.getBuffer();
  -
  -                            ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, rawBuf,  tempBuf);
  -                            rawBuf = tempBuf.getRawBuffer();
  -                            len = tempBuf.getLen();
  -                        }
  +                    DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  +                    if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  +                    {
  +                        // normalize the character according to schema 
whitespace facet
  +                        ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, rawBuf, fWSNormalizeBuf);
  +                        xsNormalized = fWSNormalizeBuf.getRawBuffer();
  +                        xsLen = fWSNormalizeBuf.getLen();
  +                    }
  +                    else {
  +                        xsNormalized = rawBuf;
  +                        xsLen = len ;
                       }
   
                       // tell the schema validation about the character data 
for checkContent later
  -                    schemaValidator->setDatatypeBuffer(rawBuf);
  +                    schemaValidator->setDatatypeBuffer(xsNormalized);
   
                       // call all active identity constraints
  -                    if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount())
  -                        fContent.append(rawBuf, len);
  +                    if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount()) {
  +                        fContent.append(xsNormalized, xsLen);
  +                    }
   
  -                    if (fDocHandler)
  -                        fDocHandler->docCharacters(rawBuf, len, false);
  +                    if (fDocHandler) {
  +                        if (fNormalizeData) {
  +                           fDocHandler->docCharacters(xsNormalized, xsLen, 
false);
  +                        }
  +                        else {
  +                            fDocHandler->docCharacters(rawBuf, len, false);
  +                        }
  +                    }
                   }
               }
           }
  @@ -1406,31 +1400,38 @@
                   }
                   else
                   {
  +                    unsigned int xsLen;
  +                    const XMLCh* xsNormalized;
                       SchemaValidator *schemaValidator = 
(SchemaValidator*)fValidator;
  -                    if (fNormalizeData) {
  -
  -                        DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  -                        if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  -                        {
  -                            // normalize the character according to schema 
whitespace facet
  -                            XMLBufBid bbtemp(&fBufMgr);
  -                            XMLBuffer& tempBuf = bbtemp.getBuffer();
  -
  -                            ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, rawBuf,  tempBuf);
  -                            rawBuf = tempBuf.getRawBuffer();
  -                            len = tempBuf.getLen();
  -                        }
  +                    DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  +                    if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  +                    {
  +                        // normalize the character according to schema 
whitespace facet
  +                        ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, rawBuf, fWSNormalizeBuf);
  +                        xsNormalized = fWSNormalizeBuf.getRawBuffer();
  +                        xsLen = fWSNormalizeBuf.getLen();
  +                    }
  +                    else {
  +                        xsNormalized = rawBuf;
  +                        xsLen = len;
                       }
   
                       // tell the schema validation about the character data 
for checkContent later
  -                    schemaValidator->setDatatypeBuffer(rawBuf);
  +                    schemaValidator->setDatatypeBuffer(xsNormalized);
   
                       // call all active identity constraints
  -                    if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount())
  -                        fContent.append(rawBuf, len);
  +                    if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount()) {
  +                        fContent.append(xsNormalized, xsLen);
  +                    }
   
  -                    if (fDocHandler)
  -                        fDocHandler->docCharacters(rawBuf, len, false);
  +                    if (fDocHandler) {
  +                        if (fNormalizeData) {
  +                            fDocHandler->docCharacters(xsNormalized, xsLen, 
false);
  +                        }
  +                        else {
  +                            fDocHandler->docCharacters(rawBuf, len, false);
  +                        }
  +                    }
                   }
               }
               else
  @@ -2460,24 +2461,24 @@
   
               if (fGrammarType == Grammar::SchemaGrammarType) {
   
  -                if (fNormalizeData)
  -                {
  -                    DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  -                    if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  -                    {
  -                        // normalize the character according to schema 
whitespace facet
  -                        XMLBufBid bbtemp(&fBufMgr);
  -                        XMLBuffer& tempBuf = bbtemp.getBuffer();
  -
  -                        ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, bbCData.getRawBuffer(),  tempBuf);
  -                        bbCData.set(tempBuf.getRawBuffer());
  +                unsigned int xsLen = bbCData.getLen();
  +                const XMLCh* xsNormalized = bbCData.getRawBuffer();
  +                DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  +                if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  +                {
  +                    // normalize the character according to schema 
whitespace facet
  +                    ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf);
  +                    xsNormalized = fWSNormalizeBuf.getRawBuffer();
  +                    xsLen = fWSNormalizeBuf.getLen();
  +                    if (fNormalizeData && fValidate) {
  +                        bbCData.set(xsNormalized);
                       }
                   }
   
                   if (fValidate) {
   
                       // tell the schema validation about the character data 
for checkContent later
  -                    
((SchemaValidator*)fValidator)->setDatatypeBuffer(bbCData.getRawBuffer());
  +                    
((SchemaValidator*)fValidator)->setDatatypeBuffer(xsNormalized);
   
                       if (charOpts != XMLElementDecl::AllCharData)
                       {
  @@ -2492,9 +2493,9 @@
                   }
   
                   // call all active identity constraints
  -                if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount())
  -                    fContent.append(bbCData.getRawBuffer(), 
bbCData.getLen());
  -
  +                if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount()) {
  +                    fContent.append(xsNormalized, xsLen);
  +                }
               }
               else {
                   if (fValidate) {
  @@ -2510,12 +2511,9 @@
               // If we have a doc handler, call it
               if (fDocHandler)
               {
  -                fDocHandler->docCharacters
  -                    (
  -                    bbCData.getRawBuffer()
  -                    , bbCData.getLen()
  -                    , true
  -                    );
  +                fDocHandler->docCharacters(
  +                    bbCData.getRawBuffer(), bbCData.getLen(), true
  +                );
               }
   
               // And we are done
  
  
  
  1.102     +105 -112  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.101
  retrieving revision 1.102
  diff -u -r1.101 -r1.102
  --- SGXMLScanner.cpp  3 Dec 2004 19:40:30 -0000       1.101
  +++ SGXMLScanner.cpp  9 Dec 2004 20:31:39 -0000       1.102
  @@ -2371,36 +2371,29 @@
               //  don't care about the return status here. If it failed, an 
error
               //  was issued, which is all we care about.
               if (attDefForWildCard) {
  -                normalizeAttValue
  -                (
  -                    attDefForWildCard
  -                    , namePtr
  -                    , curPair->getValue()
  -                    , normBuf
  +                normalizeAttValue(
  +                    attDefForWildCard, namePtr, curPair->getValue(), normBuf
                   );
   
                   //  If we found an attdef for this one, then lets validate 
it.
  -                if (fNormalizeData)
  -                {
  -                    DatatypeValidator* tempDV = ((SchemaAttDef*) 
attDefForWildCard)->getDatatypeValidator();
  -                    if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  -                    {
  -                        // normalize the attribute according to schema 
whitespace facet
  -                        XMLBufBid bbtemp(&fBufMgr);
  -                        XMLBuffer& tempBuf = bbtemp.getBuffer();
  -
  -                        ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, normBuf.getRawBuffer(), tempBuf);
  -                        normBuf.set(tempBuf.getRawBuffer());
  +                const XMLCh* xsNormalized = normBuf.getRawBuffer();
  +                DatatypeValidator* tempDV = ((SchemaAttDef*) 
attDefForWildCard)->getDatatypeValidator();
  +                if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  +                {
  +                    // normalize the attribute according to schema 
whitespace facet
  +                    XMLBufBid bbtemp(&fBufMgr);
  +                    XMLBuffer& tempBuf = bbtemp.getBuffer();
  +
  +                    ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf);
  +                    xsNormalized = fWSNormalizeBuf.getRawBuffer();
  +                    if (fNormalizeData && fValidate) {
  +                        normBuf.set(xsNormalized);
                       }
                   }
   
                   if (fValidate ) {
  -                    fValidator->validateAttrValue
  -                    (
  -                        attDefForWildCard
  -                        , normBuf.getRawBuffer()
  -                        , false
  -                        , elemDecl
  +                    fValidator->validateAttrValue(
  +                        attDefForWildCard, xsNormalized, false, elemDecl
                       );
                       attrValidator = ((SchemaValidator 
*)fValidator)->getMostRecentAttrValidator();
                       if(((SchemaValidator *)fValidator)->getErrorOccurred())
  @@ -2410,46 +2403,40 @@
                               attrValid = PSVIItem::VALIDITY_INVALID;
                       }
                   }
  -                else // no decl; default DOMTypeInfo to anySimpleType
  +                else { // no decl; default DOMTypeInfo to anySimpleType
                       attrValidator = 
DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYSIMPLETYPE);
  +                }
   
                   // Save the type for later use
                   attType = attDefForWildCard->getType();
               }
               else {
  -                normalizeAttValue
  -                (
  -                    attDef
  -                    , namePtr
  -                    , curPair->getValue()
  -                    , normBuf
  +                normalizeAttValue(
  +                    attDef, namePtr, curPair->getValue(), normBuf
                   );
   
                   //  If we found an attdef for this one, then lets validate 
it.
                   if (attDef)
                   {
  -                    if (fNormalizeData && (fGrammarType == 
Grammar::SchemaGrammarType))
  +                    const XMLCh* xsNormalized = normBuf.getRawBuffer();
  +                    if (fGrammarType == Grammar::SchemaGrammarType)
                       {
                           DatatypeValidator* tempDV = ((SchemaAttDef*) 
attDef)->getDatatypeValidator();
                           if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
                           {
                               // normalize the attribute according to schema 
whitespace facet
  -                            XMLBufBid bbtemp(&fBufMgr);
  -                            XMLBuffer& tempBuf = bbtemp.getBuffer();
  -
  -                            ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, normBuf.getRawBuffer(), tempBuf);
  -                            normBuf.set(tempBuf.getRawBuffer());
  +                            ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf);
  +                            xsNormalized = fWSNormalizeBuf.getRawBuffer();
  +                            if (fNormalizeData && fValidate && !skipThisOne) 
{
  +                                normBuf.set(xsNormalized);
  +                            }
                           }
                       }
   
                       if (fValidate && !skipThisOne)
                       {
  -                        fValidator->validateAttrValue
  -                        (
  -                            attDef
  -                            , normBuf.getRawBuffer()
  -                            , false
  -                            , elemDecl
  +                        fValidator->validateAttrValue(
  +                            attDef, xsNormalized, false, elemDecl
                           );
                           attrValidator = ((SchemaValidator 
*)fValidator)->getMostRecentAttrValidator();
                           if(((SchemaValidator 
*)fValidator)->getErrorOccurred())
  @@ -2459,11 +2446,13 @@
                                   attrValid = PSVIItem::VALIDITY_INVALID;
                           }
                       }
  -                    else
  +                    else {
                           attrValidator = 
DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYSIMPLETYPE);
  +                    }
                   }
  -                else 
  +                else {
                       attrValidator = 
DatatypeValidatorFactory::getBuiltInRegistry()->get(SchemaSymbols::fgDT_ANYSIMPLETYPE);
  +                }
   
                   // Save the type for later use
                   attType = (attDef)?attDef->getType():XMLAttDef::CData;
  @@ -3189,7 +3178,7 @@
       if (fValidate)
       {
           // Get the raw data we need for the callback
  -        const XMLCh* const rawBuf = toSend.getRawBuffer();
  +        const XMLCh* rawBuf = toSend.getRawBuffer();
           const unsigned int len = toSend.getLen();
   
           // Get the character data opts for the current element
  @@ -3229,35 +3218,37 @@
               }
               else if (charOpts == XMLElementDecl::AllCharData)
               {
  -                // The normalized data can only be as large as the
  -                // original size, so this will avoid allocating way
  -                // too much or too little memory.
  -                XMLBuffer toFill(len+1, fMemoryManager);
  -                toFill.set(rawBuf);
  -
  -                if (fNormalizeData)
  -                {
  -                    DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  -                    if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  -                    {
  -                        // normalize the character according to schema 
whitespace facet
  -                        XMLBufBid bbtemp(&fBufMgr);
  -                        XMLBuffer& tempBuf = bbtemp.getBuffer();
  -
  -                        ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, toFill.getRawBuffer(),  tempBuf);
  -                        toFill.set(tempBuf.getRawBuffer());
  -                    }
  +                unsigned int xsLen;
  +                const XMLCh* xsNormalized;
  +                DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  +                if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  +                {
  +                    // normalize the character according to schema 
whitespace facet
  +                    ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, rawBuf, fWSNormalizeBuf);
  +                    xsNormalized = fWSNormalizeBuf.getRawBuffer();
  +                    xsLen = fWSNormalizeBuf.getLen();
  +                }
  +                else {
  +                    xsNormalized = rawBuf;
  +                    xsLen = len;
                   }
   
                   // tell the schema validation about the character data for 
checkContent later
  -                
((SchemaValidator*)fValidator)->setDatatypeBuffer(toFill.getRawBuffer());
  +                
((SchemaValidator*)fValidator)->setDatatypeBuffer(xsNormalized);
   
                   // call all active identity constraints
  -                if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount())
  -                    fContent.append(toFill.getRawBuffer(), toFill.getLen());
  +                if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount()) {
  +                    fContent.append(xsNormalized, xsLen);
  +                }
   
  -                if (fDocHandler)
  -                    fDocHandler->docCharacters(toFill.getRawBuffer(), 
toFill.getLen(), false);
  +                if (fDocHandler) {
  +                    if (fNormalizeData) {
  +                        fDocHandler->docCharacters(xsNormalized, xsLen, 
false);
  +                    }
  +                    else {
  +                        fDocHandler->docCharacters(rawBuf, len, false);
  +                    }
  +                }
               }
           }
           else
  @@ -3267,35 +3258,36 @@
               //  issue an error.
               if (charOpts == XMLElementDecl::AllCharData)
               {
  -                // The normalized data can only be as large as the
  -                // original size, so this will avoid allocating way
  -                // too much or too little memory.
  -                XMLBuffer toFill(len+1, fMemoryManager);
  -                toFill.set(rawBuf);
  -
  -                if (fNormalizeData)
  -                {
  -                    DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  -                    if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  -                    {
  -                        // normalize the character according to schema 
whitespace facet
  -                        XMLBufBid bbtemp(&fBufMgr);
  -                        XMLBuffer& tempBuf = bbtemp.getBuffer();
  -
  -                        ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, toFill.getRawBuffer(),  tempBuf);
  -                        toFill.set(tempBuf.getRawBuffer());
  -                    }
  +                unsigned int xsLen;
  +                const XMLCh *xsNormalized;
  +                DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  +                if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  +                {
  +                    ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, rawBuf, fWSNormalizeBuf);
  +                    xsNormalized = fWSNormalizeBuf.getRawBuffer();
  +                    xsLen = fWSNormalizeBuf.getLen();
  +                }
  +                else {
  +                    xsNormalized = rawBuf;
  +                    xsLen = len;
                   }
   
                   // tell the schema validation about the character data for 
checkContent later
  -                
((SchemaValidator*)fValidator)->setDatatypeBuffer(toFill.getRawBuffer());
  +                
((SchemaValidator*)fValidator)->setDatatypeBuffer(xsNormalized);
   
                   // call all active identity constraints
  -                if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount())
  -                    fContent.append(toFill.getRawBuffer(), toFill.getLen());
  +                if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount()) {
  +                    fContent.append(xsNormalized, xsLen);
  +                }
   
  -                if (fDocHandler)
  -                    fDocHandler->docCharacters(toFill.getRawBuffer(), 
toFill.getLen(), false);
  +                if (fDocHandler) {
  +                    if (fNormalizeData) {
  +                        fDocHandler->docCharacters(xsNormalized, xsLen, 
false);
  +                    }
  +                    else {
  +                        fDocHandler->docCharacters(rawBuf, len, false);
  +                    }
  +                }
               }
               else
               {
  @@ -4059,27 +4051,25 @@
           if (nextCh == chCloseSquare && fReaderMgr.skippedString(CDataClose))
           {
               //  make sure we were not expecting a trailing surrogate.
  -            if (gotLeadingSurrogate)
  +            if (gotLeadingSurrogate) {
                   emitError(XMLErrs::Expected2ndSurrogateChar);
  +            }
   
  +            unsigned int xsLen = bbCData.getLen();
  +            const XMLCh* xsNormalized = bbCData.getRawBuffer();
               if (fValidate) {
   
  -                if (fNormalizeData)
  +                DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  +                if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
                   {
  -                    DatatypeValidator* tempDV = ((SchemaValidator*) 
fValidator)->getCurrentDatatypeValidator();
  -                    if (tempDV && tempDV->getWSFacet() != 
DatatypeValidator::PRESERVE)
  -                    {
  -                        // normalize the character according to schema 
whitespace facet
  -                        XMLBufBid bbtemp(&fBufMgr);
  -                        XMLBuffer& tempBuf = bbtemp.getBuffer();
  -
  -                        ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, bbCData.getRawBuffer(),  tempBuf);
  -                        bbCData.set(tempBuf.getRawBuffer());
  -                    }
  +                    // normalize the character according to schema 
whitespace facet
  +                    ((SchemaValidator*) 
fValidator)->normalizeWhiteSpace(tempDV, xsNormalized, fWSNormalizeBuf);
  +                    xsNormalized = fWSNormalizeBuf.getRawBuffer();
  +                    xsLen = fWSNormalizeBuf.getLen();
                   }
   
                   // tell the schema validation about the character data for 
checkContent later
  -                
((SchemaValidator*)fValidator)->setDatatypeBuffer(bbCData.getRawBuffer());
  +                
((SchemaValidator*)fValidator)->setDatatypeBuffer(xsNormalized);
   
                   if (charOpts != XMLElementDecl::AllCharData)
                   {
  @@ -4094,18 +4084,21 @@
               }
   
               // call all active identity constraints
  -            if (toCheckIdentityConstraint() && fICHandler->getMatcherCount())
  -                fContent.append(bbCData.getRawBuffer(), bbCData.getLen());
  +            if (toCheckIdentityConstraint() && 
fICHandler->getMatcherCount()) {
  +                fContent.append(xsNormalized, xsLen);
  +            }
   
               // If we have a doc handler, call it
               if (fDocHandler)
               {
  -                fDocHandler->docCharacters
  -                    (
  -                    bbCData.getRawBuffer()
  -                    , bbCData.getLen()
  -                    , true
  +                if (fNormalizeData) {
  +                    fDocHandler->docCharacters(xsNormalized, xsLen, true);
  +                }
  +                else {
  +                    fDocHandler->docCharacters(
  +                        bbCData.getRawBuffer(), bbCData.getLen(), true
                       );
  +                }
               }
   
               // And we are done
  
  
  
  1.77      +3 -1      xml-xerces/c/src/xercesc/internal/XMLScanner.cpp
  
  Index: XMLScanner.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLScanner.cpp,v
  retrieving revision 1.76
  retrieving revision 1.77
  diff -u -r1.76 -r1.77
  --- XMLScanner.cpp    7 Dec 2004 19:45:43 -0000       1.76
  +++ XMLScanner.cpp    9 Dec 2004 20:31:39 -0000       1.77
  @@ -206,6 +206,7 @@
       , fQNameBuf(1023, manager)
       , fPrefixBuf(1023, manager)
       , fURIBuf(1023, manager)
  +    , fWSNormalizeBuf(1023, manager)
       , fElemStack(manager)   
   {
      commonInit();
  @@ -290,6 +291,7 @@
       , fQNameBuf(1023, manager)
       , fPrefixBuf(1023, manager)
       , fURIBuf(1023, manager)
  +    , fWSNormalizeBuf(1023, manager)
       , fElemStack(manager)
   {
      commonInit();
  
  
  
  1.46      +5 -0      xml-xerces/c/src/xercesc/internal/XMLScanner.hpp
  
  Index: XMLScanner.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLScanner.hpp,v
  retrieving revision 1.45
  retrieving revision 1.46
  diff -u -r1.45 -r1.46
  --- XMLScanner.hpp    7 Dec 2004 19:45:43 -0000       1.45
  +++ XMLScanner.hpp    9 Dec 2004 20:31:39 -0000       1.46
  @@ -16,6 +16,10 @@
   
   /*
    * $Log$
  + * Revision 1.46  2004/12/09 20:31:39  knoaman
  + * DOM L3: pass schema normalized value only when datatype-normalization 
feature
  + * is enabled.
  + *
    * Revision 1.45  2004/12/07 19:45:43  knoaman
    * An option to ignore a cached DTD grammar when a document contains an
    * internal and external subset.
  @@ -1062,6 +1066,7 @@
       XMLBuffer                   fQNameBuf;
       XMLBuffer                   fPrefixBuf;
       XMLBuffer                   fURIBuf;
  +    XMLBuffer                   fWSNormalizeBuf;
       ElemStack                   fElemStack;
   
   
  
  
  

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

Reply via email to