Fri, 05 Oct 2012 10:38:51 +0200
sstrncat uses memcpy
test/main.c | file | annotate | diff | comparison | revisions | |
test/string_tests.c | file | annotate | diff | comparison | revisions | |
test/string_tests.h | file | annotate | diff | comparison | revisions | |
ucx/string.c | file | annotate | diff | comparison | revisions | |
ucx/string.h | file | annotate | diff | comparison | revisions |
1.1 --- a/test/main.c Fri Oct 05 10:25:33 2012 +0200 1.2 +++ b/test/main.c Fri Oct 05 10:38:51 2012 +0200 1.3 @@ -151,6 +151,8 @@ 1.4 ucx_test_register(suite, test_ucx_map_clone); 1.5 1.6 /* sstring Tests */ 1.7 + ucx_test_register(suite, test_sstr); 1.8 + ucx_test_register(suite, test_sstr_len_cat); 1.9 ucx_test_register(suite, test_sstrsplit); 1.10 1.11 ucx_test_run(suite, stdout);
2.1 --- a/test/string_tests.c Fri Oct 05 10:25:33 2012 +0200 2.2 +++ b/test/string_tests.c Fri Oct 05 10:38:51 2012 +0200 2.3 @@ -4,6 +4,53 @@ 2.4 2.5 #include "string_tests.h" 2.6 2.7 +UCX_TEST_IMPLEMENT(test_sstr) { 2.8 + sstr_t s1 = sstr("1234"); 2.9 + sstr_t s2 = sstrn("ab", 2); 2.10 + 2.11 + UCX_TEST_BEGIN 2.12 + 2.13 + UCX_TEST_ASSERT(s1.length == 4, "s1 length must be 4"); 2.14 + UCX_TEST_ASSERT(s2.length == 2, "s2 length must be 2"); 2.15 + 2.16 + UCX_TEST_END 2.17 +} 2.18 + 2.19 +UCX_TEST_IMPLEMENT(test_sstr_len_cat) { 2.20 + sstr_t s1 = sstr("1234"); 2.21 + sstr_t s2 = sstr(".:.:."); 2.22 + sstr_t s3 = sstr("X"); 2.23 + 2.24 + sstr_t cat; 2.25 + 2.26 + size_t len = sstrnlen(3, s1, s2, s3); 2.27 + 2.28 + UCX_TEST_BEGIN 2.29 + 2.30 + UCX_TEST_ASSERT(len == s1.length + s2.length + s3.length, 2.31 + "sstrnlen returned wrong size"); 2.32 + 2.33 + len = s1.length + s2.length + s3.length; 2.34 + 2.35 + cat.ptr = malloc(len + 1); 2.36 + cat.ptr[len] = 0; 2.37 + cat.length = len; 2.38 + 2.39 + sstrncat(3, cat, s1, s2, s3); 2.40 + 2.41 + UCX_TEST_ASSERT(cat.ptr[0] == '1', "sstrncat, wrong content"); 2.42 + UCX_TEST_ASSERT(cat.ptr[1] == '2', "sstrncat, wrong content"); 2.43 + UCX_TEST_ASSERT(cat.ptr[2] == '3', "sstrncat, wrong content"); 2.44 + UCX_TEST_ASSERT(cat.ptr[3] == '4', "sstrncat, wrong content"); 2.45 + UCX_TEST_ASSERT(cat.ptr[4] == '.', "sstrncat, wrong content"); 2.46 + UCX_TEST_ASSERT(cat.ptr[8] == '.', "sstrncat, wrong content"); 2.47 + UCX_TEST_ASSERT(cat.ptr[9] == 'X', "sstrncat, wrong content"); 2.48 + 2.49 + UCX_TEST_END 2.50 + 2.51 + free(cat.ptr); 2.52 +} 2.53 + 2.54 UCX_TEST_IMPLEMENT(test_sstrsplit) { 2.55 2.56 const char *original = "this,is,a,csv,string";
3.1 --- a/test/string_tests.h Fri Oct 05 10:25:33 2012 +0200 3.2 +++ b/test/string_tests.h Fri Oct 05 10:38:51 2012 +0200 3.3 @@ -12,6 +12,8 @@ 3.4 extern "C" { 3.5 #endif 3.6 3.7 +UCX_TEST_DECLARE(test_sstr) 3.8 +UCX_TEST_DECLARE(test_sstr_len_cat) 3.9 UCX_TEST_DECLARE(test_sstrsplit) 3.10 3.11 #ifdef __cplusplus
4.1 --- a/ucx/string.c Fri Oct 05 10:25:33 2012 +0200 4.2 +++ b/ucx/string.c Fri Oct 05 10:38:51 2012 +0200 4.3 @@ -58,11 +58,24 @@ 4.4 va_list ap; 4.5 va_start(ap, c1); 4.6 s.ptr[0] = 0; 4.7 - 4.8 - s.ptr = strncat (s.ptr, c1.ptr, s.length); 4.9 + 4.10 + size_t len = s.length; 4.11 + size_t cplen = c1.length > len ? len : c1.length; 4.12 + char *ptr = s.ptr; 4.13 + 4.14 + memcpy(ptr, c1.ptr, cplen); 4.15 + len -= cplen; 4.16 + ptr += cplen; 4.17 for (int i=0;i<n-1;i++) { 4.18 sstr_t str = va_arg (ap, sstr_t); 4.19 - s.ptr = strncat (s.ptr, str.ptr, s.length); 4.20 + cplen = str.length > len ? len : str.length; 4.21 + if(cplen <= 0) { 4.22 + va_end(ap); 4.23 + return s; 4.24 + } 4.25 + memcpy(ptr, str.ptr, cplen); 4.26 + len -= cplen; 4.27 + ptr += cplen; 4.28 } 4.29 va_end(ap); 4.30
5.1 --- a/ucx/string.h Fri Oct 05 10:25:33 2012 +0200 5.2 +++ b/ucx/string.h Fri Oct 05 10:38:51 2012 +0200 5.3 @@ -67,7 +67,7 @@ 5.4 /* 5.5 * 5.6 */ 5.7 -sstr_t sstrsubsl (sstr_t s, size_t start, size_t end); 5.8 +sstr_t sstrsubsl (sstr_t s, size_t start, size_t length); 5.9 5.10 /* 5.11 * splits s into n parts