On Mon, Oct 08, 2007 at 01:45:27AM +0000, Miles Bader wrote: > Alex Riesen <raa.lkml@xxxxxxxxx> writes: > > int strbuf_cmp2(struct strbuf *a, struct strbuf *b) > > { > > int len = a->len < b->len ? a->len: b->len; > > int cmp = memcmp(a->buf, b->buf, len); > > if (cmp) > > return cmp; > > return a->len < b->len ? -1: a->len != b->len; > > } > > BTW, why are you making such effort to return only -1, 0, or 1 in the > last line? memcmp/strcmp make no such guarantee; e.g. glibc says: > > The `strcmp' function compares the string S1 against S2, returning > a value that has the same sign as the difference between the first > differing pair of characters (interpreted as `unsigned char' > objects, then promoted to `int'). > > If the two strings are equal, `strcmp' returns `0'. > > A consequence of the ordering used by `strcmp' is that if S1 is an > initial substring of S2, then S1 is considered to be "less than" > S2. > > So I think the last line can just be: > > return a->len - b->len; Won't work because ->len are size_t and return value is int, so on 64 bits platform, this has chances to overflow. FWIW I believe we are doing micro-benchs in a function that is used in 2 places in git right now. -- ·O· Pierre Habouzit ··O madcoder@xxxxxxxxxx OOO http://www.madism.org
Attachment:
pgpAGqROkhxty.pgp
Description: PGP signature