jrk

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

commit ef34e44bcb73003b7a7496f9da4bc687ff80e404
parent bb865556c6230d1133f5a6a9f09f18626487e4f5
Author: Jake Koroman <jake@jakekoroman.com>
Date:   Thu, 31 Jul 2025 13:10:42 -0400

add jrk_fd functions.

Diffstat:
Mjrk.h | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 91 insertions(+), 0 deletions(-)

diff --git a/jrk.h b/jrk.h @@ -40,6 +40,15 @@ void jrk_arena_expand(jrk_Arena*, u64); i32 jrk_rand_num(i32); i32 jrk_rand_num_range(i32, i32); +i32 jrk_fd_open_read(char*); +i32 jrk_fd_open_write(char*); +i32 jrk_fd_open_write_append(char*); +void jrk_fd_close(i32); + +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); + /* 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) @@ -113,6 +122,8 @@ i32 jrk_rand_num_range(i32, i32); #define sb_append_buf jrk_sb_append_buf #define sb_append_cstr jrk_sb_append_cstr #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 ecalloc jrk_ecalloc #define erealloc jrk_erealloc @@ -133,14 +144,22 @@ i32 jrk_rand_num_range(i32, i32); #define rand_num jrk_rand_num #define rand_num_range jrk_rand_num_range + + #define fd_close jrk_fd_close + #define fd_open_read jrk_fd_open_read + #define fd_open_write jrk_fd_open_write + #define fd_open_write_append jrk_fd_open_write_append #endif // JRK_SHORTNAMES #ifdef JRK_IMPLEMENTATION #include <errno.h> +#include <fcntl.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/stat.h> +#include <unistd.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) @@ -217,6 +236,78 @@ jrk_sb_appendf(jrk_StringBuilder *sb, const char *fmt, ...) return n; } +u64 jrk_fd_size(i32 fd) +{ + struct stat statbuf = {0}; + if (fstat(fd, &statbuf) < 0) + jrk_edie("jrk_fd_size"); + + return statbuf.st_size; +} + +void +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); + sb->count = sz; +} + +u64 +jrk_sb_fd_write_all(jrk_StringBuilder *sb, i32 fd) +{ + u64 result; + result = write(fd, (void *) sb->items, sb->count); + if (result < 0) + jrk_edie("jrk_sb_fd_write_all"); + + return result; +} + +void +jrk_fd_close(i32 fd) +{ + close(fd); +} + +i32 +jrk_fd_open_read(char *path) +{ + i32 result = open(path, O_RDONLY); + + if (result < 0) + jrk_edie("jrk_fd_open_read"); + + return result; +} + +i32 +jrk_fd_open_write(char *path) +{ + i32 result = open(path, + O_WRONLY | O_CREAT | O_TRUNC, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + + if (result < 0) + jrk_edie("jrk_fd_open_read"); + + return result; +} + +i32 +jrk_fd_open_write_append(char *path) +{ + i32 result = open(path, + O_WRONLY | O_CREAT | O_APPEND, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + + if (result < 0) + jrk_edie("jrk_fd_open_read"); + + return result; +} + i32 jrk_rand_num(i32 upbound) {