22 #include <l4/cxx/minmax> 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 75 String substr(
char const *start,
unsigned long len = 0)
const 77 if (start >= _start && !eof(start))
79 unsigned long nlen = _start + _len - start;
82 return String(start, nlen);
88 template<
typename F >
89 char const *find_match(F &&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();
130 for (i = 0; i < c._len && i < _len; ++i)
131 if (_start[i] != c[i])
133 return i == c._len ? start() + i : 0;
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_dec(INT *v)
const 182 for (c = start(); !eof(c); ++c)
185 if (*c >=
'0' && *c <=
'9')
196 template<
typename INT>
197 int from_hex(INT *v)
const 202 for (c = start(); !eof(c); ++c)
205 if (shift >
sizeof(INT) * 8)
208 if (*c >=
'0' && *c <=
'9')
210 else if (*c >=
'A' && *c <=
'F')
212 else if (*c >=
'a' && *c <=
'f')
223 bool operator == (
String const &o)
const 225 if (len() != o.len())
228 for (
unsigned long i = 0; i < _len; ++i)
229 if (_start[i] != o._start[i])
235 bool operator != (
String const &o)
const 236 {
return ! (operator == (o)); }
248 L4::BasicOStream &operator << (L4::BasicOStream &s,
cxx::String const &str)
250 s.write(str.start(), str.len());
This class is used to group characters of a string which belong to one syntactical token types number...
T1 min(T1 a, T1 b)
Get the minimum of a and b.