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]

Reply via email to