summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Justfile41
-rw-r--r--src/ez_arena.h7
-rw-r--r--src/smrt_arena.c2
-rw-r--r--src/smrt_arena.h27
-rw-r--r--src/string.h6
-rw-r--r--src/vec2.h6
-rw-r--r--src/wav.c4
-rw-r--r--src/wav.h22
-rw-r--r--tests/wav.c8
9 files changed, 84 insertions, 39 deletions
diff --git a/Justfile b/Justfile
index 27a7e87..2edea1e 100644
--- a/Justfile
+++ b/Justfile
@@ -6,6 +6,7 @@ cc := "cc"
cflags := "-Wall -Wextra -Wpedantic -Werror -std=c23 -fPIC"
lflags := "-lm"
prefix := "/usr/local"
+extra_cflags := ""
default:
@just --list
@@ -14,23 +15,23 @@ build: build-static build-shared
build-static:
mkdir -p {{build_dir}}
- cd {{build_dir}} && {{cc}} {{cflags}} -c ../{{src_dir}}/*.c
+ cd {{build_dir}} && {{cc}} {{cflags}} {{extra_cflags}} -c ../{{src_dir}}/*.c
ar rcs {{build_dir}}/lib{{lib}}.a {{build_dir}}/*.o
build-shared:
mkdir -p {{build_dir}}
- cd {{build_dir}} && {{cc}} {{cflags}} -c ../{{src_dir}}/*.c
+ cd {{build_dir}} && {{cc}} {{cflags}} {{extra_cflags}} -c ../{{src_dir}}/*.c
{{cc}} -shared -o {{build_dir}}/lib{{lib}}.so {{build_dir}}/*.o {{lflags}}
build-release:
mkdir -p {{build_dir}}
- cd {{build_dir}} && {{cc}} {{cflags}} -O3 -DNDEBUG -c ../{{src_dir}}/*.c
+ cd {{build_dir}} && {{cc}} {{cflags}} {{extra_cflags}} -O3 -DNDEBUG -c ../{{src_dir}}/*.c
ar rcs {{build_dir}}/lib{{lib}}-release.a {{build_dir}}/*.o
{{cc}} -shared -o {{build_dir}}/lib{{lib}}-release.so {{build_dir}}/*.o {{lflags}}
build-debug:
mkdir -p {{build_dir}}
- cd {{build_dir}} && {{cc}} {{cflags}} -g -O0 -fsanitize=address,undefined -fno-omit-frame-pointer -c ../{{src_dir}}/*.c
+ cd {{build_dir}} && {{cc}} {{cflags}} {{extra_cflags}} -g -O0 -fsanitize=address,undefined -fno-omit-frame-pointer -c ../{{src_dir}}/*.c
ar rcs {{build_dir}}/lib{{lib}}-debug.a {{build_dir}}/*.o
{{cc}} -shared -fsanitize=address,undefined -o {{build_dir}}/lib{{lib}}-debug.so {{build_dir}}/*.o {{lflags}}
@@ -45,9 +46,39 @@ uninstall:
sudo rm -f {{prefix}}/lib/lib{{lib}}.a {{prefix}}/lib/lib{{lib}}.so
sudo ldconfig
+install-vendor dir: build
+ #!/usr/bin/env bash
+ set -euo pipefail
+ dir="{{dir}}"
+ dir="${dir%/}"
+ vendor_dir="$dir/vendor/{{lib}}"
+ mkdir -p "$vendor_dir/include/{{lib}}" "$vendor_dir/lib"
+ cp {{src_dir}}/*.h "$vendor_dir/include/{{lib}}/"
+ cp {{build_dir}}/lib{{lib}}.a {{build_dir}}/lib{{lib}}.so "$vendor_dir/lib/"
+ echo "Installed lib{{lib}} into $vendor_dir"
+
+ target_justfile="$dir/Justfile"
+ if [ -f "$target_justfile" ] && grep -q '^cflags :=' "$target_justfile" && grep -q '^lflags :=' "$target_justfile"; then
+ echo "Detected ctmplt-layout project at $dir; wiring up build flags"
+ inc_flag="-Ivendor/{{lib}}/include"
+ static_lib="vendor/{{lib}}/lib/lib{{lib}}.a"
+ if ! grep -qF -- "$inc_flag" "$target_justfile"; then
+ sed -i "s|^cflags := \"\(.*\)\"|cflags := \"\1 $inc_flag\"|" "$target_justfile"
+ fi
+ if ! grep -qF -- "$static_lib" "$target_justfile"; then
+ sed -i "s|^lflags := \"\(.*\)\"|lflags := \"\1 $static_lib\"|" "$target_justfile"
+ fi
+ echo "Updated $target_justfile (cflags/lflags)"
+ else
+ echo "$target_justfile doesn't match the ctmplt bin/lib layout (no cflags:=/lflags:= Justfile); skipping auto-link wiring"
+ fi
+
+uninstall-vendor dir:
+ rm -rf {{dir}}/vendor/{{lib}}
+
test-all:
mkdir -p {{build_dir}}
- {{cc}} {{cflags}} {{test_dir}}/*.c {{src_dir}}/*.c -o {{build_dir}}/test -lcriterion {{lflags}}
+ {{cc}} {{cflags}} {{extra_cflags}} {{test_dir}}/*.c {{src_dir}}/*.c -o {{build_dir}}/test -lcriterion {{lflags}}
./{{build_dir}}/test
coverage:
diff --git a/src/ez_arena.h b/src/ez_arena.h
index 19def60..9581d0c 100644
--- a/src/ez_arena.h
+++ b/src/ez_arena.h
@@ -6,11 +6,12 @@
typedef struct {
u64 alloc_size;
- u64 pos;
+ u64 pos;
} ez_arena_t;
-ez_arena_t *ez_arena_create(u64 size, b32 zero_out);
- void *ez_arena_alloc(ez_arena_t *arena, u64 alloc_amount);
+ez_arena_t * ez_arena_create(u64 size, b32 zero_out);
+
+ void * ez_arena_alloc(ez_arena_t *arena, u64 alloc_amount);
void *ez_arena_alloc_nz(ez_arena_t *arena, u64 alloc_amount);
void ez_arena_clear(ez_arena_t *arena, b32 zero_out);
void ez_arena_destroy(ez_arena_t *arena);
diff --git a/src/smrt_arena.c b/src/smrt_arena.c
index 6862212..3618771 100644
--- a/src/smrt_arena.c
+++ b/src/smrt_arena.c
@@ -171,7 +171,7 @@ smrta_temp_t smrta_scratch_start(smrt_arena_t **conflicts, u32 num_conflicts) {
smrt_arena_t **selected = &_scratch_pool[candidate_idx];
if (!*selected) {
- *selected = smrt_arena_create(MiB(64), plat_get_pagesize(), true);
+ *selected = smrt_arena_create(SMRTA_SCRATCH_RESERVE_SIZE, plat_get_pagesize(), true);
}
return smrta_temp_start(*selected);
diff --git a/src/smrt_arena.h b/src/smrt_arena.h
index 0c8d848..48774e2 100644
--- a/src/smrt_arena.h
+++ b/src/smrt_arena.h
@@ -5,26 +5,23 @@
#define SMRT_ARENA_BASE_POS (sizeof(smrt_arena_t))
typedef struct {
- u64 reserve_size;
- u64 commit_size;
-
- u64 mark_pos;
-
- u64 pos;
- u64 commit_pos;
-
+ u64 reserve_size;
+ u64 commit_size;
+ u64 mark_pos;
+ u64 pos;
+ u64 commit_pos;
b32 auto_decommit;
} smrt_arena_t;
-smrt_arena_t *smrt_arena_create(u64 reserve_size, u64 commit_size, b32 auto_decommit);
- void *smrt_arena_push(smrt_arena_t *arena, u64 alloc_amount, b32 zero_out);
+smrt_arena_t * smrt_arena_create(u64 reserve_size, u64 commit_size, b32 auto_decommit);
+
+ void * smrt_arena_push(smrt_arena_t *arena, u64 alloc_amount, b32 zero_out);
void smrt_arena_pop(smrt_arena_t *arena, u64 pop_amount);
void smrt_arena_pop_to(smrt_arena_t *arena, u64 location);
void smrt_arena_clear(smrt_arena_t *arena, b32 zero_out);
void smrt_arena_destroy(smrt_arena_t *arena);
-
void smrt_arena_mark(smrt_arena_t *arena);
- void *smrt_arena_mark_push(smrt_arena_t *arena, u64 alloc_amount, b32 zero_out);
+ void * smrt_arena_mark_push(smrt_arena_t *arena, u64 alloc_amount, b32 zero_out);
b32 smrt_arena_pop_to_mark(smrt_arena_t *arena);
#define SMRTA_ALLOC_ARRAY(arena, T, n) (T*)smrt_arena_push(arena, sizeof(T) * (n), true)
@@ -40,7 +37,13 @@ smrta_temp_t smrta_temp_start(smrt_arena_t *arena);
smrta_temp_t smrta_scratch_start(smrt_arena_t **conflicts, u32 num_conflicts);
void smrta_scratch_end(smrta_temp_t temp);
+#ifndef SCRATCH_POOL_SIZE
#define SCRATCH_POOL_SIZE 2
+#endif
+
+#ifndef SMRTA_SCRATCH_RESERVE_SIZE
+#define SMRTA_SCRATCH_RESERVE_SIZE MiB(64)
+#endif
#define TEMP_ARENA_PUSH(temp, T) (T*)smrt_arena_push(temp.arena, sizeof(T), true)
#define TEMP_ARENA_PUSH_ARRAY(temp, T, n) (T*)smrt_arena_push(temp.arena, sizeof(T) * (n), true)
diff --git a/src/string.h b/src/string.h
index 419ef96..7e3cf66 100644
--- a/src/string.h
+++ b/src/string.h
@@ -10,10 +10,10 @@ typedef struct {
u64 len;
} strng_t;
-strng_t *strng_new(smrt_arena_t *arena, u64 size);
+strng_t * strng_new(smrt_arena_t *arena, u64 size);
strng_t *strng_from(smrt_arena_t *arena, char const *c);
-strng_t *strng_dup(smrt_arena_t *arena, strng_t const *src);
- char *strng_str(smrt_arena_t *arena, strng_t const *string);
+strng_t * strng_dup(smrt_arena_t *arena, strng_t const *src);
+ char * strng_str(smrt_arena_t *arena, strng_t const *string);
b32 strng_set(strng_t *string, char const *c);
void strng_clear(strng_t *string);
diff --git a/src/vec2.h b/src/vec2.h
index fa106dc..44973ec 100644
--- a/src/vec2.h
+++ b/src/vec2.h
@@ -7,12 +7,12 @@
typedef union {
struct { f64 x, y; };
- f64 d[2];
+ f64 d[2];
} vec2d_t;
typedef struct {
- f64 *xs;
- f64 *ys;
+ f64 * xs;
+ f64 * ys;
u64 size;
} vec2d_soa_t;
diff --git a/src/wav.c b/src/wav.c
index 9698001..73fa439 100644
--- a/src/wav.c
+++ b/src/wav.c
@@ -50,10 +50,10 @@ wav_data_t load_wav_file(smrt_arena_t *arena, FILE *wav_file, wav_master_chunk_t
u32 sampled_data_size;
fread(&sampled_data_size, 4, 1, wav_file);
- data.samples = smrt_arena_push(arena, sizeof(wav_data_t) + sampled_data_size, true);
+ data.samples = smrt_arena_push(arena, sampled_data_size, true);
if (!data.samples) return data;
- fread((u8*)data.samples+WAV_DATA_BASE_POS, sampled_data_size, 1, wav_file);
+ fread((u8*)data.samples, sampled_data_size, 1, wav_file);
data.sample_count = sampled_data_size / ((format_o->bits_per_sample / 8) * format_o->num_channels);
return data;
diff --git a/src/wav.h b/src/wav.h
index 7e3c861..21830ad 100644
--- a/src/wav.h
+++ b/src/wav.h
@@ -5,11 +5,9 @@
#include <stdio.h>
-#define WAV_DATA_BASE_POS sizeof(wav_data_t)
-
typedef struct {
u64 sample_count;
- u8 *samples;
+ u8 * samples;
} wav_data_t;
// [Master RIFF chunk]
@@ -44,6 +42,18 @@ typedef struct {
} wav_fmt_chunk_t;
#pragma pack(pop)
- wav_data_t load_wav_file(smrt_arena_t *arena, FILE *wav_file, wav_master_chunk_t *master_o, wav_fmt_chunk_t *format_o);
- b32 write_wav_file(FILE *wav_file, wav_fmt_chunk_t *fmt_chunk_i, wav_data_t data_i);
-wav_fmt_chunk_t make_wav_fmt_chunk(u32 num_channels, u32 sample_rate, u16 bits_per_sample);
+/// Load WAV data from wav_file. Data will be allocated on arena
+wav_data_t load_wav_file(smrt_arena_t * arena ,
+ FILE *wav_file ,
+ wav_master_chunk_t *master_o ,
+ wav_fmt_chunk_t *format_o);
+
+/// Write WAV headers and data to wav_file.
+b32 write_wav_file(FILE * wav_file ,
+ wav_fmt_chunk_t *fmt_chunk_i ,
+ wav_data_t data_i);
+
+/// Generate WAV "fmt " chunk for unsigned 8-bit PCM data ready to be written to a file.
+wav_fmt_chunk_t make_wav_fmt_chunk(u32 num_channels ,
+ u32 sample_rate ,
+ u16 bits_per_sample);
diff --git a/tests/wav.c b/tests/wav.c
index a3a569e..29b9daf 100644
--- a/tests/wav.c
+++ b/tests/wav.c
@@ -51,7 +51,7 @@ Test(wav, read_sample_data_matches_source) {
fclose(wav_file);
i16 expected[8] = { 0, 2147, 4242, 6291, 8185, 9935, 11580, 12979 };
- i16 *samples = (i16*)((u8*)data.samples + WAV_DATA_BASE_POS);
+ i16 *samples = (i16*)((u8*)data.samples);
for (int i = 0; i < 8; i++) {
cr_expect_eq(samples[i], expected[i]);
@@ -93,7 +93,7 @@ Test(wav, read_stereo_16bit) {
cr_expect(fmtchunk.bits_per_sample == 16);
cr_expect(data.sample_count == 5);
- i16 *samples = (i16*)((u8*)data.samples + WAV_DATA_BASE_POS);
+ i16 *samples = (i16*)((u8*)data.samples);
cr_expect_eq(samples[0], 0);
cr_expect_eq(samples[1], 0);
cr_expect_eq(samples[2], 100);
@@ -119,7 +119,7 @@ Test(wav, read_mono_8bit) {
cr_expect(fmtchunk.bits_per_sample == 8);
cr_expect(data.sample_count == 6);
- u8 *samples = (u8*)data.samples + WAV_DATA_BASE_POS;
+ u8 *samples = (u8*)data.samples;
u8 expected[6] = { 0, 64, 128, 192, 255, 32 };
for (int i = 0; i < 6; i++) {
cr_expect_eq(samples[i], expected[i]);
@@ -286,7 +286,7 @@ Test(wav, write_sine, .init = write_sine_setup, .fini = write_sine_teardown) {
cr_assert_not_null(read_data.samples);
cr_expect_eq(read_data.sample_count, sample_count);
- u8 *read_samples = (u8*)read_data.samples + WAV_DATA_BASE_POS;
+ u8 *read_samples = (u8*)read_data.samples;
for (u64 i = 0; i < sample_count; i++) {
cr_expect_eq(read_samples[i], data.samples[i]);
}