3 * (c) 2008-2009 Technische Universität Dresden
4 * This file is part of TUD:OS and distributed under the terms of the
5 * GNU General Public License 2.
6 * Please see the COPYING-GPL-2 file for details.
8 * As a special exception, you may use this file as part of a free software
9 * library without restriction. Specifically, if other files instantiate
10 * templates or use macros or inline functions from this file, or you compile
11 * this file and link it with other files to produce an executable, this
12 * file does not by itself cause the resulting executable to be covered by
13 * the GNU General Public License. This exception does not however
14 * invalidate any other reasons why the executable file might be covered by
15 * the GNU General Public License.
20 #include <l4/cxx/minmax>
21 #include <l4/cxx/basic_ostream>
27 * This class is used to group characters of a string which belong
28 * to one syntactical token types number, identifier, string,
29 * whitespace or another single character.
35 typedef char const *Index;
37 String(char const *s) throw() : _start(s), _len(__builtin_strlen(s)) {}
38 String(char const *s, unsigned long len) throw() : _start(s), _len(len) {}
39 String(char const *s, char const *e) throw() : _start(s), _len(e-s) {}
41 String() : _start(0), _len(0) {}
43 Index start() const { return _start; }
44 Index end() const { return _start + _len; }
45 int len() const { return _len; }
47 void start(char const *s) { _start = s; }
48 void len(unsigned long len) { _len = len; }
49 bool empty() const { return !_len; }
51 String head(Index end) const
59 return String(_start, end - _start);
62 String head(unsigned long end) const
63 { return head(start() + end); }
65 String substr(unsigned long idx, unsigned long len = ~0UL) const
68 return String(end(), 0UL);
70 return String(_start + idx, cxx::min(len, _len - idx));
73 String substr(char const *start, unsigned long len = 0) const
75 if (start >= _start && !eof(start))
77 unsigned long nlen =_start + _len - start;
79 nlen = cxx::min(nlen, len);
80 return String(start, nlen);
83 return String(end(), 0UL);
86 template< typename F >
87 char const *find_match(F const &match) const
89 String::Index s = _start;
102 char const *find(char const *c) const
103 { return find(c, start()); }
105 char const *find(int c) const
106 { return find(c, start()); }
108 char const *rfind(char const *c) const
113 char const *p = end();
125 bool starts_with(cxx::String const &c) const
128 for (i = 0; i < c._len && i < _len; ++i)
129 if (_start[i] != c[i])
134 char const *find(int c, char const *s) const
151 char const *find(char const *c, char const *s) const
161 for (char const *x = c; *x; ++x)
169 char const &operator [] (unsigned long idx) const { return _start[idx]; }
170 char const &operator [] (int idx) const { return _start[idx]; }
171 char const &operator [] (Index idx) const { return *idx; }
173 bool eof(char const *s) const { return s >= _start + _len || !*s; }
175 template<typename INT>
176 int from_hex(INT *v) const
181 for (c = start(); !eof(c); ++c)
184 if (shift > sizeof(INT) * 8)
188 if (*c >= '0' && *c <= '9')
190 else if (*c >= 'A' && *c <= 'F')
192 else if (*c >= 'a' && *c <= 'f')
202 bool operator == (String const &o) const
204 if (len() != o.len())
207 for (unsigned long i = 0; i < _len; ++i)
208 if (_start[i] != o._start[i])
214 bool operator != (String const &o) const
215 { return ! (operator == (o)); }
227 L4::BasicOStream &operator << (L4::BasicOStream &s, cxx::String const &str)
229 s.write(str.start(), str.len());