commit 7e21af434f2fb702eb6d1c5c099d2912b737afb0
parent c6fef90638e7fa06e885e3bdb9606d23114bcf83
Author: vaplv <vincent.forest@meso-star.com>
Date: Mon, 30 Jan 2017 17:12:08 +0100
Update the cstr_to_list API
The delimiter character is no more fixed to ':'. It is defined by the
caller.
Diffstat:
3 files changed, 36 insertions(+), 23 deletions(-)
diff --git a/src/cstr.h b/src/cstr.h
@@ -131,10 +131,12 @@ cstr_to_uint(const char* str, unsigned* dst)
return RES_OK;
}
-/* Convert a string "A:B:C:D:E:F" in a list of { A, B, C, D, E, F } */
+/* Convert a string "A:B:C:D:E:F" in a list of { A, B, C, D, E, F }. ':' can be
+ * any user defined character */
RSYS_API res_T
cstr_to_list_double
(const char* str,
+ const char delimiter,
double dst[], /* May be NULL */
size_t* length, /* May be NULL. Length of the filled list */
const size_t max_length); /* Maximum size of dst */
@@ -142,6 +144,7 @@ cstr_to_list_double
RSYS_API res_T
cstr_to_list_float
(const char* str,
+ const char delimiter,
float dst[], /* May be NULL */
size_t* length, /* May be NULL. Length of the filled list */
const size_t max_length); /* Maximum size of dst */
diff --git a/src/cstr_to_list.h b/src/cstr_to_list.h
@@ -35,12 +35,14 @@
res_T
CONCAT(cstr_to_list_, CSTR_LIST_TYPE)
(const char* str,
+ const char delimiter,
CSTR_LIST_TYPE dst[],
size_t* length,
const size_t max_length) /* Maximum size of dst */
{
struct darray_char buf;
+ char delim[2] = {'\0', '\0'};
size_t str_len;
size_t i;
char* tk;
@@ -63,8 +65,9 @@ CONCAT(cstr_to_list_, CSTR_LIST_TYPE)
strncpy(darray_char_data_get(&buf), str, str_len + 1/*null char*/);
/* Parse the string */
- tk = strtok(darray_char_data_get(&buf), ":");
- for(i=0; tk; tk = strtok(NULL, ":"), ++i) {
+ delim[0] = delimiter;
+ tk = strtok(darray_char_data_get(&buf), delim);
+ for(i=0; tk; tk = strtok(NULL, delim), ++i) {
if(dst) {
if(i >= max_length) {
res = RES_BAD_ARG;
diff --git a/src/test_cstr.c b/src/test_cstr.c
@@ -131,58 +131,65 @@ main(int argc, char** argv)
sprintf(buf, "%lu%c", ULONG_MAX, '0');
CHECK(cstr_to_ulong(buf, &ul), RES_BAD_ARG);
- CHECK(cstr_to_list_double(NULL, dlist, NULL, 3), RES_BAD_ARG);
- CHECK(cstr_to_list_double("a", dlist, NULL, 3), RES_BAD_ARG);
- CHECK(cstr_to_list_double("1.e-3:2.0:"STR(PI), dlist, NULL, 3), RES_OK);
+ CHECK(cstr_to_list_double(NULL, ':', dlist, NULL, 3), RES_BAD_ARG);
+ CHECK(cstr_to_list_double("a", ':', dlist, NULL, 3), RES_BAD_ARG);
+ CHECK(cstr_to_list_double("1.e-3:2.0:"STR(PI), ':', dlist, NULL, 3), RES_OK);
CHECK(dlist[0], 1.e-3);
CHECK(dlist[1], 2.0);
CHECK(dlist[2], PI);
- CHECK(cstr_to_list_double("1.e-3:2.0:", dlist, &len, 3), RES_OK);
+ CHECK(cstr_to_list_double("1.e-3:2.0:", ':', dlist, &len, 3), RES_OK);
CHECK(len, 2);
CHECK(dlist[0], 1.e-3);
CHECK(dlist[1], 2.0);
- CHECK(cstr_to_list_double("-1.0:0.5:1.2:4.3", dlist, &len, 2), RES_BAD_ARG);
- CHECK(cstr_to_list_double("-1.0:0.5:1.2:4.3a", NULL, &len, 0), RES_BAD_ARG);
- CHECK(cstr_to_list_double("-1.0:0.5:1.2:4.3", NULL, &len, 0), RES_OK);
+ CHECK(cstr_to_list_double("-1.0:0.5:1.2:4.3", ':', dlist, &len, 2), RES_BAD_ARG);
+ CHECK(cstr_to_list_double("-1.0:0.5:1.2:4.3a", ':', NULL, &len, 0), RES_BAD_ARG);
+ CHECK(cstr_to_list_double("-1.0:0.5:1.2:4.3", ':', NULL, &len, 0), RES_OK);
CHECK(len, 4);
- CHECK(cstr_to_list_double("-1.0:0.5:1.2:4.3", dlist, NULL, len), RES_OK);
+ CHECK(cstr_to_list_double("-1.0:0.5:1.2:4.3", ':', dlist, NULL, len), RES_OK);
CHECK(dlist[0], -1.0);
CHECK(dlist[1], 0.5);
CHECK(dlist[2], 1.2);
CHECK(dlist[3], 4.3);
- CHECK(cstr_to_list_double(" \t -1.0:0.5:1.2:INF \t", dlist, NULL, 4), RES_OK);
+ CHECK(cstr_to_list_double(" \t -1.0,0.5,1.2,INF \t", ':', dlist, NULL, 4), RES_BAD_ARG);
+ CHECK(cstr_to_list_double(" \t -1.0,0.5,1.2,INF \t", ',', dlist, NULL, 4), RES_OK);
CHECK(dlist[0], -1.0);
CHECK(dlist[1], 0.5);
CHECK(dlist[2], 1.2);
CHECK(dlist[3], INF);
- CHECK(cstr_to_list_double(" \t -1.0:0.5:1.2:4.3 \ta", dlist, NULL, 4), RES_BAD_ARG);
+ CHECK(cstr_to_list_double("-1.0.2.3", '.', dlist, NULL, 4), RES_OK);
+ CHECK(dlist[0], -1);
+ CHECK(dlist[1], 0);
+ CHECK(dlist[2], 2);
+ CHECK(dlist[3], 3);
+ CHECK(cstr_to_list_double(" \t -1.0:0.5:1.2:4.3 \ta", ':', dlist, NULL, 4), RES_BAD_ARG);
dlist[1] = dlist[2] = dlist[3] = -1.0;
- CHECK(cstr_to_list_double("1.0", dlist, NULL, 1), RES_OK);
+ CHECK(cstr_to_list_double("1.0", ':', dlist, NULL, 1), RES_OK);
CHECK(dlist[0], 1.0);
CHECK(dlist[1], -1.0);
CHECK(dlist[2], -1.0);
CHECK(dlist[3], -1.0);
- CHECK(cstr_to_list_float(NULL, flist, NULL, 3), RES_BAD_ARG);
- CHECK(cstr_to_list_float("a", flist, NULL, 3), RES_BAD_ARG);
- CHECK(cstr_to_list_float("1.e-3:2.0:"STR(PI), flist, NULL, 3), RES_OK);
+ CHECK(cstr_to_list_float(NULL, ':', flist, NULL, 3), RES_BAD_ARG);
+ CHECK(cstr_to_list_float("a", ':', flist, NULL, 3), RES_BAD_ARG);
+ CHECK(cstr_to_list_float("1.e-3:2.0:"STR(PI), ':', flist, NULL, 3), RES_OK);
CHECK(flist[0], 1.e-3f);
CHECK(flist[1], 2.0f);
CHECK(flist[2], (float)PI);
- CHECK(cstr_to_list_float("1.e-3:2.0:", flist, &len, 3), RES_OK);
+ CHECK(cstr_to_list_float("1.e-3:2.0:", ':', flist, &len, 3), RES_OK);
CHECK(len, 2);
CHECK(flist[0], 1.e-3f);
CHECK(flist[1], 2.0f);
- CHECK(cstr_to_list_float("-1.0:0.5:1.2:4.3", flist, &len, 2), RES_BAD_ARG);
- CHECK(cstr_to_list_float("-1.0:0.5:1.2:4.3a", NULL, &len, 0), RES_BAD_ARG);
- CHECK(cstr_to_list_float("-1.0:0.5:1.2:4.3", NULL, &len, 0), RES_OK);
+ CHECK(cstr_to_list_float("-1.0:0.5:1.2:4.3", ':', flist, &len, 2), RES_BAD_ARG);
+ CHECK(cstr_to_list_float("-1.0:0.5:1.2:4.3a", ':', NULL, &len, 0), RES_BAD_ARG);
+ CHECK(cstr_to_list_float("-1.0:0.5:1.2:4.3", ':', NULL, &len, 0), RES_OK);
CHECK(len, 4);
- CHECK(cstr_to_list_float("-1.0:0.5:1.2:4.3", flist, NULL, len), RES_OK);
+ CHECK(cstr_to_list_float("-1.0:0.5:1.2:4.3", ':', flist, NULL, len), RES_OK);
CHECK(flist[0], -1.0f);
CHECK(flist[1], 0.5f);
CHECK(flist[2], 1.2f);
CHECK(flist[3], 4.3f);
- CHECK(cstr_to_list_float(" \t -1.0:0.5:1.2:INF \t", flist, NULL, 4), RES_OK);
+ CHECK(cstr_to_list_float(" \t -1.0,0.5,1.2,INF \t", ':', flist, NULL, 4), RES_BAD_ARG);
+ CHECK(cstr_to_list_float(" \t -1.0,0.5,1.2,INF \t", ',', flist, NULL, 4), RES_OK);
CHECK(flist[0], -1.0f);
CHECK(flist[1], 0.5f);
CHECK(flist[2], 1.2f);