peiyongz 2004/10/27 14:52:04 Modified: c/src/xercesc/framework/psvi XSValue.cpp Log: Set status for invalid data -- patch from David Bertoni Revision Changes Path 1.16 +165 -80 xml-xerces/c/src/xercesc/framework/psvi/XSValue.cpp Index: XSValue.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/psvi/XSValue.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- XSValue.cpp 20 Oct 2004 15:18:20 -0000 1.15 +++ XSValue.cpp 27 Oct 2004 21:52:04 -0000 1.16 @@ -16,6 +16,9 @@ /* * $Log$ + * Revision 1.16 2004/10/27 21:52:04 peiyongz + * Set status for invalid data -- patch from David Bertoni + * * Revision 1.15 2004/10/20 15:18:20 knoaman * Allow option of initializing static data in XMLPlatformUtils::Initialize * @@ -630,6 +633,7 @@ } break; default: + status = st_NotSupported; return false; break; } @@ -744,6 +748,7 @@ } break; default: + status = st_NotSupported; return false; break; } @@ -832,7 +837,10 @@ , XMLVersion version , MemoryManager* const manager) { - + bool isValid = true; + // Set this here, because we want to check it at the end. + status = st_Init; + try { switch (datatype) @@ -848,8 +856,7 @@ if (i == XMLUni::fgBooleanValueSpaceArraySize) { - status = st_FOCA0002; - return false; + isValid = false; } } break; @@ -857,8 +864,7 @@ { if (HexBin::getDataLength(content) == -1) { - status = st_FOCA0002; - return false; + isValid = false; } } break; @@ -866,68 +872,95 @@ { if (Base64::getDataLength(content, manager) == -1) { - status = st_FOCA0002; - return false; + isValid = false; } } break; case XSValue::dt_anyURI: - return XMLUri::isValidURI(true, content); + if (XMLUri::isValidURI(true, content) == false) + { + isValid = false; + } break; case XSValue::dt_QName: - return (version == ver_10) ? + isValid = (version == ver_10) ? XMLChar1_0::isValidQName(content, XMLString::stringLen(content)) : XMLChar1_1::isValidQName(content, XMLString::stringLen(content)); break; case XSValue::dt_NOTATION: - return XMLString::isValidNOTATION(content, manager); + if ( XMLString::isValidNOTATION(content, manager) == false) + { + isValid = false; + } break; case XSValue::dt_string: { - XMLCh* rawPtr = (XMLCh*) content; + const XMLCh* rawPtr = content; if (version == ver_10) { while (*rawPtr) if (!XMLChar1_0::isXMLChar(*rawPtr++)) - return false; + { + isValid = false; + break; + } } else { while (*rawPtr) if (!XMLChar1_1::isXMLChar(*rawPtr++)) - return false; + { + isValid = false; + break; + } } } break; case XSValue::dt_normalizedString: { - XMLCh* rawPtr = (XMLCh*) content; + const XMLCh* rawPtr = content; if (version == ver_10) { while (*rawPtr) { if (!XMLChar1_0::isXMLChar(*rawPtr)) - return false; - - if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab ) - return false; - - rawPtr++; + { + isValid = false; + break; + } + else if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab ) + { + isValid = false; + break; + } + else + { + rawPtr++; + } } } else { while (*rawPtr) { - if (!XMLChar1_1::isXMLChar(*rawPtr)) return false; - - if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab ) - return false; - - rawPtr++; + if (!XMLChar1_1::isXMLChar(*rawPtr)) + { + isValid = false; + break; + } + else if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab ) + { + isValid = false; + break; + } + else + { + rawPtr++; + } + } } @@ -937,7 +970,7 @@ case XSValue::dt_language: { unsigned int strLen = XMLString::stringLen(content); - XMLCh* rawPtr = (XMLCh*) content; + const XMLCh* rawPtr = content; bool inWS = false; if (version == ver_10) @@ -945,28 +978,43 @@ // Check leading/Trailing white space if (XMLChar1_0::isWhitespace(content[0]) || - XMLChar1_0::isWhitespace(content[strLen]) ) - return false; - - while (*rawPtr) + XMLChar1_0::isWhitespace(content[strLen - 1]) ) { - if (!XMLChar1_0::isXMLChar(*rawPtr)) - return false; - - if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab ) - return false; - - if (XMLChar1_0::isWhitespace(*rawPtr)) + isValid = false; + } + else + { + while (*rawPtr) { - if (inWS) - return false; + if (!XMLChar1_0::isXMLChar(*rawPtr)) + { + isValid = false; + break; + } + else if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab ) + { + isValid = false; + break; + } + else if (XMLChar1_0::isWhitespace(*rawPtr)) + { + if (inWS) + { + isValid = false; + break; + } + else + { + inWS = true; + } + } else - inWS = true; - } - else - inWS = false; + { + inWS = false; + } - rawPtr++; + rawPtr++; + } } } else @@ -974,48 +1022,67 @@ // Check leading/Trailing white space if (XMLChar1_1::isWhitespace(content[0]) || - XMLChar1_1::isWhitespace(content[strLen]) ) - return false; - - while (*rawPtr) + XMLChar1_1::isWhitespace(content[strLen - 1]) ) { - if (!XMLChar1_1::isXMLChar(*rawPtr)) - return false; - - if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab ) - return false; - - if (XMLChar1_1::isWhitespace(*rawPtr)) + isValid = false; + } + else + { + while (*rawPtr) { - if (inWS) - return false; + if (!XMLChar1_1::isXMLChar(*rawPtr)) + { + isValid = false; + break; + } + else if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab ) + { + isValid = false; + break; + } + else if (XMLChar1_1::isWhitespace(*rawPtr)) + { + if (inWS) + { + isValid = false; + break; + } + else + { + inWS = true; + } + } else - inWS = true; - } - else - inWS = false; + { + inWS = false; + } - rawPtr++; - } + rawPtr++; + } + } } - } - if (datatype == XSValue::dt_language) + if (isValid == true && datatype == XSValue::dt_language) { RegularExpression* regEx = getRegEx(); if (!regEx) { status = st_CantCreateRegEx; - return false; + isValid = false; + } + else + { + if (regEx->matches(content, manager) == false) + { + isValid = false; + } } - - return regEx->matches(content, manager); } break; case XSValue::dt_NMTOKEN: - return (version == ver_10) ? + isValid = (version == ver_10) ? XMLChar1_0::isValidNmtoken(content, XMLString::stringLen(content)) : XMLChar1_1::isValidNmtoken(content, XMLString::stringLen(content)); break; @@ -1031,7 +1098,10 @@ const XMLCh* token = tokenizer.nextToken(); if (!XMLChar1_0::isValidNmtoken(token, XMLString::stringLen(token))) - return false; + { + isValid = false; + break; + } } } else @@ -1041,13 +1111,16 @@ const XMLCh* token = tokenizer.nextToken(); if (!XMLChar1_1::isValidNmtoken(token, XMLString::stringLen(token))) - return false; + { + isValid = false; + break; + } } } } break; case XSValue::dt_Name: - return (version == ver_10) ? + isValid = (version == ver_10) ? XMLChar1_0::isValidName(content, XMLString::stringLen(content)) : XMLChar1_1::isValidName(content, XMLString::stringLen(content)); break; @@ -1055,7 +1128,7 @@ case XSValue::dt_ID: case XSValue::dt_IDREF: case XSValue::dt_ENTITY: - return (version == ver_10) ? + isValid = (version == ver_10) ? XMLChar1_0::isValidNCName(content, XMLString::stringLen(content)) : XMLChar1_1::isValidNCName(content, XMLString::stringLen(content)); break; @@ -1071,7 +1144,10 @@ const XMLCh* token = tokenizer.nextToken(); if (!XMLChar1_0::isValidNCName(token, XMLString::stringLen(token))) - return false; + { + isValid = false; + break; + } } } else @@ -1081,24 +1157,33 @@ const XMLCh* token = tokenizer.nextToken(); if (!XMLChar1_1::isValidNCName(token, XMLString::stringLen(token))) - return false; + { + isValid = false; + break; + } } } } break; default: - return false; + status = st_NotSupported; + isValid = false; break; } - return true; //parsing succeed } catch (...) { + isValid = false; + } + + if (isValid == false && status == st_Init) + { status = st_FOCA0002; - return false; } + + return isValid; }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]