00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00043 #ifndef COMMONCPP_TOKENIZER_H_
00044 #define COMMONCPP_TOKENIZER_H_
00045
00046 #ifndef COMMONCPP_CONFIG_H_
00047 #include <commoncpp/config.h>
00048 #endif
00049
00050 #ifndef COMMONCPP_THREAD_H_
00051 #include <commoncpp/thread.h>
00052 #endif
00053
00054 #ifndef COMMMONCPP_EXCEPTION_H_
00055 #include <commoncpp/exception.h>
00056 #endif
00057
00058 NAMESPACE_COMMONCPP
00059
00103 class __EXPORT StringTokenizer {
00104 public:
00110 static const char * const SPACE;
00111
00121
00122 class NoSuchElementException { };
00123
00128 class __EXPORT iterator {
00129 friend class StringTokenizer;
00130 private:
00131 const StringTokenizer *myTok;
00132 const char *start;
00133 const char *tokEnd;
00134 const char *endp;
00135 char *token;
00136
00137
00138 iterator(const StringTokenizer &tok, const char *end)
00139 : myTok(&tok),tokEnd(0),endp(end),token(0) {}
00140
00141 iterator(const StringTokenizer &tok)
00142 : myTok(&tok),tokEnd(0),endp(myTok->str-1),token(0) {
00143 ++(*this);
00144 }
00145
00146 public:
00147 iterator() : myTok(0),start(0),tokEnd(0),endp(0),token(0) {}
00148
00149
00150 virtual ~iterator()
00151 { if (token) *token='\0'; delete [] token; }
00152
00156
00157 iterator(const iterator& i) :
00158 myTok(i.myTok),start(i.start),tokEnd(i.tokEnd),
00159 endp(i.endp),token(0) {}
00160
00164
00165 iterator &operator = (const iterator &i)
00166 {
00167 myTok = i.myTok;
00168 start = i.start; endp = i.endp; tokEnd = i.tokEnd;
00169 if ( token )
00170 delete [] token;
00171 token = 0;
00172 return *this;
00173 }
00174
00178 iterator &operator ++ () THROWS (NoSuchElementException);
00179
00188 const char* operator * () THROWS (NoSuchElementException);
00189
00196 inline char nextDelimiter() const
00197 {return (tokEnd) ? *tokEnd : '\0';}
00198
00203
00204 inline bool operator == (const iterator &other) const
00205 {return (endp == other.endp);}
00206
00211
00212 inline bool operator != (const iterator &other) const
00213 {return (endp != other.endp);}
00214 };
00215 private:
00216 friend class StringTokenizer::iterator;
00217 const char *str;
00218 const char *delim;
00219 bool skipAll, trim;
00220 iterator itEnd;
00221
00222 public:
00261 StringTokenizer (const char *str,
00262 const char *delim,
00263 bool skipAllDelim = false,
00264 bool trim = false);
00265
00275 StringTokenizer (const char *s);
00276
00280 iterator begin() const
00281 {return iterator(*this);}
00282
00287 void setDelimiters (const char *d)
00288 {delim = d;}
00289
00294 iterator begin(const char *d)
00295 {
00296 delim = d;
00297 return iterator(*this);
00298 }
00299
00303 const iterator& end() const
00304 {return itEnd;}
00305 };
00306
00307 END_NAMESPACE
00308
00309 #endif
00310