diff options
Diffstat (limited to 'src/bootstrap/string_view.c')
-rw-r--r-- | src/bootstrap/string_view.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/bootstrap/string_view.c b/src/bootstrap/string_view.c new file mode 100644 index 0000000..13ba9e0 --- /dev/null +++ b/src/bootstrap/string_view.c | |||
@@ -0,0 +1,43 @@ | |||
1 | typedef struct StringView { | ||
2 | char *start; | ||
3 | size_t n; | ||
4 | } StringView; | ||
5 | |||
6 | char | ||
7 | sv_next(StringView *sv) { | ||
8 | if (sv->n == 0) { | ||
9 | return '\0'; | ||
10 | } | ||
11 | char c = sv->start[0]; | ||
12 | sv->start++; | ||
13 | sv->n--; | ||
14 | return c; | ||
15 | } | ||
16 | |||
17 | char | ||
18 | sv_peek(const StringView *sv) { | ||
19 | if (sv->n == 0) { | ||
20 | return '\0'; | ||
21 | } | ||
22 | return sv->start[0]; | ||
23 | } | ||
24 | |||
25 | bool | ||
26 | sv_equal(const StringView *a, const StringView *b) { | ||
27 | if (a->n != b->n) { | ||
28 | return false; | ||
29 | } | ||
30 | for (size_t i = 0; i < a->n; i++) { | ||
31 | if (a->start[i] != b->start[i]) { | ||
32 | return false; | ||
33 | } | ||
34 | } | ||
35 | return true; | ||
36 | } | ||
37 | |||
38 | void | ||
39 | sv_write(const StringView *sv, FILE *file) { | ||
40 | for (size_t i = 0; i < sv->n; i++) { | ||
41 | putc(sv->start[i], file); | ||
42 | } | ||
43 | } | ||