On Fri, Dec 16, 2005 at 09:08:13PM +0100, Thomas Hood wrote: > Glenn Maynard wrote: > > ls -v doesn't just change from strcmp to strverscmp--it changes from > > strcoll, > > so it loses locale collation. > > > Is this just a consequence of the way that strverscmp is implemented? > > DESCRIPTION > Often one has files jan1, jan2, ..., jan9, jan10, ... and it > feels wrong when ls orders them jan1, > jan10, ..., jan2, ..., jan9. In order to rectify this, GNU introduced > the -v option to ls(1), which is > implemented using versionsort(3), which again uses strverscmp(). > > Thus, the task of strverscmp() is to compare two strings and find the > "right" order, while strcmp() only > finds the lexicographic order. This function does not use the locale > category LC_COLLATE, so is meant > mostly for situations where the strings are expected to be in ASCII. > > What this function does is the following. If both strings are equal, > return 0. Otherwise find the posi- > tion between two bytes with the property that before it both strings > are equal, while directly after it > there is a difference. Find the largest consecutive digit strings > containing (or starting at, or ending > at) this position. If one or both of these is empty, then return > what strcmp() would have returned > (numerical ordering of byte values). Otherwise, compare both > digit strings numerically, where digit > strings with one or more leading zeroes are interpreted as if they > have a decimal point in front (so > that in particular digit strings with more leading zeroes come > before digit strings with fewer leading > zeroes). Thus, the ordering is 000, 00, 01, 010, 09, 0, 1, 9, 10.
Yeah. The "meant mostly for ..." bit (which I don't think was there before) acknowledges the problem; a "strverscoll" function is probably needed. Just switching strcmp for strcoll in the algorithm would probably do it (ignoring things like double-width digits). -- Glenn Maynard -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]