From 45f07986c351246cc8ae37af36a66a899fcdefda Mon Sep 17 00:00:00 2001 From: zeichensystem <83899451+zeichensystem@users.noreply.github.com> Date: Sun, 21 Dec 2025 17:30:13 +0100 Subject: [PATCH] Add string functions --- .gitignore | 0 doc/._.DS_Store | Bin 0 -> 4096 bytes doc/._guf_dict-diagram.png | Bin 0 -> 4096 bytes doc/guf_dict-diagram.png | Bin src/guf_alloc.h | 0 src/guf_alloc_libc.h | 0 src/guf_alloc_tracker.h | 0 src/guf_assert.h | 1 + src/guf_common.h | 0 src/guf_cstr.h | 0 src/guf_dbuf.h | 0 src/guf_hash.h | 0 src/guf_id_pool.h | 0 src/guf_init.h | 0 src/guf_linalg.h | 0 src/guf_math.h | 0 src/guf_math_ckdint.h | 0 src/guf_rand.h | 0 src/guf_sort.h | 0 src/guf_str.h | 96 ++++++++++++++++++++++++++++ src/guf_str_view_type.h | 0 src/guf_utf8.h | 0 src/guf_utils.h | 0 src/test/data/bartleby.txt | 0 src/test/data/utf8-test.txt | 0 src/test/example.c | 0 src/test/impls/alloc_libc_impl.c | 0 src/test/impls/alloc_tracker_impl.c | 0 src/test/impls/ckdint_impl.c | 0 src/test/impls/dbuf_impl.c | 0 src/test/impls/dbuf_impl.h | 0 src/test/impls/dict_impl.c | 0 src/test/impls/dict_impl.h | 0 src/test/impls/init_impl.c | 0 src/test/impls/linalg_impl.c | 0 src/test/impls/rand_impl.c | 0 src/test/impls/sort_impl.c | 0 src/test/impls/sort_impl.h | 0 src/test/impls/str_impl.c | 0 src/test/test.cpp | 0 src/test/test.hpp | 0 src/test/test_ckdint.cpp | 0 src/test/test_ckdint.hpp | 0 src/test/test_dbuf.cpp | 0 src/test/test_dbuf.hpp | 0 src/test/test_dict.cpp | 0 src/test/test_dict.hpp | 0 src/test/test_str.cpp | 0 src/test/test_str.hpp | 0 src/test/test_utf8.cpp | 0 src/test/test_utf8.hpp | 0 todo.txt | 2 + tools/ckdint-gen.py | 0 tools/intwrap-gen.py | 0 tools/min_max_clamp-gen.py | 0 55 files changed, 99 insertions(+) mode change 100644 => 100755 .gitignore create mode 100755 doc/._.DS_Store create mode 100755 doc/._guf_dict-diagram.png mode change 100644 => 100755 doc/guf_dict-diagram.png mode change 100644 => 100755 src/guf_alloc.h mode change 100644 => 100755 src/guf_alloc_libc.h mode change 100644 => 100755 src/guf_alloc_tracker.h mode change 100644 => 100755 src/guf_assert.h mode change 100644 => 100755 src/guf_common.h mode change 100644 => 100755 src/guf_cstr.h mode change 100644 => 100755 src/guf_dbuf.h mode change 100644 => 100755 src/guf_hash.h mode change 100644 => 100755 src/guf_id_pool.h mode change 100644 => 100755 src/guf_init.h mode change 100644 => 100755 src/guf_linalg.h mode change 100644 => 100755 src/guf_math.h mode change 100644 => 100755 src/guf_math_ckdint.h mode change 100644 => 100755 src/guf_rand.h mode change 100644 => 100755 src/guf_sort.h mode change 100644 => 100755 src/guf_str.h mode change 100644 => 100755 src/guf_str_view_type.h mode change 100644 => 100755 src/guf_utf8.h mode change 100644 => 100755 src/guf_utils.h mode change 100644 => 100755 src/test/data/bartleby.txt mode change 100644 => 100755 src/test/data/utf8-test.txt mode change 100644 => 100755 src/test/example.c mode change 100644 => 100755 src/test/impls/alloc_libc_impl.c mode change 100644 => 100755 src/test/impls/alloc_tracker_impl.c mode change 100644 => 100755 src/test/impls/ckdint_impl.c mode change 100644 => 100755 src/test/impls/dbuf_impl.c mode change 100644 => 100755 src/test/impls/dbuf_impl.h mode change 100644 => 100755 src/test/impls/dict_impl.c mode change 100644 => 100755 src/test/impls/dict_impl.h mode change 100644 => 100755 src/test/impls/init_impl.c mode change 100644 => 100755 src/test/impls/linalg_impl.c mode change 100644 => 100755 src/test/impls/rand_impl.c mode change 100644 => 100755 src/test/impls/sort_impl.c mode change 100644 => 100755 src/test/impls/sort_impl.h mode change 100644 => 100755 src/test/impls/str_impl.c mode change 100644 => 100755 src/test/test.cpp mode change 100644 => 100755 src/test/test.hpp mode change 100644 => 100755 src/test/test_ckdint.cpp mode change 100644 => 100755 src/test/test_ckdint.hpp mode change 100644 => 100755 src/test/test_dbuf.cpp mode change 100644 => 100755 src/test/test_dbuf.hpp mode change 100644 => 100755 src/test/test_dict.cpp mode change 100644 => 100755 src/test/test_dict.hpp mode change 100644 => 100755 src/test/test_str.cpp mode change 100644 => 100755 src/test/test_str.hpp mode change 100644 => 100755 src/test/test_utf8.cpp mode change 100644 => 100755 src/test/test_utf8.hpp mode change 100644 => 100755 todo.txt mode change 100644 => 100755 tools/ckdint-gen.py mode change 100644 => 100755 tools/intwrap-gen.py mode change 100644 => 100755 tools/min_max_clamp-gen.py diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/doc/._.DS_Store b/doc/._.DS_Store new file mode 100755 index 0000000000000000000000000000000000000000..8e82ed96c0d694f6a640da6c163a3ef7e4194513 GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIhYCu0iY;W;207T z1e9Qe=wPV8s%TVjGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!ns2l>ojwq-z z3ITE<8JWcjMXAO4rA5i93TgR8*$SC?C8>EOnfZB%IXRUIIjLzS3Q0MMdD+0OE==1{ PrcwP5_lXRH-2eXo=JOoa literal 0 HcmV?d00001 diff --git a/doc/._guf_dict-diagram.png b/doc/._guf_dict-diagram.png new file mode 100755 index 0000000000000000000000000000000000000000..3028d203c57636d0e8d110fb3744186a848b12b9 GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v0xDsI z>bL-8R-tKO2Z{m38N?VEM3eJ#^%4sTa#HmQOB0I{^GY)FQbF3E0SN&H1}TJmPGWIM zX>n>wN@7W>azHS|OvZ0O+Jk|CAE7QcF*ye;$z%tlw15anF0~{Ps6Wvv+tP0|N^qYcsP%6U$^XL+gN|)UwRfa_bp$mZSkqX3#Cj76;L63{RR*KfT%QKe744 zr9Xy1KeI9XX%_>!-Pd>Vv-V^b{=IiW>Ii|Pf}G6a5(5KH4v0!dV4Q;ijD~UP>t2=s=>>EH#Fr=MM3m7rB0`ns{n_pXqqa>hYn5rkFR+L@OWvQsfSv z9kk}9pX<)5oGiufjK&}NVs1YTjMSHHy12sOZ}iRI4=-pbO7^|Ze_XO0?y6D7Xb6mk zz-S1JhQMeDjE2By2#kinXb6mkzyO8-s51iZkjRB(WELwFr55Lx7A2=Dq~#Z7D`e)C rqyoF0`FV*sIh6`Isc9t&NjZsm*}%T=06Lp$R-^hKZmbN0-2eXoF9hOX literal 0 HcmV?d00001 diff --git a/doc/guf_dict-diagram.png b/doc/guf_dict-diagram.png old mode 100644 new mode 100755 diff --git a/src/guf_alloc.h b/src/guf_alloc.h old mode 100644 new mode 100755 diff --git a/src/guf_alloc_libc.h b/src/guf_alloc_libc.h old mode 100644 new mode 100755 diff --git a/src/guf_alloc_tracker.h b/src/guf_alloc_tracker.h old mode 100644 new mode 100755 diff --git a/src/guf_assert.h b/src/guf_assert.h old mode 100644 new mode 100755 index 21a1023..1077185 --- a/src/guf_assert.h +++ b/src/guf_assert.h @@ -26,6 +26,7 @@ typedef enum guf_err { GUF_ERR_NOT_FOUND, GUF_ERR_ALREADY_EXISTS, GUF_ERR_ASSERT_FAIL, + GUF_ERR_IO, GUF_ERR_TYPES_NUM } guf_err; diff --git a/src/guf_common.h b/src/guf_common.h old mode 100644 new mode 100755 diff --git a/src/guf_cstr.h b/src/guf_cstr.h old mode 100644 new mode 100755 diff --git a/src/guf_dbuf.h b/src/guf_dbuf.h old mode 100644 new mode 100755 diff --git a/src/guf_hash.h b/src/guf_hash.h old mode 100644 new mode 100755 diff --git a/src/guf_id_pool.h b/src/guf_id_pool.h old mode 100644 new mode 100755 diff --git a/src/guf_init.h b/src/guf_init.h old mode 100644 new mode 100755 diff --git a/src/guf_linalg.h b/src/guf_linalg.h old mode 100644 new mode 100755 diff --git a/src/guf_math.h b/src/guf_math.h old mode 100644 new mode 100755 diff --git a/src/guf_math_ckdint.h b/src/guf_math_ckdint.h old mode 100644 new mode 100755 diff --git a/src/guf_rand.h b/src/guf_rand.h old mode 100644 new mode 100755 diff --git a/src/guf_sort.h b/src/guf_sort.h old mode 100644 new mode 100755 diff --git a/src/guf_str.h b/src/guf_str.h old mode 100644 new mode 100755 index 50e699e..7de9ee0 --- a/src/guf_str.h +++ b/src/guf_str.h @@ -128,6 +128,10 @@ GUF_STR_KWRDS guf_str_tok_state guf_str_tok_state_new(guf_str_view str, guf_str_ */ GUF_STR_KWRDS bool guf_str_tok_next(guf_str_tok_state *state, bool preserve_delims); +GUF_STR_KWRDS unsigned guf_str_view_read_uint(guf_str_view *sv); // TODO: Handle overflow, signs etc. +GUF_STR_KWRDS uint_least64_t guf_str_view_read_u64(guf_str_view *sv); + + // 2.) guf_str: @@ -208,6 +212,14 @@ GUF_STR_KWRDS guf_str *guf_str_append_one_char(guf_str *str, char c); GUF_STR_KWRDS guf_str *guf_str_try_append(guf_str *str, guf_str_view sv, guf_err *err); GUF_STR_KWRDS guf_str *guf_str_append(guf_str *str, guf_str_view sv); +// Append from file: +#define GUF_READ_FILE_BUFSIZE 128 +GUF_STR_KWRDS ptrdiff_t guf_str_try_append_file(guf_str *to_append, const char *fname, guf_err *err); +GUF_STR_KWRDS ptrdiff_t guf_str_append_file(guf_str *to_append, const char *fname); + +// Append ints: +GUF_STR_KWRDS guf_str *guf_str_append_u64(guf_str *str, uint_least64_t n); + // Return a pointer to the null-terminated char array representing the string (works like std::string::c_str in C++) GUF_STR_KWRDS const char *guf_str_const_cstr(const guf_str *str); GUF_STR_KWRDS char *guf_str_try_get_cstr(guf_str *str, guf_err *err); // Error if str is readonly. @@ -1142,6 +1154,66 @@ GUF_STR_KWRDS guf_str *guf_str_append(guf_str *str, guf_str_view sv) return guf_str_try_append(str, sv, NULL); } +GUF_STR_KWRDS ptrdiff_t guf_str_try_append_file(guf_str *to_append, const char *fname, guf_err *err) +{ + if (!fname) { + guf_err_set_or_panic(err, GUF_ERR_NULL_PTR, GUF_ERR_MSG("guf_str_read_file: fname is NULL")); + return 0; + } + + FILE *f = fopen(fname, "r"); + if (!f) { + guf_err_set_or_panic(err, GUF_ERR_IO, GUF_ERR_MSG("guf_str_read_file:: Failed to open file (fopen returned NULL)")); + return 0; + } + + size_t chars_read = 0, total_chars_read = 0; + char buf[GUF_READ_FILE_BUFSIZE] = {'\0'}; + while ((chars_read = fread(buf, sizeof buf[0], GUF_ARR_SIZE(buf), f)) && !ferror(f)) { + guf_str_append(to_append, (guf_str_view){.len = chars_read, .str = buf}); + total_chars_read += chars_read; + if (feof(f)) { + break; + } + } + + if (ferror(f)) { + fclose(f); + guf_err_set_or_panic(err, GUF_ERR_IO, GUF_ERR_MSG("read_file: Unexpected error while reading file")); + } else { + GUF_ASSERT(feof(f)); + fclose(f); + } + + return total_chars_read; +} + +GUF_STR_KWRDS ptrdiff_t guf_str_append_file(guf_str *to_append, const char *fname) { + return guf_str_try_append_file(to_append, fname, NULL); +} + + +GUF_STR_KWRDS guf_str *guf_str_append_u64(guf_str *str, uint_least64_t n) { + + char buf[20] = {'\0'}; + int start_idx = GUF_ARR_SIZE(buf); + int num_digits = 0; + do { + GUF_ASSERT(start_idx > 0); + char c = (n % 10) + '0'; + buf[--start_idx] = c; + ++num_digits; + } while ((n = n / 10)); + + GUF_ASSERT(num_digits == (int)GUF_ARR_SIZE(buf) - start_idx); + + const guf_str_view num_sv = (guf_str_view) {.str = buf + start_idx, .len = num_digits}; + + return guf_str_append(str, num_sv); +} + + + GUF_STR_KWRDS guf_str *guf_str_try_substr(guf_str *str, ptrdiff_t pos, ptrdiff_t count, guf_err *err) { GUF_ASSERT(guf_str_is_valid(str)); @@ -1526,6 +1598,30 @@ GUF_STR_KWRDS bool guf_str_view_equal_val_arg(guf_str_view a_val, guf_str_view b return guf_str_view_equal(&a_val, &b_val); } +GUF_STR_KWRDS unsigned guf_str_view_read_uint(guf_str_view *sv) +{ // TODO: Handle overflow etc. + unsigned res = 0; + while (sv->len && sv->str[0] >= '0' && sv->str[0] <= '9') { + res *= 10; + res += (sv->str[0] - '0'); + sv->len -= 1; + sv->str = sv->len > 0 ? sv->str + 1 : NULL; + } + return res; +} + +GUF_STR_KWRDS uint_least64_t guf_str_view_read_u64(guf_str_view *sv) +{ // TODO: Handle overflow etc. + uint_least64_t res = 0; + while (sv->len && sv->str[0] >= '0' && sv->str[0] <= '9') { + res *= 10; + res += (sv->str[0] - '0'); + sv->len -= 1; + sv->str = sv->len > 0 ? sv->str + 1 : NULL; + } + return res; +} + #undef GUF_STR_IMPL #undef GUF_STR_IMPL_STATIC #endif /* end impl */ diff --git a/src/guf_str_view_type.h b/src/guf_str_view_type.h old mode 100644 new mode 100755 diff --git a/src/guf_utf8.h b/src/guf_utf8.h old mode 100644 new mode 100755 diff --git a/src/guf_utils.h b/src/guf_utils.h old mode 100644 new mode 100755 diff --git a/src/test/data/bartleby.txt b/src/test/data/bartleby.txt old mode 100644 new mode 100755 diff --git a/src/test/data/utf8-test.txt b/src/test/data/utf8-test.txt old mode 100644 new mode 100755 diff --git a/src/test/example.c b/src/test/example.c old mode 100644 new mode 100755 diff --git a/src/test/impls/alloc_libc_impl.c b/src/test/impls/alloc_libc_impl.c old mode 100644 new mode 100755 diff --git a/src/test/impls/alloc_tracker_impl.c b/src/test/impls/alloc_tracker_impl.c old mode 100644 new mode 100755 diff --git a/src/test/impls/ckdint_impl.c b/src/test/impls/ckdint_impl.c old mode 100644 new mode 100755 diff --git a/src/test/impls/dbuf_impl.c b/src/test/impls/dbuf_impl.c old mode 100644 new mode 100755 diff --git a/src/test/impls/dbuf_impl.h b/src/test/impls/dbuf_impl.h old mode 100644 new mode 100755 diff --git a/src/test/impls/dict_impl.c b/src/test/impls/dict_impl.c old mode 100644 new mode 100755 diff --git a/src/test/impls/dict_impl.h b/src/test/impls/dict_impl.h old mode 100644 new mode 100755 diff --git a/src/test/impls/init_impl.c b/src/test/impls/init_impl.c old mode 100644 new mode 100755 diff --git a/src/test/impls/linalg_impl.c b/src/test/impls/linalg_impl.c old mode 100644 new mode 100755 diff --git a/src/test/impls/rand_impl.c b/src/test/impls/rand_impl.c old mode 100644 new mode 100755 diff --git a/src/test/impls/sort_impl.c b/src/test/impls/sort_impl.c old mode 100644 new mode 100755 diff --git a/src/test/impls/sort_impl.h b/src/test/impls/sort_impl.h old mode 100644 new mode 100755 diff --git a/src/test/impls/str_impl.c b/src/test/impls/str_impl.c old mode 100644 new mode 100755 diff --git a/src/test/test.cpp b/src/test/test.cpp old mode 100644 new mode 100755 diff --git a/src/test/test.hpp b/src/test/test.hpp old mode 100644 new mode 100755 diff --git a/src/test/test_ckdint.cpp b/src/test/test_ckdint.cpp old mode 100644 new mode 100755 diff --git a/src/test/test_ckdint.hpp b/src/test/test_ckdint.hpp old mode 100644 new mode 100755 diff --git a/src/test/test_dbuf.cpp b/src/test/test_dbuf.cpp old mode 100644 new mode 100755 diff --git a/src/test/test_dbuf.hpp b/src/test/test_dbuf.hpp old mode 100644 new mode 100755 diff --git a/src/test/test_dict.cpp b/src/test/test_dict.cpp old mode 100644 new mode 100755 diff --git a/src/test/test_dict.hpp b/src/test/test_dict.hpp old mode 100644 new mode 100755 diff --git a/src/test/test_str.cpp b/src/test/test_str.cpp old mode 100644 new mode 100755 diff --git a/src/test/test_str.hpp b/src/test/test_str.hpp old mode 100644 new mode 100755 diff --git a/src/test/test_utf8.cpp b/src/test/test_utf8.cpp old mode 100644 new mode 100755 diff --git a/src/test/test_utf8.hpp b/src/test/test_utf8.hpp old mode 100644 new mode 100755 diff --git a/todo.txt b/todo.txt old mode 100644 new mode 100755 index 8070cb8..3fb13a1 --- a/todo.txt +++ b/todo.txt @@ -1,5 +1,7 @@ - fix readonly str/uninit ? +- dict: allow set + - guf_stack, guf_queue, guf_dqueue, guf_prio_queue (using a heap), guf_ringbuf - sort: add cpp #ifdef to remove restrict from declaration diff --git a/tools/ckdint-gen.py b/tools/ckdint-gen.py old mode 100644 new mode 100755 diff --git a/tools/intwrap-gen.py b/tools/intwrap-gen.py old mode 100644 new mode 100755 diff --git a/tools/min_max_clamp-gen.py b/tools/min_max_clamp-gen.py old mode 100644 new mode 100755