Index: subversion/libsvn_subr/svn_string.c =================================================================== --- subversion/libsvn_subr/svn_string.c (revision 11892) +++ subversion/libsvn_subr/svn_string.c (working copy) @@ -71,6 +71,21 @@ return new_string; } +apr_size_t +string__find_char_backward (const char *str, apr_size_t len, char ch) +{ + apr_size_t i = len; + + while (i != 0) + { + if (str[--i] == ch) + return i; + } + + /* char was not found, return len */ + return len; +} + svn_string_t * svn_string_ncreate (const char *bytes, apr_size_t size, apr_pool_t *pool) { @@ -152,10 +167,10 @@ /* now that we know they have identical lengths... */ - if (memcmp (str1->data, str2->data, str1->len)) - return FALSE; - else + if ((memcmp (str1->data, str2->data, str1->len)) == 0) return TRUE; + else + return FALSE; } @@ -177,22 +192,12 @@ return str->len; } - apr_size_t svn_string_find_char_backward (const svn_string_t *str, char ch) { - int i; /* signed! */ - - for (i = (str->len - 1); i >= 0; i--) - { - if (str->data[i] == ch) - return i; - } - - return str->len; + return string__find_char_backward(str->data, str->len, ch); } - /* svn_stringbuf functions */ @@ -326,6 +331,7 @@ { apr_size_t prev_size = str->blocksize; str->blocksize *= 2; + /* check for apr_size_t overflow */ if (prev_size > str->blocksize) { str->blocksize = minimum_size; @@ -401,10 +407,10 @@ /* now that we know they have identical lengths... */ - if (memcmp (str1->data, str2->data, str1->len)) - return FALSE; - else + if ((memcmp (str1->data, str2->data, str1->len)) == 0) return TRUE; + else + return FALSE; } @@ -448,18 +454,9 @@ apr_size_t svn_stringbuf_find_char_backward (const svn_stringbuf_t *str, char ch) { - int i; /* signed! */ - - for (i = (str->len - 1); i >= 0; i--) - { - if (str->data[i] == ch) - return i; - } - - return str->len; + return string__find_char_backward (str->data, str->len, ch); } - svn_boolean_t svn_string_compare_stringbuf (const svn_string_t *str1, const svn_stringbuf_t *str2) @@ -470,10 +467,10 @@ /* now that we know they have identical lengths... */ - if (memcmp (str1->data, str2->data, str1->len)) - return FALSE; - else + if ((memcmp (str1->data, str2->data, str1->len)) == 0) return TRUE; + else + return FALSE; } Index: subversion/tests/libsvn_subr/string-test.c =================================================================== --- subversion/tests/libsvn_subr/string-test.c (revision 11892) +++ subversion/tests/libsvn_subr/string-test.c (working copy) @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -57,8 +58,6 @@ const char *phrase_2 = "a longish phrase of sorts, longer than 16 anyway"; - - static svn_error_t * test1 (const char **msg, svn_boolean_t msg_only, @@ -445,7 +444,124 @@ return SVN_NO_ERROR; } +/* Helper function for checking correctness of find_char_backward */ +static svn_error_t * +test__find_char_backward(const char* data, + apr_size_t len, + char ch, + apr_size_t pos, + svn_boolean_t msg_only, + apr_pool_t *pool) +{ + apr_size_t i; + if (msg_only) + return SVN_NO_ERROR; + + a = svn_stringbuf_create (data, pool); + i = svn_stringbuf_find_char_backward (a, ch); + + if (i == pos) + return SVN_NO_ERROR; + else + return fail (pool, "test failed"); +} + +static svn_error_t * +test13 (const char **msg, + svn_boolean_t msg_only, + apr_pool_t *pool) +{ + *msg = "find_char_backward; middle case"; + a = svn_stringbuf_create("test, test", pool); + + return + test__find_char_backward(a->data, a->len, ',', 4, msg_only, pool); +} + +static svn_error_t * +test14 (const char **msg, + svn_boolean_t msg_only, + apr_pool_t *pool) +{ + *msg = "find_char_backward; 0 case"; + + a = svn_stringbuf_create(",test test", pool); + + return + test__find_char_backward(a->data, a->len, ',', 0, msg_only, pool); +} + +static svn_error_t * +test15 (const char **msg, + svn_boolean_t msg_only, + apr_pool_t *pool) +{ + *msg = "find_char_backward; strlen - 1 case"; + + a = svn_stringbuf_create("testing,", pool); + + return test__find_char_backward(a->data, + a->len, + ',', + a->len - 1, + msg_only, + pool); +} + +static svn_error_t * +test16 (const char **msg, + svn_boolean_t msg_only, + apr_pool_t *pool) +{ + *msg = "find_char_backward; len = 0 case"; + + a = svn_stringbuf_create("", pool); + + assert(svn_stringbuf_isempty(a)); + + return + test__find_char_backward(a->data, a->len, ',', 0, msg_only, pool); +} + +static svn_error_t * +test17 (const char **msg, + svn_boolean_t msg_only, + apr_pool_t *pool) +{ + *msg = "find_char_backward; no occurence case"; + + a = svn_stringbuf_create("test test test", pool); + + return test__find_char_backward(a->data, + a->len, + ',', + a->len, + msg_only, + pool); +} + +static svn_error_t * +test18 (const char **msg, + svn_boolean_t msg_only, + apr_pool_t *pool) +{ + *msg = "check that whitespace will be stripped correctly"; + + if (msg_only) + return SVN_NO_ERROR; + + a = svn_stringbuf_create (" \ttest\t\t \t ", pool); + b = svn_stringbuf_create ("test", pool); + + svn_stringbuf_strip_whitespace(a); + + if (svn_stringbuf_compare(a, b) == TRUE) + return SVN_NO_ERROR; + else + return fail (pool, "test failed"); +} + /* ==================================================================== If you add a new test to this file, update this array. @@ -469,5 +585,11 @@ SVN_TEST_PASS (test10), SVN_TEST_PASS (test11), SVN_TEST_PASS (test12), + SVN_TEST_PASS (test13), + SVN_TEST_PASS (test14), + SVN_TEST_PASS (test15), + SVN_TEST_PASS (test16), + SVN_TEST_PASS (test17), + SVN_TEST_PASS (test18), SVN_TEST_NULL };