Implement read-only string literals

This commit is contained in:
Abdelrahman Said 2025-02-09 14:29:54 +00:00
parent 7657ad1b58
commit bbf38499ca
4 changed files with 48 additions and 15 deletions

View File

@ -15,15 +15,20 @@ struct str8 {
c8 *buf; c8 *buf;
}; };
typedef const Str8 Str8RO;
#define wapp_str8_buf(CAPACITY) ((Str8){.capacity = CAPACITY, .size = 0, .buf = (c8[CAPACITY]){0}}) #define wapp_str8_buf(CAPACITY) ((Str8){.capacity = CAPACITY, .size = 0, .buf = (c8[CAPACITY]){0}})
// Utilises the fact that memcpy returns pointer to dest buffer and that getting // Utilises the fact that memcpy returns pointer to dest buffer and that getting
// address of compound literals is valid in C to create a string on the stack // address of compound literals is valid in C to create a string on the stack
#define wapp_str8_lit(STRING) ((Str8){.capacity = sizeof(STRING) - 1, \ #define wapp_str8_lit(STRING) ((Str8){.capacity = (sizeof(STRING) - 1) * 2, \
.size = sizeof(STRING) - 1, \ .size = sizeof(STRING) - 1, \
.buf = memcpy(&((c8 [sizeof(STRING)]){0}), STRING, sizeof(STRING))}) .buf = memcpy(&((c8 [sizeof(STRING) * 2]){0}), STRING, sizeof(STRING))})
#define wapp_str8_lit_ro(STRING) ((Str8RO){.capacity = sizeof(STRING) - 1, \
.size = sizeof(STRING) - 1, \
.buf = (c8 *)STRING})
c8 wapp_str8_get(const Str8 *str, u64 index); c8 wapp_str8_get(Str8RO *str, u64 index);
void wapp_str8_set(Str8 *str, u64 index, c8 c); void wapp_str8_set(Str8 *str, u64 index, c8 c);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -7,24 +7,51 @@ TestFuncResult test_str8_lit(void) {
bool result; bool result;
Str8 s1 = wapp_str8_lit("Hello world"); Str8 s1 = wapp_str8_lit("Hello world");
result = s1.capacity == 11 && s1.capacity == s1.size; result = s1.capacity == 22 && s1.capacity != s1.size;
Str8 s2 = wapp_str8_lit("Different strokes for different folks"); Str8 s2 = wapp_str8_lit("Different strokes for different folks");
result = result && s2.capacity == 37 && s2.capacity == s2.size; result = result && s2.capacity == 74 && s2.capacity != s2.size;
Str8 s3 = wapp_str8_lit("Discretion is the better part of valour"); Str8 s3 = wapp_str8_lit("Discretion is the better part of valour");
result = result && s3.capacity == 39 && s3.capacity == s3.size; result = result && s3.capacity == 78 && s3.capacity != s3.size;
Str8 s4 = wapp_str8_lit("Distance lends enchantment to the view"); Str8 s4 = wapp_str8_lit("Distance lends enchantment to the view");
result = result && s4.capacity == 38 && s4.capacity == s4.size; result = result && s4.capacity == 76 && s4.capacity != s4.size;
Str8 s5 = wapp_str8_lit("Do as I say, not as I do"); Str8 s5 = wapp_str8_lit("Do as I say, not as I do");
result = result && s5.capacity == 24 && s5.capacity == s5.size; result = result && s5.capacity == 48 && s5.capacity != s5.size;
Str8 s6 = wapp_str8_lit("Do as you would be done by"); Str8 s6 = wapp_str8_lit("Do as you would be done by");
result = result && s6.capacity == 26 && s6.capacity == s6.size; result = result && s6.capacity == 52 && s6.capacity != s6.size;
Str8 s7 = wapp_str8_lit("Do unto others as you would have them do to you"); Str8 s7 = wapp_str8_lit("Do unto others as you would have them do to you");
result = result && s7.capacity == 94 && s7.capacity != s7.size;
return wapp_tester_result(result);
}
TestFuncResult test_str8_lit_ro(void) {
bool result;
Str8RO s1 = wapp_str8_lit_ro("Hello world");
result = s1.capacity == 11 && s1.capacity == s1.size;
Str8RO s2 = wapp_str8_lit_ro("Different strokes for different folks");
result = result && s2.capacity == 37 && s2.capacity == s2.size;
Str8RO s3 = wapp_str8_lit_ro("Discretion is the better part of valour");
result = result && s3.capacity == 39 && s3.capacity == s3.size;
Str8RO s4 = wapp_str8_lit_ro("Distance lends enchantment to the view");
result = result && s4.capacity == 38 && s4.capacity == s4.size;
Str8RO s5 = wapp_str8_lit_ro("Do as I say, not as I do");
result = result && s5.capacity == 24 && s5.capacity == s5.size;
Str8RO s6 = wapp_str8_lit_ro("Do as you would be done by");
result = result && s6.capacity == 26 && s6.capacity == s6.size;
Str8RO s7 = wapp_str8_lit_ro("Do unto others as you would have them do to you");
result = result && s7.capacity == 47 && s7.capacity == s7.size; result = result && s7.capacity == 47 && s7.capacity == s7.size;
return wapp_tester_result(result); return wapp_tester_result(result);

View File

@ -8,6 +8,7 @@ BEGIN_C_LINKAGE
#endif // __cplusplus #endif // __cplusplus
TestFuncResult test_str8_lit(void); TestFuncResult test_str8_lit(void);
TestFuncResult test_str8_lit_ro(void);
TestFuncResult test_str8_buf(void); TestFuncResult test_str8_buf(void);
TestFuncResult test_str8_get_index_within_bounds(void); TestFuncResult test_str8_get_index_within_bounds(void);
TestFuncResult test_str8_get_index_out_of_bounds(void); TestFuncResult test_str8_get_index_out_of_bounds(void);

View File

@ -1,4 +1,4 @@
#include "str8/test_str8.h" #include "test_str8.h"
#include "test_allocator.h" #include "test_allocator.h"
#include "test_arena.h" #include "test_arena.h"
#include "test_cpath.h" #include "test_cpath.h"
@ -10,9 +10,9 @@
int main(void) { int main(void) {
wapp_tester_run_tests(test_arena_allocator, test_arena_init, test_arena_init_succeeds_when_reserving_very_large_size, wapp_tester_run_tests(test_arena_allocator, test_arena_init, test_arena_init_succeeds_when_reserving_very_large_size,
test_str8_lit, test_str8_buf, test_str8_get_index_within_bounds, test_str8_get_index_out_of_bounds, test_str8_lit, test_str8_lit_ro, test_str8_buf, test_str8_get_index_within_bounds,
test_str8_set, test_cpath_join_path, test_cpath_dirname, test_cpath_dirup, test_str8_get_index_out_of_bounds, test_str8_set, test_cpath_join_path, test_cpath_dirname,
test_arena_alloc_succeeds_when_within_capacity, test_arena_alloc_fails_when_over_capacity, test_cpath_dirup, test_arena_alloc_succeeds_when_within_capacity, test_arena_alloc_fails_when_over_capacity,
test_arena_realloc_bigger_size, test_arena_realloc_smaller_size, test_arena_clear, test_arena_realloc_bigger_size, test_arena_realloc_smaller_size, test_arena_clear,
test_arena_destroy, test_commander_cmd_success, test_commander_cmd_failure, test_arena_destroy, test_commander_cmd_success, test_commander_cmd_failure,
test_commander_cmd_out_buf_success, test_commander_cmd_out_buf_failure); test_commander_cmd_out_buf_success, test_commander_cmd_out_buf_failure);