Index: src/string.c ================================================================== --- src/string.c +++ src/string.c @@ -178,22 +178,40 @@ bool cfw_string_set(CFWString *str, const char *cstr) { char *copy; + size_t len; + + if (str != NULL) { + if ((copy = cfw_strdup(cstr)) == NULL) + return false; - if ((copy = cfw_strdup(cstr)) == NULL) - return false; + len = strlen(copy); + } else { + copy = NULL; + len = 0; + } if (str->data != NULL) free(str->data); str->data = copy; - str->len = strlen(copy); + str->len = len; return true; } + +void +cfw_string_set_nocopy(CFWString *str, char *cstr, size_t len) +{ + if (str->data != NULL) + free(str->data); + + str->data = cstr; + str->len = len; +} bool cfw_string_append(CFWString *str, CFWString *append) { char *new; Index: src/string.h ================================================================== --- src/string.h +++ src/string.h @@ -35,9 +35,10 @@ 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 void cfw_string_set_nocopy(CFWString*, char*, size_t); extern bool cfw_string_append(CFWString*, CFWString*); extern size_t cfw_string_find(CFWString*, CFWString*, cfw_range_t); #endif