From 2f9467cfd2574af44f97ee89b460c410a5a3c85a Mon Sep 17 00:00:00 2001 From: wm4 Date: Mon, 17 Nov 2014 21:22:21 +0100 Subject: Provide a strndup() fallback This standard function is not available everywhere, so we detect it and provide a fallback if missing. --- configure.ac | 2 +- libass/ass_utils.c | 14 ++++++++++++++ libass/ass_utils.h | 7 +++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 5575dfd..abcb474 100644 --- a/configure.ac +++ b/configure.ac @@ -28,7 +28,7 @@ AC_TYPE_UINT32_T AC_TYPE_UINT8_T # Checks for library functions. -AC_CHECK_FUNCS([mkdir strcasecmp strdup strtol]) +AC_CHECK_FUNCS([mkdir strcasecmp strdup strndup strtol]) # Checks for libraries. AC_SEARCH_LIBS([iconv_open], [iconv], AC_DEFINE(CONFIG_ICONV, 1, [use iconv])) diff --git a/libass/ass_utils.c b/libass/ass_utils.c index 593d787..b1c736c 100644 --- a/libass/ass_utils.c +++ b/libass/ass_utils.c @@ -62,6 +62,20 @@ int has_avx2(void) #endif // ASM +#ifndef HAVE_STRNDUP +char *ass_strndup(const char *s, size_t n) +{ + char *end = memchr(s, 0, n); + size_t len = end ? end - s : n; + char *new = len < SIZE_MAX ? malloc(len + 1) : NULL; + if (new) { + memcpy(new, s, len); + new[len] = 0; + } + return new; +} +#endif + void *ass_aligned_alloc(size_t alignment, size_t size) { assert(!(alignment & (alignment - 1))); // alignment must be power of 2 diff --git a/libass/ass_utils.h b/libass/ass_utils.h index 1ce451c..579ac40 100644 --- a/libass/ass_utils.h +++ b/libass/ass_utils.h @@ -27,6 +27,8 @@ #include #include +#include "config.h" + #ifdef CONFIG_ENCA #include #endif @@ -54,6 +56,11 @@ int has_avx(void); int has_avx2(void); #endif +#ifndef HAVE_STRNDUP +char *ass_strndup(const char *s, size_t n); +#define strndup ass_strndup +#endif + void *ass_aligned_alloc(size_t alignment, size_t size); void ass_aligned_free(void *ptr); -- cgit v1.2.3