Provide a fallback implementation of strndup()
authorAdrian Perez de Castro <aperez@igalia.com>
Mon, 5 Aug 2019 13:07:57 +0000 (16:07 +0300)
committerRan Benita <ran@unusedvar.com>
Fri, 27 Dec 2019 10:45:14 +0000 (12:45 +0200)
Some environments (e.g. Windows + MSVC) do not provide strndup(), this
tries to detect its presence and provide a fallback implementation when
not available.

[ran: some tweaks]

meson.build
src/utils.h

index ad268d0..b7aaeee 100644 (file)
@@ -99,6 +99,9 @@ endif
 if cc.has_header_symbol('fcntl.h', 'posix_fallocate', prefix: system_ext_define)
     configh_data.set('HAVE_POSIX_FALLOCATE', 1)
 endif
+if cc.has_header_symbol('string.h', 'strndup', prefix: system_ext_define)
+    configh_data.set('HAVE_STRNDUP', 1)
+endif
 if cc.has_header_symbol('stdlib.h', 'secure_getenv', prefix: system_ext_define)
     configh_data.set('HAVE_SECURE_GETENV', 1)
 elif cc.has_header_symbol('stdlib.h', '__secure_getenv', prefix: system_ext_define)
index c012651..d796e10 100644 (file)
@@ -110,6 +110,21 @@ memdup(const void *mem, size_t nmemb, size_t size)
     return p;
 }
 
+#if !(defined(HAVE_STRNDUP) && HAVE_STRNDUP)
+static inline char *
+strndup(const char *s, size_t n)
+{
+    size_t slen = strlen(s);
+    size_t len = MIN(slen, n);
+    char *p = malloc(len + 1);
+    if (!p)
+        return NULL;
+    memcpy(p, str, len);
+    p[len] = '\0';
+    return p;
+}
+#endif
+
 /* ctype.h is locale-dependent and has other oddities. */
 static inline bool
 is_space(char ch)