jrk

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

commit 15f1d8efe1195049ae3edfd1699db2a695ccadb8
parent 171444e442f450ebc1964da0cba6dec59d759f0f
Author: Jake Koroman <jake@jakekoroman.com>
Date:   Wed, 23 Jul 2025 10:43:49 -0400

add jrk_ecalloc and jrk_erealloc.

Diffstat:
Mjrk.h | 42+++++++++++++++++++++++++++++++++---------
1 file changed, 33 insertions(+), 9 deletions(-)

diff --git a/jrk.h b/jrk.h @@ -40,6 +40,9 @@ typedef struct { u64 length; } jrk_string; +void *jrk_ecalloc(u64, u64); +void *jrk_erealloc(void*, u64); + void *jrk_arrgrow(void*, u64, u64, u64); jrk_arena jrk_arena_create(u64); @@ -51,8 +54,8 @@ jrk_string jrk_strchop_delim(char*, char, u64); void jrk_strput(jrk_string); void jrk_strputn(jrk_string, u64); -static inline i32 jrk_rand_num(i32); -static inline i32 jrk_rand_num_range(i32, i32); +i32 jrk_rand_num(i32); +i32 jrk_rand_num_range(i32, i32); #define jrk_arrsetcap(arr,n) ((arr) = jrk_arrgrow(arr,0,sizeof(typeof(*arr)),n)) #define jrk_arr_header(arr) ((jrk_array_header *) (arr) - 1) @@ -73,6 +76,9 @@ static inline i32 jrk_rand_num_range(i32, i32); delim, n) #ifdef JRK_SHORTNAMES +#define ecalloc jrk_ecalloc +#define erealloc jrk_erealloc + #define arrput jrk_arrput #define arrlen jrk_arrlen #define arrcap jrk_arrcap @@ -100,6 +106,7 @@ static inline i32 jrk_rand_num_range(i32, i32); #include <errno.h> #include <stdio.h> #include <stdlib.h> +#include <string.h> #define jrk_die(x) do { fprintf(stderr, "%s:%d: error: "x"\n", __FILE__, __LINE__); exit(69); } while(0) #define jrk_edie(x) do { fprintf(stderr, "%s:%d: error: "x": %s\n", __FILE__, __LINE__, strerror(errno)); exit(69); } while(0) @@ -110,6 +117,26 @@ static inline i32 jrk_rand_num_range(i32, i32); #endif // JRK_SHORTNAMES void * +jrk_ecalloc(u64 nmemb, u64 size) +{ + void *p; + + if (!(p = calloc(nmemb, size))) + jrk_edie("jrk_ecalloc"); + return p; +} + +void * +jrk_erealloc(void *ptr, u64 size) +{ + void *p; + + if (!(p = realloc(ptr, size))) + edie("jrk_erealloc"); + return p; +} + +void * jrk_arrgrow(void *arr, u64 addlen, u64 elemsize, u64 min_cap) { u64 min_len = jrk_arrlen(arr) + addlen; @@ -125,7 +152,7 @@ jrk_arrgrow(void *arr, u64 addlen, u64 elemsize, u64 min_cap) else if (min_cap < 4) min_cap = 4; - void *temp = realloc(arr ? jrk_arr_header(arr) : NULL, elemsize * min_cap + sizeof(jrk_array_header)); + void *temp = jrk_erealloc(arr ? jrk_arr_header(arr) : NULL, elemsize * min_cap + sizeof(jrk_array_header)); temp = (jrk_array_header *) temp + 1; if (arr == NULL) @@ -159,10 +186,7 @@ jrk__arena_push(jrk_arena *arena, u64 n) void jrk_arena_expand(jrk_arena *arena, u64 new_capacity) { - u8 *tmp = realloc(arena->data, new_capacity); - - if (!tmp) - jrk_die("buy more ram lol"); + u8 *tmp = jrk_erealloc(arena->data, new_capacity); arena->capacity = new_capacity; arena->data = tmp; @@ -203,13 +227,13 @@ jrk_strputn(jrk_string string, u64 n) printf("%*.*s\n", (int) n, (int) n, string.data); } -static inline i32 +i32 jrk_rand_num(i32 upbound) { return rand() % upbound + 1; } -static inline i32 +i32 jrk_rand_num_range(i32 min, i32 max) { return rand() % (max - min + 1) + min;