summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--example/arena.c17
-rwxr-xr-xexample/build.sh14
-rw-r--r--example/macros.c (renamed from example/example.c)82
-rw-r--r--example/string.c34
-rw-r--r--example/sys.c43
-rw-r--r--prb_linux.h11
-rw-r--r--prb_sys.h7
-rw-r--r--prb_windows.h11
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");
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;