Provide a fallback implementation of strndup()

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]
master
Adrian Perez de Castro 2019-08-05 16:07:57 +03:00 committed by Ran Benita
parent a8acc2ff5c
commit 93a13050d6
2 changed files with 18 additions and 0 deletions

View File

@ -99,6 +99,9 @@ endif
if cc.has_header_symbol('fcntl.h', 'posix_fallocate', prefix: system_ext_define) if cc.has_header_symbol('fcntl.h', 'posix_fallocate', prefix: system_ext_define)
configh_data.set('HAVE_POSIX_FALLOCATE', 1) configh_data.set('HAVE_POSIX_FALLOCATE', 1)
endif 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) if cc.has_header_symbol('stdlib.h', 'secure_getenv', prefix: system_ext_define)
configh_data.set('HAVE_SECURE_GETENV', 1) configh_data.set('HAVE_SECURE_GETENV', 1)
elif cc.has_header_symbol('stdlib.h', '__secure_getenv', prefix: system_ext_define) elif cc.has_header_symbol('stdlib.h', '__secure_getenv', prefix: system_ext_define)

View File

@ -110,6 +110,21 @@ memdup(const void *mem, size_t nmemb, size_t size)
return p; 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. */ /* ctype.h is locale-dependent and has other oddities. */
static inline bool static inline bool
is_space(char ch) is_space(char ch)