[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: About version sorting of `ls'.
From: |
Jim Meyering |
Subject: |
Re: About version sorting of `ls'. |
Date: |
06 Mar 2001 04:55:01 +0100 |
User-agent: |
Gnus/5.09 (Gnus v5.9.0) Emacs/21.0.99 |
Thank you for the report and patch.
Since strverscmp.c is part of the GNU C library,
I'll pass this on to them.
ISONO Tomoatsu <address@hidden> wrote:
| Dear Maintainers,
|
| In fileutils-4.0.41, there is a conflict between the description of
| version sorting and a result of it. The conflict concerns fractional
| cases.
|
| # SunOS smaux 5.7 Generic_106541-05 sun4u sparc
|
| A result of `ls -1v'. The description in fileutils.texi.
| abc-1.007.tgz abc-1.007.tgz
| abc-1.012b.tgz abc-1.01a.tgz
| abc-1.01a.tgz abc-1.012b.tgz
|
| A resolution is given below, which makes `ls' output in the
| described way. I hope you will adopt this kind of change.
|
| Yours sincerely,
| ISONO Tomoatsu
| -------------------------------------------------------------------
| ISONO Tomoatsu <address@hidden>
| -------------------------------------------------------------------
|
|
| diff -rc fileutils-4.0.41/lib/strverscmp.c
fileutils-4.0.41+modified-20010305/lib/strverscmp.c
| *** fileutils-4.0.41/lib/strverscmp.c Thu Nov 16 18:08:53 2000
| --- fileutils-4.0.41+modified-20010305/lib/strverscmp.c Mon Mar 5
08:15:11 2001
| ***************
| *** 36,41 ****
| --- 36,43 ----
| #define CMP 2
| #define LEN 3
|
| + /* Use DUM to fill spaces. */
| + #define DUM 0
|
| /* ISDIGIT differs from isdigit, as follows:
| - Its arg may be any int or unsigned int; it need not be an unsigned
char.
| ***************
| *** 59,64 ****
| --- 61,119 ----
| equal to or greater than S2 (for more info, see the texinfo doc).
| */
|
| + /* MODIFIED VERSION:
| + The following is the ordering of the original version.
| +
| + a.x
| + a00.x
| + a01.x
| + a012.x
| + a01a.x
| + a0a.x
| + aa.x
| + abc-1.007.tgz
| + abc-1.012b.tgz
| + abc-1.01a.tgz
| +
| + But I think this is not so good, and suggest a new clear definition of
| + order. And, please note that the last three filenames are examples in
| + `doc/fileutils.texi' and that the order of them is different from the
| + description there.
| +
| + 1. Treat each maximal successive sequence of digits /[0-9]+/ as a
| + `character' (we refer it as DIGSEQ).
| +
| + 2. The numerical value of a DIGSEQ is considered as a fractional one if
| + it begins with `0'. But in fractional cases, there exists ambiguity
| + due to last successive `0's in DIGSEQ. So, when the numerical values
| + of them are equal, we regard the longer one as the larger one.
| +
| + (This is equivalent to consider as following: we define numerical
| + values of `0' (resp. `1',... ,`9') as 1 (resp. 2,... , 10). Consider
| + a DIGSEQ is an undecimal, or eleven-adic expression (both in integer
| + case and in fractional case).
| +
| + 3. The order between a DIGSEQ and a non-digit character CHAR is defined
| + to be the same order between '0' and CHAR.
| +
| + 4. The order between two DIGSEQs is defined to be the same order as
| + numerical values of two DIGSEQs.
| +
| + 5. Compare strings according to the order of `character's.
| +
| + Original Modified
| + a.x a.x
| + a00.x a0a.x
| + a01.x a00.x
| + a012.x a01.x
| + a01a.x a01a.x
| + a0a.x a012.x
| + aa.x aa.x
| + abc-1.007.tgz abc-1.007.tgz
| + abc-1.012b.tgz abc-1.01a.tgz
| + abc-1.01a.tgz abc-1.012b.tgz
| + */
| +
| int
| __strverscmp (const char *s1, const char *s2)
| {
| ***************
| *** 73,89 ****
| --- 128,164 ----
| static const unsigned int next_state[] =
| {
| /* state x d 0 - */
| + /* the first zero digit means fractional state,
| + the first non-zero digit means integral state. */
| + /* S_N */ S_N, S_I, S_F, DUM,
| + /* the successive digit means integral in integral state. */
| + /* S_I */ S_N, S_I, S_I, DUM,
| + /* the successive digit means fractional in fractional state. */
| + /* S_F */ S_N, S_F, S_F/*,DUM,*/
| + /* No need to use S_Z state */
| + #if 0
| /* S_N */ S_N, S_I, S_Z, S_N,
| /* S_I */ S_N, S_I, S_I, S_I,
| /* S_F */ S_N, S_F, S_F, S_F,
| /* S_Z */ S_N, S_F, S_Z, S_Z
| + #endif
| };
|
| static const int result_type[] =
| {
| + /* Note we never refer to 0/0 */
| /* state x/x x/d x/0 x/- d/x d/d d/0 d/-
| 0/x 0/d 0/0 0/- -/x -/d -/0 -/- */
|
| + /* S_N */ CMP, CMP, CMP, DUM, CMP, LEN, CMP, DUM, /* int > frac */
| + CMP, CMP, DUM, DUM, DUM, DUM, DUM, DUM,
| + /* S_I */ CMP, -1, -1, DUM, 1, LEN, LEN, DUM,
| + 1, LEN, DUM, DUM, DUM, DUM, DUM, DUM,
| + /* S_F */ CMP, -1, -1, DUM, 1, CMP, CMP, DUM, /* no need LEN cmp
*/
| + 1, CMP/*,DUM,DUM, DUM, DUM, DUM, DUM, */
| + /* S_Z *//*CMP, -1, -1, DUM, 1, CMP, CMP, DUM,
| + 1, CMP, CMP, DUM */
| + #if 0
| /* S_N */ CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,
| CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
| /* S_I */ CMP, -1, -1, CMP, 1, LEN, LEN, CMP,
| ***************
| *** 92,97 ****
| --- 167,173 ----
| CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
| /* S_Z */ CMP, 1, 1, CMP, -1, CMP, CMP, CMP,
| -1, CMP, CMP, CMP
| + #endif
| };
|
| if (p1 == p2)
|
| _______________________________________________
| Bug-fileutils mailing list
| address@hidden
| http://mail.gnu.org/mailman/listinfo/bug-fileutils