summaryrefslogtreecommitdiff
path: root/stage3/string.c
diff options
context:
space:
mode:
authorLizzy Fleckenstein <lizzy@vlhl.dev>2023-12-19 01:54:39 +0100
committerLizzy Fleckenstein <lizzy@vlhl.dev>2023-12-19 02:11:32 +0100
commit6d263c7d4e0f4b1d34694b5d3d159ccb20b3db02 (patch)
tree41578268cf68b2d9ea1737687a0f98af979948d8 /stage3/string.c
parent5881b4d5c1040c762599f90e091e4cc4c3abe6b1 (diff)
downloadcuddles-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.c74
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 };
}