Mon, 14 Jul 2014 13:51:02 +0200
added new sstrcat
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 Mon Jul 14 12:45:48 2014 +0200 1.2 +++ b/test/main.c Mon Jul 14 13:51:02 2014 +0200 1.3 @@ -121,6 +121,7 @@ 1.4 ucx_test_register(suite, test_sstr_len); 1.5 ucx_test_register(suite, test_sstrcmp); 1.6 ucx_test_register(suite, test_sstrcasecmp); 1.7 + ucx_test_register(suite, test_sstrcat); 1.8 ucx_test_register(suite, test_sstrchr_sstrrchr); 1.9 ucx_test_register(suite, test_sstrsplit); 1.10 ucx_test_register(suite, test_sstrtrim);
2.1 --- a/test/string_tests.c Mon Jul 14 12:45:48 2014 +0200 2.2 +++ b/test/string_tests.c Mon Jul 14 13:51:02 2014 +0200 2.3 @@ -54,6 +54,7 @@ 2.4 UCX_TEST_END 2.5 } 2.6 2.7 + 2.8 UCX_TEST(test_sstrchr_sstrrchr) { 2.9 sstr_t str = ST("I will find you - and I will kill you"); 2.10 UCX_TEST_BEGIN 2.11 @@ -100,6 +101,37 @@ 2.12 UCX_TEST_END 2.13 } 2.14 2.15 + 2.16 +UCX_TEST(test_sstrcat) { 2.17 + sstr_t s1 = S("12"); 2.18 + sstr_t s2 = S("34"); 2.19 + sstr_t s3 = S("56"); 2.20 + sstr_t sn = { NULL, 0 }; 2.21 + 2.22 + UCX_TEST_BEGIN 2.23 + 2.24 + sstr_t t1 = sstrcat(2, s1, s2); 2.25 + UCX_TEST_ASSERT(!sstrcmp(t1, S("1234")), "t1: wrong content"); 2.26 + free(t1.ptr); 2.27 + 2.28 + sstr_t t2 = sstrcat(3, s1, s2, s3); 2.29 + UCX_TEST_ASSERT(!sstrcmp(t2, S("123456")), "t2: wrong content"); 2.30 + free(t2.ptr); 2.31 + 2.32 + sstr_t t3 = sstrcat(6, s1, sn, s2, sn, s3, sn); 2.33 + UCX_TEST_ASSERT(!sstrcmp(t3, S("123456")), "t3: wrong content"); 2.34 + free(t3.ptr); 2.35 + 2.36 + sstr_t t4 = sstrcat(2, sn, sn); 2.37 + UCX_TEST_ASSERT(t4.ptr, "t4.ptr is NULL"); 2.38 + UCX_TEST_ASSERT(t4.length == 0, "t4 has wrong length"); 2.39 + free(t4.ptr); 2.40 + 2.41 + 2.42 + UCX_TEST_END 2.43 + 2.44 +} 2.45 + 2.46 UCX_TEST(test_sstrsplit) { 2.47 2.48 const char *original = "this,is,a,csv,string";
3.1 --- a/test/string_tests.h Mon Jul 14 12:45:48 2014 +0200 3.2 +++ b/test/string_tests.h Mon Jul 14 13:51:02 2014 +0200 3.3 @@ -40,6 +40,7 @@ 3.4 UCX_TEST(test_sstr_len); 3.5 UCX_TEST(test_sstrcmp); 3.6 UCX_TEST(test_sstrcasecmp); 3.7 +UCX_TEST(test_sstrcat); 3.8 UCX_TEST(test_sstrchr_sstrrchr); 3.9 UCX_TEST(test_sstrsplit); 3.10 UCX_TEST(test_sstrtrim);
4.1 --- a/ucx/string.c Mon Jul 14 12:45:48 2014 +0200 4.2 +++ b/ucx/string.c Mon Jul 14 13:51:02 2014 +0200 4.3 @@ -61,6 +61,74 @@ 4.4 return size; 4.5 } 4.6 4.7 +static sstr_t sstrvcat_a( 4.8 + UcxAllocator *a, 4.9 + size_t count, 4.10 + sstr_t s1, 4.11 + sstr_t s2, 4.12 + va_list ap) { 4.13 + sstr_t str; 4.14 + str.ptr = NULL; 4.15 + str.length = 0; 4.16 + if(count < 2) { 4.17 + return str; 4.18 + } 4.19 + 4.20 + sstr_t *strings = calloc(count, sizeof(sstr_t)); 4.21 + if(!strings) { 4.22 + return str; 4.23 + } 4.24 + 4.25 + // get all args and overall length 4.26 + strings[0] = s1; 4.27 + strings[1] = s2; 4.28 + size_t strlen = s1.length + s2.length; 4.29 + for (size_t i=2;i<count;i++) { 4.30 + sstr_t s = va_arg (ap, sstr_t); 4.31 + strings[i] = s; 4.32 + strlen += s.length; 4.33 + } 4.34 + 4.35 + // create new string 4.36 + str.ptr = malloc(strlen + 1); 4.37 + str.length = strlen; 4.38 + if(!str.ptr) { 4.39 + free(strings); 4.40 + str.length = 0; 4.41 + return str; 4.42 + } 4.43 + 4.44 + // concatenate strings 4.45 + size_t pos = 0; 4.46 + for (size_t i=0;i<count;i++) { 4.47 + sstr_t s = strings[i]; 4.48 + memcpy(str.ptr + pos, s.ptr, s.length); 4.49 + pos += s.length; 4.50 + } 4.51 + 4.52 + str.ptr[str.length] = '\0'; 4.53 + 4.54 + free(strings); 4.55 + 4.56 + return str; 4.57 +} 4.58 + 4.59 +sstr_t sstrcat(size_t count, sstr_t s1, sstr_t s2, ...) { 4.60 + va_list ap; 4.61 + va_start(ap, s2); 4.62 + sstr_t s = sstrvcat_a(ucx_default_allocator(), count, s1, s2, ap); 4.63 + va_end(ap); 4.64 + return s; 4.65 +} 4.66 + 4.67 +sstr_t sstrcat_a(UcxAllocator *a, size_t count, sstr_t s1, sstr_t s2, ...) { 4.68 + va_list ap; 4.69 + va_start(ap, s2); 4.70 + sstr_t s = sstrvcat_a(a, count, s1, s2, ap); 4.71 + va_end(ap); 4.72 + return s; 4.73 +} 4.74 + 4.75 sstr_t sstrsubs(sstr_t s, size_t start) { 4.76 return sstrsubsl (s, start, s.length-start); 4.77 }
5.1 --- a/ucx/string.h Mon Jul 14 12:45:48 2014 +0200 5.2 +++ b/ucx/string.h Mon Jul 14 13:51:02 2014 +0200 5.3 @@ -120,6 +120,17 @@ 5.4 size_t sstrnlen(size_t count, sstr_t string, ...); 5.5 5.6 /** 5.7 + * Concatenates strings. 5.8 + * 5.9 + * @param count the total number of strings to concatenate 5.10 + * @param ... all strings 5.11 + * @return the concatenated string 5.12 + */ 5.13 +sstr_t sstrcat(size_t count, sstr_t s1, sstr_t s2, ...); 5.14 +sstr_t sstrcat_a(UcxAllocator *a, size_t count, sstr_t s1, sstr_t s2, ...); 5.15 + 5.16 + 5.17 +/** 5.18 * Returns a substring starting at the specified location. 5.19 * 5.20 * <b>Attention:</b> the new string references the same memory area as the