summaryrefslogtreecommitdiff
path: root/kernel/lib/sv.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/lib/sv.c')
-rw-r--r--kernel/lib/sv.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/kernel/lib/sv.c b/kernel/lib/sv.c
index 580e63a..2143a4b 100644
--- a/kernel/lib/sv.c
+++ b/kernel/lib/sv.c
@@ -54,7 +54,11 @@ struct sv sv_skip_chars(const struct sv input, const char *chars) {
return r;
}
-uint64_t sv_parse_unsigned_number(struct sv input, struct sv *rest) {
+uint64_t sv_parse_unsigned_number(struct sv input, struct sv *rest,
+ int *got_num) {
+ if (got_num) {
+ *got_num = 0;
+ }
uint64_t r = 0;
size_t i = 0;
for (; i < input.length; i++) {
@@ -64,6 +68,11 @@ uint64_t sv_parse_unsigned_number(struct sv input, struct sv *rest) {
r *= 10;
r += input.s[i] - '0';
}
+ if (i > 0) {
+ if (got_num) {
+ *got_num = 1;
+ }
+ }
input.length -= i;
input.s += i;
if (rest) {
@@ -229,6 +238,23 @@ struct sv sv_clone(struct sv s) {
return new_sv;
}
+int sv_try_eat(struct sv input, struct sv *rest, struct sv b) {
+ if (input.length < b.length) {
+ return 0;
+ }
+ for (size_t i = 0; i < b.length; i++) {
+ if (input.s[i] != b.s[i]) {
+ return 0;
+ }
+ }
+ input.s += b.length;
+ input.length -= b.length;
+ if (rest) {
+ *rest = input;
+ }
+ return 1;
+}
+
char *sv_copy_to_c(struct sv s, char *out, size_t buffer_length) {
int copy_len = min(s.length + 1, buffer_length);
if (0 == copy_len) {