Lolly 1.4.27
Loading...
Searching...
No Matches
string.cpp
Go to the documentation of this file.
1
2/******************************************************************************
3 * MODULE : string.cpp
4 * DESCRIPTION: Fixed size strings with reference counting.
5 * Zero characters can be part of string.
6 * COPYRIGHT : (C) 1999 Joris van der Hoeven
7 *******************************************************************************
8 * This software falls under the GNU general public license version 3 or later.
9 * It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
10 * in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ******************************************************************************/
12
13#include "string.hpp"
14#include "basic.hpp"
15#include <stdio.h>
16#include <stdlib.h>
17#include <string.h>
18#include <string>
19
20/******************************************************************************
21 * Low level routines and constructors
22 ******************************************************************************/
23
24static inline int
25round_length (int n) {
26 n= (n + 3) & (0xfffffffc);
27 if (n < 24) return n;
28 int i= 32;
29 while (n > i)
30 i<<= 1;
31 return i;
32}
33
35 if (a_N != 0) {
37 }
38}
39
40void
42 int nn= round_length (n);
43 int mm= round_length (m);
44 if (mm != nn) {
45 if (mm != 0) {
46 if (nn != 0) {
47 a_N= mm;
49 }
50 else {
51 a_N= mm;
53 }
54 }
55 else if (nn != 0) {
57 a_N= 0;
58 a = NULL;
59 };
60 }
61 n= m;
62}
63
64int
66 int old_n= n;
67 n+= delta;
68 reserve (n);
69 return old_n;
70}
71
72void
74 int old_size= a_N;
75 if (new_n != 0) {
76 if (old_size == 0) {
79 }
80 else if (old_size < new_n) {
83 }
84 }
85 else {
86 if (old_size != 0) {
88 a = NULL;
89 a_N= 0;
90 };
91 }
92}
93
96 rep->a[0]= c;
97}
98
99string::string (char c, int n) {
101 for (int i= 0; i < n; i++)
102 rep->a[i]= c;
103}
104
105string::string (const char* a) {
106 int i, n= strlen (a);
108 for (i= 0; i < n; i++)
109 rep->a[i]= a[i];
110}
111
112string::string (const char* a, int n) {
113 int i;
115 for (i= 0; i < n; i++)
116 rep->a[i]= a[i];
117}
118
119/******************************************************************************
120 * Common routines for strings
121 ******************************************************************************/
122
123bool
124string::operator== (const char* s) {
125 int i, n= rep->n;
126 char* S= rep->a;
127 for (i= 0; i < n; i++) {
128 if (s[i] != S[i]) return false;
129 if (s[i] == '\0') return false;
130 }
131 return (s[i] == '\0');
132}
133
134bool
135string::operator!= (const char* s) {
136 int i, n= rep->n;
137 char* S= rep->a;
138 for (i= 0; i < n; i++) {
139 if (s[i] != S[i]) return true;
140 if (s[i] == '\0') return true;
141 }
142 return (s[i] != '\0');
143}
144
145bool
147 return ((string_view<char>) *this) == ((string_view<char>) a);
148}
149
150bool
152 return ((string_view<char>) *this) != ((string_view<char>) a);
153}
154
155string
156string::operator() (int begin, int end) {
157 if (end <= begin) return string ();
158
159 int i;
160 begin= max (min (rep->n, begin), 0);
161 end = max (min (rep->n, end), 0);
162 string r (end - begin);
163 for (i= begin; i < end; i++)
164 r[i - begin]= rep->a[i];
165 return r;
166}
167
168string
169copy (string s) {
170 int i, n= N (s);
171 string r (n);
172 for (i= 0; i < n; i++)
173 r[i]= s[i];
174 return r;
175}
176
177string&
178operator<< (string& a, char x) {
179 int old_a_N= a->expand_or_shrink_by (1);
180 a[old_a_N] = x;
181 return a;
182}
183
184string&
185operator<< (string& a, string b) {
186 int b_N = N (b);
187 int old_a_N= a->expand_or_shrink_by (b_N);
188 for (int i= 0; i < b_N; i++)
189 a[i + old_a_N]= b[i];
190 return a;
191}
192
193string
194operator* (string a, string b) {
195 int i, n1= N (a), n2= N (b);
196 string c (n1 + n2);
197 for (i= 0; i < n1; i++)
198 c[i]= a[i];
199 for (i= 0; i < n2; i++)
200 c[i + n1]= b[i];
201 return c;
202}
203
204string
205operator* (const char* a, string b) {
206 return string (a) * b;
207}
208
209string
210operator* (string a, const char* b) {
211 return a * string (b);
212}
213
214bool
215operator< (string s1, string s2) {
216 return ((string_view<char>) s1) < ((string_view<char>) s2);
217}
218
219bool
220operator<= (string s1, string s2) {
221 return ((string_view<char>) s1) <= ((string_view<char>) s2);
222}
223
224int
225hash (string s) {
226 int h= 0;
227 for (char ch : s) {
228 h= (h << 9) + (h >> 23);
229 h= h + ((int) ch);
230 }
231 return h;
232}
233
234/******************************************************************************
235 * Conversion routines
236 ******************************************************************************/
237
238bool
239as_bool (string s) {
240 return (s == "true" || s == "#t");
241}
242
243int
244as_int (string s) {
245 int i= 0, n= N (s), val= 0;
246 if (n == 0) return 0;
247 if (s[0] == '+') i++;
248 if (s[0] == '-') i++;
249 while (i < n) {
250 if (s[i] < '0') break;
251 if (s[i] > '9') break;
252 val*= 10;
253 val+= (int) (s[i] - '0');
254 i++;
255 }
256 if (s[0] == '-') val= -val;
257 return val;
258}
259
260long int
261as_long_int (string s) {
262 int i= 0, n= N (s);
263 long int val= 0;
264 if (n == 0) return 0;
265 if (s[0] == '+') i++;
266 if (s[0] == '-') i++;
267 while (i < n) {
268 if (s[i] < '0') break;
269 if (s[i] > '9') break;
270 val*= 10;
271 val+= (int) (s[i] - '0');
272 i++;
273 }
274 if (s[0] == '-') val= -val;
275 return val;
276}
277
278double
279as_double (string s) {
280 double x= 0.0;
281 {
282 int i, n= N (s);
283 STACK_NEW_ARRAY (buf, char, n + 1);
284 for (i= 0; i < n; i++)
285 buf[i]= s[i];
286 buf[n]= '\0';
287 sscanf (buf, "%lf", &x);
288 STACK_DELETE_ARRAY (buf);
289 } // in order to avoid segmentation fault due to compiler bug
290 return x;
291}
292
293char*
294as_charp (string s) {
295 int i, n= N (s);
296 char* s2= tm_new_array<char> (n + 1);
297 for (i= 0; i < n; i++)
298 s2[i]= s[i];
299 s2[n]= '\0';
300 return s2;
301}
302
303string
305 if (f) return string ("true");
306 else return string ("false");
307}
308
309string
311 return string ((std::to_string (i)).c_str ());
312}
313
314string
316 return string ((std::to_string (i)).c_str ());
317}
318
319string
321 return string ((std::to_string (i)).c_str ());
322}
323
324string
325as_string (unsigned int i) {
326 char buf[64];
327 sprintf (buf, "%u", i);
328 // sprintf (buf, "%u\0", i);
329 return string (buf);
330}
331
332string
333as_string (unsigned long int i) {
334 char buf[64];
335 sprintf (buf, "%lu", i);
336 // sprintf (buf, "%lu\0", i);
337 return string (buf);
338}
339
340string
341as_string (double x) {
342 char buf[64];
343 sprintf (buf, "%g", x);
344 // sprintf (buf, "%g\0", x);
345 return string (buf);
346}
347
348string
349as_string (const char* s) {
350 return string (s);
351}
352
353bool
354is_empty (string s) {
355 return N (s) == 0;
356}
357
358bool
359is_bool (string s) {
360 return (s == "true") || (s == "false");
361}
362
363bool
364is_int (string s) {
365 int i= 0, n= N (s);
366 if (n == 0) return false;
367 if (s[i] == '+') i++;
368 if (s[i] == '-') i++;
369 if (i == n) return false;
370 for (; i < n; i++)
371 if ((s[i] < '0') || (s[i] > '9')) return false;
372 return true;
373}
374
375bool
376is_double (string s) {
377 int i= 0, n= N (s);
378 if (n == 0) return false;
379 if (s[i] == '+') i++;
380 if (s[i] == '-') i++;
381 if (i == n) return false;
382 for (; i < n; i++)
383 if ((s[i] < '0') || (s[i] > '9')) break;
384 if (i == n) return true;
385 if (s[i] == '.') {
386 i++;
387 if (i == n) return false;
388 for (; i < n; i++)
389 if ((s[i] < '0') || (s[i] > '9')) break;
390 }
391 if (i == n) return true;
392 if (s[i++] != 'e') return false;
393 if (s[i] == '+') i++;
394 if (s[i] == '-') i++;
395 if (i == n) return false;
396 for (; i < n; i++)
397 if ((s[i] < '0') || (s[i] > '9')) return false;
398 return true;
399}
400
401bool
402is_charp (string s) {
403 (void) s;
404 return true;
405}
406
407bool
408is_quoted (string s) {
409 int n= N (s);
410 return (n >= 2) && (s[0] == '\"') && (s[n - 1] == '\"');
411}
412
413bool
414is_id (string s) {
415 int i= 0, n= N (s);
416 if (n == 0) return false;
417 for (i= 0; i < n; i++) {
418 if ((i > 0) && (s[i] >= '0') && (s[i] <= '9')) continue;
419 if ((s[i] >= 'a') && (s[i] <= 'z')) continue;
420 if ((s[i] >= 'A') && (s[i] <= 'Z')) continue;
421 if (s[i] == '_') continue;
422 return false;
423 }
424 return true;
425}
int N(array< T > a)
Get the length of the array.
Definition array.hpp:170
int round_length(int n, size_t s)
Definition array.ipp:21
#define STACK_NEW_ARRAY(name, T, size)
Definition basic.hpp:43
#define STACK_DELETE_ARRAY(name)
Definition basic.hpp:44
blackbox b[13]
The list class represents a linked list.
Definition list.hpp:48
char * a
Definition string.hpp:26
void reserve(int n)
reserve memory space to contain at least n word in the whole string. Do not affect length of string,...
Definition string.cpp:73
int expand_or_shrink_by(int delta)
expand (or shrink) string by delta, but do not release memory when string is shrinked.
Definition string.cpp:65
void resize(int n)
expand (or shrink) string to given length n, and try to release memory when string is shrinked.
Definition string.cpp:41
string()
Definition string.hpp:64
bool operator!=(const char *s)
Definition string.cpp:135
char * end()
Definition string.hpp:77
char * begin()
Definition string.hpp:76
bool operator==(const char *s)
Definition string.cpp:124
string operator()(int start, int end)
Definition string.cpp:156
void tm_delete_array(C *Ptr)
SI min(SI i, SI j)
Returns the minimum of two signed integers.
Definition minmax.hpp:27
SI max(SI i, SI j)
Returns the maximum of two signed integers.
Definition minmax.hpp:40
int as_int(string s)
Definition string.cpp:244
bool operator<(string s1, string s2)
Definition string.cpp:215
bool is_charp(string s)
Definition string.cpp:402
bool operator<=(string s1, string s2)
Definition string.cpp:220
static int round_length(int n)
Definition string.cpp:25
string as_string_bool(bool f)
Definition string.cpp:304
char * as_charp(string s)
Definition string.cpp:294
bool is_double(string s)
Definition string.cpp:376
bool as_bool(string s)
Definition string.cpp:239
string as_string(int16_t i)
Definition string.cpp:310
bool is_int(string s)
Definition string.cpp:364
long int as_long_int(string s)
Definition string.cpp:261
double as_double(string s)
Definition string.cpp:279
bool is_bool(string s)
Definition string.cpp:359
string operator*(string a, string b)
Definition string.cpp:194
string copy(string s)
Definition string.cpp:169
bool is_id(string s)
Definition string.cpp:414
string & operator<<(string &a, char x)
Definition string.cpp:178
bool is_quoted(string s)
Definition string.cpp:408
bool is_empty(string s)
Definition string.cpp:354
int hash(string s)
Definition string.cpp:225
base class of resources
Definition resource.hpp:23
url delta(url base, url u)
Definition url.cpp:469