From 05b339b0b130496ddd2e2ace0c7f445136b899b2 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Fri, 1 Jul 2022 11:26:44 +0200 Subject: [PATCH] Added strndup replacement --- winpr/include/winpr/string.h | 5 +++++ winpr/libwinpr/crt/string.c | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/winpr/include/winpr/string.h b/winpr/include/winpr/string.h index d7a849c8b..7c95bb43f 100644 --- a/winpr/include/winpr/string.h +++ b/winpr/include/winpr/string.h @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -211,6 +212,10 @@ extern "C" WINPR_API INT64 GetLine(char** lineptr, size_t* size, FILE* stream); +#if !defined(HAVE_STRNDUP) + WINPR_API char* strndup(const char* s, size_t n); +#endif + #ifdef __cplusplus } #endif diff --git a/winpr/libwinpr/crt/string.c b/winpr/libwinpr/crt/string.c index 294bb2753..3d9afb92f 100644 --- a/winpr/libwinpr/crt/string.c +++ b/winpr/libwinpr/crt/string.c @@ -18,6 +18,7 @@ */ #include +#include #include #include @@ -643,3 +644,25 @@ INT64 GetLine(char** lineptr, size_t* size, FILE* stream) return -1; #endif } + +#if !defined(HAVE_STRNDUP) +char* strndup(const char* s, size_t n) +{ + char* rc; + size_t len; + + WINPR_ASSERT(s || (n == 0)); + if (n == 0) + return NULL; + + len = strnlen(s, n); + if (len == n) + len++; + + rc = calloc(len, sizeof(char)); + if (!rc) + return NULL; + memcpy(rc, s, n); + return rc; +} +#endif