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