[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:01020] ファイルのソート結果が不定となる場合



小松です。

file.c の cmplist() についてですが、特に(ファイル名はユニークなので)
ファイルサイズやタイムスタンプが等しい時、ファイルの並び順はディレク
トリからの読み出し順、あるいは前回のソート結果の影響によって不定にな
ります。
そこで、これらの時はファイル名でも比較するというのを提案したいのです
がどうでしょう。問題は、「日付は降順で、名前では昇順で」とかいった複
雑な要望が来るかもしれないことですが……。

このパッチでは、名前では昇順に固定します。


--- file.c~	2012-08-03 00:00:00.000000000 +0900
+++ file.c	2013-05-20 15:03:54.309996959 +0900
@@ -166,7 +166,7 @@
  {
  	namelist *namep1, *namep2;
  	char *cp1, *cp2;
-	int tmp;
+	int ord, tmp;

  	namep1 = (namelist *)vp1;
  	namep2 = (namelist *)vp2;
@@ -182,6 +182,8 @@
  	if ((tmp = isdotdir(namep2 -> name) - isdotdir(namep1 -> name)))
  		return(tmp);

+	ord = sorton > 7 ? -1 : 1;
+
  	switch (sorton & 7) {
  		case 5:
  			tmp = (int)strlen(namep1 -> name)
@@ -221,13 +223,15 @@
  				tmp = strpathcmp2(namep1 -> name,
  					namep2 -> name);
  			else if (namep1 -> st_size == namep2 -> st_size)
-				tmp = 0;
+				tmp = ord * strpathcmp2(namep1 -> name,
+							namep2 -> name);
  			else tmp = (namep1 -> st_size > namep2 -> st_size)
  				? 1 : -1;
  			break;
  		case 4:
  			if (namep1 -> st_mtim == namep2 -> st_mtim)
-				tmp = 0;
+				tmp = ord * strpathcmp2(namep1 -> name,
+							namep2 -> name);
  			else tmp = (namep1 -> st_mtim > namep2 -> st_mtim)
  				? 1 : -1;
  			break;
@@ -236,7 +240,7 @@
  			break;
  	}

-	if (sorton > 7) tmp = -tmp;
+	tmp = ord * tmp;
  	if (!tmp) tmp = namep1 -> ent - namep2 -> ent;

  	return(tmp);


と、これに関連するもうひとつの議論として、ファイルリストの名前順ソー
トを strcmp() で行うのか、 strverscmp() で行うのか、という点です。後
者の場合、ソート後は(GNUの)ls -vのようになります。

# strverscmp()はglibcの独自拡張ですが

さらっと調べただけですが、midnight commander, clex, lfmは前者、vifm,
ranger, あとはGNOMEやXfceなどのファイルマネージャでも後者を採ってい
ます…ということで、意見が割れると予想されるので、とりあえずstrvers
cmp()と同等の比較部分だけおいておきます。実装はもう少し議論を深めて
からのほうがいいのでは、と考えます。

# これらは他のコードを一切見ずに書いたので、ライセンス感染の恐れはあ
# りません。

begin 644 naturcmp.c.gz
M'XL("%"(FE$``VYA='5R8VUP+F,`G5,]3\,P$)WM7W$%J;*;?C&[L+##`",2
M"H[;6&J3R$E%0M7_SMEQ$[L@!K)8OKOW[MT[9S6C,`/W%6ES-/)0+26&XFBZ
MA])DRD#=&%WL0):'*C6Z+@NL6U%ZJPNY/V8*-K+I*K7,'X+83:Y2Q-;+_"8(
M#MTP2F\SM=6%@J*4::TL.VOGT'%@C+4<'H!UG,,"W&WC;GP`74'>*&&L*8]5
MI4P/OEP\1Y#;A#D>Z#@>/I092.<@.60EG(C]L`'110,9W,-:D"&V+0TP`;K.
M]$XW;(8-.$RG00";",!PDLSM#$G"'9#H+3!D0SKN6`,;+,L<>JAOC<4_>DRB
M)MPK(@QUW\.=&#2J?:W`,DS^ELDC@L45`QF']A794'"&SUSO%;!UX.>[?T6!
MHU^CHQ=#Y6BH#7D>*]#JL[KL*;U1)R_`K:)%:#21(&&ZB])=F+;6MY8WZ_@P
M%`D>@%L`8NPC$'W:N3@^!D*L\J]?=D5(DF!0`![=V/0\0,^CDU9)/UL_;3_U
MQ-%=@$:AC85?:+3/$3D)#>,Q<!$C@S7Z`GG)1VNT'EYOD-/'YZ>75Y!Y:F#6
@BNC:"7JBY)>MCR^;"WJ.F:/?^%_L$?<W<`SPQ-H$````
`
end

begin 644 naturcmp.h.gz
M'XL("-W(F5$``VYA='5R8VUP+F@`T]?B4M#BS$LL*2U*SBW0RP#RX`*).0KY
M12FI10K%)469>>D*R?FY!8E%F<7Y>4`E^EQ<RIEI>2FI:0I^CB&A0<Z^`?$>
M7,I`?F9>*K(05V9>B0+4/)`)"O'Q`?$:&L[^?L$A"LD9B44*6A4Z"LC<2DU-
::Q1=B<6I).CD4D[-2\E,XP(`#T_@`=L`````
`
end


--
Hironao Komatsu <hirkmt@gmail.com>