メルカリでみっけたので即手続き。
OpenBSD(uaa@), Ham(JG1UAA), Ingress(Lv14, RES), Japanese(Sagamihara-city, Kanagawa)
Another side: https://social.tchncs.de/@uaa
npub1rarr265r9f9j6ewp960hcm7cvz9zskc7l2ykwul57e7xa60r8css7uf890
Messages from this Mastodon account can read via mostr.pub with npub1j3un8843rpuk4rvwnd7plaknf2lce58yl6qmpkqrwt3tr5k60vfqxmlq0w
@omasanori 自分は置かれた状況に合わせてもがいちゃうので、どちらを選ぶかというのはなかなか決めきれないです。コードの歴史を重視するならオリジナル(のディレクトリ構造)に戻るとして、未来に向けて作り変えていくのであれば今のmainブランチからという気がします。
他の方の意見も聞いてみたいですね…
@omasanori sj3が動き出しているんですが、如何しますか? https://github.com/jg1uaa/sj3/tree/dev (今までPR出していたfix, sj3ブランチの内容をすべて含んでいるのと、FreeBSD/DragonFlyBSDのutmpx非対応という制限があります)
今更K&R本、それも初版なんか読んでも…というのはあるんだろうけど、K&Rスタイルの意図していたところってなんなのかなーというのがちょいと気になって。
流石に「プログラミング言語C」の初版(第2版のANSI対応版じゃない方)を探すのは困難か…
getsjrk()では
if ((i = sj3_rkinit2(DEFRKFILE, erase)) != TRUE) {
if (i == 1) {
fprintf(stderr, "Warning cannot open rule file %s\n\r",
DEFRKFILE);
(void)sj3_rkinit2("/dev/null", erase);
} else
done3();
}
なのに、getsjrc()は
strcpy(RCfile, DEFRCFILE);
if (setrc2(RCfile) == TRUE)
return;
RCfile[0] = '\0';
とか、なによ?💢
ああ、sjrcを置くデフォルトのパスが違っていて、原典版はそこにsjrcがあるけどFUJIMI版は置いてないとかそういう話ね。それじゃあ確かにおかしくなる。
(FUJIMI版)
(gdb) b setrc2
Breakpoint 1 at 0x805ba4f: file sjrc2.c, line 190.
(gdb) run
Starting program: /home/uaa/sj3/sj3
Breakpoint 1, setrc2 (file=0x80c5b80 <RCfile> "/home/uaa/.sjrc") at sjrc2.c:190
190 if (vflag > 1)
(gdb) s
193 if ((fd = fopen(RCfile, "r")) == NULL)
(gdb) s
194 return(FALSE);
(gdb)
~/.sjrcを置けば動くってことらしいけど、この条件分岐の違いが分らぬ。
(原典)
(gdb) b setrc
Breakpoint 1 at 0x8058d50: file sjrc.c, line 200.
(gdb) run
Starting program: /home/uaa/sj3-2.0.1.20/sj3/sj3
Breakpoint 1, setrc (file=0x80c1720 <RCfile> "/home/uaa/.sjrc") at sjrc.c:200
200 if (vflag > 1)
(gdb) s
203 if ((fd = fopen(RCfile, "r")) == NULL)
(gdb) s
getsjrc () at sjrc.c:182
182 strcpy(RCfile, DEFRCFILE);
(gdb)
set_init_mode()のブレークポイントすら抜けるからもっと前に何か起きてんのか
Hardware watchpoint 1: Direct
Old value = 0
New value = 1
0x0805931d in set_init_mode (word=0xbfffb340) at sjrc.c:567
567 Direct = 1;
(gdb) backtrace
#0 0x0805931d in set_init_mode (word=0xbfffb340) at sjrc.c:567
#1 0x08058e08 in setrc (file=0x80c1720 <RCfile> "/usr/local/lib/sj3/sjrc")
at sjrc.c:213
#2 0x08058ef9 in getsjrc () at sjrc.c:183
#3 0x0804a6ad in main (argc=1, argv=0xbffff454) at sj3.c:131
(gdb)
FUJIMI版だとDirectを設定せずにウォッチポイントすり抜けてる
ん゛っ?
(原典)
Breakpoint 1, inputprocess () at conv.c:105
105 if (Direct) {
(gdb) n
106 set_guide_line (KEY_CONV);
(gdb)
(FUJIMI版)
Breakpoint 1, inputprocess () at conv.c:107
107 if (Direct) {
(gdb) n
111 set_guide_line (KEY_NORMAL);
(gdb)
sj3(tty client)が死んだときに、/tmpにcore吐かせるのは良いのかどうか…sj3を動作させたカレントディレクトリで良いじゃんよという気がしなくもないんだけど(確実に残すという意味で/tmpなのかなあ)
うむむ…openpty()化したsj3.c, sjgetchar.cを原典に戻してもファンクションキーの表示は問題ないから、それ以外に原因があるような気がしてならないんだけどなあ。
uaa@slackware-vm2:~/sj3$ ls *_
conv.c_ etc.c_ funckey.c_ stat_conv.c_
display.c_ eucmessage.c_ screen.c_ term.c_
uaa@slackware-vm2:~/sj3$
この辺のコードを原典に置き換えても起動時のステータスライン(ファンクションキーの状態)表示がおかしいのは何故なんだろう…他に原因があるか、それ以外の何かか…丹念に追わないとダメなのかも。
なので、SJ_getchar()をうっかり直しそうになって元のままにして、inkey()の戻り値の型だけ直すことにします(助言感謝です!)。
sjgetchar.c: wchar16_t SJ_getchar()が原典(sj3-2.0.1.20)の時点からこうなってるというのがなんとも…
まあ c を int にしたらしたで、今度は wchar_t からの変換で符号拡張がされなくて云々みたいなトラブルの種はあるので……
でも一番嫌らしいのって
if ((c = SJ_getchar ()) == (wchar16_t) EOF)
/* ここの空白 */
return ((short) c);
sj3ってなんかコメントを全部取っ払ってる感じで、あの空白はコメントがあったと思しき箇所なんですよねえ。多分何か意図があるんだと思うんだけど…ああ、もうっ💢
その後の(short)のキャストをうっかり削ると大怪我するとか、SJ_getchar()自体wchar16_tにする必要あるの?(intじゃダメなんですかねー)とか、頭痛いですこれ
あー、そういうことならまあ素直っちゃ素直なのかな。
「SJ_getchar() が EOF のとき」を (c = SJ_getchar()) で wchar_t にキャストされてしまうので両辺揃えて比較の右辺にも (wchar_t) を付けてやったと。
とりあえずK&R→ANSI化した際に関数の戻り値の型が正しくない箇所を見つけたから直しちゃおう
conv.c: inkey()
if ((c = SJ_getchar ()) == (wchar16_t) EOF)
return ((short) c);
このコード凄くいやらしくないですか?
EOFは(-1)、typedef unsigned short wchar16_t、wchar16_t SJ_getchar()なので、SJ_getchar()の戻り値が0xffff(EOF)だったらこれをshortにキャストしてさらにintで返す。
なのでEOF(-1)で帰ってきそうなはずなんだけど、いまいち確信が持てない。ちょいとコード書いて試せばいいか。