diff options
author | pryazha <pryadeiniv@mail.ru> | 2025-07-09 15:37:44 +0500 |
---|---|---|
committer | pryazha <pryadeiniv@mail.ru> | 2025-07-09 15:37:44 +0500 |
commit | 3f68a5ea045f3a097768c681ecf60989ca296ec1 (patch) | |
tree | 163cf9ad0631d839da7912afca03a9dadd120806 | |
parent | ea6cdf80a35f0a3c45833e94782cfd1ec7dae929 (diff) |
-rw-r--r-- | example/arena.c | 17 | ||||
-rwxr-xr-x | example/build.sh | 14 | ||||
-rw-r--r-- | example/macros.c (renamed from example/example.c) | 82 | ||||
-rw-r--r-- | example/string.c | 34 | ||||
-rw-r--r-- | example/sys.c | 43 | ||||
-rw-r--r-- | prb_linux.h | 11 | ||||
-rw-r--r-- | prb_sys.h | 7 | ||||
-rw-r--r-- | prb_windows.h | 11 |
8 files changed, 132 insertions, 87 deletions
diff --git a/example/arena.c b/example/arena.c new file mode 100644 index 0000000..addf4ee --- /dev/null +++ b/example/arena.c @@ -0,0 +1,17 @@ +#include "prb.h" + +i32 main(void) +{ + printf("Arenas:\n"); + + arena_t arena = alloc_arena(10); + u8 *first = push_arena(&arena, 5); + prb_memset(first, 5, 5); + u8 *second = push_arena(&arena, 5); + prb_memset(second, 10, 5); + printf("|"); + for (i32 i = 0; i < 10; i++) + printf("%x%s", first[i], ((i+1) % 5 == 0) ? "|" : " "); + printf("\n"); + release_arena(&arena); +} diff --git a/example/build.sh b/example/build.sh index de969e8..e6cee7c 100755 --- a/example/build.sh +++ b/example/build.sh @@ -1,14 +1,22 @@ #!/bin/sh compiler='gcc' +path=`dirname $0` +cd $path if [ $# -eq 1 ] ; then if [ $1 = 'windows' ] ; then compiler='x86_64-w64-mingw32-gcc' fi + if [ $1 = 'clean' ] ; then + set -x + rm -f macros macros.exe arena arena.exe sys sys.exe string string.exe + exit + fi fi cflags='-g -Wall' include='-I..' libs='-lm' -path=`dirname $0` set -x -cd $path -$compiler $cflags $include -o example example.c $libs +$compiler $cflags $include -o macros macros.c $libs +$compiler $cflags $include -o arena arena.c $libs +$compiler $cflags $include -o sys sys.c $libs +$compiler $cflags $include -o string string.c $libs diff --git a/example/example.c b/example/macros.c index bce70bb..169a2ca 100644 --- a/example/example.c +++ b/example/macros.c @@ -1,13 +1,13 @@ #include "prb.h" -#define MAX_NODES 10 - typedef struct { i32 i32_element; i16 i16_element; u8 u8_element; } type_t; +#define MAX_NODES 10 + typedef struct stack_node_t { i32 value; struct stack_node_t *next; @@ -31,25 +31,6 @@ typedef struct { i32 main(void) { - // os - printf("os: "); - switch (OS) { - case OS_LINUX: - printf("linux\n"); - break; - case OS_WINDOWS: - printf("windows\n"); - break; - default: - printf("unsupported\n"); - return 1; - } - - arena_t path_arena = alloc_arena(MAX_PATH); - char *dir = sys_getbindir(&path_arena); - printf("bin directory \"%s\"\n", dir); - - // macros u64 offset = offsetof(type_t, u8_element); assert(offset == 6); printf("offsetof(type_t, u8_element) = %lu\n", offset); @@ -70,9 +51,7 @@ i32 main(void) assert(!nums[i]); printf("%x%s", nums[i], (i == array_count(nums)-1) ? "" : ", "); } - printf("]\n"); - - printf("\n"); + printf("]\n\n"); printf("Singly linked list (stack for example):\n"); @@ -114,59 +93,4 @@ i32 main(void) printf("%d%s", node->value, ((node->next) ? " -> " : "\n")); printf("\n"); - - printf("I'm pretty sure the vectors are fine\n"); - printf("At least for the last few months :)\n\n"); - - printf("Arenas:\n"); - - arena_t arena = alloc_arena(10); - u8 *first = push_arena(&arena, 5); - prb_memset(first, 5, 5); - u8 *second = push_arena(&arena, 5); - prb_memset(second, 10, 5); - printf("|"); - for (i32 i = 0; i < 10; i++) - printf("%x%s", first[i], ((i+1) % 5 == 0) ? "|" : " "); - printf("\n"); - release_arena(&arena); - - printf("Strings:\n"); - - arena_t str_arena = alloc_arena(0); - str8_list_t strlist = {0}; - str8_list_push(&str_arena, &strlist, 0, str8lit("first ")); - str8_list_push(&str_arena, &strlist, 0, str8lit("second ")); - str8_list_push(&str_arena, &strlist, 0, str8lit("third\n")); - str8_print(str8lit("strlist: ")); - str8_list_print(&strlist); - - str8_t fstr = str8_pushf(&str_arena, "Formatted string: %d\n", 69); - str8_print(fstr); - - memzero_struct(&strlist); - str8_list_pushf(&str_arena, &strlist, 0, "first %d -> ", 34); - str8_list_pushf(&str_arena, &strlist, 0, "second: %d -> ", 35); - str8_list_pushf(&str_arena, &strlist, 0, "sum: %d\n", 34+35); - str8_list_pushf(&str_arena, &strlist, 1, "%s", "To the front -> "); - - str8_print(str8lit("Formatted string list:\n")); - str8_list_print(&strlist); - - str8_t catstr = str8_list_join(&str_arena, &strlist); - str8_print(str8lit("Concatenated string list:\n")); - str8_print(catstr); - - release_arena(&str_arena); - - const char *filename = "build.sh"; - arena = alloc_arena(megabytes(1)); - char *content; - if (sys_read_file(&arena, &content, filename)) - printf("%s content:\n%s", filename, content); - else - printf("failed to read %s\n", filename); - release_arena(&arena); - - return(0); } diff --git a/example/string.c b/example/string.c new file mode 100644 index 0000000..fbd0943 --- /dev/null +++ b/example/string.c @@ -0,0 +1,34 @@ +#include "prb.h" + +i32 main(void) +{ + printf("Strings:\n"); + + arena_t str_arena = alloc_arena(0); + str8_list_t strlist = {0}; + str8_list_push(&str_arena, &strlist, 0, str8lit("first ")); + str8_list_push(&str_arena, &strlist, 0, str8lit("second ")); + str8_list_push(&str_arena, &strlist, 0, str8lit("third\n")); + str8_print(str8lit("strlist: ")); + str8_list_print(&strlist); + + str8_t fstr = str8_pushf(&str_arena, "Formatted string: %d\n", 69); + str8_print(fstr); + + memzero_struct(&strlist); + str8_list_pushf(&str_arena, &strlist, 0, "first %d -> ", 34); + str8_list_pushf(&str_arena, &strlist, 0, "second: %d -> ", 35); + str8_list_pushf(&str_arena, &strlist, 0, "sum: %d\n", 34+35); + str8_list_pushf(&str_arena, &strlist, 1, "%s", "To the front -> "); + + str8_print(str8lit("Formatted string list:\n")); + str8_list_print(&strlist); + + str8_t catstr = str8_list_join(&str_arena, &strlist); + str8_print(str8lit("Concatenated string list:\n")); + str8_print(catstr); + + release_arena(&str_arena); + + return(0); +} diff --git a/example/sys.c b/example/sys.c new file mode 100644 index 0000000..f9f5c33 --- /dev/null +++ b/example/sys.c @@ -0,0 +1,43 @@ +#include "prb.h" + +i32 main(void) +{ + void *mem; + arena_t arena; + char *dir, *content, *path; + const char *filename = "build.sh"; + + printf("os: "); + switch (OS) { + case OS_LINUX: + printf("linux\n"); + break; + case OS_WINDOWS: + printf("windows\n"); + break; + default: + printf("unsupported\n"); + return 1; + } + + mem = sys_alloc(megabytes(32)); + assert(mem); + sys_free(mem, megabytes(32)); + + arena = alloc_arena(megabytes(32)); + + dir = sys_getbindir(&arena); + printf("bin directory \"%s\"\n", dir); + + path = push_arena(&arena, MAX_PATH); + memset(path, 0, MAX_PATH); + snprintf(path, MAX_PATH, "%s/%s", dir, filename); + + if (sys_read_file(&arena, &content, path)) + printf("%s content:\n%s", path, content); + else + printf("failed to read %s\n", path); + + if (!sys_read_file(&arena, &content, filename)) + die("failed to read %s\n", filename); +} diff --git a/prb_linux.h b/prb_linux.h index 3acc229..9a6ba90 100644 --- a/prb_linux.h +++ b/prb_linux.h @@ -17,6 +17,17 @@ void sys_free(void *memory, u64 length) munmap(memory, length); } +void die(const char *error_string, ...) +{ + va_list args; + va_start(args, error_string); + fprintf(stderr, "error: "); + vfprintf(stderr, error_string, args); + fprintf(stderr, "\n"); + va_end(args); + _exit(1); +} + u64 sys_read_file(arena_t *arena, char **buffer, const char *filename) { FILE *file = fopen(filename, "rb"); @@ -1,10 +1,7 @@ -#define MAX_PATH 512 +#define MAX_PATH 1024 extern void *sys_alloc(u64 length); extern void sys_free(void *memory, u64 length); - -// TODO(pryazha): Try using exit_failure, seems reasonable. I/O (file mainly) is a concern though -// extern void exit_failure(const char *format, ...); - +extern void die(const char *format, ...); extern u64 sys_read_file(arena_t *arena, char **buffer, const char *filename); extern char *sys_getbindir(arena_t *arena); diff --git a/prb_windows.h b/prb_windows.h index aec7e9b..9514c75 100644 --- a/prb_windows.h +++ b/prb_windows.h @@ -12,6 +12,17 @@ void sys_free(void *memory, u64 length) assert(VirtualFree(memory, 0, MEM_RELEASE)); } +void die(const char *error_string, ...) +{ + va_list args; + va_start(args, error_string); + printf("error: "); + vprintf(error_string, args); + printf("\n"); + va_end(args); + exit(1); +} + u64 sys_read_file(arena_t *arena, char **buffer, const char *filename) { *buffer = 0; |