00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #if !defined(XMLSTRINGTOKENIZER_HPP)
00023 #define XMLSTRINGTOKENIZER_HPP
00024
00025 #include <xercesc/util/RefArrayVectorOf.hpp>
00026 #include <xercesc/util/XMLString.hpp>
00027
00028 XERCES_CPP_NAMESPACE_BEGIN
00029
00042 class XMLStringTokenizer :public XMemory
00043 {
00044 public:
00045
00046
00047
00050
00063 XMLStringTokenizer(const XMLCh* const srcStr,
00064 MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00065
00076 XMLStringTokenizer(const XMLCh* const srcStr
00077 , const XMLCh* const delim
00078 , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
00079
00081
00082
00083
00084
00087
00088 ~XMLStringTokenizer();
00089
00091
00092
00093
00094
00097
00104 bool hasMoreTokens();
00105
00114 int countTokens();
00115
00122 XMLCh* nextToken();
00123
00125
00126 private:
00127
00128
00129
00130 XMLStringTokenizer(const XMLStringTokenizer&);
00131 XMLStringTokenizer& operator=(const XMLStringTokenizer&);
00132
00133
00134
00135
00136 void cleanUp();
00137
00138
00139
00140
00141 bool isDelimeter(const XMLCh ch);
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 int fOffset;
00162 int fStringLen;
00163 XMLCh* fString;
00164 const XMLCh* fDelimeters;
00165 RefArrayVectorOf<XMLCh>* fTokens;
00166 MemoryManager* fMemoryManager;
00167 };
00168
00169
00170
00171
00172 inline bool XMLStringTokenizer::isDelimeter(const XMLCh ch) {
00173
00174 return XMLString::indexOf(fDelimeters, ch) == -1 ? false : true;
00175 }
00176
00177
00178
00179
00180
00181 inline int XMLStringTokenizer::countTokens() {
00182
00183 if (fStringLen == 0)
00184 return 0;
00185
00186 int tokCount = 0;
00187 bool inToken = false;
00188
00189 for (int i= fOffset; i< fStringLen; i++) {
00190
00191 if (isDelimeter(fString[i])) {
00192
00193 if (inToken) {
00194 inToken = false;
00195 }
00196
00197 continue;
00198 }
00199
00200 if (!inToken) {
00201
00202 tokCount++;
00203 inToken = true;
00204 }
00205
00206 }
00207
00208 return tokCount;
00209 }
00210
00211 XERCES_CPP_NAMESPACE_END
00212
00213 #endif
00214