diff options
Diffstat (limited to 'src/basic')
-rw-r--r-- | src/basic/arena.c | 76 | ||||
-rw-r--r-- | src/basic/arena.h | 36 | ||||
-rw-r--r-- | src/basic/basic.h | 75 | ||||
-rw-r--r-- | src/basic/math.c | 84 | ||||
-rw-r--r-- | src/basic/math.h | 42 | ||||
-rw-r--r-- | src/basic/string32.c | 324 | ||||
-rw-r--r-- | src/basic/string32.h | 60 | ||||
-rw-r--r-- | src/basic/time.h | 42 |
8 files changed, 739 insertions, 0 deletions
diff --git a/src/basic/arena.c b/src/basic/arena.c new file mode 100644 index 0000000..8f2e17e --- /dev/null +++ b/src/basic/arena.c @@ -0,0 +1,76 @@ +#include <basic/arena.h> +#include <assert.h> +#include <string.h> +#include <stdlib.h> + +void +arena_init(Arena *arena, u64 size) +{ + arena->size_used = 0; + arena->size_max = size; + arena->memory = malloc(size); +} + +void +arena_deinit(Arena *arena) +{ + arena->size_used = 0; + arena->size_max = 0; + free(arena->memory); +} + +void +arena_align(Arena *arena, u64 alignment) +{ + // @Incomplete +} + +void* +arena_push(Arena *arena, u64 size) +{ + void *result = arena->memory + arena->size_used; + arena->size_used += size; + assert(arena->size_used <= arena->size_max); + return result; +} + +void +arena_pop_to(Arena *arena, u64 pos) +{ + arena->size_used = pos; +} + +void +arena_pop_size(Arena *arena, u64 size) +{ + arena->size_used -= size; +} + +void +arena_zero(Arena *arena) +{ + memset(arena->memory, 0, arena->size_used); +} + +void +arena_clear(Arena *arena) +{ + arena->size_used = 0; +} + + +ArenaTmp +arena_tmp_begin(Arena *arena) +{ + ArenaTmp tmp; + tmp.arena = arena; + tmp.pos = arena->size_used; + return tmp; +} + +void +arena_tmp_end(ArenaTmp tmp) +{ + tmp.arena->size_used = tmp.pos; +} + diff --git a/src/basic/arena.h b/src/basic/arena.h new file mode 100644 index 0000000..f13ccfa --- /dev/null +++ b/src/basic/arena.h @@ -0,0 +1,36 @@ +#ifndef ARENA_H +#define ARENA_H + + +#include <basic/basic.h> + +typedef struct { + size_t size_used; + size_t size_max; + u8 *memory; +} Arena; + + +typedef struct { + Arena *arena; + u64 pos; +} ArenaTmp; + + +void arena_init(Arena *arena, u64 size); +void arena_deinit(Arena *arena); + +void arena_align(Arena *arena, u64 alignment); +void* arena_push(Arena *arena, u64 size); +void arena_pop_to(Arena *arena, u64 pos); +void arena_pop_size(Arena *arena, u64 size); + +void arena_zero(Arena *arena); +void arena_clear(Arena *arena); + + +ArenaTmp arena_tmp_begin(Arena *arena); +void arena_tmp_end(ArenaTmp tmp); + + +#endif // MEM_ARENA_H diff --git a/src/basic/basic.h b/src/basic/basic.h new file mode 100644 index 0000000..46bf77c --- /dev/null +++ b/src/basic/basic.h @@ -0,0 +1,75 @@ +#ifndef BASIC_H +#define BASIC_H + +#include <stdint.h> +#include <limits.h> +#include <stdbool.h> +#include <stddef.h> +#include <assert.h> +#include <sys/param.h> + +typedef int8_t i8; +typedef int16_t i16; +typedef int32_t i32; +typedef int64_t i64; + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +typedef uint8_t b8; +typedef uint16_t b16; +typedef uint32_t b32; +typedef uint64_t b64; + +typedef float f32; +typedef double f64; + +#define ARRAY_COUNT(x) (sizeof(x) / sizeof(x[0])) + +#define KIBIBYTES(x) ((x)*1024) +#define MEBIBYTES(x) ((x)*KIBIBYTES(1024)) +#define GIBIBYTES(x) ((x)*MEBIBYTES(1024)) + +#define I8_MAX INT8_MAX +#define I16_MAX INT16_MAX +#define I32_MAX INT32_MAX +#define I64_MAX INT64_MAX + +#define U8_MAX UINT8_MAX +#define U16_MAX UINT16_MAX +#define U32_MAX UINT32_MAX +#define U64_MAX UINT64_MAX + +#define F32_MAX FLT_MAX +#define F64_MAX DBL_MAX +#define F32_MIN FLT_MIN +#define F64_MIN DBL_MIN + +#define likely(expr) __builtin_expect(!!(expr), 1) +#define unlikely(expr) __builtin_expect(!!(expr), 0) + +#define InvalidCodePath assert(!"InvalidCodePath") +#define InvalidDefaultCase default: {InvalidCodePath;} break + +#define internal_var static +#define internal_fn static +#define persist_var static + +// Todo: use __FILE__ and __LINE__ macros for debug prints +#ifdef NDEBUG +#define debug_printf() +#else +#define debug_printf(...) printf(__VA_ARGS__) +#endif + + +#if defined(__linux__) +#include <alloca.h> +#elif defined(_WIN64) +#define alloca(size) _alloca(size) +#endif + + +#endif // BASIC_H diff --git a/src/basic/math.c b/src/basic/math.c new file mode 100644 index 0000000..3521821 --- /dev/null +++ b/src/basic/math.c @@ -0,0 +1,84 @@ +#include <basic/basic.h> +#include <basic/math.h> + +i32 +f32_round_to_i32(f32 value) +{ + i32 result; + if (value >= 0) { + result = (i32)(value + 0.5f); + } else { + result = (i32)(value - 0.5f); + } + return result; +} + +f32 +f32_center(f32 dim, f32 dim_total) +{ + f32 result = (dim_total - dim) / 2; + return result; +} + +V2F32 +v2f32(f32 x, f32 y) +{ + V2F32 result = {x, y}; + return result; +} + +V2F32 +v2f32_add(V2F32 v1, V2F32 v2) +{ + V2F32 result = {v1.x + v2.x, v1.y + v2.y}; + return result; +} + +V2F32 +v2f32_sub(V2F32 v1, V2F32 v2) +{ + V2F32 result = {v1.x - v2.x, v1.y - v2.y}; + return result; +} + +V2F32 +v2f32_center(V2F32 dim_inner, V2F32 dim_outer) +{ + V2F32 pos; + pos.x = f32_center(dim_inner.x, dim_outer.x); + pos.y = f32_center(dim_inner.y, dim_outer.y); + return pos; +} + +V3F32 +v3f32(f32 x, f32 y, f32 z) +{ + V3F32 result = {x, y, z}; + return result; +} + +V4F32 +v4f32(f32 x, f32 y, f32 z, f32 w) +{ + V4F32 result = {x, y, z, w}; + return result; +} + +RectF32 +rectf32(float x0, float y0, float x1, float y1) +{ + RectF32 result = {x0, y0, x1, y1}; + return result; +} + +b32 +rectf32_contains_v2f32(RectF32 rect, V2F32 pos) +{ + b32 result = pos.x >= rect.x0 && + pos.x <= rect.x1 && + pos.y >= rect.y0 && + pos.y <= rect.y1; + return result; +} + + diff --git a/src/basic/math.h b/src/basic/math.h new file mode 100644 index 0000000..d0863c1 --- /dev/null +++ b/src/basic/math.h @@ -0,0 +1,42 @@ +#ifndef MATH_H +#define MATH_H + +#include <basic/basic.h> + +typedef struct { + f32 x, y; +} V2F32; + +typedef struct { + f32 x, y, z; +} V3F32; + +typedef struct { + f32 x, y, z, w; +} V4F32; + +typedef struct { + f32 x0; + f32 y0; + f32 x1; + f32 y1; +} RectF32; + +V2F32 v2f32(f32 x, f32 y); +V2F32 v2f32_add(V2F32 v1, V2F32 v2); +V2F32 v2f32_sub(V2F32 v1, V2F32 v2); +V2F32 v2f32_center(V2F32 dim, V2F32 dim_total); + +V3F32 v3f32(f32 x, f32 y, f32 z); + +V4F32 v4f32(f32 x, f32 y, f32 z, f32 w); + +i32 f32_round_to_i32(f32 value); +f32 f32_center(f32 dim, f32 dim_total); + +RectF32 rectf32(f32 x0, f32 y0, f32 x1, f32 y1); +b32 rectf32_contains_v2f32(RectF32 rect, V2F32 pos); + + + +#endif // MATH_H diff --git a/src/basic/string32.c b/src/basic/string32.c new file mode 100644 index 0000000..c88a1a8 --- /dev/null +++ b/src/basic/string32.c @@ -0,0 +1,324 @@ +#include "basic/arena.h" +#include <SDL2/SDL_keycode.h> +#include <os/os.h> +#include <string.h> + +#include <basic/basic.h> +#include <basic/string32.h> + + + +void +string32_buffer_move_cursor_left(String32Buffer *buffer) +{ + if (buffer->cursor > 0) { + buffer->cursor -= 1; + } +} + + +void +string32_buffer_move_cursor_right(String32Buffer *buffer) +{ + if (buffer->cursor < buffer->len) { + buffer->cursor += 1; + } +} + + +b32 +string32_buffer_del_left(String32Buffer *buffer) +{ + if (buffer->cursor > 0){ + u32 *dest = &buffer->codepoints[buffer->cursor - 1]; + u32 *src = &buffer->codepoints[buffer->cursor]; + size_t move_size = (buffer->len - buffer->cursor) * sizeof(u32); + memmove(dest, src, move_size); + + buffer->len -= 1; + buffer->cursor -= 1; + + return true; + } + + return false; +} + + +b32 +string32_buffer_del_right(String32Buffer *buffer) +{ + if (buffer->cursor < buffer->len) { + u32 *dest = &buffer->codepoints[buffer->cursor]; + u32 *src = &buffer->codepoints[buffer->cursor + 1]; + size_t move_size = (buffer->len - buffer->cursor) * sizeof(u32); + memmove(dest, src, move_size); + + buffer->len -= 1; + + return true; + } + + return false; +} + + +b32 +string32_buffer_insert(String32Buffer *buffer, u32 codepoint) +{ + if (buffer->len < buffer->max_len && + buffer->cursor <= buffer->len) + { + u32 *dest = &buffer->codepoints[buffer->cursor + 1]; + u32 *src = &buffer->codepoints[buffer->cursor]; + size_t move_size = (buffer->len - buffer->cursor) * sizeof(u32); + memmove(dest, src, move_size); + + buffer->codepoints[buffer->cursor] = codepoint; + buffer->len += 1; + buffer->cursor += 1; + + return true; + } + + return false; +} + + +void +string32_buffer_edit(String32Buffer *buffer, OSEventKeyPress key_press) +{ + if (key_press.is_unicode) { + switch (key_press.code) { + case '\b': { + string32_buffer_del_left(buffer); + } break; + + case 127: { + string32_buffer_del_right(buffer); + } break; + + default: { + string32_buffer_insert(buffer, key_press.code); + } + } + } + else { + if (key_press.code == OS_KEYCODE_LEFT) { + string32_buffer_move_cursor_left(buffer); + } + else if (key_press.code == OS_KEYCODE_RIGHT) { + string32_buffer_move_cursor_right(buffer); + } + } +} + + +void +string32_buffer_append_string32_buffer(String32Buffer *buffer, String32Buffer *src_buffer) +{ + size_t len_avail = buffer->max_len - buffer->len; + size_t copy_count = len_avail >= src_buffer->len ? src_buffer->len : len_avail; + u32 *dest = buffer->codepoints + buffer->len; + u32 *src = src_buffer->codepoints; + for (size_t i = 0; i < copy_count; i++) { + *dest++ = *src++; + } + buffer->len += copy_count; +} + + +void +string32_buffer_append_string32(String32Buffer *buffer, String32 *str) +{ + size_t len_avail = buffer->max_len - buffer->len; + size_t copy_count = str->len >= len_avail ? len_avail : str->len; + u32 *dest = buffer->codepoints + buffer->len; + u32 *src = str->codepoints; + for (size_t i = 0; i < copy_count; i++) { + *dest++ = *src++; + } + buffer->len += copy_count; +} + + +void +string32_buffer_append_ascii_cstr(String32Buffer *buffer, char *ascii) +{ + while (*ascii) { + if (buffer->len >= buffer->max_len) { + break; + } + + buffer->codepoints[buffer->len] = *ascii; + buffer->len += 1; + ascii++; + } +} + + +void +string32_buffer_copy_string32_buffer(String32Buffer *dest, String32Buffer *src) +{ + string32_buffer_reset(dest); + string32_buffer_append_string32_buffer(dest, src); +} + + +void +string32_buffer_copy_string32(String32Buffer *buffer, String32 *str) +{ + string32_buffer_reset(buffer); + string32_buffer_append_string32(buffer, str); +} + + +b32 string32_buffer_equal_string32(String32Buffer *buffer, String32 *str) +{ + if (buffer->len != str->len) { + return false; + } + for (size_t i = 0; i < buffer->len; i++) { + if (buffer->codepoints[i] != str->codepoints[i]) { + return false; + } + } + return true; +} + + +String32 * +string32_buffer_to_string32_with_len(Arena *arena, String32Buffer *buffer, size_t len) +{ + size_t push_size = sizeof(String32) + len * sizeof(u32); + String32 *result = arena_push(arena, push_size); + + memcpy(result->codepoints, buffer->codepoints, len * sizeof(u32)); + result->len = len; + + return result; +} + + +String32 * +string32_buffer_to_string32(Arena *arena, String32Buffer *buffer) +{ + size_t push_size = sizeof(String32) + buffer->len * sizeof(u32); + String32 *result = arena_push(arena, push_size); + + memcpy(result->codepoints, buffer->codepoints, buffer->len * sizeof(u32)); + result->len = buffer->len; + + return result; +} + + +void +string32_buffer_print(String32Buffer *buffer) +{ + for (size_t i = 0; i < buffer->len; i++) { + putchar(buffer->codepoints[i]); + } +} + + +void +string32_buffer_reset(String32Buffer *buffer) +{ + buffer->len = 0; + buffer->cursor = 0; +} + +void +string32_buffer_init_in_place(String32Buffer *buffer, size_t max_len) +{ + buffer->cursor = 0; + buffer->len = 0; + buffer->max_len = max_len; +} + + +String32Buffer * +string32_buffer_create(Arena *arena, size_t max_len) +{ + size_t push_size = sizeof(String32Buffer) + max_len * sizeof(u32); + String32Buffer *buffer = arena_push(arena, push_size); + + buffer->cursor = 0; + buffer->len = 0; + buffer->max_len = max_len; + + return buffer; +} + + +void +string32_print(String32 *str) +{ + for (size_t i = 0; i < str->len; i++) { + putchar(str->codepoints[i]); + } +} + + +b32 +string32_equal(String32 *str1, String32 *str2) { if (str1->len != str2->len) { + return false; + } + + for (size_t i = 0; i < str1->len; i++) { + if (str1->codepoints[i] != str2->codepoints[i]) { + return false; + } + } + + return true; +} + + +String32 * +string32_create_from_u32_array(Arena *arena, u32 *buffer, size_t len) +{ + size_t push_size = sizeof(String32) + len * sizeof(u32); + String32 *result = arena_push(arena, push_size); + + memcpy(result->codepoints, buffer, len); + result->len = len; + + return result; +} + + + +String32 * +string32_create_from_string32(Arena *arena, String32 *src) +{ + size_t push_size = sizeof(String32) + src->len * sizeof(u32); + String32 *result = arena_push(arena, push_size); + + for (size_t i = 0; i < src->len; i++) { + result->codepoints[i] = src->codepoints[i]; + } + result->len = src->len; + + return result; +} + + +String32 * +string32_create_from_ascii(Arena *arena, char *ascii) +{ + size_t len = strlen(ascii); + + size_t push_size = sizeof(String32) + strlen(ascii) * sizeof(u32); + String32 *result = arena_push(arena, push_size); + + u32 *dest = result->codepoints; + while (*ascii) { + *dest++ = *ascii++; + } + result->len = len; + + return result; +} + diff --git a/src/basic/string32.h b/src/basic/string32.h new file mode 100644 index 0000000..3af5fb3 --- /dev/null +++ b/src/basic/string32.h @@ -0,0 +1,60 @@ +#ifndef STRING32_H +#define STRING32_H + +#include <basic/basic.h> +#include <basic/arena.h> +#include <os/os.h> + + + +typedef struct { + u32 len; + u32 codepoints[]; +} String32; + + +typedef struct { + u32 cursor; + u32 len; + u32 max_len; + u32 codepoints[]; +} String32Buffer; + + + +String32 *string32_create_from_ascii(Arena *arena, char *ascii); +String32 *string32_create_from_string32(Arena *arena, String32 *src); +String32 *string32_create_from_string32_with_len(Arena *arena, String32 *src, size_t len); +String32 *string32_create_from_u32_array(Arena *arena, u32 *buffer, size_t len); + +b32 string32_equal(String32 *str1, String32 *str2); +void string32_print(String32 *str); + + + +String32Buffer* string32_buffer_create(Arena *arena, size_t max_len); +void string32_buffer_init_in_place(String32Buffer *buffer, size_t max_len); + +String32 *string32_buffer_to_string32(Arena *arena, String32Buffer *buffer); +String32 *string32_buffer_to_string32_with_len(Arena *arena, String32Buffer *buffer, size_t len); + +void string32_buffer_reset(String32Buffer *buffer); +void string32_buffer_print(String32Buffer *buffer); + +void string32_buffer_append_ascii_cstr(String32Buffer *buffer, char *ascii); +void string32_buffer_append_string32(String32Buffer *buffer, String32 *str); +void string32_buffer_append_string32_buffer(String32Buffer *buffer, String32Buffer *src); + +b32 string32_buffer_equal_string32(String32Buffer *buffer, String32 *str); +void string32_buffer_copy_string32(String32Buffer *buffer, String32 *str); +void string32_buffer_copy_string32_buffer(String32Buffer *dest, String32Buffer *src); + +void string32_buffer_edit(String32Buffer *buffer, OSEventKeyPress key_press); +b32 string32_buffer_insert(String32Buffer *buffer, u32 codepoint); +b32 string32_buffer_delete_right(String32Buffer *buffer); +b32 string32_buffer_delete_left(String32Buffer *buffer); +void string32_buffer_move_cursor_left(String32Buffer *buffer); +void string32_buffer_move_cursor_right(String32Buffer *buffer); + + +#endif // STRING32_H diff --git a/src/basic/time.h b/src/basic/time.h new file mode 100644 index 0000000..8d739b2 --- /dev/null +++ b/src/basic/time.h @@ -0,0 +1,42 @@ +#ifndef BASIC_TIME_H +#define BASIC_TIME_H + +#include <os/os.h> + +typedef OSTime Time; + + +typedef struct { + Time t0; + Time t1; +} Timer; + +#define TIMER_START(name) \ + static Timer timer_##name; \ + timer_##name.t0 = os_time_get_now(); + +// Todo: On windows this %ld should be %lld +#define TIMER_END(name) \ + timer_##name.t1 = os_time_get_now(); \ + i64 sec_diff = timer_##name.t1.seconds - timer_##name.t0.seconds; \ + i64 nsec0 = timer_##name.t0.nanoseconds; \ + i64 nsec1 = timer_##name.t1.nanoseconds; \ + i64 nsec_total = sec_diff*1000*1000*1000; \ + if (nsec1 >= nsec0) nsec_total += nsec1 - nsec0; \ + else nsec_total -= nsec1 + nsec0; \ + i64 ms_part = nsec_total / (1000*1000); \ + i64 ns_part = nsec_total % (1000*1000); \ + printf("%-24s: %3ld,%06ld ms\n", #name, ms_part, ns_part); + + +#define CYCLER_START(name) \ + u64 cycler_##name_t0 = __rdtsc(); + +// Todo: On windows this %lu should be %llu +#define CYCLER_END(name) \ + u64 cycler_##name_t1 = __rdtsc(); \ + u64 cycles_counted_##name = cycler_##name_t1 - cycler_##name_t0; \ + printf("cycles elapsed (%s): %lu\n", #name, cycles_counted_##name); + + +#endif // BASIC_TIME_H |