From bbc63a23924d7f24b162f9e94b1a5b07b1514baf Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Sun, 14 Jun 2015 23:25:49 -0700 Subject: [PATCH] Util: Add strdup implementation for platforms without it --- CMakeLists.txt | 5 +++++ src/util/string.c | 10 ++++++++++ src/util/string.h | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 14f235775..01257b042 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -211,6 +211,7 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm.*") endif() include(CheckFunctionExists) +check_function_exists(strdup HAVE_STRDUP) check_function_exists(strndup HAVE_STRNDUP) check_function_exists(snprintf_l HAVE_SNPRINTF_L) if(CMAKE_SYSTEM_NAME STREQUAL "Linux") @@ -223,6 +224,10 @@ check_function_exists(newlocale HAVE_NEWLOCALE) check_function_exists(freelocale HAVE_FREELOCALE) check_function_exists(uselocale HAVE_USELOCALE) +if(HAVE_STRDUP) + add_definitions(-DHAVE_STRDUP) +endif() + if(HAVE_STRNDUP) add_definitions(-DHAVE_STRNDUP) endif() diff --git a/src/util/string.c b/src/util/string.c index 74b7ed997..6920d8d0c 100644 --- a/src/util/string.c +++ b/src/util/string.c @@ -17,6 +17,16 @@ char* strndup(const char* start, size_t len) { } #endif +#ifndef HAVE_STRDUP +char* strdup(const char* str) { + size_t len = strlen(str); + char* out = malloc(len + 1); + strncpy(out, str, len); + out[len] = '\0'; + return out; +} +#endif + char* strnrstr(const char* restrict haystack, const char* restrict needle, size_t len) { char* last = 0; const char* next = haystack; diff --git a/src/util/string.h b/src/util/string.h index e326bf047..c49bc06d0 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -13,6 +13,10 @@ char* strndup(const char* start, size_t len); #endif +#ifndef strdup +char* strdup(const char* str); +#endif + char* strnrstr(const char* restrict s1, const char* restrict s2, size_t len); int utfcmp(const uint16_t* utf16, const char* utf8, size_t utf16Length, size_t utf8Length);