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