UCommon
tokenizer.h
Go to the documentation of this file.
1// Copyright (C) 1999-2005 Open Source Telecom Corporation.
2// Copyright (C) 2006-2014 David Sugar, Tycho Softworks.
3// Copyright (C) 2015 Cherokees of Idaho.
4//
5// This program is free software; you can redistribute it and/or modify
6// it under the terms of the GNU General Public License as published by
7// the Free Software Foundation; either version 2 of the License, or
8// (at your option) any later version.
9//
10// This program is distributed in the hope that it will be useful,
11// but WITHOUT ANY WARRANTY; without even the implied warranty of
12// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13// GNU General Public License for more details.
14//
15// You should have received a copy of the GNU Lesser General Public License
16// along this program. If not, see <http://www.gnu.org/licenses/>.
17//
18// As a special exception, you may use this file as part of a free software
19// library without restriction. Specifically, if other files instantiate
20// templates or use macros or inline functions from this file, or you compile
21// this file and link it with other files to produce an executable, this
22// file does not by itself cause the resulting executable to be covered by
23// the GNU General Public License. This exception does not however
24// invalidate any other reasons why the executable file might be covered by
25// the GNU General Public License.
26//
27// This exception applies only to the code released under the name GNU
28// Common C++. If you copy code from other releases into a copy of GNU
29// Common C++, as the General Public License permits, the exception does
30// not apply to the code that you add in this way. To avoid misleading
31// anyone as to the status of such modified files, you must delete
32// this exception notice from them.
33//
34// If you write modifications of your own for GNU Common C++, it is your choice
35// whether to permit this exception to apply to your modifications.
36// If you do not wish that, delete this exception notice.
37//
38
43
44#ifndef COMMONCPP_TOKENIZER_H_
45#define COMMONCPP_TOKENIZER_H_
46
47#ifndef COMMONCPP_CONFIG_H_
48#include <commoncpp/config.h>
49#endif
50
51#ifndef COMMONCPP_THREAD_H_
52#include <commoncpp/thread.h>
53#endif
54
55#ifndef COMMMONCPP_EXCEPTION_H_
56#include <commoncpp/exception.h>
57#endif
58
59namespace ost {
60
104class __EXPORT StringTokenizer {
105public:
111 static const char * const SPACE;
112
122 // maybe move more global ?
124
129 class __EXPORT iterator {
130 friend class StringTokenizer; // access our private constructors
131 private:
132 const StringTokenizer *myTok; // my StringTokenizer
133 const char *start; // start of current token
134 const char *tokEnd; // end of current token (->nxDelimiter)
135 const char *endp; // one before next token
136 char *token; // allocated token, if requested
137
138 // for initialization of the itEnd iterator
139 iterator(const StringTokenizer &tok, const char *end)
140 : myTok(&tok),tokEnd(0),endp(end),token(0) {}
141
142 iterator(const StringTokenizer &tok)
143 : myTok(&tok),tokEnd(0),endp(myTok->str-1),token(0) {
144 ++(*this); // init first token.
145 }
146
147 public:
148 iterator() : myTok(0),start(0),tokEnd(0),endp(0),token(0) {}
149
150 // see also: comment in implementation of operator++
151 virtual ~iterator()
152 { if (token) *token='\0'; delete [] token; }
153
157 // everything, but not responsible for the allocated token.
158 iterator(const iterator& i) :
159 myTok(i.myTok),start(i.start),tokEnd(i.tokEnd),
160 endp(i.endp),token(0) {}
161
165 // everything, but not responsible for the allocated token.
166 iterator &operator=(const iterator &i) {
167 myTok = i.myTok;
168 start = i.start; endp = i.endp; tokEnd = i.tokEnd;
169 if ( token )
170 delete [] token;
171 token = 0;
172 return *this;
173 }
174
178 iterator &operator++() THROWS (NoSuchElementException);
179
188 const char* operator*() THROWS (NoSuchElementException);
189
196 inline char nextDelimiter() const
197 {return (tokEnd) ? *tokEnd : '\0';}
198
203 // only compare the end-position. speed.
204 inline bool operator == (const iterator &other) const
205 {return (endp == other.endp);}
206
211 // only compare the end position. speed.
212 inline bool operator != (const iterator &other) const
213 {return (endp != other.endp);}
214 };
215private:
216 friend class StringTokenizer::iterator;
217 const char *str;
218 const char *delim;
219 bool skipAll, trim;
220 iterator itEnd;
221
222public:
261 StringTokenizer (const char *str,
262 const char *delim,
263 bool skipAllDelim = false,
264 bool trim = false);
265
275 StringTokenizer (const char *s);
276
281 {return iterator(*this);}
282
287 void setDelimiters (const char *d)
288 {delim = d;}
289
294 iterator begin(const char *d) {
295 delim = d;
296 return iterator(*this);
297 }
298
302 const iterator& end() const
303 {return itEnd;}
304};
305
306} // namespace ost
307
308#endif
309
GNU Common C++ exception model base classes.
void setDelimiters(const char *d)
changes the set of delimiters used in subsequent iterations.
Definition tokenizer.h:287
static const char *const SPACE
a delimiter string containing all usual whitespace delimiters.
Definition tokenizer.h:111
iterator begin() const
returns the begin iterator
Definition tokenizer.h:280
StringTokenizer(const char *str, const char *delim, bool skipAllDelim=false, bool trim=false)
creates a new StringTokenizer for a string and a given set of delimiters.
const iterator & end() const
the iterator marking the end.
Definition tokenizer.h:302
StringTokenizer(const char *s)
create a new StringTokenizer which splits the input string at whitespaces.
iterator begin(const char *d)
returns a begin iterator with an alternate set of delimiters.
Definition tokenizer.h:294
Exception thrown, if someone tried to read beyond the end of the tokens.
Definition tokenizer.h:123
The input forward iterator for tokens.
Definition tokenizer.h:129
iterator(const iterator &i)
copy constructor.
Definition tokenizer.h:158
iterator & operator++()
shifts this iterator to the next token in the string.
char nextDelimiter() const
returns the next delimiter after the current token or '\0', if there are no following delimiters.
Definition tokenizer.h:196
iterator & operator=(const iterator &i)
assignment operator.
Definition tokenizer.h:166
Common C++ thread class and sychronization objects.