From 61c76abf89c2db31f0a2879b9e2fbcbcce5ab50a Mon Sep 17 00:00:00 2001 From: Aaro Saila Date: Wed, 15 Jul 2026 14:33:05 +0300 Subject: [PATCH] DynString_equal_c_str --- src/DynString.c | 22 ++++++++++++++++++++-- src/DynString.h | 1 + src/pltf/win32/internal.c | 11 ++--------- src/pltf/win32/internal.h | 4 ++-- src/pltf/win32/pltf.c | 4 ++-- tests/main.c | 28 ++++++++++++++++++++++++++-- 6 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/DynString.c b/src/DynString.c index 30d3e96..76ad6c3 100644 --- a/src/DynString.c +++ b/src/DynString.c @@ -39,11 +39,11 @@ const char* DynString_c_str(const DynString* dstr) { } bool DynString_equal(const DynString* s1, const DynString* s2) { - if (s1->len != s2->len) { + if (s1->data == NULL || s2->data == NULL) { return false; } - if (s1->data == NULL || s2->data == NULL) { + if (s1->len != s2->len) { return false; } @@ -56,6 +56,24 @@ bool DynString_equal(const DynString* s1, const DynString* s2) { return true; } +bool DynString_equal_c_str(const DynString* s1, const char* s2) { + if (s1->data == NULL || s2 == NULL) { + return false; + } + + if (s1->len != strlen(s2)) { + return false; + } + + for (size_t i = 0; i < s1->len; i++) { + if (s1->data[i] != s2[i]) { + return false; + } + } + + return true; +} + void DynString_reserve(DynString* dstr, const size_t new_capacity) { if (dstr->capacity >= new_capacity) { return; diff --git a/src/DynString.h b/src/DynString.h index cf20e73..4d54d78 100644 --- a/src/DynString.h +++ b/src/DynString.h @@ -17,6 +17,7 @@ void DynString_free(DynString* dstr); bool DynString_is_null(const DynString* dstr); const char* DynString_c_str(const DynString* dstr); bool DynString_equal(const DynString* s1, const DynString* s2); +bool DynString_equal_c_str(const DynString* s1, const char* s2); void DynString_concat_c_str( DynString* dstr, const char* str, diff --git a/src/pltf/win32/internal.c b/src/pltf/win32/internal.c index 862056a..1850f77 100644 --- a/src/pltf/win32/internal.c +++ b/src/pltf/win32/internal.c @@ -23,9 +23,9 @@ PltfWin32State pltf_state = { #undef PLTF_KEYS_X -bool pltf_has_wgl_extension(const DynString* name) { +bool pltf_has_wgl_extension(const char* name) { for (size_t i = 0; i < pltf_state.wgl_extensions.len; i++) { - if (DynString_equal(name, DynArray_DynString_at(&pltf_state.wgl_extensions, i))) { + if (DynString_equal_c_str(DynArray_DynString_at(&pltf_state.wgl_extensions, i), name)) { return true; } } @@ -33,13 +33,6 @@ bool pltf_has_wgl_extension(const DynString* name) { return false; } -bool pltf_has_wgl_extension_c_str(const char* name) { - DynString name_dstr = DynString_alloc(name, strlen(name)); - const bool res = pltf_has_wgl_extension(&name_dstr); - DynString_free(&name_dstr); - return res; -} - unsigned int vk_to_pltf_key(WPARAM key) { switch (key) { case VK_ESCAPE: diff --git a/src/pltf/win32/internal.h b/src/pltf/win32/internal.h index e34cbbe..c6259c5 100644 --- a/src/pltf/win32/internal.h +++ b/src/pltf/win32/internal.h @@ -30,8 +30,8 @@ typedef struct { extern PltfWin32State pltf_state; extern HMODULE opengl_module; -bool pltf_has_wgl_extension(const DynString* name); -bool pltf_has_wgl_extension_c_str(const char* name); +bool pltf_has_wgl_extension(const char* name); +// bool pltf_has_wgl_extension_c_str(const char* name); unsigned int vk_to_pltf_key(WPARAM key); #endif // PLTF_WIN32_INTERNAL_H_ diff --git a/src/pltf/win32/pltf.c b/src/pltf/win32/pltf.c index 0c82bd1..176a158 100644 --- a/src/pltf/win32/pltf.c +++ b/src/pltf/win32/pltf.c @@ -156,10 +156,10 @@ void pltf_gl_ctx_create() { free(wgl_extensions_str); - if (!pltf_has_wgl_extension_c_str("WGL_ARB_pixel_format")) { + if (!pltf_has_wgl_extension("WGL_ARB_pixel_format")) { LOG_FATAL("WGL_ARB_create_context extension required."); } - if (!pltf_has_wgl_extension_c_str("WGL_ARB_create_context")) { + if (!pltf_has_wgl_extension("WGL_ARB_create_context")) { LOG_FATAL("WGL_ARB_create_context extension is required"); } diff --git a/tests/main.c b/tests/main.c index 62648b5..7a2584b 100644 --- a/tests/main.c +++ b/tests/main.c @@ -34,10 +34,33 @@ void test_DynString_equal(void** state) { DynString_free(&s2); s1 = DynString_alloc("Hello", strlen("Hello")); - s2 = DynString_alloc("Hello", strlen("Hello")); - assert_true(DynString_equal(&s1, &s2)); + s2 = DynString_alloc("Hell0", strlen("Hell0")); + assert_false(DynString_equal(&s1, &s2)); DynString_free(&s1); DynString_free(&s2); + + s1 = DynString_alloc("Hello World", strlen("Hello World")); + s2 = DynString_alloc("Hello", strlen("Hello")); + assert_false(DynString_equal(&s1, &s2)); + DynString_free(&s1); + DynString_free(&s2); +} + +void test_DynString_equal_c_str(void** state) { + DynString s1 = DynString_alloc("Hello", strlen("Hello")); + char* s2 = "Hello"; + assert_true(DynString_equal_c_str(&s1, s2)); + DynString_free(&s1); + + s1 = DynString_alloc("Hello", strlen("Hello")); + s2 = "Hell0"; + assert_false(DynString_equal_c_str(&s1, s2)); + DynString_free(&s1); + + s1 = DynString_alloc("Hello World", strlen("Hello World")); + s2 = "Hello"; + assert_false(DynString_equal_c_str(&s1, s2)); + DynString_free(&s1); } void test_DynString_concat_c_str(void** state) { @@ -71,6 +94,7 @@ int main() { cmocka_unit_test(test_DynString_alloc), cmocka_unit_test(test_DynString_free), cmocka_unit_test(test_DynString_equal), + cmocka_unit_test(test_DynString_equal_c_str), cmocka_unit_test(test_DynString_concat_c_str), cmocka_unit_test(test_DynString_c_str), };