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
parent
a8acc2ff5c
commit
93a13050d6
|
@ -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)
|
||||||
|
|
15
src/utils.h
15
src/utils.h
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue