commit 439f45490b55ce4424a9b0e4d034ddceb405adae
parent ef34e44bcb73003b7a7496f9da4bc687ff80e404
Author: Jake Koroman <jake@jakekoroman.com>
Date: Thu, 31 Jul 2025 14:53:17 -0400
implement jrk_StringView.
Diffstat:
M | jrk.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)
{