summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-11-17 21:22:21 +0100
committerwm4 <wm4@nowhere>2014-11-17 21:22:21 +0100
commit2f9467cfd2574af44f97ee89b460c410a5a3c85a (patch)
tree2ae50d584c136b84778cff4429ec9dbddf780d6d
parent0c0b3f57aa688f3d2b38c5faf8178dad45302aa0 (diff)
downloadlibass-2f9467cfd2574af44f97ee89b460c410a5a3c85a.tar.bz2
libass-2f9467cfd2574af44f97ee89b460c410a5a3c85a.tar.xz
Provide a strndup() fallback
This standard function is not available everywhere, so we detect it and provide a fallback if missing.
-rw-r--r--configure.ac2
-rw-r--r--libass/ass_utils.c14
-rw-r--r--libass/ass_utils.h7
3 files changed, 22 insertions, 1 deletions
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 <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);