xmlstring.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 1,907 行 · 第 1/4 页

CPP
1,907
字号
int XMLString::compareNString(  const   XMLCh* const    str1                                , const XMLCh* const    str2                                , const unsigned int    maxChars){    const XMLCh* psz1 = str1;    const XMLCh* psz2 = str2;    unsigned int curCount = 0;    while (true)    {        // If an inequality, then return difference        if (*psz1 != *psz2)            return int(*psz1) - int(*psz2);        // If either ended, then both ended, so equal        if (!*psz1)            break;        // Move upwards to next chars        psz1++;        psz2++;        //        //  Bump the count of chars done. If it equals the max then we are        //  equal for the requested count, so break out and return equal.        //        curCount++;        if (curCount == maxChars)            break;    }    return 0;}int XMLString::compareNIString( const   XMLCh* const    str1                                , const XMLCh* const    str2                                , const unsigned int    maxChars){    // Refer this oneto the transcoding service    return XMLPlatformUtils::fgTransService->compareNIString(str1, str2, maxChars);}int XMLString::compareString(   const   XMLCh* const    str1                                , const XMLCh* const    str2){    const XMLCh* psz1 = str1;    const XMLCh* psz2 = str2;    if (psz1 == 0 || psz2 == 0) {        if (psz1 == 0) {            return 0 - XMLString::stringLen(psz2);        }		else if (psz2 == 0) {            return XMLString::stringLen(psz1);        }    }    while (true)    {        // If an inequality, then return the difference        if (*psz1 != *psz2)            return int(*psz1) - int(*psz2);        // If either has ended, then they both ended, so equal        if (!*psz1)            break;        // Move upwards for the next round        psz1++;        psz2++;    }    return 0;}bool XMLString::regionMatches(const   XMLCh* const	str1							  , const int			offset1							  , const XMLCh* const	str2							  , const int			offset2							  , const unsigned int	charCount){	if (!validateRegion(str1, offset1,str2, offset2, charCount))		return false;	if (compareNString(str1+offset1, str2+offset2, charCount) != 0)		return false;	return true;}bool XMLString::regionIMatches(const   XMLCh* const	str1						 	   , const int			offset1							   , const XMLCh* const	str2							   , const int			offset2							   , const unsigned int	charCount){	if (!validateRegion(str1, offset1,str2, offset2, charCount))		return false;	if (compareNIString(str1+offset1, str2+offset2, charCount) != 0)		return false;	return true;}void XMLString::copyString(XMLCh* const target, const XMLCh* const src){    if (!src)    {        *target = 0;        return;    }    XMLCh* pszOut = target;    const XMLCh* pszIn = src;    while (*pszIn)        *pszOut++ = *pszIn++;    // Capp off the target where we ended    *pszOut = 0;}bool XMLString::copyNString(        XMLCh* const    target                            , const XMLCh* const    src                            , const unsigned int    maxChars){    XMLCh* outPtr = target;    const XMLCh* srcPtr = src;    const XMLCh* endPtr = target + maxChars - 1;    while (*srcPtr && (outPtr <= endPtr))        *outPtr++ = *srcPtr++;    // Cap it off here    *outPtr = 0;    // Return whether we copied it all or hit the max    return (*srcPtr == 0);}unsigned int XMLString::hash(   const   XMLCh* const    tohash                                , const unsigned int    hashModulus                                , MemoryManager* const  manager){        if (!hashModulus)        ThrowXMLwithMemMgr(IllegalArgumentException, XMLExcepts::Pool_ZeroModulus, manager);    unsigned int hashVal = 0;    if (tohash) {        const XMLCh* curCh = tohash;        while (*curCh)        {            unsigned int top = hashVal >> 24;            hashVal += (hashVal * 37) + top + (unsigned int)(*curCh);            curCh++;        }    }    // Divide by modulus    return hashVal % hashModulus;}const XMLCh* XMLString::findAny(const   XMLCh* const    toSearch                                , const XMLCh* const    searchList){    const XMLCh* srcPtr = toSearch;    while (*srcPtr)    {        const XMLCh* listPtr = searchList;        const XMLCh  curCh = *srcPtr;        while (*listPtr)        {            if (curCh == *listPtr++)                return srcPtr;        }        srcPtr++;    }    return 0;}XMLCh* XMLString::findAny(          XMLCh* const    toSearch                            , const XMLCh* const    searchList){    XMLCh* srcPtr = toSearch;    while (*srcPtr)    {        const XMLCh* listPtr = searchList;        const XMLCh  curCh = *srcPtr;        while (*listPtr)        {            if (curCh == *listPtr++)                return srcPtr;        }        srcPtr++;    }    return 0;}int XMLString::patternMatch(  const XMLCh* const    toSearch                            , const XMLCh* const    pattern){    if (!toSearch || !*toSearch )        return -1;    const int patnLen = XMLString::stringLen(pattern);	if ( !patnLen )		return -1;    const XMLCh* srcPtr    = toSearch;    const XMLCh* patnStart = toSearch;    int  patnIndex = 0;    while (*srcPtr)    {        if ( !(*srcPtr++ == pattern[patnIndex]))        {            patnIndex = 0;            srcPtr = ++patnStart;        }        else        {            if (++patnIndex == patnLen)                // full pattern match found                return (srcPtr - patnLen - toSearch);        }    }    return -1;}unsigned int XMLString::hashN(  const   XMLCh* const    tohash                                , const unsigned int    n                                , const unsigned int    hashModulus                                , MemoryManager* const  manager){    if (!hashModulus)        ThrowXMLwithMemMgr(IllegalArgumentException, XMLExcepts::Pool_ZeroModulus, manager);    unsigned int hashVal = 0;    if (tohash) {        const XMLCh* curCh = tohash;        int i = n;        while (i--)        {            unsigned int top = hashVal >> 24;            hashVal += (hashVal * 37) + top + (unsigned int)(*curCh);            curCh++;        }    }    // Divide by modulus    return hashVal % hashModulus;}int XMLString::indexOf(const XMLCh* const toSearch, const XMLCh ch){    if (toSearch)    {        const XMLCh* srcPtr = toSearch;        while (*srcPtr)        {            if (ch == *srcPtr)                return (int)(srcPtr - toSearch);            srcPtr++;        }    }    return -1;}int XMLString::indexOf( const   XMLCh* const    toSearch                        , const XMLCh           ch                        , const unsigned int    fromIndex                        , MemoryManager* const  manager){    const int len = stringLen(toSearch);    // Make sure the start index is within the XMLString bounds	if ((int)fromIndex > len-1)        ThrowXMLwithMemMgr(ArrayIndexOutOfBoundsException, XMLExcepts::Str_StartIndexPastEnd, manager);    for (int i = (int)fromIndex; i < len; i++)    {        if (toSearch[i] == ch)            return i;    }    return -1;}int XMLString::lastIndexOf(const XMLCh ch,                           const XMLCh* const toSearch,                           const unsigned int toSearchLen){    for (int i = (int)toSearchLen-1; i >= 0; i--)    {        if (toSearch[i] == ch)            return i;    }    return -1;}int XMLString::lastIndexOf( const   XMLCh* const    toSearch                            , const XMLCh           ch                            , const unsigned int    fromIndex                            , MemoryManager* const  manager){    const int len = stringLen(toSearch);	if ((int)fromIndex > len-1)        ThrowXMLwithMemMgr(ArrayIndexOutOfBoundsException, XMLExcepts::Str_StartIndexPastEnd, manager);    for (int i = (int)fromIndex; i >= 0; i--)    {        if (toSearch[i] == ch)            return i;    }    return -1;}XMLCh*XMLString::makeUName(const XMLCh* const pszURI, const XMLCh* const pszName){    //    //  If there is a URI, then format out the full name in the {uri}name    //  form. Otherwise, just set it to the same thing as the base name.    //    XMLCh* pszRet = 0;    const unsigned int uriLen = stringLen(pszURI);    if (uriLen)    {        pszRet = new XMLCh[uriLen + stringLen(pszName) + 3];        XMLCh szTmp[2];        szTmp[1] = 0;        szTmp[0] = chOpenCurly;        copyString(pszRet, szTmp);        catString(pszRet, pszURI);        szTmp[0] = chCloseCurly;        catString(pszRet, szTmp);        catString(pszRet, pszName);    }     else    {        pszRet = replicate(pszName);    }    return pszRet;}bool XMLString::textToBin(const XMLCh* const toConvert, unsigned int& toFill                          , MemoryManager* const manager){    toFill = 0;    // If no string, then its a failure    if ((!toConvert) || (!*toConvert))        return false;	XMLCh* trimmedStr = XMLString::replicate(toConvert, manager);	ArrayJanitor<XMLCh> jan1(trimmedStr, manager);	XMLString::trim(trimmedStr);    unsigned int trimmedStrLen = XMLString::stringLen(trimmedStr);	if ( !trimmedStrLen )		return false;	// we don't allow '-' sign	if (XMLString::indexOf(trimmedStr, chDash, 0, manager) != -1)		return false;	//the errno set by previous run is NOT automatically cleared	errno = 0;	char *nptr = XMLString::transcode(trimmedStr, manager);    ArrayJanitor<char> jan2(nptr, manager);    char *endptr;	 //     // REVISIT: conversion of (unsigned long) to (unsigned int)	 //          may truncate value on IA64    toFill = (unsigned int) strtoul(nptr, &endptr, 10);	// check if all chars are valid char	// check if overflow/underflow occurs	if ( ( (endptr - nptr) != (int) trimmedStrLen) ||         (errno == ERANGE)                      )		return false;    return true;}int XMLString::parseInt(const XMLCh* const toConvert                     , MemoryManager* const manager){    // If no string, or empty string, then it is a failure    if ((!toConvert) || (!*toConvert))        ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_null_ptr, manager);	XMLCh* trimmedStr = XMLString::replicate(toConvert, manager);	ArrayJanitor<XMLCh> jan1(trimmedStr, manager);	XMLString::trim(trimmedStr);    unsigned int trimmedStrLen = XMLString::stringLen(trimmedStr);	if ( !trimmedStrLen )        ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_null_ptr, manager);	//the errno set by previous run is NOT automatically cleared	errno = 0;	char *nptr = XMLString::transcode(trimmedStr, manager);    ArrayJanitor<char> jan2(nptr, manager);    char *endptr;    long retVal = strtol(nptr, &endptr, 10);	// check if all chars are valid char	if ( (endptr - nptr) != (int) trimmedStrLen)		ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::XMLNUM_Inv_chars, manager);	// check if overflow/underflow occurs    if (errno == ERANGE)        ThrowXMLwithMemMgr(NumberFormatException, XMLExcepts::Str_ConvertOverflow, manager);	 //     // REVISIT: conversion of (long) to (int)	 //          may truncate value on IA64	return (int) retVal;}void XMLString::trim(XMLCh* const toTrim){    const unsigned int len = stringLen(toTrim);    unsigned int skip, scrape;    for (skip = 0; skip < len; skip++)    {        if (!XMLPlatformUtils::fgTransService->isSpace(toTrim[skip]))            break;    }    for (scrape = len; scrape > skip; scrape--)    {        if (!XMLPlatformUtils::fgTransService->isSpace(toTrim[scrape - 1]))            break;    }    // Cap off at the scrap point    if (scrape != len)        toTrim[scrape] = 0;    if (skip)    {        // Copy the chars down        unsigned int index = 0;        while (toTrim[skip])            toTrim[index++] = toTrim[skip++];        toTrim[index] = 0;    }}void XMLString::upperCase(XMLCh* const toUpperCase)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?