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