]> git.lizzy.rs Git - nothing.git/blob - src/system/s.h
688af2d1939effe22e6b3df574492956a012cda0
[nothing.git] / src / system / s.h
1 #ifndef S_H_
2 #define S_H_
3
4 #include <stdlib.h>
5 #include <string.h>
6 #include "system/stacktrace.h"
7 #include "system/memory.h"
8
9 typedef struct {
10     size_t count;
11     const char *data;
12 } String;
13
14 #define STRING_LIT(literal) string(sizeof(literal) - 1, literal)
15
16 static inline
17 String string(size_t count, const char *data)
18 {
19     String result = {
20         .count = count,
21         .data = data
22     };
23
24     return result;
25 }
26
27 static inline
28 String string_nt(const char *data)
29 {
30     String result = {
31         .count = strlen(data),
32         .data = data
33     };
34
35     return result;
36 }
37
38 static inline
39 String chop_by_delim(String *input, char delim)
40 {
41     trace_assert(input);
42
43     size_t i = 0;
44     while (i < input->count && input->data[i] != delim)
45         i++;
46
47     if (i < input->count) {
48         String result = string(i, input->data);
49         input->data  += i + 1;
50         input->count -= i - 1;
51         return result;
52     }
53
54     String result = *input;
55     input->data += i;
56     input->count -= i;
57     return result;
58 }
59
60 static inline
61 int string_equal(String a, String b)
62 {
63     if (a.count != b.count) return 0;
64     return memcmp(a.data, b.data, a.count) == 0;
65 }
66
67 static inline
68 String trim_begin(String input)
69 {
70     while (input.count > 0 && isspace(*input.data)) {
71         input.data += 1;
72         input.count -= 1;
73     }
74
75     return input;
76 }
77
78 static inline
79 String trim_end(String input)
80 {
81     while (input.count > 0 && isspace(*(input.data + input.count - 1))) {
82         input.count -= 1;
83     }
84
85     return input;
86 }
87
88 static inline
89 String trim(String input)
90 {
91     return trim_end(trim_begin(input));
92 }
93
94 static inline
95 String chop_word(String *input)
96 {
97     trace_assert(input);
98
99     *input = trim_begin(*input);
100
101     size_t i = 0;
102     while (i < input->count && !isspace(input->data[i]))
103         i++;
104
105     String result = string(i, input->data);
106     input->data += i;
107     input->count -= i;
108     return result;
109 }
110
111 static inline
112 char *string_to_cstr(Memory *memory, String s)
113 {
114     trace_assert(memory);
115
116     char *result = memory_alloc(memory, s.count + 1);
117     memset(result, 0, s.count + 1);
118     memcpy(result, s.data, s.count);
119     return result;
120 }
121
122 #endif  // S_H_