From f4d4a8ab0043be496f8e0532b4aae41aaeee4b67 Mon Sep 17 00:00:00 2001 From: cannoli-fruit Date: Wed, 8 Jul 2026 22:34:18 -0400 Subject: [PATCH] init --- .gitingnore | 1 + README.md | 5 ++ TODO.md | 3 + a.out | Bin 0 -> 16384 bytes examples/da_float.c | 17 +++++ examples/da_ins.c | 22 ++++++ examples/sb_concat.c | 14 ++++ examples/string_split.c | 25 +++++++ examples/string_trim.c | 17 +++++ lazy.h | 162 ++++++++++++++++++++++++++++++++++++++++ 10 files changed, 266 insertions(+) create mode 100644 .gitingnore create mode 100644 README.md create mode 100644 TODO.md create mode 100755 a.out create mode 100644 examples/da_float.c create mode 100644 examples/da_ins.c create mode 100644 examples/sb_concat.c create mode 100644 examples/string_split.c create mode 100644 examples/string_trim.c create mode 100644 lazy.h diff --git a/.gitingnore b/.gitingnore new file mode 100644 index 0000000..f8305e7 --- /dev/null +++ b/.gitingnore @@ -0,0 +1 @@ +a.out \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a42ecc0 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# LAZY.h +I like C but i'm also getting tired of writing dynamic arrays, hopefully this is just all the default data structures and utilities for having fun in C. + +Don't expect production ready, I'll probably change most things a decent amount +If you want consistency just clone the header file and don't update diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..7ab4a92 --- /dev/null +++ b/TODO.md @@ -0,0 +1,3 @@ +# TODO +Change all string slice functions to start with lz_slc + diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..70dc073447fb89a5834bb548150fd6d800d3820d GIT binary patch literal 16384 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 GRsR65JhG?& literal 0 HcmV?d00001 diff --git a/examples/da_float.c b/examples/da_float.c new file mode 100644 index 0000000..08455a3 --- /dev/null +++ b/examples/da_float.c @@ -0,0 +1,17 @@ +#include +#define LAZY_IMPL +#include "lazy.h" + +int main() { + Lz_DA(float) nums = {0}; + lz_da_reserve(nums, 64); + for (int i = 0; i < 32; ++i) { + lz_da_append(nums, 2.0*i); + } + + for (int i = 0; i < nums.cnt; ++i) { + printf("%f\n", nums.elts[i]); + } + + return 0; +} diff --git a/examples/da_ins.c b/examples/da_ins.c new file mode 100644 index 0000000..01d7664 --- /dev/null +++ b/examples/da_ins.c @@ -0,0 +1,22 @@ +#include +#define LAZY_IMPL +#include "../lazy.h" + +int main() { + Lz_DA(int) xs = {0}; + lz_da_append(xs, 1); + lz_da_append(xs, 3); + lz_da_append(xs, 4); + lz_da_shrink_to_fit(xs); + + for (int i = 0; i < xs.cnt; ++i) { + printf("%d: %d\n", i, xs.elts[i]); + } + + printf("\n"); + lz_da_insert(xs,1,2); + + for (int i = 0; i < xs.cnt; ++i) { + printf("%d: %d\n", i, xs.elts[i]); + } +} diff --git a/examples/sb_concat.c b/examples/sb_concat.c new file mode 100644 index 0000000..a2a2af8 --- /dev/null +++ b/examples/sb_concat.c @@ -0,0 +1,14 @@ +#include +#define LAZY_IMPL +#include "../lazy.h" + +int main() { + Lz_SB sb1 = lz_sb_from_cstr("Hello "); + Lz_SB sb2 = lz_sb_from_cstr("World!"); + + lz_da_concat(sb1,sb2); + + printf(LZ_STR_FMT"\n", LZ_STR_PRINTF(sb1)); + + return 0; +} diff --git a/examples/string_split.c b/examples/string_split.c new file mode 100644 index 0000000..0de3d94 --- /dev/null +++ b/examples/string_split.c @@ -0,0 +1,25 @@ +#define LAZY_IMPL +#include "lazy.h" +#include +#include +#include + +int isnotalpha(int x) { return !isalpha(x); } + +int main() { + char *src = strdup("This is a list of words, which apparently has been referred to previously as a sentence") + Lz_Slc s = lz_cstr_to_slc(src); + + Lz_Slc word; + int i = 0; + do { + lz_split_slc_typ(&s, isnotalpha, &word); + printf("Word %d: "LZ_SLC_FMT"\n", i, LZ_SLC_PRINTF(word)); + ++i; + } while(s.len != 0); + + free(src); + + return 0; + +} diff --git a/examples/string_trim.c b/examples/string_trim.c new file mode 100644 index 0000000..83b3502 --- /dev/null +++ b/examples/string_trim.c @@ -0,0 +1,17 @@ +#include +#include +#define LAZY_IMPL +#include "lazy.h" + +int main() { + char *src = strdup(" \t This text has some extra whitespace \t "); + Lz_Slc s = lz_cstr_to_slc(src); + + printf("|"LZ_SLC_FMT"|\n", LZ_SLC_PRINTF(s)); + lz_trim_typ(&s, isspace); + printf("|"LZ_SLC_FMT"|\n", LZ_SLC_PRINTF(s)); + + free(src); // excessive but this is how you should do it + + return 0; +} diff --git a/lazy.h b/lazy.h new file mode 100644 index 0000000..055591b --- /dev/null +++ b/lazy.h @@ -0,0 +1,162 @@ +#include +#include +#include +#include + +#define LZ_STR_FMT "%.*s" +#define LZ_STR_PRINTF(slc) (int)slc.cnt, slc.data + +typedef struct { + char *data; + size_t cnt; +} Lz_Slc; + +void lz_trim_left_typ(Lz_Slc *src, int (*classfunc)(int)); +void lz_trim_right_typ(Lz_Slc *src, int (*classfunc)(int)); +void lz_trim_typ(Lz_Slc *src, int (*classfunc)(int)); +void lz_drop_left(Lz_Slc *src, size_t n); +void lz_drop_right(Lz_Slc *src, size_t n); +void lz_split_slc(Lz_Slc *src, char delim, Lz_Slc *dst); +void lz_split_slc_typ(Lz_Slc *src, int (*classfunc)(int), Lz_Slc *dst); +Lz_Slc lz_cstr_to_slc(char *dat); + +#define Lz_DA(T) struct {T *data; size_t cnt; size_t cap; } +#define lz_da_append(da, x) do { \ + if ((da).cap > (da).cnt) {\ + (da).data[(da).cnt++] = (x);\ + } else if((da).cap == 0) {\ + (da).data = malloc(256*sizeof(*(da).data));\ + (da).cap = 256;\ + (da).cnt = 0;\ + (da).data[(da).cnt++] = (x);\ + } else {\ + (da).data = realloc((da).data, sizeof(*(da).data)*(da).cap*(2));\ + (da).cap *= 2;\ + (da).data[(da).cnt++] = (x);\ + }\ +} while(0) +#define lz_da_insert(da, i, x) do {\ + if ((i) > (da).cnt) {\ + assert(0 && "Insert out of dynamic array size");\ + }\ + if ((i) < 0) {\ + assert(0 && "Negative index of insertion");\ + }\ + if ((da).cap > (da).cnt) {\ + memmove((da).data+(i)+1,(da).data+(i),((da).cnt-(i))*sizeof(*(da).data));\ + (da).data[i] = (x);\ + (da).cnt++;\ + } else if ((da).cap == (da).cnt) {\ + (da).data = realloc((da).data, sizeof(*(da).data)*(da).cap*2);\ + (da).cap *= 2;\ + memmove((da).data+(i)+1,(da).data+(i),((da).cnt-(i))*sizeof(*(da).data));\ + (da).data[i] = (x);\ + (da).cnt++;\ + } else {\ + assert(0 && "Unreachable thru proper dynamic array functions");\ + }\ +} while(0) +#define lz_da_pop(da) do {\ + if ((da).cnt > 0) {\ + (da).cnt--;\ + }\ +} while(0) +#define lz_da_concat(dst,src) do {\ + if (sizeof(*(dst).data) != sizeof(*(dst).data)) {\ + assert(0 && "Mismatched types of arrays being concatenated");\ + }\ + lz_da_reserve((dst),((src).cnt+(dst).cnt));\ + memcpy((dst).data+(dst).cnt, (src).data, (src).cnt*sizeof(*(dst).data));\ + (dst).cnt = ((src).cnt+(dst).cnt);\ +} while(0) +#define lz_da_destroy(da) do { free((da).data); } while (0); +#define lz_da_reserve(da, size) do {\ + if ((da).cap < (size)) {\ + (da).data = realloc((da).data, (size)*sizeof(*(da).data));\ + (da).cap = (size);\ + }\ +} while (0) +#define lz_da_shrink_to_fit(da) do {\ + if ((da).cnt == (da).cap) break;\ + (da).data = realloc((da).data, (da).cnt * sizeof(*(da).data));\ + (da).cap = (da).cnt;\ +} while(0) + +typedef Lz_DA(char) Lz_SB; + +#ifdef LAZY_IMPL +void lz_drop_left(Lz_Slc *src, size_t n) { + if (src->cnt < n) n = src->cnt; + src->data += n; + src->cnt -= n; +} + +void lz_drop_right(Lz_Slc *src, size_t n) { + if (src->cnt < n) n = src->cnt; + src->cnt -= n; +} + +void lz_trim_left_typ(Lz_Slc *src, int (*classfunc)(int)) { + while (classfunc(src->data[0])) { + lz_drop_left(src, 1); + } +} + +void lz_trim_right_typ(Lz_Slc *src, int (*classfunc)(int)) { + while (classfunc(src->data[src->cnt-1])) { + lz_drop_right(src, 1); + } +} + +void lz_trim_typ(Lz_Slc *src, int (*classfunc)(int)) { + lz_trim_left_typ(src, classfunc); + lz_trim_right_typ(src, classfunc); +} + +void lz_split_slc(Lz_Slc *src, char delim, Lz_Slc *dst) { + size_t i = 0; + while (i < src->cnt && src->data[i] != delim) { + ++i; + } + dst->data = src->data; + dst->cnt = i; + if (src->cnt != i) { + src->data += i+1; + src->cnt -= i+1; + } else { + src->cnt = 0; + } +} + +void lz_split_slc_typ(Lz_Slc *src, int (*classfunc)(int), Lz_Slc *dst) { + size_t i = 0; + while (i < src->cnt && !classfunc(src->data[i])) { + ++i; + } + dst->data = src->data; + dst->cnt = i; + if (src->cnt != i) { + src->data += i+1; + src->cnt -= i+1; + } else { + src->cnt = 0; + } + lz_trim_left_typ(src, classfunc); +} + +Lz_SB lz_sb_from_cstr(const char *dat) { + size_t len = strlen(dat); + Lz_SB sb = {0}; + lz_da_reserve(sb, len); + memcpy(sb.data, dat, len*sizeof(char)); + sb.cnt = len; + return sb; +} + +Lz_Slc lz_cstr_to_slc(char *dat) { + Lz_Slc out = {0}; + out.data = dat; + out.cnt = strlen(dat); + return out; +} +#endif