diff options
author | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2023-12-19 01:54:39 +0100 |
---|---|---|
committer | Lizzy Fleckenstein <lizzy@vlhl.dev> | 2023-12-19 02:11:32 +0100 |
commit | 6d263c7d4e0f4b1d34694b5d3d159ccb20b3db02 (patch) | |
tree | 41578268cf68b2d9ea1737687a0f98af979948d8 /stage3/string.c | |
parent | 5881b4d5c1040c762599f90e091e4cc4c3abe6b1 (diff) | |
download | cuddles-6d263c7d4e0f4b1d34694b5d3d159ccb20b3db02.tar.xz |
keyboard driver and threads
* PS/2 keyboard driver
* interactive shell
* move away from \0 terminated strings to sized slices
* coroutine threads and IRQ queues
Diffstat (limited to 'stage3/string.c')
-rw-r--r-- | stage3/string.c | 74 |
1 files changed, 45 insertions, 29 deletions
diff --git a/stage3/string.c b/stage3/string.c index ff4bfc3..2f95b99 100644 --- a/stage3/string.c +++ b/stage3/string.c @@ -1,19 +1,39 @@ #include "string.h" +#include "memory.h" +#include "heap.h" -usize find_char(const char *str, char chr) +isize str_cmp(str s1, str s2) { - usize ret = 0; - while (*str != chr && *str != '\0') - str++, ret++; - return ret; + if (s1.len != s2.len) + return (isize) s1.len - (isize) s2.len; + + return memcmp(s1.data, s2.data, s1.len); +} + +static bool match_char(char c, str tokens) +{ + for (usize t = 0; t < tokens.len; t++) + if (c == tokens.data[t]) + return true; + + return false; +} + +usize str_find(str s, str tokens) +{ + for (usize i = 0; i < s.len; i++) + if (match_char(s.data[i], tokens)) + return i; + + return s.len; } -u64 parse_num(u8 **str, u8 base, isize size) +usize str_parse_num(str s, u8 base, u64 *x) { - u64 x = 0; + *x = 0; - while (size-- != 0) { - u8 c = **str; + for (usize i = 0; i < s.len; i++) { + u8 c = s.data[i]; u64 d; if (c >= '0' && c <= '9') @@ -23,34 +43,30 @@ u64 parse_num(u8 **str, u8 base, isize size) else if (c >= 'A' && c <= 'z') d = c - 'A'; else - return x; + return i; if (d >= base) - return x; + return i; - (*str)++; - x = x * base + d; + *x = *x * base + d; } - return x; + return s.len; } -usize strlen(const char *str) +str str_split_walk(str *s, str sep) { - return find_char(str, '\0'); -} + if (s->len == 0) + return NILS; -int strcmp(const char *p1, const char *p2) -{ - while (*p1 == *p2 && *p1 != '\0') - p1++, p2++; - return *p1 - *p2; -} + usize x = str_find(*s, sep); + usize o = x + (x < s->len); -int strncmp(const char *p1, const char *p2, usize size) -{ - for (usize i = 0; i < size; i++) - if (p1[i] != p2[i]) - return p1[i]-p2[i]; - return 0; + s->len -= o; + s->data += o; + + if (x == 0) + return str_split_walk(s, sep); + else + return (str) { x, s->data - o }; } |