blob: c29d08210d5e847a7f32bfe94f3ce09dd6b59ff2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
#include "sv.h"
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char *SV_TO_C(struct sv s) {
char *c_string = malloc(s.length + 1);
memcpy(c_string, s.s, s.length);
c_string[s.length] = '\0';
return c_string;
}
struct sv sv_split_space(const struct sv input, struct sv *rest) {
struct sv r = {
.s = input.s,
};
for (size_t i = 0; i < input.length; i++) {
if (isspace(input.s[i])) {
r.length = i;
if (rest) {
rest->s += i + 1;
rest->length -= (i + 1);
}
return r;
}
}
if (rest) {
rest->s = NULL;
rest->length = 0;
}
return input;
}
struct sv sv_split_delim(const struct sv input, struct sv *rest, char delim) {
struct sv r = {
.s = input.s,
};
for (size_t i = 0; i < input.length; i++) {
if (delim == input.s[i]) {
r.length = i;
if (rest) {
rest->s += i + 1;
rest->length -= (i + 1);
}
return r;
}
}
if (rest) {
rest->s = NULL;
rest->length = 0;
}
return input;
}
int sv_isempty(struct sv s) {
return (0 == s.length);
}
char sv_peek(struct sv s) {
if (0 == s.length) {
return '\0';
}
return s.s[0];
}
int sv_eq(struct sv a, struct sv b) {
if (a.length != b.length) {
return 0;
}
for (size_t i = 0; i < a.length; i++) {
if (a.s[i] != b.s[i]) {
return 0;
}
}
return 1;
}
struct sv sv_trim_left(struct sv s, size_t n) {
if (s.length < n) {
s.s += s.length;
s.length = 0;
return s;
}
s.s += n;
s.length -= n;
return s;
}
struct sv sv_clone(struct sv s) {
struct sv new_sv;
new_sv.length = s.length;
char *new_string = malloc(s.length);
memcpy(new_string, s.s, s.length);
new_sv.s = new_string;
return new_sv;
}
struct sv sv_clone_from_c(const char *s) {
return sv_clone(C_TO_SV(s));
}
|