> Author: brane > Date: Thu Nov 22 14:00:48 2012 > New Revision: 1412554
> Modified: subversion/trunk/subversion/libsvn_subr/string.c > svn_cstring__similarity(const char *stra, const char *strb, > svn_membuf_t *buffer, apr_size_t *rlcs) > { > - const apr_size_t lena = strlen(stra); > - const apr_size_t lenb = strlen(strb); > + const svn_string_t stringa = {stra, strlen(stra)}; > + const svn_string_t stringb = {strb, strlen(strb)}; Unfortunately our C'89 coding standard doesn't allow us to use non-constant initializers, and there are some compilers occasionally used to build Subversion that don't accept it. > + return svn_string__similarity(&stringa, &stringb, buffer, rlcs); > +} > + > +unsigned int > +svn_string__similarity(const svn_string_t *stringa, > + const svn_string_t *stringb, > + svn_membuf_t *buffer, apr_size_t *rlcs) > +{ > + const char *stra = stringa->data; > + const char *strb = stringb->data; > + const apr_size_t lena = stringa->len; > + const apr_size_t lenb = stringb->len; > const apr_size_t total = lena + lenb; > const char *enda = stra + lena; > const char *endb = strb + lenb; > @@ -1200,11 +1212,13 @@ svn_cstring__similarity(const char *stra > } > > /* ... and the common suffix */ > - while (stra < enda && strb < endb && *enda == *endb) > - { > - --enda; --endb; > - ++lcs; > - } > + if (stra < enda && strb < endb) > + do > + { > + --enda; --endb; > + ++lcs; > + } > + while (stra < enda && strb < endb && *enda == *endb); Both "before" and "after" versions of this block appear to strip off (and count in LCS) not only the common suffix but also one non-matching character as well iff such a non-matching character remains in each string. Is that the intention? It looks wrong so please document it if so. > if (stra < enda && strb < endb) > { > @@ -1254,7 +1268,7 @@ svn_cstring__similarity(const char *stra > } > } > > - /* The common suffix matcher always finds the nul terminator, > + /* The common suffix matcher always incremnts the lcs It incremented it *one more than the true common-suffix count* is the relevant point. (And then only if there was still at least one character remaining in each string at that time; but that's the condition of the outer "if" guarding this block, so necessarily true here.) > so subtract 1 from the result. */ > lcs += prev[slots] - 1; > } - Julian