return result;
}
-char** pakfire_split_string(const char* s, char delim) {
- // Copy string to stack and count spaces
- char buffer[strlen(s) + 2];
+static unsigned int pakfire_chrcnt(const char* s, char delim) {
+ size_t length = strlen(s);
- size_t count = 1;
- for (unsigned int i = 0; i < strlen(s) + 1; i++) {
- buffer[i] = s[i];
+ unsigned int count = 0;
- if (s[i] == delim) {
- buffer[i] = '\0';
+ for (unsigned int i = 0; i < length; i++)
+ if (s[i] == delim)
count++;
- }
+
+ return count;
+}
+
+char** pakfire_split_string(const char* s, char delim) {
+ char** array = NULL;
+
+ if (!s) {
+ errno = EINVAL;
+ return NULL;
}
- // Allocate an array of sufficient size
- char** ret = malloc(sizeof(*ret) * (count + 1));
+ // Count how often we need to split
+ unsigned int count = pakfire_chrcnt(s, delim) + 1;
+
+ // Allocate array
+ array = calloc(count + 1, sizeof(*array));
+ if (!array)
+ return NULL;
+
+ // Copy string to stack
+ char* p = strdupa(s);
+ if (!p)
+ return NULL;
- // Copy strings to heap one by one
unsigned int i = 0;
- char* p = buffer;
while (*p) {
- ret[i++] = strdup(p);
+ char* e = strchr(p, delim);
- // Move pointer to the next string
- p += strlen(p) + 1;
- }
+ // Terminate the string
+ if (e)
+ *e = '\0';
- // Terminate array
- ret[count] = NULL;
+ // Add string to the array
+ array[i++] = strdup(p);
- return ret;
+ // End loop when we reached the end
+ if (!e)
+ break;
+
+ // Or continue at the next line
+ p = e + 1;
+ }
+
+ return array;
}
char* pakfire_string_join(char** list, const char* delim) {
# #
#############################################################################*/
+#include <errno.h>
#include <stdlib.h>
#include <string.h>
return EXIT_SUCCESS;
}
+static int test_string_split(const struct test* t) {
+ char** result = pakfire_split_string(NULL, 'X');
+
+ // Must return on invalid input
+ ASSERT_ERRNO(!result, EINVAL);
+
+ // Split a string
+ result = pakfire_split_string("ABCXABCXABC", 'X');
+ ASSERT(result);
+
+ ASSERT_STRING_EQUALS(result[0], "ABC");
+ ASSERT_STRING_EQUALS(result[1], "ABC");
+ ASSERT_STRING_EQUALS(result[2], "ABC");
+ ASSERT_NULL(result[3]);
+
+ // Split a string withtout the delimiter
+ result = pakfire_split_string("ABCABC", 'X');
+ ASSERT(result);
+
+ ASSERT_STRING_EQUALS(result[0], "ABCABC");
+ ASSERT_NULL(result[1]);
+
+ // String with only delimiters
+ result = pakfire_split_string("XXXX", 'X');
+ ASSERT(result);
+
+ ASSERT_STRING_EQUALS(result[0], "");
+ ASSERT_STRING_EQUALS(result[1], "");
+ ASSERT_STRING_EQUALS(result[2], "");
+ ASSERT_STRING_EQUALS(result[3], "");
+ ASSERT_NULL(result[4]);
+
+ return EXIT_SUCCESS;
+}
+
int main(int argc, char** argv) {
testsuite_add_test(test_basename);
testsuite_add_test(test_dirname);
testsuite_add_test(test_string_startswith);
testsuite_add_test(test_string_partition);
testsuite_add_test(test_string_replace);
+ testsuite_add_test(test_string_split);
return testsuite_run();
}