From 2e04b2c23c66a42372d0ecaea2b0f4b2c7b7c7e5 Mon Sep 17 00:00:00 2001 From: Vincent Douillet Date: Tue, 24 Dec 2024 11:52:50 +0100 Subject: delete files --- str.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 6 deletions(-) (limited to 'str.c') diff --git a/str.c b/str.c index 6521fa6..5b4522f 100644 --- a/str.c +++ b/str.c @@ -28,20 +28,43 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include #include #include char * -str_split(const char *str, char c) +str_head(const char *str, char c) +{ + char *occ, *result; + size_t head_len; + + occ = strrchr(str, c); + if (!occ || (occ == str && *occ != c)) + return NULL; + + /* copy head to new buffer */ + head_len = occ - str + 1; + result = malloc(sizeof(char) * head_len); + if (result == NULL) + return NULL; + if (strlcpy(result, str, head_len) < head_len) { + free(result); + return NULL; + } + return result; +} + +char * +str_tail(const char *str, char c) { char *right, *result; size_t right_len; right = strrchr(str, c); - if (!right || right == str) + if (!right || (right == str && *right != c)) return NULL; - /* move right part to new buffer */ + /* copy right part to new buffer */ right_len = strlen(right); result = malloc(sizeof(char) * right_len); if (result == NULL) @@ -51,9 +74,6 @@ str_split(const char *str, char c) free(result); return NULL; } - /* remove right part from src buffer */ - *right = '\0'; - return result; } @@ -70,3 +90,46 @@ str_replace(char *str, char a, char b) tmp++; } } + +size_t +str_concat(char **dst,...) +{ + va_list str_list; + const char *str; + char *concat; + size_t cur_size, dst_size, w_size; + + /* first compute required size */ + dst_size = 0; + va_start(str_list, dst); + while ((str = va_arg(str_list, char *)) != NULL) { + dst_size += strlen(str); + } + va_end(str_list); + dst_size++; + + /* alloc result string */ + *dst = malloc(sizeof(char) * dst_size); + if (*dst == NULL) + return 0; + + /* concatenate now */ + concat = *dst; + concat[0] = '\0'; + w_size = 0; + va_start(str_list, dst); + while ((str = va_arg(str_list, char *)) != NULL) { + cur_size = strlen(str); + if (strlcpy(concat, str, dst_size) >= dst_size) { + w_size = 0; + free(dst); + break; + } + w_size += cur_size; + concat += cur_size; + dst_size -= cur_size; + } + va_end(str_list); + + return w_size; +} -- cgit v1.2.3