rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

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:
Msrc/cstr.h | 5++++-
Msrc/cstr_to_list.h | 7+++++--
Msrc/test_cstr.c | 47+++++++++++++++++++++++++++--------------------
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);