diff --git a/src/xpdev/strwrap.c b/src/xpdev/strwrap.c index e3174a36a9d880583e294befae25395111a4ccfa..0af148051139b98307ec335d022ea9d6902f6d94 100644 --- a/src/xpdev/strwrap.c +++ b/src/xpdev/strwrap.c @@ -38,5 +38,36 @@ char* ltoa(long val, char* str, int radix) } return(str); } +#endif + +#ifdef _WIN32 +/* From FreeBSD */ +size_t +strnlen(const char *s, size_t maxlen) +{ + size_t len; + + for (len = 0; len < maxlen; len++, s++) { + if (!*s) + break; + } + return (len); +} + +/* From FreeBSD */ +char * +strndup(const char *str, size_t maxlen) +{ + char *copy; + size_t len; + len = strnlen(str, maxlen); + copy = malloc(len + 1); + if (copy != NULL) { + (void)memcpy(copy, str, len); + copy[len] = '\0'; + } + + return copy; +} #endif diff --git a/src/xpdev/strwrap.h b/src/xpdev/strwrap.h index 1f8a181d14dac24a49c510f1e51577484e260fdf..f30d54e450e68bd45cae618ca9b2cf22e2b2610f 100644 --- a/src/xpdev/strwrap.h +++ b/src/xpdev/strwrap.h @@ -18,4 +18,17 @@ char* ltoa(long val, char* str, int radix); #endif +#ifdef _MSVC +#if defined(__cplusplus) +extern "C" { +#endif + +char *strndup(const char *str, size_t maxlen); +size_t strnlen(const char *s, size_t maxlen); + +#if defined(__cplusplus) +} +#endif +#endif + #endif