#pragma once #include #include typedef struct s8_slice { uint8_t* data; int64_t len; } S8Slice; #define S(str) (S8Slice) { \ .data = (uint8_t*)("" str), \ .len = sizeof(str)-1, \ } #define S8_error(str) (S8Slice) { \ .data = (uint8_t*)("" str), \ .len = -1, \ } static inline S8Slice s8slice_from_cstr(const char* cstr) { return (S8Slice){ .len = strlen(cstr), .data = (uint8_t*)cstr, }; } static inline S8Slice s8slice(const S8Slice* s, int64_t begin, int64_t end) { if (end >= s->len) { return S8_error("s8slice: `end` surpasses length of `s`"); } const int64_t diff = end - begin; return (S8Slice) { .len = diff, .data = &s->data[begin] }; } static bool s8_equals(S8Slice a, S8Slice b) { if (a.len != b.len) { return false; } return memcmp(a.data, b.data, a.len); }