in src/xercesc/framework/psvi/XSValue.cpp [643:936]
bool XSValue::validateStrings(const XMLCh* const content
, DataType datatype
, Status& status
, XMLVersion version
, MemoryManager* const manager)
{
bool isValid = true;
switch (datatype) {
case XSValue::dt_boolean:
{
XMLSize_t i = 0;
XMLCh* tmpStrValue = XMLString::replicate(content, manager);
ArrayJanitor<XMLCh> janTmpName(tmpStrValue, manager);
XMLString::trim(tmpStrValue);
for (; i < XMLUni::fgBooleanValueSpaceArraySize; i++) {
if (XMLString::equals(tmpStrValue, XMLUni::fgBooleanValueSpace[i]))
break;
}
if (XMLUni::fgBooleanValueSpaceArraySize == i) {
isValid = false;
}
break;
}
case XSValue::dt_hexBinary:
{
XMLCh* tmpStrValue = XMLString::replicate(content, manager);
ArrayJanitor<XMLCh> janTmpName(tmpStrValue, manager);
XMLString::trim(tmpStrValue);
if (HexBin::getDataLength(tmpStrValue) == -1) {
isValid = false;
}
}
break;
case XSValue::dt_base64Binary:
if (Base64::getDataLength(content, manager) == -1) {
isValid = false;
}
break;
case XSValue::dt_anyURI:
if (XMLUri::isValidURI(true, content, true) == false) {
isValid = false;
}
break;
case XSValue::dt_QName:
{
XMLCh* tmpStrValue = XMLString::replicate(content, manager);
ArrayJanitor<XMLCh> janTmpName(tmpStrValue, manager);
XMLString::trim(tmpStrValue);
isValid = (version == ver_10) ?
XMLChar1_0::isValidQName(tmpStrValue, XMLString::stringLen(tmpStrValue)) :
XMLChar1_1::isValidQName(tmpStrValue, XMLString::stringLen(tmpStrValue));
}
break;
case XSValue::dt_NOTATION:
{
XMLCh* tmpStrValue = XMLString::replicate(content, manager);
ArrayJanitor<XMLCh> janTmpName(tmpStrValue, manager);
XMLString::trim(tmpStrValue);
if ( XMLString::isValidNOTATION(tmpStrValue, manager) == false) {
isValid = false;
}
}
break;
case XSValue::dt_string:
{
const XMLCh* rawPtr = content;
if (version == ver_10) {
while (*rawPtr)
if (!XMLChar1_0::isXMLChar(*rawPtr++)) {
isValid = false;
break;
}
}
else {
while (*rawPtr)
if (!XMLChar1_1::isXMLChar(*rawPtr++)) {
isValid = false;
break;
}
}
break;
}
case XSValue::dt_normalizedString:
{
const XMLCh* rawPtr = content;
if (version == ver_10) {
while (*rawPtr) {
if (!XMLChar1_0::isXMLChar(*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)) {
isValid = false;
break;
}
else if (*rawPtr == chCR || *rawPtr == chLF || *rawPtr == chHTab) {
isValid = false;
break;
}
else {
rawPtr++;
}
}
}
break;
}
case XSValue::dt_token:
case XSValue::dt_language:
{
XMLSize_t strLen = XMLString::stringLen(content);
const XMLCh* rawPtr = content;
bool inWS = false;
if (version == ver_10) {
// Check leading/Trailing white space
if (XMLChar1_0::isWhitespace(content[0]) ||
XMLChar1_0::isWhitespace(content[strLen - 1]) ) {
isValid = false;
}
else {
while (*rawPtr) {
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 = false;
}
rawPtr++;
}
}
}
else {
// Check leading/Trailing white space
if (XMLChar1_1::isWhitespace(content[0]) ||
XMLChar1_1::isWhitespace(content[strLen - 1]) ) {
isValid = false;
}
else {
while (*rawPtr) {
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 = false;
}
rawPtr++;
}
}
}
if (isValid == true && datatype == XSValue::dt_language) {
if (!sXSValueRegEx) {
status = st_CantCreateRegEx;
isValid = false;
}
else
{
if (sXSValueRegEx->matches(content, manager) == false)
{
isValid = false;
}
}
}
break;
}
case XSValue::dt_NMTOKEN:
isValid = (version == ver_10) ?
XMLChar1_0::isValidNmtoken(content, XMLString::stringLen(content)) :
XMLChar1_1::isValidNmtoken(content, XMLString::stringLen(content));
break;
case XSValue::dt_NMTOKENS:
// [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)*
{
XMLStringTokenizer tokenizer(content, Separator_20, manager);
if (version == ver_10) {
while (tokenizer.hasMoreTokens()) {
const XMLCh* token = tokenizer.nextToken();
if (!XMLChar1_0::isValidNmtoken(token, XMLString::stringLen(token))) {
isValid = false;
break;
}
}
}
else {
while (tokenizer.hasMoreTokens()) {
const XMLCh* token = tokenizer.nextToken();
if (!XMLChar1_1::isValidNmtoken(token, XMLString::stringLen(token))) {
isValid = false;
break;
}
}
}
break;
}
case XSValue::dt_Name:
isValid = (version == ver_10) ?
XMLChar1_0::isValidName(content) :
XMLChar1_1::isValidName(content);
break;
case XSValue::dt_NCName:
case XSValue::dt_ID:
case XSValue::dt_IDREF:
case XSValue::dt_ENTITY:
isValid = (version == ver_10) ?
XMLChar1_0::isValidNCName(content, XMLString::stringLen(content)) :
XMLChar1_1::isValidNCName(content, XMLString::stringLen(content));
break;
case XSValue::dt_ENTITIES:
case XSValue::dt_IDREFS:
{
XMLStringTokenizer tokenizer(content, Separator_ws, manager);
if (version == ver_10 ) {
while (tokenizer.hasMoreTokens()) {
const XMLCh* token = tokenizer.nextToken();
if (!XMLChar1_0::isValidNCName(token, XMLString::stringLen(token))) {
isValid = false;
break;
}
}
}
else {
while (tokenizer.hasMoreTokens()) {
const XMLCh* token = tokenizer.nextToken();
if (!XMLChar1_1::isValidNCName(token, XMLString::stringLen(token))) {
isValid = false;
break;
}
}
}
}
break;
default:
status = st_NotSupported;
isValid = false;
break;
}
if (isValid == false && status == st_Init) {
status = st_FOCA0002;
}
return isValid;
}