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

[FDclone-users:00654] Re: 仕切り直します。



こんばんは、田村です。

今日は私一人出勤で、留守番のような格好でしたので、先日の
宿題をやって見ました。やりながら書いたので、
継ぎ継ぎですが、取りあえず報告します。

fd v2.09 で、Mac OSX 10.4.8 純正ターミナルで行いました。
.fd2rc は以下のもので確認しました。
一応特定の関係ない箇所、の変更の確認の場合は、ディレクトリ削除
の上、アーカイブを展開し直してから作業してます。

-----.fd2rc-----
#SORTTYPE=1
UNICODEBUFFER=1
LANGUAGE=""
DEFKCODE=""
INPUTKCODE=""
PTYINKCODE=""
PTYOUTKCODE=""
FNAMEKCODE=""
MESSAGELANG="C"
PAGER=lv
EDITOR=vim
-----.fd2rc-----

On Sat, 21 Oct 2006 23:15:12 +0900, Takashi SHIRAI wrote:
>  しらいです。

> ◎検証 1
>  browse.c:putname() が怪しそうなので、これをシンプルなもの
> に置換えます。putname() の冒頭に数行変数宣言がありますが、そ
> れに続けて以下の 3 行を追加して下さい。
> 	calclocate(no);
> 	cputs2(list[no].name);
> 	return(0);
>  これで、各行のファイル名表示が非常にシンプルなものになりま
> すが、カーソル移動くらいは出来るので、この状況でカーソル移動
> 等を繰返して再現性を確認して下さい。

