]> granicus.if.org Git - libass/commitdiff
Provide a strndup() fallback
authorwm4 <wm4@nowhere>
Mon, 17 Nov 2014 20:22:21 +0000 (21:22 +0100)
committerwm4 <wm4@nowhere>
Mon, 17 Nov 2014 20:22:21 +0000 (21:22 +0100)
This standard function is not available everywhere, so we detect it and
provide a fallback if missing.

configure.ac
libass/ass_utils.c
libass/ass_utils.h

index 5575dfdbda5e93d87bcf67946c2a8d0afebf4b0d..abcb474cbc0068572e90478cf5d816402c3c3b89 100644 (file)
@@ -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]))
index 593d787c57f86095c0b570820d55f15219b29b85..b1c736c3719afdec4aa7c95393fc4283bfb9c618 100644 (file)
@@ -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
index 1ce451ccd3ce4374a7b8163c4af63906f94bb5a4..579ac4061717a9a9f51804dee2a263e834a54085 100644 (file)
@@ -27,6 +27,8 @@
 #include <assert.h>
 #include <errno.h>
 
+#include "config.h"
+
 #ifdef CONFIG_ENCA
 #include <enca.h>
 #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);