3 * (c) 2008-2009 Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
6 * This file is part of TUD:OS and distributed under the terms of the
7 * GNU General Public License 2.
8 * Please see the COPYING-GPL-2 file for details.
10 * As a special exception, you may use this file as part of a free software
11 * library without restriction. Specifically, if other files instantiate
12 * templates or use macros or inline functions from this file, or you compile
13 * this file and link it with other files to produce an executable, this
14 * file does not by itself cause the resulting executable to be covered by
15 * the GNU General Public License. This exception does not however
16 * invalidate any other reasons why the executable file might be covered by
17 * the GNU General Public License.
22 #include <l4/cxx/minmax>
23 #include <l4/cxx/basic_ostream>
29 * This class is used to group characters of a string which belong
30 * to one syntactical token types number, identifier, string,
31 * whitespace or another single character.
37 typedef char const *Index;
39 String(char const *s) throw() : _start(s), _len(__builtin_strlen(s)) {}
40 String(char const *s, unsigned long len) throw() : _start(s), _len(len) {}
41 String(char const *s, char const *e) throw() : _start(s), _len(e-s) {}
43 String() : _start(0), _len(0) {}
45 Index start() const { return _start; }
46 Index end() const { return _start + _len; }
47 int len() const { return _len; }
49 void start(char const *s) { _start = s; }
50 void len(unsigned long len) { _len = len; }
51 bool empty() const { return !_len; }
53 String head(Index end) const
61 return String(_start, end - _start);
64 String head(unsigned long end) const
65 { return head(start() + end); }
67 String substr(unsigned long idx, unsigned long len = ~0UL) const
70 return String(end(), 0UL);
72 return String(_start + idx, cxx::min(len, _len - idx));
75 String substr(char const *start, unsigned long len = 0) const
77 if (start >= _start && !eof(start))
79 unsigned long nlen =_start + _len - start;
81 nlen = cxx::min(nlen, len);
82 return String(start, nlen);
85 return String(end(), 0UL);
88 template< typename F >
89 char const *find_match(F const &match) const
91 String::Index s = _start;
104 char const *find(char const *c) const
105 { return find(c, start()); }
107 char const *find(int c) const
108 { return find(c, start()); }
110 char const *rfind(char const *c) const
115 char const *p = end();
127 bool starts_with(cxx::String const &c) const
130 for (i = 0; i < c._len && i < _len; ++i)
131 if (_start[i] != c[i])
136 char const *find(int c, char const *s) const
153 char const *find(char const *c, char const *s) const
163 for (char const *x = c; *x; ++x)
171 char const &operator [] (unsigned long idx) const { return _start[idx]; }
172 char const &operator [] (int idx) const { return _start[idx]; }
173 char const &operator [] (Index idx) const { return *idx; }
175 bool eof(char const *s) const { return s >= _start + _len || !*s; }
177 template<typename INT>
178 int from_hex(INT *v) const
183 for (c = start(); !eof(c); ++c)
186 if (shift > sizeof(INT) * 8)
190 if (*c >= '0' && *c <= '9')
192 else if (*c >= 'A' && *c <= 'F')
194 else if (*c >= 'a' && *c <= 'f')
204 bool operator == (String const &o) const
206 if (len() != o.len())
209 for (unsigned long i = 0; i < _len; ++i)
210 if (_start[i] != o._start[i])
216 bool operator != (String const &o) const
217 { return ! (operator == (o)); }
229 L4::BasicOStream &operator << (L4::BasicOStream &s, cxx::String const &str)
231 s.write(str.start(), str.len());