From: Michael D. Lowis Date: Tue, 4 Nov 2014 17:47:54 +0000 (-0500) Subject: Added str_join and str_split functions to string interface X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=a239e68f5e8711583d9bf5aeedf6365e759f3d84;p=projs%2Flibcds.git Added str_join and str_split functions to string interface --- diff --git a/source/string/str.c b/source/string/str.c index a0b55c7..6ecb5e6 100644 --- a/source/string/str.c +++ b/source/string/str.c @@ -147,3 +147,35 @@ size_t str_rfind(str_t* p_str1, str_t* p_str2) return idx; } +str_t* str_join(char* joinstr, vec_t* strs) { + str_t* ret = str_new(""); + str_t* jstr = str_new(joinstr); + for (size_t idx = 0; idx < vec_size(strs); idx++) { + str_t* str = (str_t*)vec_at(strs, idx); + if (str_size(ret) > 0) + mem_swap((void**)&ret, str_concat(ret, jstr)); + mem_swap((void**)&ret, str_concat(ret, str)); + } + mem_release(jstr); + return ret; +} + +vec_t* str_split(str_t* str, str_t* splitstr) { + vec_t* vec = vec_new(0); + size_t index = str_find(str, splitstr); + if (index != SIZE_MAX) { + str_t* therest = str_substr(str, index + str_size(splitstr), str_size(str)); + vec_push_back( vec, str_substr(str, 0, index) ); + if (SIZE_MAX != str_find(str, splitstr)) { + vec_t* nextsplit = str_split(therest, splitstr); + for (size_t idx = 0; idx < vec_size(nextsplit); idx++) { + vec_push_back( vec, mem_retain( vec_at(nextsplit, idx) ) ); + } + mem_release(nextsplit); + } else { + vec_push_back( vec, therest ); + } + } + return vec; +} + diff --git a/source/string/str.h b/source/string/str.h index 9115342..58cb73e 100644 --- a/source/string/str.h +++ b/source/string/str.h @@ -10,6 +10,7 @@ extern "C" { #endif #include "rt.h" +#include "vec.h" /* Forward declare our struct */ struct str_t; @@ -167,6 +168,19 @@ size_t str_find(str_t* p_str1, str_t* p_str2); */ size_t str_rfind(str_t* p_str1, str_t* p_str2); +/** + * @brief Joins all of the strings in the given vector together separated by the + * join string. + * + * @param joinstr The string that will be used to separate the strings. + * @param strs The vector of strings to be joined. + * + * @return The newly joined string. + */ +str_t* str_join(char* joinstr, vec_t* strs); + +vec_t* str_split(str_t* str, str_t* splitstr); + #ifdef __cplusplus } #endif