From 3f68a5ea045f3a097768c681ecf60989ca296ec1 Mon Sep 17 00:00:00 2001 From: pryazha Date: Wed, 9 Jul 2025 15:37:44 +0500 Subject: organized examples --- example/arena.c | 17 ++++++ example/build.sh | 14 ++++- example/example.c | 172 ------------------------------------------------------ example/macros.c | 96 ++++++++++++++++++++++++++++++ example/string.c | 34 +++++++++++ example/sys.c | 43 ++++++++++++++ prb_linux.h | 11 ++++ prb_sys.h | 7 +-- prb_windows.h | 11 ++++ 9 files changed, 225 insertions(+), 180 deletions(-) create mode 100644 example/arena.c delete mode 100644 example/example.c create mode 100644 example/macros.c create mode 100644 example/string.c create mode 100644 example/sys.c 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/example.c deleted file mode 100644 index bce70bb..0000000 --- a/example/example.c +++ /dev/null @@ -1,172 +0,0 @@ -#include "prb.h" - -#define MAX_NODES 10 - -typedef struct { - i32 i32_element; - i16 i16_element; - u8 u8_element; -} type_t; - -typedef struct stack_node_t { - i32 value; - struct stack_node_t *next; -} stack_node_t; - -typedef struct { - stack_node_t *first; - stack_node_t *last; -} stack_t; - -typedef struct node_t { - i32 value; - struct node_t *next; - struct node_t *prev; -} node_t; - -typedef struct { - node_t *first; - node_t *last; -} list_t; - -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); - i32 clamped = clamp(0, -1, 1); - assert(clamped == 0); - printf("clamp(0, -1, 1) = %d\n", clamped); - clamped = clamp(0, 2, 1); - assert(clamped == 1); - printf("clamp(0, 2, 1) = %d\n", clamped); - - i32 nums[] = {0, 1, 2, 3}; - printf("mem0: ["); - for (i32 i = 0; i < array_count(nums); ++i) - printf("%x%s", nums[i], (i == array_count(nums)-1) ? "" : ", "); - memzero(nums, sizeof(nums)); - printf("] -> ["); - for (i32 i = 0; i < array_count(nums); ++i) { - assert(!nums[i]); - printf("%x%s", nums[i], (i == array_count(nums)-1) ? "" : ", "); - } - printf("]\n"); - - printf("\n"); - - printf("Singly linked list (stack for example):\n"); - - stack_node_t stack_nodes[MAX_NODES]; - stack_t stack = {0}; - for (i32 i = 0; i < MAX_NODES; ++i) { - stack_node_t *node = stack_nodes+i; - node->value = i; - sllpush(stack.first, stack.last, node); - } - - for (stack_node_t *node = stack.first; node; node = node->next) - printf("%d%s", node->value, ((node->next) ? " -> " : "\n")); - - sllpop(stack.first, stack.last); - - printf("After pop:\n"); - for (stack_node_t *node = stack.first; node; node = node->next) - printf("%d%s", node->value, ((node->next) ? " -> " : "\n")); - - node_t nodes[MAX_NODES]; - list_t list = {0}; - for (i32 i = 0; i < MAX_NODES; ++i) { - node_t *node = nodes+i; - node->value = i; - dllpushback(list.first, list.last, node); - } - - printf("Doubly linked list:\n"); - for (node_t *node = list.first; node; node = node->next) - printf("%d%s", node->value, ((node->next) ? " -> " : "\n")); - - printf("Remove odd numbers:\n"); - for (node_t *node = list.first; node; node = node->next) - if (node->value % 2 == 1) - dllremove(list.first, list.last, node); - - for (node_t *node = list.first; node; node = node->next) - 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/macros.c b/example/macros.c new file mode 100644 index 0000000..169a2ca --- /dev/null +++ b/example/macros.c @@ -0,0 +1,96 @@ +#include "prb.h" + +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; +} stack_node_t; + +typedef struct { + stack_node_t *first; + stack_node_t *last; +} stack_t; + +typedef struct node_t { + i32 value; + struct node_t *next; + struct node_t *prev; +} node_t; + +typedef struct { + node_t *first; + node_t *last; +} list_t; + +i32 main(void) +{ + u64 offset = offsetof(type_t, u8_element); + assert(offset == 6); + printf("offsetof(type_t, u8_element) = %lu\n", offset); + i32 clamped = clamp(0, -1, 1); + assert(clamped == 0); + printf("clamp(0, -1, 1) = %d\n", clamped); + clamped = clamp(0, 2, 1); + assert(clamped == 1); + printf("clamp(0, 2, 1) = %d\n", clamped); + + i32 nums[] = {0, 1, 2, 3}; + printf("mem0: ["); + for (i32 i = 0; i < array_count(nums); ++i) + printf("%x%s", nums[i], (i == array_count(nums)-1) ? "" : ", "); + memzero(nums, sizeof(nums)); + printf("] -> ["); + for (i32 i = 0; i < array_count(nums); ++i) { + assert(!nums[i]); + printf("%x%s", nums[i], (i == array_count(nums)-1) ? "" : ", "); + } + printf("]\n\n"); + + printf("Singly linked list (stack for example):\n"); + + stack_node_t stack_nodes[MAX_NODES]; + stack_t stack = {0}; + for (i32 i = 0; i < MAX_NODES; ++i) { + stack_node_t *node = stack_nodes+i; + node->value = i; + sllpush(stack.first, stack.last, node); + } + + for (stack_node_t *node = stack.first; node; node = node->next) + printf("%d%s", node->value, ((node->next) ? " -> " : "\n")); + + sllpop(stack.first, stack.last); + + printf("After pop:\n"); + for (stack_node_t *node = stack.first; node; node = node->next) + printf("%d%s", node->value, ((node->next) ? " -> " : "\n")); + + node_t nodes[MAX_NODES]; + list_t list = {0}; + for (i32 i = 0; i < MAX_NODES; ++i) { + node_t *node = nodes+i; + node->value = i; + dllpushback(list.first, list.last, node); + } + + printf("Doubly linked list:\n"); + for (node_t *node = list.first; node; node = node->next) + printf("%d%s", node->value, ((node->next) ? " -> " : "\n")); + + printf("Remove odd numbers:\n"); + for (node_t *node = list.first; node; node = node->next) + if (node->value % 2 == 1) + dllremove(list.first, list.last, node); + + for (node_t *node = list.first; node; node = node->next) + printf("%d%s", node->value, ((node->next) ? " -> " : "\n")); + + printf("\n"); +} 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"); diff --git a/prb_sys.h b/prb_sys.h index 7250758..1d0b0bd 100644 --- a/prb_sys.h +++ b/prb_sys.h @@ -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; -- cgit v1.2.3-70-g09d2