Index: src/string.c ================================================================== --- src/string.c +++ src/string.c @@ -44,10 +44,32 @@ { char *copy; size_t len; len = strlen(s); + + if ((copy = malloc(len + 1)) == NULL) { + errno = ENOMEM; + return NULL; + } + + memcpy(copy, s, len); + copy[len] = 0; + + return copy; +} + +char* +cfw_strndup(const char *s, size_t max) +{ + char *copy; + size_t len; + + len = strlen(s); + + if (len > max) + len = max; if ((copy = malloc(len + 1)) == NULL) { errno = ENOMEM; return NULL; } Index: src/string.h ================================================================== --- src/string.h +++ src/string.h @@ -31,10 +31,11 @@ #include "range.h" typedef struct CFWString CFWString; extern CFWClass *cfw_string; extern char* cfw_strdup(const char*); +extern char* cfw_strndup(const char*, size_t); extern const char* cfw_string_c(CFWString*); extern size_t cfw_string_length(CFWString*); extern bool cfw_string_set(CFWString*, const char*); extern bool cfw_string_append(CFWString*, CFWString*); extern size_t cfw_string_find(CFWString*, CFWString*, cfw_range_t);