diff --git a/lsm/include/lsm/str.h b/lsm/include/lsm/str.h index bc18fa9..01f2651 100644 --- a/lsm/include/lsm/str.h +++ b/lsm/include/lsm/str.h @@ -36,6 +36,17 @@ lsm_error lsm_str_init_zero(lsm_str **ptr); */ lsm_error lsm_str_init_copy(lsm_str **ptr, char *s); +/** + * Same as `lsm_str_init_copy`, except that it takes an additional argument + * specifying the length of the string to copy over. This can be used to more + * easily "cut" parts of a C-style string out into an LSM string. + * + * @param ptr pointer to store newly allocated pointer + * @param s string to copy into lsm string + * @param len length of string to copy + */ +lsm_error lsm_str_init_copy_n(lsm_str **ptr, char *s, uint64_t len); + /** * Overwrite an existing lsm_str so it now represents the new provided string. * The string pointer of the original object is free'd if needed. Ownership of @@ -52,10 +63,20 @@ void lsm_str_overwrite(lsm_str *str, char *s); * string is copied, leaving the original untouched. * * @param str lsm_str object to modify - * @param s string to convert into lsm string; ownership is taken over + * @param s string to copy into lsm string */ lsm_error lsm_str_overwrite_copy(lsm_str *str, char *s); +/** + * Same as `lsm_str_overwrite_copy`, except the length is explicitely specified, + * allowing you to easily "cut" parts of a C string out into an LSM string. + * + * @param str lsm_str object to modify + * @param s string to copy into lsm string + * @param len length of the string to copy + */ +lsm_error lsm_str_overwrite_copy_n(lsm_str *str, char *s, uint64_t len); + /** * Deallocate the existing internal string if needed and replace the lsm_str * with a string of length 0, wiping its contents. This function can be used as diff --git a/lsm/src/str/lsm_str.c b/lsm/src/str/lsm_str.c index aea5e02..afab724 100644 --- a/lsm/src/str/lsm_str.c +++ b/lsm/src/str/lsm_str.c @@ -47,6 +47,20 @@ lsm_error lsm_str_init_copy(lsm_str **ptr, char *s) { return lsm_error_ok; } +lsm_error lsm_str_init_copy_n(lsm_str **ptr, char *s, uint64_t len) { + lsm_str *str = calloc(1, sizeof(lsm_str)); + + if (str == NULL) { + return lsm_error_failed_alloc; + } + + lsm_str_overwrite_copy_n(str, s, len); + + *ptr = str; + + return lsm_error_ok; +} + void lsm_str_overwrite(lsm_str *str, char *s) { str->len = strlen(s); @@ -59,8 +73,10 @@ void lsm_str_overwrite(lsm_str *str, char *s) { } lsm_error lsm_str_overwrite_copy(lsm_str *str, char *s) { - str->len = strlen(s); + return lsm_str_overwrite_copy_n(str, s, strlen(s)); +} +lsm_error lsm_str_overwrite_copy_n(lsm_str *str, char *s, uint64_t len) { if (str->len <= 8) { memcpy(str->data.val, s, str->len); } else { @@ -74,6 +90,8 @@ lsm_error lsm_str_overwrite_copy(lsm_str *str, char *s) { str->data.ptr = buf; } + str->len = len; + return lsm_error_ok; }