bool XSValue::validateStrings()

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;
}