00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #if !defined(XERCESC_INCLUDE_GUARD_XMLSTRING_HPP)
00023 #define XERCESC_INCLUDE_GUARD_XMLSTRING_HPP
00024
00025 #include <xercesc/util/BaseRefVectorOf.hpp>
00026 #include <xercesc/framework/XMLBuffer.hpp>
00027 #include <xercesc/framework/MemoryManager.hpp>
00028 #include <string.h>
00029 #include <assert.h>
00030
00031 XERCES_CPP_NAMESPACE_BEGIN
00032
00033 class XMLLCPTranscoder;
00045 class XMLUTIL_EXPORT XMLString
00046 {
00047 public:
00048
00049
00050
00067 static void catString
00068 (
00069 char* const target
00070 , const char* const src
00071 );
00072
00085 static void catString
00086 (
00087 XMLCh* const target
00088 , const XMLCh* const src
00089 );
00091
00105 static int compareIString
00106 (
00107 const char* const str1
00108 , const char* const str2
00109 );
00110
00121 static int compareIString
00122 (
00123 const XMLCh* const str1
00124 , const XMLCh* const str2
00125 );
00126
00138 static int compareIStringASCII
00139 (
00140 const XMLCh* const str1
00141 , const XMLCh* const str2
00142 );
00143
00144
00145
00159 static int compareNString
00160 (
00161 const char* const str1
00162 , const char* const str2
00163 , const XMLSize_t count
00164 );
00165
00179 static int compareNString
00180 (
00181 const XMLCh* const str1
00182 , const XMLCh* const str2
00183 , const XMLSize_t count
00184 );
00185
00186
00200 static int compareNIString
00201 (
00202 const char* const str1
00203 , const char* const str2
00204 , const XMLSize_t count
00205 );
00206
00221 static int compareNIString
00222 (
00223 const XMLCh* const str1
00224 , const XMLCh* const str2
00225 , const XMLSize_t count
00226 );
00227
00240 static int compareString
00241 (
00242 const char* const str1
00243 , const char* const str2
00244 );
00245
00257 static int compareString
00258 (
00259 const XMLCh* const str1
00260 , const XMLCh* const str2
00261 );
00262
00271 static bool equals
00272 (
00273 const XMLCh* str1
00274 , const XMLCh* str2
00275 );
00276
00286 static bool equalsN
00287 (
00288 const XMLCh* str1
00289 , const XMLCh* str2
00290 , XMLSize_t n
00291 );
00292
00293 static bool equals
00294 (
00295 const char* str1
00296 , const char* str2
00297 );
00298
00308 static bool equalsN
00309 (
00310 const char* str1
00311 , const char* str2
00312 , XMLSize_t n
00313 );
00314
00341 static bool regionMatches
00342 (
00343 const XMLCh* const str1
00344 , const int offset1
00345 , const XMLCh* const str2
00346 , const int offset2
00347 , const XMLSize_t charCount
00348 );
00349
00377 static bool regionIMatches
00378 (
00379 const XMLCh* const str1
00380 , const int offset1
00381 , const XMLCh* const str2
00382 , const int offset2
00383 , const XMLSize_t charCount
00384 );
00386
00399 static void copyString
00400 (
00401 char* const target
00402 , const char* const src
00403 );
00404
00415 static void copyString
00416 (
00417 XMLCh* const target
00418 , const XMLCh* const src
00419 );
00420
00433 static bool copyNString
00434 (
00435 XMLCh* const target
00436 , const XMLCh* const src
00437 , const XMLSize_t maxChars
00438 );
00440
00449 static XMLSize_t hash
00450 (
00451 const char* const toHash
00452 , const XMLSize_t hashModulus
00453 );
00454
00461 static XMLSize_t hash
00462 (
00463 const XMLCh* const toHash
00464 , const XMLSize_t hashModulus
00465 );
00466
00475 static XMLSize_t hashN
00476 (
00477 const XMLCh* const toHash
00478 , const XMLSize_t numChars
00479 , const XMLSize_t hashModulus
00480 );
00481
00483
00494 static int indexOf(const char* const toSearch, const char ch);
00495
00504 static int indexOf(const XMLCh* const toSearch, const XMLCh ch);
00505
00517 static int indexOf
00518 (
00519 const char* const toSearch
00520 , const char chToFind
00521 , const XMLSize_t fromIndex
00522 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00523 );
00524
00536 static int indexOf
00537 (
00538 const XMLCh* const toSearch
00539 , const XMLCh chToFind
00540 , const XMLSize_t fromIndex
00541 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00542 );
00543
00552 static int lastIndexOf(const char* const toSearch, const char ch);
00553
00562 static int lastIndexOf(const XMLCh* const toSearch, const XMLCh ch);
00563
00573 static int lastIndexOf
00574 (
00575 const XMLCh ch
00576 , const XMLCh* const toSearch
00577 , const XMLSize_t toSearchLen
00578 );
00579
00591 static int lastIndexOf
00592 (
00593 const char* const toSearch
00594 , const char chToFind
00595 , const XMLSize_t fromIndex
00596 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00597 );
00598
00610 static int lastIndexOf
00611 (
00612 const XMLCh* const toSearch
00613 , const XMLCh ch
00614 , const XMLSize_t fromIndex
00615 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00616 );
00618
00626 static void moveChars
00627 (
00628 XMLCh* const targetStr
00629 , const XMLCh* const srcStr
00630 , const XMLSize_t count
00631 );
00632
00634
00646 static void subString
00647 (
00648 char* const targetStr
00649 , const char* const srcStr
00650 , const XMLSize_t startIndex
00651 , const XMLSize_t endIndex
00652 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00653 );
00654
00664 static void subString
00665 (
00666 XMLCh* const targetStr
00667 , const XMLCh* const srcStr
00668 , const XMLSize_t startIndex
00669 , const XMLSize_t endIndex
00670 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00671 );
00672
00683 static void subString
00684 (
00685 XMLCh* const targetStr
00686 , const XMLCh* const srcStr
00687 , const XMLSize_t startIndex
00688 , const XMLSize_t endIndex
00689 , const XMLSize_t srcStrLength
00690 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00691 );
00692
00694
00707 static char* replicate(const char* const toRep,
00708 MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00709
00720 static XMLCh* replicate(const XMLCh* const toRep,
00721 MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00722
00724
00733 static bool startsWith
00734 (
00735 const char* const toTest
00736 , const char* const prefix
00737 );
00738
00745 static bool startsWith
00746 (
00747 const XMLCh* const toTest
00748 , const XMLCh* const prefix
00749 );
00750
00759 static bool startsWithI
00760 (
00761 const char* const toTest
00762 , const char* const prefix
00763 );
00764
00774 static bool startsWithI
00775 (
00776 const XMLCh* const toTest
00777 , const XMLCh* const prefix
00778 );
00779
00786 static bool endsWith
00787 (
00788 const XMLCh* const toTest
00789 , const XMLCh* const suffix
00790 );
00791
00792
00801 static const XMLCh* findAny
00802 (
00803 const XMLCh* const toSearch
00804 , const XMLCh* const searchList
00805 );
00806
00815 static XMLCh* findAny
00816 (
00817 XMLCh* const toSearch
00818 , const XMLCh* const searchList
00819 );
00820
00827 static int patternMatch
00828 (
00829 const XMLCh* const toSearch
00830 , const XMLCh* const pattern
00831 );
00832
00837 static XMLSize_t stringLen(const char* const src);
00838
00843 static XMLSize_t stringLen(const XMLCh* const src);
00844
00852 static bool isValidNOTATION(const XMLCh* const name
00853 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00854
00860 static bool isValidEncName(const XMLCh* const name);
00861
00868 static bool isAlpha(XMLCh const theChar);
00869
00875 static bool isDigit(XMLCh const theChar);
00876
00882 static bool isAlphaNum(XMLCh const theChar);
00883
00889 static bool isHex(XMLCh const theChar);
00890
00896 static bool isInList(const XMLCh* const toFind, const XMLCh* const enumList);
00897
00899
00902
00914 static void sizeToText
00915 (
00916 const XMLSize_t toFormat
00917 , char* const toFill
00918 , const XMLSize_t maxChars
00919 , const unsigned int radix
00920 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00921 );
00922
00934 static void sizeToText
00935 (
00936 const XMLSize_t toFormat
00937 , XMLCh* const toFill
00938 , const XMLSize_t maxChars
00939 , const unsigned int radix
00940 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00941 );
00942
00954 static void binToText
00955 (
00956 const unsigned int toFormat
00957 , char* const toFill
00958 , const XMLSize_t maxChars
00959 , const unsigned int radix
00960 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00961 );
00962
00974 static void binToText
00975 (
00976 const unsigned int toFormat
00977 , XMLCh* const toFill
00978 , const XMLSize_t maxChars
00979 , const unsigned int radix
00980 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
00981 );
00982
00994 static void binToText
00995 (
00996 const unsigned long toFormat
00997 , char* const toFill
00998 , const XMLSize_t maxChars
00999 , const unsigned int radix
01000 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01001 );
01002
01014 static void binToText
01015 (
01016 const unsigned long toFormat
01017 , XMLCh* const toFill
01018 , const XMLSize_t maxChars
01019 , const unsigned int radix
01020 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01021 );
01022
01023 #if XERCES_SIZEOF_INT != 8 && XERCES_SIZEOF_LONG != 8 && XERCES_SIZEOF_INT64 != 4
01024
01035 static void binToText
01036 (
01037 const XMLUInt64 toFormat
01038 , char* const toFill
01039 , const XMLSize_t maxChars
01040 , const unsigned int radix
01041 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01042 );
01043
01055 static void binToText
01056 (
01057 const XMLUInt64 toFormat
01058 , XMLCh* const toFill
01059 , const XMLSize_t maxChars
01060 , const unsigned int radix
01061 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01062 );
01063 #endif // XERCES_SIZEOF_INT != 8 && XERCES_SIZEOF_LONG != 8 && XERCES_SIZEOF_INT64 != 4
01064
01076 static void binToText
01077 (
01078 const int toFormat
01079 , char* const toFill
01080 , const XMLSize_t maxChars
01081 , const unsigned int radix
01082 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01083 );
01084
01096 static void binToText
01097 (
01098 const int toFormat
01099 , XMLCh* const toFill
01100 , const XMLSize_t maxChars
01101 , const unsigned int radix
01102 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01103 );
01104
01116 static void binToText
01117 (
01118 const long toFormat
01119 , char* const toFill
01120 , const XMLSize_t maxChars
01121 , const unsigned int radix
01122 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01123 );
01124
01136 static void binToText
01137 (
01138 const long toFormat
01139 , XMLCh* const toFill
01140 , const XMLSize_t maxChars
01141 , const unsigned int radix
01142 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01143 );
01144
01145 #if XERCES_SIZEOF_INT != 8 && XERCES_SIZEOF_LONG != 8 && XERCES_SIZEOF_INT64 != 4
01146
01157 static void binToText
01158 (
01159 const XMLInt64 toFormat
01160 , char* const toFill
01161 , const XMLSize_t maxChars
01162 , const unsigned int radix
01163 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01164 );
01165
01177 static void binToText
01178 (
01179 const XMLInt64 toFormat
01180 , XMLCh* const toFill
01181 , const XMLSize_t maxChars
01182 , const unsigned int radix
01183 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01184 );
01185 #endif // XERCES_SIZEOF_INT != 8 && XERCES_SIZEOF_LONG != 8 && XERCES_SIZEOF_INT64 != 4
01186
01198 static bool textToBin
01199 (
01200 const XMLCh* const toConvert
01201 , unsigned int& toFill
01202 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01203 );
01204
01218 static int parseInt
01219 (
01220 const XMLCh* const toConvert
01221 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01222 );
01223
01229 static void cut
01230 (
01231 XMLCh* const toCutFrom
01232 , const XMLSize_t count
01233 );
01234
01246 static char* transcode
01247 (
01248 const XMLCh* const toTranscode
01249 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01250 );
01251
01267 static bool transcode
01268 (
01269 const XMLCh* const toTranscode
01270 , char* const toFill
01271 , const XMLSize_t maxChars
01272 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01273 );
01274
01286 static XMLCh* transcode
01287 (
01288 const char* const toTranscode
01289 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01290 );
01291
01302 static bool transcode
01303 (
01304 const char* const toTranscode
01305 , XMLCh* const toFill
01306 , const XMLSize_t maxChars
01307 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01308 );
01309
01315 static void trim(char* const toTrim);
01316
01322 static void trim(XMLCh* const toTrim);
01323
01331 static BaseRefVectorOf<XMLCh>* tokenizeString(const XMLCh* const tokenizeSrc
01332 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
01333
01335
01346 static XMLCh* makeUName
01347 (
01348 const XMLCh* const pszURI
01349 , const XMLCh* const pszName
01350 );
01351
01368 static XMLSize_t replaceTokens
01369 (
01370 XMLCh* const errText
01371 , const XMLSize_t maxChars
01372 , const XMLCh* const text1
01373 , const XMLCh* const text2
01374 , const XMLCh* const text3
01375 , const XMLCh* const text4
01376 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01377 );
01378
01383 static void upperCase(XMLCh* const toUpperCase);
01384
01390 static void upperCaseASCII(XMLCh* const toUpperCase);
01391
01396 static void lowerCase(XMLCh* const toLowerCase);
01397
01403 static void lowerCaseASCII(XMLCh* const toLowerCase);
01404
01408 static bool isWSReplaced(const XMLCh* const toCheck);
01409
01413 static bool isWSCollapsed(const XMLCh* const toCheck);
01414
01420 static void replaceWS(XMLCh* const toConvert
01421 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
01422
01428 static void collapseWS(XMLCh* const toConvert
01429 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
01430
01436 static void removeWS(XMLCh* const toConvert
01437 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
01438
01439
01445 static void removeChar(const XMLCh* const srcString
01446 , const XMLCh& toRemove
01447 , XMLBuffer& dstBuffer);
01448
01456 static void fixURI(const XMLCh* const str, XMLCh* const target);
01457
01459
01468 static void release
01469 (
01470 char** buf
01471 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01472 );
01473
01481 static void release
01482 (
01483 XMLCh** buf
01484 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
01485 );
01487
01488
01489 private :
01490
01494 XMLString();
01496 ~XMLString();
01498
01499
01503 static void initString(XMLLCPTranscoder* const defToUse,
01504 MemoryManager* const manager);
01505 static void termString();
01507
01512 static bool validateRegion(const XMLCh* const str1, const int offset1,
01513 const XMLCh* const str2, const int offset2,
01514 const XMLSize_t charCount);
01515
01516 static MemoryManager* fgMemoryManager;
01517
01518 friend class XMLPlatformUtils;
01519 };
01520
01521
01522
01523
01524
01525
01526 inline void XMLString::moveChars( XMLCh* const targetStr
01527 , const XMLCh* const srcStr
01528 , const XMLSize_t count)
01529 {
01530 memcpy(targetStr, srcStr, count * sizeof(XMLCh));
01531 }
01532
01533 inline XMLSize_t XMLString::stringLen(const XMLCh* const src)
01534 {
01535 if (src == 0 || *src == 0)
01536 {
01537 return 0;
01538 }
01539 else
01540 {
01541 const XMLCh* pszTmp = src + 1;
01542
01543 while (*pszTmp)
01544 ++pszTmp;
01545
01546 return (pszTmp - src);
01547 }
01548 }
01549
01550 inline XMLCh* XMLString::replicate(const XMLCh* const toRep,
01551 MemoryManager* const manager)
01552 {
01553
01554 XMLCh* ret = 0;
01555 if (toRep)
01556 {
01557 const XMLSize_t len = stringLen(toRep);
01558 ret = (XMLCh*) manager->allocate((len+1) * sizeof(XMLCh));
01559 memcpy(ret, toRep, (len + 1) * sizeof(XMLCh));
01560 }
01561 return ret;
01562 }
01563
01564 inline bool XMLString::startsWith( const XMLCh* const toTest
01565 , const XMLCh* const prefix)
01566 {
01567 return (compareNString(toTest, prefix, stringLen(prefix)) == 0);
01568 }
01569
01570 inline bool XMLString::startsWithI( const XMLCh* const toTest
01571 , const XMLCh* const prefix)
01572 {
01573 return (compareNIString(toTest, prefix, stringLen(prefix)) == 0);
01574 }
01575
01576 inline bool XMLString::endsWith(const XMLCh* const toTest,
01577 const XMLCh* const suffix)
01578 {
01579
01580 XMLSize_t suffixLen = XMLString::stringLen(suffix);
01581
01582 return regionMatches(toTest, (int)(XMLString::stringLen(toTest) - suffixLen),
01583 suffix, 0, suffixLen);
01584 }
01585
01586 inline bool XMLString::validateRegion(const XMLCh* const str1,
01587 const int offset1,
01588 const XMLCh* const str2,
01589 const int offset2,
01590 const XMLSize_t charCount)
01591 {
01592
01593 if (offset1 < 0 || offset2 < 0 ||
01594 (offset1 + charCount) > XMLString::stringLen(str1) ||
01595 (offset2 + charCount) > XMLString::stringLen(str2) )
01596 return false;
01597
01598 return true;
01599 }
01600
01601 inline bool XMLString::equals( const XMLCh* str1
01602 , const XMLCh* str2)
01603 {
01604 if (str1 == str2)
01605 return true;
01606
01607 if (str1 == 0 || str2 == 0)
01608 return ((!str1 || !*str1) && (!str2 || !*str2));
01609
01610 while (*str1)
01611 if(*str1++ != *str2++)
01612 return false;
01613
01614
01615 return (*str2==0);
01616 }
01617
01618 inline bool XMLString::equalsN(const XMLCh* str1,
01619 const XMLCh* str2,
01620 XMLSize_t n)
01621 {
01622 if (str1 == str2 || n == 0)
01623 return true;
01624
01625 if (str1 == 0 || str2 == 0)
01626 return ((!str1 || !*str1) && (!str2 || !*str2));
01627
01628 for (; n != 0 && *str1 && *str2; --n, ++str1, ++str2)
01629 if(*str1 != *str2)
01630 break;
01631
01632 return n == 0 || *str1 == *str2;
01633 }
01634
01635 inline bool XMLString::equals( const char* str1
01636 , const char* str2)
01637 {
01638 if (str1 == str2)
01639 return true;
01640
01641 if (str1 == 0 || str2 == 0)
01642 return ((!str1 || !*str1) && (!str2 || !*str2));
01643
01644 while (*str1)
01645 if(*str1++ != *str2++)
01646 return false;
01647
01648
01649 return (*str2==0);
01650 }
01651
01652 inline bool XMLString::equalsN(const char* str1,
01653 const char* str2,
01654 XMLSize_t n)
01655 {
01656 if (str1 == str2 || n == 0)
01657 return true;
01658
01659 if (str1 == 0 || str2 == 0)
01660 return ((!str1 || !*str1) && (!str2 || !*str2));
01661
01662 for (; n != 0 && *str1 && *str2; --n, ++str1, ++str2)
01663 if(*str1 != *str2)
01664 break;
01665
01666 return n == 0 || *str1 == *str2;
01667 }
01668
01669 inline int XMLString::lastIndexOf(const XMLCh* const toSearch, const XMLCh ch)
01670 {
01671 return XMLString::lastIndexOf(ch, toSearch, stringLen(toSearch));
01672 }
01673
01674 inline XMLSize_t XMLString::hash(const XMLCh* const tohash
01675 , const XMLSize_t hashModulus)
01676 {
01677 if (tohash == 0 || *tohash == 0)
01678 return 0;
01679
01680 const XMLCh* curCh = tohash;
01681 XMLSize_t hashVal = (XMLSize_t)(*curCh++);
01682
01683 while (*curCh)
01684 hashVal = (hashVal * 38) + (hashVal >> 24) + (XMLSize_t)(*curCh++);
01685
01686
01687 return hashVal % hashModulus;
01688 }
01689
01690 inline XMLSize_t XMLString::hashN(const XMLCh* const tohash
01691 , const XMLSize_t n
01692 , const XMLSize_t hashModulus)
01693 {
01694 if (tohash == 0 || n == 0)
01695 return 0;
01696
01697 const XMLCh* curCh = tohash;
01698 XMLSize_t hashVal = (XMLSize_t)(*curCh++);
01699
01700 for(XMLSize_t i=0;i<n;i++)
01701 hashVal = (hashVal * 38) + (hashVal >> 24) + (XMLSize_t)(*curCh++);
01702
01703
01704 return hashVal % hashModulus;
01705 }
01706
01707 XERCES_CPP_NAMESPACE_END
01708
01709 #endif