diff --git a/CMakeLists.txt b/CMakeLists.txt index 3bd86fe..f989e9d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,7 +20,7 @@ endif () if (NOT DEFINED MSVC) set(WARNING_FLAGS_C -Wall -Wextra -Wpedantic -Wvla -Wshadow -Wundef -Wmisleading-indentation -Wnull-dereference -Wswitch-default -Wstrict-overflow=5 -Wconversion -Wno-sign-conversion -Wsign-promo -Wcast-align -Wcast-qual -Wdouble-promotion -Wformat=2 -Winit-self -Wdisabled-optimization -Wno-unused-function) set(WARNING_FLAGS_CXX -Wall -Wextra -Wpedantic -Wvla -Wshadow -Wundef -Wmisleading-indentation -Wnull-dereference -Wswitch-default -Wstrict-overflow=5 -Wconversion -Wno-sign-conversion -Wsign-promo -Wcast-align -Wcast-qual -Wdouble-promotion -Wformat=2 -Winit-self -Wdisabled-optimization -Woverloaded-virtual -Wredundant-decls -Wctor-dtor-privacy -Wno-unused-function) - set(DBG_FLAGS -fsanitize=undefined,address -g3 -glldb -Og) + set(DBG_FLAGS -fsanitize=undefined,address -g3 -Og) else () set(WARNING_FLAGS_C /W4) set(WARNING_FLAGS_CXX /W4) @@ -47,10 +47,10 @@ endif() message(STATUS "Configure libguf_test...") target_compile_definitions(libguf_test PUBLIC TEST_DATA_DIR="${CMAKE_CURRENT_SOURCE_DIR}/src/test/data/") target_compile_options(libguf_test PRIVATE $<$:${WARNING_FLAGS_CXX}> $<$:${WARNING_FLAGS_C}> $<$: ${DBG_FLAGS}>) - target_link_options(libguf_test PRIVATE $<$:${WARNING_FLAGS_CXX}> $<$:${WARNING_FLAGS_C}> $<$: ${DBG_FLAGS}>) + target_link_options(libguf_test PRIVATE $<$:${WARNING_FLAGS_CXX}> $<$:${WARNING_FLAGS_C}> $<$: ${DBG_FLAGS}> -lm) message(STATUS "Configured libguf_test") message(STATUS "Configure libguf_example...") target_compile_options(libguf_example PRIVATE ${WARNING_FLAGS_C} $<$: ${DBG_FLAGS}>) - target_link_options(libguf_example PRIVATE ${WARNING_FLAGS_C} $<$: ${DBG_FLAGS}>) + target_link_options(libguf_example PRIVATE ${WARNING_FLAGS_C} $<$: ${DBG_FLAGS}> -lm) message(STATUS "Configured libguf_example") diff --git a/src/guf_cstr.h b/src/guf_cstr.h index db30b62..c49a935 100755 --- a/src/guf_cstr.h +++ b/src/guf_cstr.h @@ -9,6 +9,15 @@ #include "guf_assert.h" #include "guf_hash.h" +static inline char *guf_cstr_dup(const char *cstr) +{ + char *cpy = (char*)calloc(strlen(cstr) + 1, 1); // Explicit conversion for cpp... + if (cpy) { + strcpy(cpy, cstr); + } + return cpy; +} + typedef const char* guf_cstr_const; static inline int guf_cstr_const_cmp(const guf_cstr_const *a, const guf_cstr_const *b) @@ -42,11 +51,11 @@ static inline guf_cstr_heap *guf_cstr_heap_copy(guf_cstr_heap *dst, const guf_cs *dst = NULL; return dst; } - *dst = strdup(*src); + *dst = guf_cstr_dup(*src); GUF_ASSERT_RELEASE(*dst); return dst; } - +// static inline guf_cstr_heap *guf_cstr_heap_move(guf_cstr_heap *dst, guf_cstr_heap *src, void *ctx) { (void)ctx; diff --git a/src/guf_str.h b/src/guf_str.h index 7de9ee0..703c599 100755 --- a/src/guf_str.h +++ b/src/guf_str.h @@ -77,7 +77,7 @@ typedef struct guf_str_tok_state { #define GUF_CSTR_TO_VIEW_CPP(CSTR) guf_str_view {.str = (CSTR), .len = (ptrdiff_t)strlen(CSTR)} #define GUF_CSTR_LIT_TO_VIEW_CPP(CSTR) guf_str_view {.str = (CSTR), .len = (ptrdiff_t)sizeof(CSTR) - 1} - #define GUF_STR_UNINITIALISED_CPP guf_str{.allocator = NULL, .data.lng.size = 0, .data.lng.capacity = 0, .data.lng.c_str = NULL} + #define GUF_STR_UNINITIALISED_CPP guf_str{.data = {0}, .allocator = NULL} #endif // 1.) guf_str_view: diff --git a/src/test/example.c b/src/test/example.c index 5685519..c4a98c9 100755 --- a/src/test/example.c +++ b/src/test/example.c @@ -132,7 +132,7 @@ int main(void) dbuf_heap_cstr strings = dbuf_heap_cstr_new(&allocator); dbuf_heap_cstr_push_val_cpy(&strings, "Foo 1"); dbuf_heap_cstr_push_val_cpy(&strings, "Bar 2"); - char *move_me = strdup("Baz 3"); + char *move_me = guf_cstr_dup("Baz 3"); dbuf_heap_cstr_push(&strings, &move_me, GUF_CPY_MOVE); GUF_ASSERT_RELEASE(move_me == NULL); diff --git a/src/test/test.hpp b/src/test/test.hpp index e776aa0..58d65bf 100755 --- a/src/test/test.hpp +++ b/src/test/test.hpp @@ -55,7 +55,7 @@ public: bool passed {false}, done {false}; size_t num_failed_checks {0}, num_passed_checks {0}; - Test(const std::string& name) : name{name} {} + Test(const std::string& nm) : name{nm} {} virtual ~Test() = default; size_t total_checks() const @@ -67,7 +67,7 @@ public: void before_run() { - time_start = std::chrono::high_resolution_clock::now(); + time_start = std::chrono::steady_clock::now(); } void after_run() @@ -75,7 +75,7 @@ public: done = true; passed = (num_failed_checks == 0); - time_end = std::chrono::high_resolution_clock::now(); + time_end = std::chrono::steady_clock::now(); runtime_ms = std::chrono::duration_cast(time_end - time_start); } diff --git a/src/test/test_dict.cpp b/src/test/test_dict.cpp index 2ee7127..91d14ab 100755 --- a/src/test/test_dict.cpp +++ b/src/test/test_dict.cpp @@ -61,11 +61,11 @@ void DictSvToIntTest::insert_lookup(std::optional inital_dict_cap) dbuf_str_view delims = dbuf_str_view_new(&allocator); for (size_t i = 0; i < GUF_ARR_SIZE(GUF_UTF8_WHITESPACE); ++i) { - guf_str_view d = {.len = (ptrdiff_t)strlen(GUF_UTF8_WHITESPACE[i]), .str = GUF_UTF8_WHITESPACE[i]}; + guf_str_view d = {.str = GUF_UTF8_WHITESPACE[i], .len = (ptrdiff_t)strlen(GUF_UTF8_WHITESPACE[i])}; dbuf_str_view_push_val(&delims, d); } for (size_t i = 0; i < GUF_ARR_SIZE(GUF_UTF8_COMMON_PUNCT); ++i) { - guf_str_view d = {.len = (ptrdiff_t)strlen(GUF_UTF8_COMMON_PUNCT[i]), .str = GUF_UTF8_COMMON_PUNCT[i]}; + guf_str_view d = {.str = GUF_UTF8_COMMON_PUNCT[i], .len = (ptrdiff_t)strlen(GUF_UTF8_COMMON_PUNCT[i])}; dbuf_str_view_push_val(&delims, d); } @@ -378,14 +378,14 @@ void DictSvToIntTest::insert_lookup(std::optional inital_dict_cap) str += c % 2 ? "AAA" : "aaa"; } - guf_str str_cpy = guf_str_new(guf_str_view{.len = (ptrdiff_t)str.size(), .str = str.data()}, &allocator); + guf_str str_cpy = guf_str_new(guf_str_view{.str = str.data(), .len = (ptrdiff_t)str.size()}, &allocator); dict_str_i32_insert_val_arg(&word_cnt_dict_str, str_cpy, 42, GUF_CPY_DEEP, GUF_CPY_VALUE); int32_t *foo = dict_str_i32_at_val_arg(&word_cnt_dict_str, guf_str_new_readonly(guf_str_view_from_str(&str_cpy))); if (TEST_CHECK(foo)) { TEST_CHECK(*foo == 42); } guf_str_append(&str_cpy, GUF_CSTR_LIT_TO_VIEW_CPP("Foobar")); - int32_t *foo2 = dict_str_i32_at_val_arg(&word_cnt_dict_str, guf_str_new_readonly(guf_str_view{.len = (ptrdiff_t)str.size(), .str = str.data()})); + int32_t *foo2 = dict_str_i32_at_val_arg(&word_cnt_dict_str, guf_str_new_readonly(guf_str_view{.str = str.data(), .len = (ptrdiff_t)str.size()})); if (TEST_CHECK(foo2)) { TEST_CHECK(*foo2 == 42); } diff --git a/src/test/test_str.cpp b/src/test/test_str.cpp index 46956bb..9f816da 100755 --- a/src/test/test_str.cpp +++ b/src/test/test_str.cpp @@ -335,8 +335,8 @@ std::vector StrTest::test_popsplit(std::string_view str, std:: } - const guf_str_view delim_sv = guf_str_view{.len = (ptrdiff_t)delim.size(), .str = delim.data()}; - guf_str_view src = guf_str_view{.len = (ptrdiff_t)str.size(), .str = str.data()}; + const guf_str_view delim_sv = guf_str_view{.str = delim.data(), .len = (ptrdiff_t)delim.size()}; + guf_str_view src = guf_str_view{.str = str.data(), .len = (ptrdiff_t)str.size()}; size_t n = 0; do { const guf_str_view popped = guf_str_view_pop_split(&src, delim_sv); @@ -356,10 +356,10 @@ std::vector StrTest::test_popsplit(std::string_view str, std:: std::vector StrTest::get_toks(std::string_view sv_in, const std::vector& delims_in, bool preserve_delims, guf_str_tok_delim_opt opt) { - const guf_str_view sv = guf_str_view{.len = (ptrdiff_t)sv_in.size(), .str = sv_in.data()}; + const guf_str_view sv = guf_str_view{.str = sv_in.data(), .len = (ptrdiff_t)sv_in.size()}; std::vector delims; for (const auto delim : delims_in) { - delims.push_back(guf_str_view{.len = (ptrdiff_t)delim.size(), .str = delim.data()}); + delims.push_back(guf_str_view{.str = delim.data(), .len = (ptrdiff_t)delim.size()}); } guf_str_tok_state tok_state = guf_str_tok_state_new(sv, delims.data(), std::ssize(delims), opt); diff --git a/src/test/test_utf8.cpp b/src/test/test_utf8.cpp index 6a80789..3294070 100755 --- a/src/test/test_utf8.cpp +++ b/src/test/test_utf8.cpp @@ -27,11 +27,11 @@ void UTF8Test::run() push_check_name("count_words"); dbuf_str_view delims = dbuf_str_view_new(&allocator); for (size_t i = 0; i < GUF_ARR_SIZE(GUF_UTF8_WHITESPACE); ++i) { - guf_str_view d = {.len = (ptrdiff_t)strlen(GUF_UTF8_WHITESPACE[i]), .str = GUF_UTF8_WHITESPACE[i]}; + guf_str_view d = {.str = GUF_UTF8_WHITESPACE[i], .len = (ptrdiff_t)strlen(GUF_UTF8_WHITESPACE[i])}; dbuf_str_view_push_val(&delims, d); } for (size_t i = 0; i < GUF_ARR_SIZE(GUF_UTF8_COMMON_PUNCT); ++i) { - guf_str_view d = {.len = (ptrdiff_t)strlen(GUF_UTF8_COMMON_PUNCT[i]), .str = GUF_UTF8_COMMON_PUNCT[i]}; + guf_str_view d = {.str = GUF_UTF8_COMMON_PUNCT[i], .len = (ptrdiff_t)strlen(GUF_UTF8_COMMON_PUNCT[i])}; dbuf_str_view_push_val(&delims, d); } int words = count_words(TEST_DATA_DIR "/" "utf8-test.txt", &delims); diff --git a/todo.txt b/todo.txt index 3fb13a1..6c890ae 100755 --- a/todo.txt +++ b/todo.txt @@ -1,4 +1,4 @@ -- fix readonly str/uninit ? +- fix readonly str/uninit? - dict: allow set