# HG changeset patch # User Mike Becker # Date 1445956174 -3600 # Node ID 2bc19726c3402bc722be190afb8c982e0f9d2c29 # Parent fa8b745be7b5ced8971ea88e926874b732e87994 added sstrstr() function + improved sstrsplit variants by using sstrprefix() diff -r fa8b745be7b5 -r 2bc19726c340 test/main.c --- a/test/main.c Mon Oct 26 14:09:45 2015 +0100 +++ b/test/main.c Tue Oct 27 15:29:34 2015 +0100 @@ -125,6 +125,7 @@ ucx_test_register(suite, test_sstrcasecmp); ucx_test_register(suite, test_sstrcat); ucx_test_register(suite, test_sstrchr_sstrrchr); + ucx_test_register(suite, test_sstrstr); ucx_test_register(suite, test_sstrsplit); ucx_test_register(suite, test_sstrtrim); ucx_test_register(suite, test_sstrprefixsuffix); diff -r fa8b745be7b5 -r 2bc19726c340 test/string_tests.c --- a/test/string_tests.c Mon Oct 26 14:09:45 2015 +0100 +++ b/test/string_tests.c Tue Oct 27 15:29:34 2015 +0100 @@ -79,6 +79,27 @@ UCX_TEST_END } +UCX_TEST(test_sstrstr) { + sstr_t str = ST("find the match in this string"); + UCX_TEST_BEGIN + + sstr_t notfound = sstrstr(str, S("no match")); + UCX_TEST_ASSERT(notfound.length == 0, "no match must return empty string"); + + sstr_t result = sstrstr(str, S("match")); + UCX_TEST_ASSERT(result.length == 20, "sstrstr returned wrong length"); + UCX_TEST_ASSERT(!strcmp("match in this string", result.ptr), + "sstrstr did not return the expected string"); + + result = sstrstr(str, S("")); + UCX_TEST_ASSERT(result.length == str.length, + "sstrstr with empty match string returned wrong length"); + UCX_TEST_ASSERT(!strcmp(str.ptr, result.ptr), + "sstrstr with empty match string did not return the original string"); + + UCX_TEST_END +} + UCX_TEST(test_sstrcmp) { sstr_t str = ST("compare this"); diff -r fa8b745be7b5 -r 2bc19726c340 test/string_tests.h --- a/test/string_tests.h Mon Oct 26 14:09:45 2015 +0100 +++ b/test/string_tests.h Tue Oct 27 15:29:34 2015 +0100 @@ -42,6 +42,7 @@ UCX_TEST(test_sstrcasecmp); UCX_TEST(test_sstrcat); UCX_TEST(test_sstrchr_sstrrchr); +UCX_TEST(test_sstrstr); UCX_TEST(test_sstrsplit); UCX_TEST(test_sstrtrim); UCX_TEST(test_sstrprefixsuffix); diff -r fa8b745be7b5 -r 2bc19726c340 ucx/string.c --- a/ucx/string.c Mon Oct 26 14:09:45 2015 +0100 +++ b/ucx/string.c Tue Oct 27 15:29:34 2015 +0100 @@ -175,6 +175,24 @@ return n; } +sstr_t sstrstr(sstr_t string, sstr_t match) { + if (match.length == 0) { + return string; + } + + for (size_t i = 0 ; i < string.length ; i++) { + sstr_t substr = sstrsubs(string, i); + if (sstrprefix(substr, match)) { + return substr; + } + } + + sstr_t emptystr; + emptystr.length = 0; + emptystr.ptr = NULL; + return emptystr; +} + sstr_t* sstrsplit(sstr_t s, sstr_t d, ssize_t *n) { return sstrsplit_a(ucx_default_allocator(), s, d, n); } @@ -201,23 +219,13 @@ } for (size_t i = 0 ; i < s.length ; i++) { - if (sv.ptr[i] == d.ptr[0]) { - _Bool match = 1; - for (size_t j = 1 ; j < d.length ; j++) { - if (j+i < s.length) { - match &= (sv.ptr[i+j] == d.ptr[j]); - } else { - match = 0; - break; - } + sstr_t substr = sstrsubs(sv, i); + if (sstrprefix(substr, d)) { + (*n)++; + for (size_t j = 0 ; j < d.length ; j++) { + sv.ptr[i+j] = 0; } - if (match) { - (*n)++; - for (size_t j = 0 ; j < d.length ; j++) { - sv.ptr[i+j] = 0; - } - i += d.length - 1; // -1, because the loop will do a i++ - } + i += d.length - 1; // -1, because the loop will do a i++ } if ((*n) == nmax) break; } diff -r fa8b745be7b5 -r 2bc19726c340 ucx/string.h --- a/ucx/string.h Mon Oct 26 14:09:45 2015 +0100 +++ b/ucx/string.h Tue Oct 27 15:29:34 2015 +0100 @@ -214,6 +214,23 @@ sstr_t sstrrchr(sstr_t string, int chr); /** + * Returns a substring starting at the location of the first occurrence of the + * specified string. + * + * If the string does not contain the other string, an empty string is returned. + * + * If match is an empty string, the complete string is + * returned. + * + * @param string the string to be scanned + * @param match string containing the sequence of characters to match + * @return a substring starting at the first occurrence of + * match, or an empty string, if the sequence is not + * present in string + */ +sstr_t sstrstr(sstr_t string, sstr_t match); + +/** * Splits a string into parts by using a delimiter string. * * This function will return NULL, if one of the following happens: