L4Re Operating System Framework
Interface and Usage Documentation
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
string
1// vi:set ft=cpp: -*- Mode: C++ -*-
2/*
3 * (c) 2008-2009 Alexander Warg <warg@os.inf.tu-dresden.de>
4 * economic rights: Technische Universität Dresden (Germany)
5 *
6 * License: see LICENSE.spdx (in this directory or the directories above)
7 */
8
12#pragma once
13
14#include <l4/cxx/minmax>
15#include <l4/cxx/basic_ostream>
16
17
18namespace cxx {
19
30class String
31{
32public:
33
35 typedef char const *Index;
36
38 String(char const *s) noexcept : _start(s), _len(__builtin_strlen(s)) {}
40 String(char const *s, unsigned long len) noexcept : _start(s), _len(len) {}
41
48 String(char const *s, char const *e) noexcept : _start(s), _len(e - s) {}
49
51 String() : _start(0), _len(0) {}
52
54 Index start() const { return _start; }
56 Index end() const { return _start + _len; }
58 int len() const { return _len; }
59
61 void start(char const *s) { _start = s; }
63 void len(unsigned long len) { _len = len; }
65 bool empty() const { return !_len; }
66
69 {
70 if (end < _start)
71 return String();
72
73 if (eof(end))
74 return *this;
75
76 return String(_start, end - _start);
77 }
78
80 String head(unsigned long end) const
81 { return head(start() + end); }
82
84 String substr(unsigned long idx, unsigned long len = ~0UL) const
85 {
86 if (idx >= _len)
87 return String(end(), 0UL);
88
89 return String(_start + idx, cxx::min(len, _len - idx));
90 }
91
93 String substr(char const *start, unsigned long len = 0) const
94 {
95 if (start >= _start && !eof(start))
96 {
97 unsigned long nlen = _start + _len - start;
98 if (len != 0)
99 nlen = cxx::min(nlen, len);
100 return String(start, nlen);
101 }
102
103 return String(end(), 0UL);
104 }
105
107 template< typename F >
108 char const *find_match(F &&match) const
109 {
110 String::Index s = _start;
111 while (1)
112 {
113 if (eof(s))
114 return s;
115
116 if (match(*s))
117 return s;
118
119 ++s;
120 }
121 }
122
124 char const *find(char const *c) const
125 { return find(c, start()); }
126
128 char const *find(int c) const
129 { return find(c, start()); }
130
132 char const *rfind(char const *c) const
133 {
134 if (!_len)
135 return end();
136
137 char const *p = end();
138 --p;
139 while (p >= _start)
140 {
141 if (*p == *c)
142 return p;
143 --p;
144 }
145 return end();
146
147 }
148
156 {
157 unsigned long i;
158 for (i = 0; i < c._len && i < _len; ++i)
159 if (_start[i] != c[i])
160 return 0;
161 return i == c._len ? start() + i : 0;
162 }
163
165 char const *find(int c, char const *s) const
166 {
167 if (s < _start)
168 return end();
169
170 while (1)
171 {
172 if (eof(s))
173 return s;
174
175 if (*s == c)
176 return s;
177
178 ++s;
179 }
180 }
181
191 char const *find(char const *c, char const *s) const
192 {
193 if (s < _start)
194 return end();
195
196 while (1)
197 {
198 if (eof(s))
199 return s;
200
201 for (char const *x = c; *x; ++x)
202 if (*s == *x)
203 return s;
204
205 ++s;
206 }
207 }
208
210 char const &operator [] (unsigned long idx) const { return _start[idx]; }
212 char const &operator [] (int idx) const { return _start[idx]; }
214 char const &operator [] (Index idx) const { return *idx; }
215
217 bool eof(char const *s) const { return s >= _start + _len || !*s; }
218
227 template<typename INT>
228 int from_dec(INT *v) const
229 {
230 *v = 0;
231 Index c;
232 for (c = start(); !eof(c); ++c)
233 {
234 unsigned char n;
235 if (*c >= '0' && *c <= '9')
236 n = *c - '0';
237 else
238 return c - start();
239
240 *v *= 10;
241 *v += n;
242 }
243 return c - start();
244 }
245
256 template<typename INT>
257 int from_hex(INT *v) const
258 {
259 *v = 0;
260 unsigned shift = 0;
261 Index c;
262 for (c = start(); !eof(c); ++c)
263 {
264 shift += 4;
265 if (shift > sizeof(INT) * 8)
266 return -1;
267 unsigned char n;
268 if (*c >= '0' && *c <= '9')
269 n = *c - '0';
270 else if (*c >= 'A' && *c <= 'F')
271 n = *c - 'A' + 10;
272 else if (*c >= 'a' && *c <= 'f')
273 n = *c - 'a' + 10;
274 else
275 return c - start();
276
277 *v <<= 4;
278 *v |= n;
279 }
280 return c - start();
281 }
282
284 bool operator == (String const &o) const
285 {
286 if (len() != o.len())
287 return false;
288
289 for (unsigned long i = 0; i < _len; ++i)
290 if (_start[i] != o._start[i])
291 return false;
292
293 return true;
294 }
295
297 bool operator != (String const &o) const
298 { return ! (operator == (o)); }
299
300private:
301 char const *_start;
302 unsigned long _len;
303};
304
305}
306
308inline
309L4::BasicOStream &operator << (L4::BasicOStream &s, cxx::String const &str)
310{
311 s.write(str.start(), str.len());
312 return s;
313}
Basic IO stream.
Allocation free string class with explicit length field.
Definition string:31
String head(unsigned long end) const
Prefix of length end.
Definition string:80
Index start() const
Pointer to first character.
Definition string:54
Index end() const
Pointer to first byte behind the string.
Definition string:56
char const * find(char const *c, char const *s) const
Find character set at position.
Definition string:191
int from_hex(INT *v) const
Convert hex string to integer.
Definition string:257
String(char const *s) noexcept
Initialize from a zero-terminated string.
Definition string:38
bool operator==(String const &o) const
Equality.
Definition string:284
String(char const *s, char const *e) noexcept
Initialize with start and end pointer.
Definition string:48
char const * find(int c, char const *s) const
Find character c starting at position s. Return end() if not found.
Definition string:165
void len(unsigned long len)
Set length.
Definition string:63
bool empty() const
Check if the string has length zero.
Definition string:65
bool eof(char const *s) const
Check if pointer s points behind string.
Definition string:217
char const * find(char const *c) const
Find character. Return end() if not found.
Definition string:124
String(char const *s, unsigned long len) noexcept
Initialize from a pointer to first character and a length.
Definition string:40
String substr(unsigned long idx, unsigned long len=~0UL) const
Substring of length len starting at idx.
Definition string:84
char const * find_match(F &&match) const
Find matching character. match should be a function such as isspace.
Definition string:108
char const * find(int c) const
Find character. Return end() if not found.
Definition string:128
String head(Index end) const
Return prefix up to index.
Definition string:68
char const * Index
Character index type.
Definition string:35
int from_dec(INT *v) const
Convert decimal string to integer.
Definition string:228
bool operator!=(String const &o) const
Inequality.
Definition string:297
void start(char const *s)
Set start.
Definition string:61
Index starts_with(cxx::String const &c) const
Check if c is a prefix of string.
Definition string:155
char const * rfind(char const *c) const
Find right-most character. Return end() if not found.
Definition string:132
char const & operator[](unsigned long idx) const
Get character at idx.
Definition string:210
int len() const
Length.
Definition string:58
String()
Zero-initialize. Create an invalid string.
Definition string:51
String substr(char const *start, unsigned long len=0) const
Substring of length len starting at start.
Definition string:93
Our C++ library.
Definition arith:11