X-Git-Url: http://git.efficios.com/?p=babeltrace.git;a=blobdiff_plain;f=include%2Fbabeltrace%2Fcompat%2Fstring.h;h=7a574e679d207f4a03549e9f2ddce1751c2ae210;hp=5d6a0632d5b3ef67e6db510eb99e3ae9ab161bb0;hb=5ea98697b9f786ac73fd5152d96aebe02906a10d;hpb=001edcbe6676b9ed2de88b5772877c7d91669851 diff --git a/include/babeltrace/compat/string.h b/include/babeltrace/compat/string.h index 5d6a0632..7a574e67 100644 --- a/include/babeltrace/compat/string.h +++ b/include/babeltrace/compat/string.h @@ -24,6 +24,7 @@ */ #include +#include #if !defined(__linux__) || ((_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !defined(_GNU_SOURCE)) @@ -51,4 +52,65 @@ int compat_strerror_r(int errnum, char *buf, size_t buflen) #endif +#ifdef HAVE_STRNLEN +static inline +size_t bt_strnlen(const char *str, size_t max) +{ + return strnlen(str, max); +} +#else +static inline +size_t bt_strnlen(const char *str, size_t max) +{ + size_t ret; + const char *end; + + end = memchr(str, 0, max); + + if (end) { + ret = (size_t) (end - str); + } else { + ret = max; + } + + return ret; +} +#endif /* HAVE_STRNLEN */ + +#ifdef HAVE_STRNDUP +static inline +char *bt_strndup(const char *s, size_t n) +{ + return strndup(s, n); +} +#else +static inline +char *bt_strndup(const char *s, size_t n) +{ + char *ret; + size_t navail; + + if (!s) { + ret = NULL; + goto end; + } + + /* min() */ + navail = strlen(s) + 1; + if ((n + 1) < navail) { + navail = n + 1; + } + + ret = malloc(navail); + if (!ret) { + goto end; + } + + memcpy(ret, s, navail); + ret[navail - 1] = '\0'; +end: + return ret; +} +#endif /* HAVE_STRNDUP */ + #endif /* _BABELTRACE_COMPAT_STRING_H */