diff --git a/CMakeLists.txt b/CMakeLists.txt index 6775b99..29ca33d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,9 +28,12 @@ if(MSVC) endif() elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_C_FLAGS - "${CMAKE_C_FLAGS} -Wno-unused-parameter -Wall -Wextra -Wpedantic -Walloca -Wcast-align -Wcast-qual -Wdouble-promotion -Wduplicated-cond -Wenum-conversion -Wfloat-equal -Wformat-overflow=2 -Wformat-signedness -Wformat=2 -Wframe-larger-than=2048 -Wlogical-op -Wmissing-braces -Wmultichar -Wpointer-arith -Wrestrict -Wshadow -Wjump-misses-init -Wsuggest-attribute=format -Wsuggest-attribute=malloc -Wuninitialized -Wvla -Wwrite-strings -Wsign-conversion -std=c99" + "${CMAKE_C_FLAGS} -Wno-unused-parameter -Wall -Wextra -Wpedantic -Walloca -Wcast-align -Wcast-qual -Wdouble-promotion -Wduplicated-cond -Wenum-conversion -Wfloat-equal -Wformat-overflow=2 -Wformat-signedness -Wformat=2 -Wframe-larger-than=2048 -Wlogical-op -Wmissing-braces -Wmultichar -Wpointer-arith -Wrestrict -Wshadow -Wjump-misses-init -Wsuggest-attribute=format -Wsuggest-attribute=malloc -Wuninitialized -Wvla -Wwrite-strings -Wsign-conversion -std=gnu99" ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-parameter -Wall -Wextra -Wpedantic -Walloca -Wcast-align -Wcast-qual -Wcomma-subscript -Wctor-dtor-privacy -Wdeprecated-copy-dtor -Wdouble-promotion -Wduplicated-cond -Wenum-conversion -Wextra-semi -Wfloat-equal -Wformat-overflow=2 -Wformat-signedness -Wformat=2 -Wframe-larger-than=2048 -Wlogical-op -Wmismatched-tags -Wmissing-braces -Wmultichar -Wnoexcept -Wnon-virtual-dtor -Woverloaded-virtual -Wpointer-arith -Wrange-loop-construct -Wrestrict -Wshadow -Wstrict-null-sentinel -Wsuggest-attribute=format -Wsuggest-attribute=malloc -Wuninitialized -Wvla -Wvolatile -Wwrite-strings -Wsign-conversion") +elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -std=gnu99") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") else() message("WARNING: Unknown compiler, warning flags were not set") endif() diff --git a/include/tinycsocket.h b/include/tinycsocket.h index df6717b..d0bf52f 100644 --- a/include/tinycsocket.h +++ b/include/tinycsocket.h @@ -29,7 +29,7 @@ #ifndef TINYCSOCKET_INTERNAL_H_ #define TINYCSOCKET_INTERNAL_H_ -static const char* const TCS_VERSION_TXT = "v0.3.61"; +static const char* const TCS_VERSION_TXT = "v0.3.62"; static const char* const TCS_LICENSE_TXT = "Copyright 2018 Markus Lindelöw\n" "\n" @@ -190,22 +190,12 @@ typedef UINT_PTR TcsSocket; typedef unsigned int TcsInterfaceId; // TODO: GUID is used for in vista at newer. Change this type. #elif defined(TINYCSOCKET_USE_POSIX_IMPL) -#if defined(TINYCSOCKET_IMPLEMENTATION) || defined(TCS_DEFINE_POSIX_MACROS) -// Only needed on glibc/Cygwin where -std=c99 restricts symbol visibility. -// On BSD/musl, setting these RESTRICTS visibility instead of expanding it. -#if defined(__linux__) || defined(__CYGWIN__) -#ifndef _XOPEN_SOURCE -#define _XOPEN_SOURCE 600 -#endif -#ifndef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 200112L -#endif -#ifndef _ISOC99_SOURCE -#define _ISOC99_SOURCE -#endif -#ifndef _DEFAULT_SOURCE -#define _DEFAULT_SOURCE -#endif +#if defined(TINYCSOCKET_IMPLEMENTATION) +#if (defined(__linux__) || defined(__CYGWIN__)) && defined(__STRICT_ANSI__) +#pragma message( \ + "tinycsocket: Strict ANSI C mode detected on glibc/Cygwin. " \ + "POSIX symbols may be hidden. Use -std=gnu99 instead of -std=c99, " \ + "or define _POSIX_C_SOURCE=200112L and _DEFAULT_SOURCE before including this header.") #endif #endif @@ -2306,6 +2296,12 @@ bool tcs_address_is_broadcast(const struct TcsAddress* addr); #include #include +#ifdef _MSC_VER +#define TDS_UNUSED +#else +#define TDS_UNUSED __attribute__((unused)) +#endif + static inline int tds_ulist_create(void** data, size_t* count, size_t* capacity, size_t element_size); static inline int tds_ulist_destroy(void** data, size_t* count, size_t* capacity); static inline int tds_ulist_reserve(void** data, size_t* capacity, size_t element_size, size_t requested_capacity); @@ -2437,27 +2433,27 @@ static inline int tds_ulist_remove(void** data, size_t capacity; \ }; \ \ - static inline int tds_ulist_##NAME##_create(struct TdsUList_##NAME* ulist) \ + TDS_UNUSED static inline int tds_ulist_##NAME##_create(struct TdsUList_##NAME* ulist) \ { \ return tds_ulist_create((void**)&ulist->data, &ulist->count, &ulist->capacity, sizeof(TYPE)); \ } \ - static inline int tds_ulist_##NAME##_destroy(struct TdsUList_##NAME* ulist) \ + TDS_UNUSED static inline int tds_ulist_##NAME##_destroy(struct TdsUList_##NAME* ulist) \ { \ int sts = tds_ulist_destroy((void**)&ulist->data, &ulist->count, &ulist->capacity); \ memset(ulist, 0, sizeof(*ulist)); \ return sts; \ } \ - static inline int tds_ulist_##NAME##_add(struct TdsUList_##NAME* ulist, TYPE* data, size_t count) \ + TDS_UNUSED static inline int tds_ulist_##NAME##_add(struct TdsUList_##NAME* ulist, TYPE* data, size_t count) \ { \ return tds_ulist_add((void**)&ulist->data, &ulist->count, &ulist->capacity, sizeof(TYPE), (void*)data, count); \ } \ - static inline int tds_ulist_##NAME##_remove( \ + TDS_UNUSED static inline int tds_ulist_##NAME##_remove( \ struct TdsUList_##NAME* ulist, size_t remove_from, size_t remove_count) \ { \ return tds_ulist_remove( \ (void**)&ulist->data, &ulist->count, &ulist->capacity, sizeof(TYPE), remove_from, remove_count); \ } \ - static inline int tds_ulist_##NAME##_reserve(struct TdsUList_##NAME* ulist, size_t new_capacity) \ + TDS_UNUSED static inline int tds_ulist_##NAME##_reserve(struct TdsUList_##NAME* ulist, size_t new_capacity) \ { \ return tds_ulist_reserve((void**)&ulist->data, &ulist->capacity, sizeof(TYPE), new_capacity); \ } @@ -2580,65 +2576,65 @@ static inline int tds_map_remove(void** keys, return 0; } -#define TDS_MAP_IMPL(KEY_TYPE, VALUE_TYPE, NAME) \ - \ - struct TdsMap_##NAME \ - { \ - KEY_TYPE* keys; \ - VALUE_TYPE* values; \ - size_t count; \ - size_t capacity; \ - }; \ - \ - static inline int tds_map_##NAME##_create(struct TdsMap_##NAME* map) \ - { \ - memset(map, 0, sizeof(struct TdsMap_##NAME)); \ - return tds_map_create((void**)&map->keys, \ - (void**)&map->values, \ - &map->count, \ - &map->capacity, \ - sizeof(KEY_TYPE), \ - sizeof(VALUE_TYPE)); \ - } \ - static inline int tds_map_##NAME##_destroy(struct TdsMap_##NAME* map) \ - { \ - int sts = tds_map_destroy((void**)&map->keys, (void**)&map->values, &map->count, &map->capacity); \ - if (sts != 0) \ - return sts; \ - memset(map, 0, sizeof(struct TdsMap_##NAME)); \ - return 0; \ - } \ - static inline int tds_map_##NAME##_add(struct TdsMap_##NAME* map, KEY_TYPE key, VALUE_TYPE value) \ - { \ - return tds_map_add((void**)&map->keys, \ - (void**)&map->values, \ - &map->count, \ - &map->capacity, \ - sizeof(KEY_TYPE), \ - sizeof(VALUE_TYPE), \ - &key, \ - &value); \ - } \ - static inline int tds_map_##NAME##_addp(struct TdsMap_##NAME* map, KEY_TYPE* key, VALUE_TYPE* value) \ - { \ - return tds_map_add((void**)&map->keys, \ - (void**)&map->values, \ - &map->count, \ - &map->capacity, \ - sizeof(KEY_TYPE), \ - sizeof(VALUE_TYPE), \ - key, \ - value); \ - } \ - static inline int tds_map_##NAME##_remove(struct TdsMap_##NAME* map, size_t index) \ - { \ - return tds_map_remove((void**)&map->keys, \ - (void**)&map->values, \ - &map->count, \ - &map->capacity, \ - sizeof(KEY_TYPE), \ - sizeof(VALUE_TYPE), \ - index); \ +#define TDS_MAP_IMPL(KEY_TYPE, VALUE_TYPE, NAME) \ + \ + struct TdsMap_##NAME \ + { \ + KEY_TYPE* keys; \ + VALUE_TYPE* values; \ + size_t count; \ + size_t capacity; \ + }; \ + \ + TDS_UNUSED static inline int tds_map_##NAME##_create(struct TdsMap_##NAME* map) \ + { \ + memset(map, 0, sizeof(struct TdsMap_##NAME)); \ + return tds_map_create((void**)&map->keys, \ + (void**)&map->values, \ + &map->count, \ + &map->capacity, \ + sizeof(KEY_TYPE), \ + sizeof(VALUE_TYPE)); \ + } \ + TDS_UNUSED static inline int tds_map_##NAME##_destroy(struct TdsMap_##NAME* map) \ + { \ + int sts = tds_map_destroy((void**)&map->keys, (void**)&map->values, &map->count, &map->capacity); \ + if (sts != 0) \ + return sts; \ + memset(map, 0, sizeof(struct TdsMap_##NAME)); \ + return 0; \ + } \ + TDS_UNUSED static inline int tds_map_##NAME##_add(struct TdsMap_##NAME* map, KEY_TYPE key, VALUE_TYPE value) \ + { \ + return tds_map_add((void**)&map->keys, \ + (void**)&map->values, \ + &map->count, \ + &map->capacity, \ + sizeof(KEY_TYPE), \ + sizeof(VALUE_TYPE), \ + &key, \ + &value); \ + } \ + TDS_UNUSED static inline int tds_map_##NAME##_addp(struct TdsMap_##NAME* map, KEY_TYPE* key, VALUE_TYPE* value) \ + { \ + return tds_map_add((void**)&map->keys, \ + (void**)&map->values, \ + &map->count, \ + &map->capacity, \ + sizeof(KEY_TYPE), \ + sizeof(VALUE_TYPE), \ + key, \ + value); \ + } \ + TDS_UNUSED static inline int tds_map_##NAME##_remove(struct TdsMap_##NAME* map, size_t index) \ + { \ + return tds_map_remove((void**)&map->keys, \ + (void**)&map->values, \ + &map->count, \ + &map->capacity, \ + sizeof(KEY_TYPE), \ + sizeof(VALUE_TYPE), \ + index); \ } #endif @@ -2670,7 +2666,6 @@ static inline int tds_map_remove(void** keys, // Header only should not need other files #ifndef TINYCSOCKET_INTERNAL_H_ -#define TCS_DEFINE_POSIX_MACROS // Helper to not lock to strict C99 #include "tinycsocket_internal.h" #endif #ifdef TINYCSOCKET_USE_POSIX_IMPL @@ -2702,8 +2697,8 @@ static inline int tds_map_remove(void** keys, #endif #include -#include // fcntl() for non-blocking -#include // IOV_MAX +#include // fcntl() for non-blocking +#include #include // Flags for ifaddrs (?) #include // Protocols and custom return codes #include // IPPROTO_XXP @@ -2744,6 +2739,8 @@ struct TcsPool const TcsSocket TCS_SOCKET_INVALID = -1; const int TCS_WAIT_INF = -1; +static long tcs_iov_max = 1024; // Default, updated by tcs_lib_init() via sysconf(_SC_IOV_MAX) + // Addresses const uint32_t TCS_ADDRESS_ANY_IP4 = INADDR_ANY; const uint32_t TCS_ADDRESS_LOOPBACK_IP4 = INADDR_LOOPBACK; @@ -3016,7 +3013,9 @@ static TcsResult native2sockaddr(const struct sockaddr* in_addr, struct TcsAddre TcsResult tcs_lib_init(void) { - // Not needed for posix + long iov_max = sysconf(_SC_IOV_MAX); + if (iov_max > 0) + tcs_iov_max = iov_max; return TCS_SUCCESS; } @@ -3298,7 +3297,7 @@ TcsResult tcs_sendv(TcsSocket socket_ctx, if (flags & TCS_MSG_SENDALL) return TCS_ERROR_NOT_IMPLEMENTED; - if (buffer_count > IOV_MAX) + if (buffer_count > (size_t)tcs_iov_max) return TCS_ERROR_INVALID_ARGUMENT; struct iovec stack_iovec[TCS_SENDV_STACK_MAX]; @@ -3333,7 +3332,7 @@ TcsResult tcs_sendv(TcsSocket socket_ctx, msg.msg_namelen = 0; msg.msg_iov = my_iovec; // msg_iovlen type varies across platforms (int on POSIX, size_t on glibc). - // buffer_count is already validated against IOV_MAX above. + // buffer_count is already validated against tcs_iov_max above. #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" diff --git a/src/tinycsocket_internal.h b/src/tinycsocket_internal.h index e9db88e..a872237 100644 --- a/src/tinycsocket_internal.h +++ b/src/tinycsocket_internal.h @@ -23,7 +23,7 @@ #ifndef TINYCSOCKET_INTERNAL_H_ #define TINYCSOCKET_INTERNAL_H_ -static const char* const TCS_VERSION_TXT = "v0.3.61"; +static const char* const TCS_VERSION_TXT = "v0.3.62"; static const char* const TCS_LICENSE_TXT = "Copyright 2018 Markus Lindelöw\n" "\n" @@ -184,22 +184,12 @@ typedef UINT_PTR TcsSocket; typedef unsigned int TcsInterfaceId; // TODO: GUID is used for in vista at newer. Change this type. #elif defined(TINYCSOCKET_USE_POSIX_IMPL) -#if defined(TINYCSOCKET_IMPLEMENTATION) || defined(TCS_DEFINE_POSIX_MACROS) -// Only needed on glibc/Cygwin where -std=c99 restricts symbol visibility. -// On BSD/musl, setting these RESTRICTS visibility instead of expanding it. -#if defined(__linux__) || defined(__CYGWIN__) -#ifndef _XOPEN_SOURCE -#define _XOPEN_SOURCE 600 -#endif -#ifndef _POSIX_C_SOURCE -#define _POSIX_C_SOURCE 200112L -#endif -#ifndef _ISOC99_SOURCE -#define _ISOC99_SOURCE -#endif -#ifndef _DEFAULT_SOURCE -#define _DEFAULT_SOURCE -#endif +#if defined(TINYCSOCKET_IMPLEMENTATION) +#if (defined(__linux__) || defined(__CYGWIN__)) && defined(__STRICT_ANSI__) +#pragma message( \ + "tinycsocket: Strict ANSI C mode detected on glibc/Cygwin. " \ + "POSIX symbols may be hidden. Use -std=gnu99 instead of -std=c99, " \ + "or define _POSIX_C_SOURCE=200112L and _DEFAULT_SOURCE before including this header.") #endif #endif diff --git a/src/tinycsocket_posix.c b/src/tinycsocket_posix.c index aee17cd..a75c1d5 100644 --- a/src/tinycsocket_posix.c +++ b/src/tinycsocket_posix.c @@ -22,7 +22,6 @@ // Header only should not need other files #ifndef TINYCSOCKET_INTERNAL_H_ -#define TCS_DEFINE_POSIX_MACROS // Helper to not lock to strict C99 #include "tinycsocket_internal.h" #endif #ifdef TINYCSOCKET_USE_POSIX_IMPL @@ -54,8 +53,8 @@ #endif #include -#include // fcntl() for non-blocking -#include // IOV_MAX +#include // fcntl() for non-blocking +#include #include // Flags for ifaddrs (?) #include // Protocols and custom return codes #include // IPPROTO_XXP @@ -96,6 +95,8 @@ struct TcsPool const TcsSocket TCS_SOCKET_INVALID = -1; const int TCS_WAIT_INF = -1; +static long tcs_iov_max = 1024; // Default, updated by tcs_lib_init() via sysconf(_SC_IOV_MAX) + // Addresses const uint32_t TCS_ADDRESS_ANY_IP4 = INADDR_ANY; const uint32_t TCS_ADDRESS_LOOPBACK_IP4 = INADDR_LOOPBACK; @@ -368,7 +369,9 @@ static TcsResult native2sockaddr(const struct sockaddr* in_addr, struct TcsAddre TcsResult tcs_lib_init(void) { - // Not needed for posix + long iov_max = sysconf(_SC_IOV_MAX); + if (iov_max > 0) + tcs_iov_max = iov_max; return TCS_SUCCESS; } @@ -650,7 +653,7 @@ TcsResult tcs_sendv(TcsSocket socket_ctx, if (flags & TCS_MSG_SENDALL) return TCS_ERROR_NOT_IMPLEMENTED; - if (buffer_count > IOV_MAX) + if (buffer_count > (size_t)tcs_iov_max) return TCS_ERROR_INVALID_ARGUMENT; struct iovec stack_iovec[TCS_SENDV_STACK_MAX]; @@ -685,7 +688,7 @@ TcsResult tcs_sendv(TcsSocket socket_ctx, msg.msg_namelen = 0; msg.msg_iov = my_iovec; // msg_iovlen type varies across platforms (int on POSIX, size_t on glibc). - // buffer_count is already validated against IOV_MAX above. + // buffer_count is already validated against tcs_iov_max above. #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wconversion" #pragma GCC diagnostic ignored "-Wsign-conversion" diff --git a/src/tinydatastructures.h b/src/tinydatastructures.h index cb058ea..699b669 100644 --- a/src/tinydatastructures.h +++ b/src/tinydatastructures.h @@ -4,6 +4,12 @@ #include #include +#ifdef _MSC_VER +#define TDS_UNUSED +#else +#define TDS_UNUSED __attribute__((unused)) +#endif + static inline int tds_ulist_create(void** data, size_t* count, size_t* capacity, size_t element_size); static inline int tds_ulist_destroy(void** data, size_t* count, size_t* capacity); static inline int tds_ulist_reserve(void** data, size_t* capacity, size_t element_size, size_t requested_capacity); @@ -135,27 +141,27 @@ static inline int tds_ulist_remove(void** data, size_t capacity; \ }; \ \ - static inline int tds_ulist_##NAME##_create(struct TdsUList_##NAME* ulist) \ + TDS_UNUSED static inline int tds_ulist_##NAME##_create(struct TdsUList_##NAME* ulist) \ { \ return tds_ulist_create((void**)&ulist->data, &ulist->count, &ulist->capacity, sizeof(TYPE)); \ } \ - static inline int tds_ulist_##NAME##_destroy(struct TdsUList_##NAME* ulist) \ + TDS_UNUSED static inline int tds_ulist_##NAME##_destroy(struct TdsUList_##NAME* ulist) \ { \ int sts = tds_ulist_destroy((void**)&ulist->data, &ulist->count, &ulist->capacity); \ memset(ulist, 0, sizeof(*ulist)); \ return sts; \ } \ - static inline int tds_ulist_##NAME##_add(struct TdsUList_##NAME* ulist, TYPE* data, size_t count) \ + TDS_UNUSED static inline int tds_ulist_##NAME##_add(struct TdsUList_##NAME* ulist, TYPE* data, size_t count) \ { \ return tds_ulist_add((void**)&ulist->data, &ulist->count, &ulist->capacity, sizeof(TYPE), (void*)data, count); \ } \ - static inline int tds_ulist_##NAME##_remove( \ + TDS_UNUSED static inline int tds_ulist_##NAME##_remove( \ struct TdsUList_##NAME* ulist, size_t remove_from, size_t remove_count) \ { \ return tds_ulist_remove( \ (void**)&ulist->data, &ulist->count, &ulist->capacity, sizeof(TYPE), remove_from, remove_count); \ } \ - static inline int tds_ulist_##NAME##_reserve(struct TdsUList_##NAME* ulist, size_t new_capacity) \ + TDS_UNUSED static inline int tds_ulist_##NAME##_reserve(struct TdsUList_##NAME* ulist, size_t new_capacity) \ { \ return tds_ulist_reserve((void**)&ulist->data, &ulist->capacity, sizeof(TYPE), new_capacity); \ } @@ -278,65 +284,65 @@ static inline int tds_map_remove(void** keys, return 0; } -#define TDS_MAP_IMPL(KEY_TYPE, VALUE_TYPE, NAME) \ - \ - struct TdsMap_##NAME \ - { \ - KEY_TYPE* keys; \ - VALUE_TYPE* values; \ - size_t count; \ - size_t capacity; \ - }; \ - \ - static inline int tds_map_##NAME##_create(struct TdsMap_##NAME* map) \ - { \ - memset(map, 0, sizeof(struct TdsMap_##NAME)); \ - return tds_map_create((void**)&map->keys, \ - (void**)&map->values, \ - &map->count, \ - &map->capacity, \ - sizeof(KEY_TYPE), \ - sizeof(VALUE_TYPE)); \ - } \ - static inline int tds_map_##NAME##_destroy(struct TdsMap_##NAME* map) \ - { \ - int sts = tds_map_destroy((void**)&map->keys, (void**)&map->values, &map->count, &map->capacity); \ - if (sts != 0) \ - return sts; \ - memset(map, 0, sizeof(struct TdsMap_##NAME)); \ - return 0; \ - } \ - static inline int tds_map_##NAME##_add(struct TdsMap_##NAME* map, KEY_TYPE key, VALUE_TYPE value) \ - { \ - return tds_map_add((void**)&map->keys, \ - (void**)&map->values, \ - &map->count, \ - &map->capacity, \ - sizeof(KEY_TYPE), \ - sizeof(VALUE_TYPE), \ - &key, \ - &value); \ - } \ - static inline int tds_map_##NAME##_addp(struct TdsMap_##NAME* map, KEY_TYPE* key, VALUE_TYPE* value) \ - { \ - return tds_map_add((void**)&map->keys, \ - (void**)&map->values, \ - &map->count, \ - &map->capacity, \ - sizeof(KEY_TYPE), \ - sizeof(VALUE_TYPE), \ - key, \ - value); \ - } \ - static inline int tds_map_##NAME##_remove(struct TdsMap_##NAME* map, size_t index) \ - { \ - return tds_map_remove((void**)&map->keys, \ - (void**)&map->values, \ - &map->count, \ - &map->capacity, \ - sizeof(KEY_TYPE), \ - sizeof(VALUE_TYPE), \ - index); \ +#define TDS_MAP_IMPL(KEY_TYPE, VALUE_TYPE, NAME) \ + \ + struct TdsMap_##NAME \ + { \ + KEY_TYPE* keys; \ + VALUE_TYPE* values; \ + size_t count; \ + size_t capacity; \ + }; \ + \ + TDS_UNUSED static inline int tds_map_##NAME##_create(struct TdsMap_##NAME* map) \ + { \ + memset(map, 0, sizeof(struct TdsMap_##NAME)); \ + return tds_map_create((void**)&map->keys, \ + (void**)&map->values, \ + &map->count, \ + &map->capacity, \ + sizeof(KEY_TYPE), \ + sizeof(VALUE_TYPE)); \ + } \ + TDS_UNUSED static inline int tds_map_##NAME##_destroy(struct TdsMap_##NAME* map) \ + { \ + int sts = tds_map_destroy((void**)&map->keys, (void**)&map->values, &map->count, &map->capacity); \ + if (sts != 0) \ + return sts; \ + memset(map, 0, sizeof(struct TdsMap_##NAME)); \ + return 0; \ + } \ + TDS_UNUSED static inline int tds_map_##NAME##_add(struct TdsMap_##NAME* map, KEY_TYPE key, VALUE_TYPE value) \ + { \ + return tds_map_add((void**)&map->keys, \ + (void**)&map->values, \ + &map->count, \ + &map->capacity, \ + sizeof(KEY_TYPE), \ + sizeof(VALUE_TYPE), \ + &key, \ + &value); \ + } \ + TDS_UNUSED static inline int tds_map_##NAME##_addp(struct TdsMap_##NAME* map, KEY_TYPE* key, VALUE_TYPE* value) \ + { \ + return tds_map_add((void**)&map->keys, \ + (void**)&map->values, \ + &map->count, \ + &map->capacity, \ + sizeof(KEY_TYPE), \ + sizeof(VALUE_TYPE), \ + key, \ + value); \ + } \ + TDS_UNUSED static inline int tds_map_##NAME##_remove(struct TdsMap_##NAME* map, size_t index) \ + { \ + return tds_map_remove((void**)&map->keys, \ + (void**)&map->values, \ + &map->count, \ + &map->capacity, \ + sizeof(KEY_TYPE), \ + sizeof(VALUE_TYPE), \ + index); \ } #endif diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 4786d4d..ccffd66 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -4,17 +4,6 @@ include(CTest) add_executable(tests "tests.cpp" "mock.cpp" "mock.h") target_compile_options(tests PUBLIC "-DDO_WRAP") target_link_libraries(tests PRIVATE tinycsocket_wrapped) -# doctest's signal handling needs POSIX feature test macros to expose -# sigaltstack/sigaction/SA_ONSTACK/SIGSTKSZ on Cygwin and glibc with -std=c++11. -# Set them only on test targets to avoid leaking into header-only consumers. -if(NOT MSVC) - target_compile_definitions(tests PRIVATE - _XOPEN_SOURCE=600 - _POSIX_C_SOURCE=200112L - _DEFAULT_SOURCE - _ISOC99_SOURCE - ) -endif() set_target_properties(tests PROPERTIES FOLDER tinycsocket/tests) add_definitions(-DDOCTEST_CONFIG_TREAT_CHAR_STAR_AS_STRING) if(MINGW) @@ -24,7 +13,7 @@ if(MINGW) ) endif() if(NOT MSVC) - target_compile_options(tests PUBLIC -std=c++11) + target_compile_options(tests PUBLIC -std=gnu++11) endif() # Android does not need to link to any threads. It does not follow posix. # MSVC does not need to link to any threads. Windows has threads built-in. @@ -38,7 +27,7 @@ endif() add_executable(test_translation_units "header_only/a.c" "header_only/b.c") target_link_libraries(test_translation_units PRIVATE tinycsocket_header) if(NOT MSVC) - target_compile_options(test_translation_units PUBLIC -std=c99) + target_compile_options(test_translation_units PUBLIC -std=gnu99) endif() if(MINGW) @@ -67,7 +56,7 @@ target_sources( ) target_include_directories(tests_header_only PRIVATE "../src/") if(NOT MSVC) - target_compile_options(tests_header_only PUBLIC -std=c++11) + target_compile_options(tests_header_only PUBLIC -std=gnu++11) endif() if(MINGW) target_link_libraries(