]> git.mdlowis.com Git - projs/libcds.git/commitdiff
Added str_join and str_split functions to string interface
authorMichael D. Lowis <mike.lowis@gentex.com>
Tue, 4 Nov 2014 17:47:54 +0000 (12:47 -0500)
committerMichael D. Lowis <mike.lowis@gentex.com>
Tue, 4 Nov 2014 17:47:54 +0000 (12:47 -0500)
source/string/str.c
source/string/str.h

index a0b55c77411eaf8ab4933ed6fbf668f2c4e0a53d..6ecb5e6240d664e2a5aeceee0caea5d353b9117b 100644 (file)
@@ -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;
+}
+
index 9115342102986d6dc1f9b1c1a94c071c3ccd7a3c..58cb73ecdc944371c1f242b37e718b0b61c0da5c 100644 (file)
@@ -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