added new sstrcat

Mon, 14 Jul 2014 13:51:02 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 14 Jul 2014 13:51:02 +0200
changeset 180
2185f19dcc45
parent 179
ee25d79a4187
child 182
998bf7c643b4

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

mercurial