-----browse.c-----
int putname(list, no, isstandout)
namelist *list;
int no, isstandout;
{
	char *buf;
	struct tm *tm;
	int i, j, col, len, wid, width;
	calclocate(no);
	cputs2(list[no].name);
	return(0);
-----browse.c-----

こうかな?、
これではファイル名が消える現象は現れません。(消えません)
違うと困るので、こちらかな?

-----browse.c-----
int putname(list, no, isstandout)
namelist *list;
int no, isstandout;
	calclocate(no);
	cputs2(list[no].name);
	return(0);
{
	char *buf;
	struct tm *tm;
	int i, j, col, len, wid, width;
-----browse.c-----

こちらはエラーになって止まるので最初ので正解ですか。

[yuji:~/work/FD-2.09test] yuji% make
make -f Makefile.tmp
cc -DDARWIN=1 -O    -DFD=2 -c -o browse.o browse.c
browse.c: In function 'putname':
browse.c:1008: error: parse error before 'calclocate'
make[1]: *** [browse.o] Error 1
make: *** [all] Error 2


> ◎検証 2
>  カーソル移動だけで実行される関数としてもう一つ有力なのが、
> browse.c:infobar() です。今度はこれを無効にしてみましょう。
> infobar() の冒頭に以下の 1 行を追加して下さい。
> 	return;
>  これで画面最下行の情報表示が無くなりますが、動作には不都合
> ない筈ですので、この状況で再現性の確認をお願いします。

-----browse.c-----
}
static VOID NEAR infobar(VOID_A)
	return;
{
	char *buf;
	struct tm *tm;
	int len;
-----browse.c-----

としたら、大量のエラーになったので、

-----browse.c-----
}
	return;
static VOID NEAR infobar(VOID_A)
{
	char *buf;
	struct tm *tm;
	int len;
-----browse.c-----

としたのですが、やはりエラーが、

[yuji:~/work/FD-2.09test2] yuji% make
make -f Makefile.tmp
cc -DDARWIN=1 -O    -DFD=2 -c -o browse.o browse.c
browse.c:771: error: parse error before 'return'
make[1]: *** [browse.o] Error 1
make: *** [all] Error 2

-----browse.c-----
	return(width);
	return;
}
static VOID NEAR infobar(VOID_A)
{
	char *buf;
	struct tm *tm;
	int len;
-----browse.c-----

でも無いと。

-----browse.c-----
	return;
	return(width);
}
static VOID NEAR infobar(VOID_A)
{
	char *buf;
	struct tm *tm;
	int len;
-----browse.c-----
これでも無い。

すみません、無知ですみません、どこに挿入するのでしょうか?

もしかしたら、ここですか?
-----browse.c-----
}

static VOID NEAR infobar(VOID_A)
{
return;
	char *buf;
	struct tm *tm;
	int len;
-----browse.c-----

ここだと、エラー無く、コンパイルが終わり、最下行には
「Wait a minute.」の表示のみがでています。
もしこれで良ければ、ファイル名はやはり消えません。

> ◎検証 1+2
ファイル名が消える現象は起こりません(消えません)。


> ◎検証 3
>  malloc2() を一つずつ置換えていって、どの malloc2() を置換
> えたら直るのかを検証しましょう。func.h の最後に以下の一行を
> 追加します。
> 	#define	malloc3(s)	malloc(s * 16)

>  なので、まずはファイル単位で特定しましょう。MAXPATHLEN の
> 時に行なったのと同じ方法です。#include "func.h" の直後に以下
> の一行を追加します。
> 	#define	malloc2		malloc3
>  怪しそうなファイルから順に適用していって、ファイルが特定出
> 来たら、今度はそのファイルの中の malloc2() を手動で malloc3()
> に書換えていって、場所の特定をして下さい。
>  怪しそうなファイルは browse.c/file.c/kanji.c/dosemu.c 辺り
> でしょうかね。

browse.c から始めましたが、早くも当たりのようです。

-----browse.c-----756 line~
	else {
		tmp = malloc3(width * 2 + len + 1);
		i = Xreadlink(nodospath(path, namep -> name),
			tmp, width * 2 + len);
		if (i >= 0) {
			tmp[i] = '\0';
			strncpy3(buf, tmp, &w, len);
		}
-----browse.c-----

「/Users/yuji/012345678901234567」以下にて日本語ファイル名
「/Users/yuji/Documents/10 blog」以下にて日本語ファイル名
「/Users/yuji/Documents」以下にて ASCII ファイル名
「/User2/yuji/Documents」以下にて ASCII ファイル名
「/User2/yuji/Documents/10 blog」以下にて日本語ファイル名
が消える事を確認。

-----browse.c-----804line~
		buf = malloc3(TD_INFO * KANAWID + 1);
		tm = localtime(&(filelist[filepos].st_mtim));

		len = putfilename(buf, &(filelist[filepos]), len);
		buf[len++] = ' ';
-----browse.c-----
上記と同じくファイル名が消える事を確認。

-----browse.c-----867line~
	buf = malloc3(n_lastcolumn * KANAWID + 1);
	tm = localtime(&(filelist[filepos].st_mtim));
-----browse.c-----

この部分を変更した時に、ファイル名が消えなくなったようです。
日本語、ASCII ファイル名ともに消えないようです。
(まだ消える事が確認できていません)。

念のため
-----browse.c-----1036line
	buf = malloc3(col * KANAWID + 1);
	i = (isstandout && fnameofs > 0) ? fnameofs : 0;
	wid = width;
	i = strncpy3(buf, list[no].name, &width, i);
-----browse.c-----

こちらでは、やはりファイル名が消えるようです。

念のため、「file.c」の

>#include "func.h" の直後に以下の一行を追加します。
>	#define	malloc2		malloc3

では、ファイル名が消える現象を確認しました。

「kanji.c」、「dosemu.c」
のファイルも試しましたが、ファイルが消える現象は
起こるようです(消えます)。

> ◎検証 4
>  同じことを realloc2() でも行なってみましょう。func.h に追
> 加する一行はこうなります。
> 	#define	realloc3(p, s)	realloc(p, s * 16)
>  同様に各ファイルの #include "func.h" の直後に追加する一行
> はこうです。
> 	#define	realloc2	realloc3

 browse.c の場合。
「/Users/yuji/012345678901234567」以下にて日本語ファイル名
「/Users/yuji/Documents/10 blog」以下にて日本語ファイル名
「/Users/yuji/Documents」以下にて ASCII ファイル名
「/User2/yuji/Documents」以下にて ASCII ファイル名
「/User2/yuji/Documents/10 blog」以下にて日本語ファイル名
が消える事を確認したが、全体に現象の起こる頻度が少ない、
特に ASCII ファイル名が消える確率が少ない。

 file.c の場合、日本語、ASCII ファイル名ともに消える。

 kanji.c の場合も、同上(消える)。

 dosemu.c の場合。
日本語、ASCII ファイル名ともに消えるが、再現確率が非常に
低い。特に ASCII ファイル名がほとんど消えない。
次を、と思ったら dosemu.c には realloc が一ヶ所しかないんですね、
念のためと思い、realloc2 を realloc3 にして見ましたら、ファイルが消え
なくなってしまいました。おかしいと思い。また元に戻し、
(realloc3 を realloc2 に戻し、#include "func.h" の下に
#define	realloc2	realloc3 を追加、して見た所、
やはりファイル名は消えません。??

再現確率が非常に低いのだと思うのですが。

以上報告でした。

---
yuji tamura