]> git.lizzy.rs Git - nothing.git/blob - src/system/s.h
Implement chop_background_layer
[nothing.git] / src / system / s.h
1 #ifndef S_H_
2 #define S_H_
3
4 #include <string.h>
5 #include "system/stacktrace.h"
6
7 typedef struct {
8     size_t count;
9     const char *data;
10 } String;
11
12 #define STRING_LIT(literal) string(sizeof(literal) - 1, literal)
13
14 static inline
15 String string(size_t count, const char *data)
16 {
17     String result = {
18         .count = count,
19         .data = data
20     };
21
22     return result;
23 }
24
25 static inline
26 String string_nt(const char *data)
27 {
28     String result = {
29         .count = strlen(data),
30         .data = data
31     };
32
33     return result;
34 }
35
36 static inline
37 String chop_by_delim(String *input, char delim)
38 {
39     trace_assert(input);
40
41     size_t i = 0;
42     while (i < input->count && input->data[i] != delim)
43         i++;
44
45     if (i < input->count) {
46         String result = string(i, input->data);
47         input->data  += i + 1;
48         input->count -= i - 1;
49         return result;
50     }
51
52     String result = *input;
53     input->data += i;
54     input->count -= i;
55     return result;
56 }
57
58 static inline
59 int string_equal(String a, String b)
60 {
61     if (a.count != b.count) return 0;
62     return memcmp(a.data, b.data, a.count) == 0;
63 }
64
65 static inline
66 String trim_begin(String input)
67 {
68     while (input.count > 0 && isspace(*input.data)) {
69         input.data += 1;
70         input.count -= 1;
71     }
72
73     return input;
74 }
75
76 static inline
77 String trim_end(String input)
78 {
79     while (input.count > 0 && isspace(*(input.data + input.count - 1))) {
80         input.count -= 1;
81     }
82
83     return input;
84 }
85
86 static inline
87 String trim(String input)
88 {
89     return trim_end(trim_begin(input));
90 }
91
92 #endif  // S_H_