jrk

my own c stdlib to keep myself sane
git clone git://git.jakekoroman.com/jrk
Log | Files | Refs

commit 439f45490b55ce4424a9b0e4d034ddceb405adae
parent ef34e44bcb73003b7a7496f9da4bc687ff80e404
Author: Jake Koroman <jake@jakekoroman.com>
Date:   Thu, 31 Jul 2025 14:53:17 -0400

implement jrk_StringView.

Diffstat:
Mjrk.h | 68+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 67 insertions(+), 1 deletion(-)

diff --git a/jrk.h b/jrk.h @@ -30,6 +30,11 @@ typedef struct { u64 capacity; } jrk_StringBuilder; +typedef struct { + char *data; + u64 count; +} jrk_StringView; + void *jrk_ecalloc(u64, u64); void *jrk_erealloc(void*, u64); @@ -49,6 +54,11 @@ i32 jrk_sb_appendf(jrk_StringBuilder*, const char*, ...); void jrk_sb_fd_read_all(jrk_StringBuilder*, i32); u64 jrk_sb_fd_write_all(jrk_StringBuilder*, i32); +jrk_StringView jrk_sv_from_parts(char*, u64); +jrk_StringView jrk_sv_trim_right(jrk_StringView); +jrk_StringView jrk_sv_trim_left(jrk_StringView); +jrk_StringView jrk_sv_trim(jrk_StringView); + /* NOTE(jake): no shortname as 'assert' is just too generic */ #define jrk_assert(c, msg) do { if (!(c)) jrk_die("jrk_assert: "msg); } while(0) @@ -58,6 +68,8 @@ u64 jrk_sb_fd_write_all(jrk_StringBuilder*, i32); #define jrk_arena_push_array(arena, type, n) (type *) jrk__arena_push(arena, sizeof(type) * n) #define jrk_arena_push_struct(arena, type) (type *) jrk__arena_push(arena, sizeof(type)) +#define jrk_sb_to_sv(sb) jrk_sv_from_parts((sb).items, (sb).count) + #define jrk_da_reserve(da, expected_capacity) \ do { \ if ((expected_capacity) > (da)->capacity) { \ @@ -116,6 +128,7 @@ u64 jrk_sb_fd_write_all(jrk_StringBuilder*, i32); #ifdef JRK_SHORTNAMES #define Arena jrk_Arena #define StringBuilder jrk_StringBuilder + #define StringView jrk_StringView #define sb_appendf jrk_sb_appendf #define sb_append_null jrk_sb_append_null @@ -124,6 +137,13 @@ u64 jrk_sb_fd_write_all(jrk_StringBuilder*, i32); #define sb_free jrk_sb_free #define sb_fd_read_all jrk_sb_fd_read_all #define sb_fd_write_all jrk_sb_fd_write_all + #define sb_to_sv jrk_sb_to_sv + + #define sv_trim_left jrk_sv_trim_left + #define sv_trim_right jrk_sv_trim_right + #define sv_trim jrk_sv_trim + #define sv_from_cstr jrk_sv_from_cstr + #define sv_from_parts jrk_sv_from_parts #define ecalloc jrk_ecalloc #define erealloc jrk_erealloc @@ -152,6 +172,7 @@ u64 jrk_sb_fd_write_all(jrk_StringBuilder*, i32); #endif // JRK_SHORTNAMES #ifdef JRK_IMPLEMENTATION +#include <ctype.h> #include <errno.h> #include <fcntl.h> #include <stdarg.h> @@ -250,7 +271,9 @@ jrk_sb_fd_read_all(jrk_StringBuilder *sb, i32 fd) { u64 sz = jrk_fd_size(fd); jrk_da_reserve(sb, sz); - u64 n = read(fd, sb->items, sz); + if (read(fd, sb->items, sz) < 0) + jrk_edie("jrk_sb_fd_read_all"); + sb->count = sz; } @@ -308,6 +331,49 @@ jrk_fd_open_write_append(char *path) return result; } +jrk_StringView +jrk_sv_from_parts(char *data, u64 count) +{ + jrk_StringView result = {0}; + result.data = data; + if (data[count] == '\0') + result.count = count-1; + else + result.count = count; + return result; +} + +jrk_StringView +jrk_sv_from_cstr(char *data) +{ + jrk_StringView result = {0}; + result.data = data; + result.count = strlen(data); + return result; +} + +jrk_StringView +jrk_sv_trim_right(jrk_StringView sv) +{ + u64 i = 0; + for (; i < sv.count && isspace(sv.data[sv.count - 1 - i]); ++i); + return jrk_sv_from_parts(sv.data, sv.count - i); +} + +jrk_StringView +jrk_sv_trim_left(jrk_StringView sv) +{ + u64 i = 0; + for (; i < sv.count && isspace(sv.data[i]); ++i); + return jrk_sv_from_parts(sv.data + i, sv.count - i); +} + +jrk_StringView +jrk_sv_trim(jrk_StringView sv) +{ + return jrk_sv_trim_right(jrk_sv_trim_left(sv)); +} + i32 jrk_rand_num(i32 upbound) {