diff --git a/c/Makefile.no-autoconfig b/c/Makefile.no-autoconfig index 91f24e9af..60190e3ff 100644 --- a/c/Makefile.no-autoconfig +++ b/c/Makefile.no-autoconfig @@ -89,6 +89,7 @@ TEST_MULTIPLE_CONTAINERS_SRCS = \ lib/mlrutil.c lib/mlr_globals.c lib/string_builder.c \ containers/lrec.c containers/header_keeper.c containers/sllv.c \ containers/slls.c \ + containers/string_array.c \ containers/hss.c \ containers/lhmsi.c \ containers/lhmss.c \ diff --git a/c/containers/string_array.c b/c/containers/string_array.c index 4cdd32802..1b10d6323 100644 --- a/c/containers/string_array.c +++ b/c/containers/string_array.c @@ -22,3 +22,30 @@ void string_array_free(string_array_t* parray) { free(parray->strings); free(parray); } + +string_array_t* string_array_from_line(char* line, char ifs) { + if (*line == 0) // empty string splits to empty array + return string_array_alloc(0); + + int num_commas = 0; + + for (char* p = line; *p; p++) + if (*p == ifs) + num_commas++; + + string_array_t* parray = string_array_alloc(num_commas + 1); + + char* start = line; + int i = 0; + for (char* p = line; *p; p++) { + if (*p == ifs) { + *p = 0; + p++; + parray->strings[i++] = start; + start = p; + } + } + parray->strings[i++] = start; + + return parray; +} diff --git a/c/containers/string_array.h b/c/containers/string_array.h index 107772a42..d0ddd9245 100644 --- a/c/containers/string_array.h +++ b/c/containers/string_array.h @@ -10,5 +10,6 @@ typedef struct _string_array_t { string_array_t* string_array_alloc(int length); void string_array_free(string_array_t* parray); +string_array_t* string_array_from_line(char* line, char ifs); #endif // STRING_ARRAY_H diff --git a/c/unit_test/test_multiple_containers.c b/c/unit_test/test_multiple_containers.c index f4538a752..9275dbffa 100644 --- a/c/unit_test/test_multiple_containers.c +++ b/c/unit_test/test_multiple_containers.c @@ -4,6 +4,7 @@ #include "lib/mlrutil.h" #include "containers/slls.h" #include "containers/sllv.h" +#include "containers/string_array.h" #include "containers/hss.h" #include "containers/lhmsi.h" #include "containers/lhmss.h" @@ -98,6 +99,28 @@ static char* test_sllv() { return NULL; } +// ---------------------------------------------------------------- +static char* test_string_array() { + string_array_t* parray = string_array_from_line(mlr_strdup_or_die(""), ','); + mu_assert_lf(parray->length == 0); + string_array_free(parray); + + parray = string_array_from_line(mlr_strdup_or_die("a"), ','); + mu_assert_lf(parray->length == 1); + mu_assert_lf(streq(parray->strings[0], "a")); + + parray = string_array_from_line(mlr_strdup_or_die("c,d,a,e,b"), ','); + mu_assert_lf(parray->length == 5); + + mu_assert_lf(streq(parray->strings[0], "c")); + mu_assert_lf(streq(parray->strings[1], "d")); + mu_assert_lf(streq(parray->strings[2], "a")); + mu_assert_lf(streq(parray->strings[3], "e")); + mu_assert_lf(streq(parray->strings[4], "b")); + + return NULL; +} + // ---------------------------------------------------------------- static char* test_hss() { @@ -624,6 +647,7 @@ static char* test_dheap() { static char * run_all_tests() { mu_run_test(test_slls); mu_run_test(test_sllv); + mu_run_test(test_string_array); mu_run_test(test_hss); mu_run_test(test_lhmsi); mu_run_test(test_lhmss);