Naive implementation of strverscmp(3)
Peter Jeremy
peterjeremy at optushome.com.au
Wed Feb 15 00:05:35 PST 2006
On Tue, 2006-Feb-14 22:25:03 +0100, Ulrich Spoerlein wrote:
>this is probably not the right list, but I'd like to collect reviews of
>a strverscmp(3) function I wrote. It is used by the graphics/gqview port
...
>Is there a chance this might get included into libc? Or is it considered
>bloat?
I don't think it belongs in libc. Maybe libutil.
>The GNU version can be found here
>http://refspecs.freestandards.org/LSB_2.0.1/LSB-generic/LSB-generic/baselib-strverscmp.html
>Quite frankly, I don't understand their integral/fraction distinction,
I don't think their description makes sense - it's not clear what the
point is or where it would be used. If '.' was also a magic character
then (IMHO) it would make more sense.
>int
>strverscmp(const char *s1, const char *s2)
>{
> static const char *digits = "0123456789";
> int ret;
> long n1, n2;
> size_t p1, p2;
>
> do {
> p1 = strcspn(s1, digits);
> p2 = strcspn(s2, digits);
>
+ if (p1 != p2) break;
+
> /* Different prefix */
> if ((ret = strncmp(s1, s2, p1)) != 0)
> return ret;
...
> /* Numbers are equal or not present, try with next ones. */
> p1 = strspn(s1, digits);
> p2 = strspn(s2, digits);
You can avoid these strspn() calls [which are not cheap] by saving the
endptr values from the strtol() calls above.
> s1 += p1;
> s2 += p2;
- } while (p1 == p2 && p1 != 0 && p1 != 0);
+ } while (p1 == p2 && p1 != 0);
For the first point, consider
strverscmp("jan25", "janx25");
--
Peter Jeremy
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/freebsd-hackers/attachments/20060215/b6d419e5/attachment.bin
More information about the freebsd-hackers
mailing list