From 553b43d2e563dcff74d4c86904fa3737e96d7365 Mon Sep 17 00:00:00 2001 From: Anton Kling Date: Tue, 19 Mar 2024 01:41:22 +0100 Subject: IRC: Add the IRC client I am working on --- userland/irc/sv.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 userland/irc/sv.c (limited to 'userland/irc/sv.c') diff --git a/userland/irc/sv.c b/userland/irc/sv.c new file mode 100644 index 0000000..c29d082 --- /dev/null +++ b/userland/irc/sv.c @@ -0,0 +1,102 @@ +#include "sv.h" +#include +#include +#include + +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)); +} -- cgit v1.2.3