From 463e7bae5faa755dc23092736cb7886442acf998 Mon Sep 17 00:00:00 2001 From: Soikk Date: Thu, 2 Oct 2025 17:38:16 +0200 Subject: Added dsstr dsnstr and streqn --- str/str.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) (limited to 'str/str.c') diff --git a/str/str.c b/str/str.c index 6cc9418..145aca9 100755 --- a/str/str.c +++ b/str/str.c @@ -64,6 +64,24 @@ str dnstr(u32 cap){ return s; } +str dsstr(char *s){ + str r = { + .cap = 0, + .len = len(s), + .ptr = s + }; + return r; +} + +str dsnstr(char *s, u32 len){ + str r = { + .cap = 0, + .len = len, + .ptr = s + }; + return r; +} + int resize_str(str *s, u32 nsize){ if(nsize == 0) return 1; char *nptr = realloc(s->ptr, nsize); @@ -108,6 +126,7 @@ str utostr(u64 n, int b){ } // TODO add support for different bases +// TODO check length u64 strtou(str s){ u64 i = 0, r = 0; while(charisnum(s.ptr[i])){ @@ -121,7 +140,7 @@ int streq(str s1, str s2){ if(s1.len != s2.len){ return 0; } - int i = 0; + u32 i = 0; while(i < s1.len){ if(s1.ptr[i] != s2.ptr[i]){ return 0; @@ -131,6 +150,20 @@ int streq(str s1, str s2){ return 1; } +int streqn(str s1, str s2, u32 n){ + if(s1.len < n || s2.len < n){ + return 0; + } + u32 i = 0; + while(i < n){ + if(s1.ptr[i] != s2.ptr[i]){ + return 0; + } + i++; + } + return 1; +} + u64 len_nstrs(u64 n, ...){ u64 s = 0; va_list vl; @@ -364,6 +397,28 @@ void unmap_file(str *s){ s->cap = 0; } +str fread_str(int fd, int max){ + str s = dnstr(max); + s.len = read(fd, s.ptr, s.cap); + if(s.len == 0){ + free_str(&s); + return (str){0}; + } + if(s.ptr[s.len-1] == '\n'){ + s.ptr[--s.len] = '\0'; + } + if(s.len != s.cap){ + char *p = realloc(s.ptr, s.len+1); + if(p == NULL){ + free_str(&s); + return (str){0}; + } + s.ptr = p; + s.cap = s.len; + } + return s; +} + void print_str(str s){ for(u32 i = 0; i < s.len; i++){ putchar(s.ptr[i]); -- cgit v1.2.3