?? xmlstring.cpp
字號:
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 + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -