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

[FDclone-users:00500] Re: FDclone でファイルサイズが 0 と表示される



 しらいです。

In Message-Id <OF5F317E98.4E9760F4-ON49257153.00194C06@tky.lightwell.co.jp>
        SHIOTA Shoichi <Shoichi.Shiota@lightwell.co.jp>さんwrites:
> 潮田です。

> 先の例では、
> 
>   2G                 999999999 06-04-14  9:08
>   sss                        2 06-04-14  9:17
>   ss                         0 06-04-14  9:13
>   x.tar              999999999 06-04-14  9:18
> 
> と表示されています。

 これ、試しにカラム幅を増やして最下行のステイタスを確認して
貰えますか?最下行は桁数さえ十分にあれば 999... で丸めたりは
しませんので、真のサイズが表示される筈です。
 32bits 幅を越えている 4GB 以上のサイズに対して正しい表示が
得られているでしょうか?

 というのも、そもそも sscanf() 時に間違った桁に値を置いてし
まったとしても、その変数の bit 領域の範囲内であれば値「0」に
なる筈がないんですね。0 って全ての bit が 0 なんですから。
 ということは、sscanf() で間違って値を置いてしまった桁部分
が無視されて表示されているということなんじゃないでしょうか。
つまり、64bits 幅全てを表示し切れていない訳です。
 だとしたら、まずは printf() の方を先に何とかする必要があり
ますね。


> 先の2つの環境で試しましたが、どちらでも何も表示されませんでした。
> (ブランクしか出力されていない?)

 おかしいなー。元の program には正しく「%02x」と書いてある
ので、insert した後に編集ミスでもしちゃったんでしょうか。


> $ xlc x.c

 一応、cc の方で試してみて下さい。xlc の方だと普通に C99 な
実装になってるそうですから。以降も暫くは cc だけを使って下さ
いね。


> "x.c", line 13.22: 1506-207 (W) 整数定数 0x0123456789 が範囲外です。

 immediate に 32bits 幅を越える値を表現する術がないようです
ので、shift して値を代入することにしましょう。


> "x.c", line 14.14: 1506-374 (I) ポインター型「char*」と「long long*」の間には互換性がありません。

 pointer 云々を言われないように、sscanf() と同様 vararg で
実装しましょう。

 また、単独の program だと compile option 等が異なるかも知
れませんので、FDclone そのものの main() をすげ替えることに
します。
 という訳で、今度のテストでは FD-2.08b に以下の patch をあ
てて試してみて下さい。
 i386 な環境では
	ef cd ab 89 67 45 23 01
	3210456789ab7654
	9876543210
みたいな結果になります。

 途中の fprintf() が修飾子「q」を使っていますが、OS 標準の
の fprintf() が「q」非対応だった場合は、取り敢えず「l」に置
換えてみて下さい。下 32bits だけ表示する筈です。
 もしくは、自前の printf() を信用して「fprintf2()」と書換え
てみてもいいかも知れません。

---- Cut Here ----
diff -u ../old/FD-2.08b/main.c ./main.c
--- ../old/FD-2.08b/main.c	Thu Mar 30 00:00:00 2006
+++ ./main.c	Tue Apr 18 21:36:47 2006
@@ -1235,12 +1235,64 @@
 	if (*cwd) rawchdir(cwd);
 }
 
+static VOID sub2 __P_((int, ...));
+static VOID sub1 __P_((VOID_A));
+
+#ifdef	USESTDARGH
+/*VARARGS2*/
+static VOID sub2(int size, ...)
+#else
+static VOID sub2(size, va_alist)
+int size;
+va_dcl;
+#endif
+{
+	va_list args;
+	u_char *buf;
+	u_short u;
+	int i;
+
+	VA_START(args, size);
+	buf = va_arg(args, u_char *);
+	va_end(args);
+
+	for (i = 0; i < size; i++) printf("%02x ", buf[i]);
+	printf("\n");
+	u = 0x7654;
+	memcpy(buf, (char *)(&u), sizeof(u));
+	buf += size - sizeof(u);
+	u = 0x3210;
+	memcpy(buf, (char *)(&u), sizeof(u));
+}
+
+static VOID sub1(VOID_A)
+{
+	off_t n;
+
+	n = 0x0123;
+	n <<= 16;
+	n |= 0x4567;
+	n <<= 16;
+	n |= 0x89ab;
+	n <<= 16;
+	n |= 0xcdef;
+
+	sub2(sizeof(off_t), &n);
+	fprintf(stdout, "%qx\n", n);
+
+	sscanf2("9876543210", "%qd", &n);
+	fprintf2(stdout, "%qd\n", n);
+}
+
 int main(argc, argv, envp)
 int argc;
 char *argv[], *envp[];
 {
 	char *cp;
 	int i;
+
+	sub1();
+	exit(0);
 
 #ifdef	DEBUG
 	mtrace();
---- Cut Here ----

                                               しらい たかし