commit ef34e44bcb73003b7a7496f9da4bc687ff80e404
parent bb865556c6230d1133f5a6a9f09f18626487e4f5
Author: Jake Koroman <jake@jakekoroman.com>
Date: Thu, 31 Jul 2025 13:10:42 -0400
add jrk_fd functions.
Diffstat:
M | jrk.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)
{