20:04:16 @uaa@social.mikutter.hachune.net
icon

メルカリでみっけたので即手続き。

20:02:34 @uaa@social.mikutter.hachune.net
icon

@omasanori 自分は置かれた状況に合わせてもがいちゃうので、どちらを選ぶかというのはなかなか決めきれないです。コードの歴史を重視するならオリジナル(のディレクトリ構造)に戻るとして、未来に向けて作り変えていくのであれば今のmainブランチからという気がします。

他の方の意見も聞いてみたいですね…

19:53:55 @uaa@social.mikutter.hachune.net
icon

@omasanori sj3が動き出しているんですが、如何しますか? github.com/jg1uaa/sj3/tree/dev (今までPR出していたfix, sj3ブランチの内容をすべて含んでいるのと、FreeBSD/DragonFlyBSDのutmpx非対応という制限があります)

Web site image
GitHub - jg1uaa/sj3 at dev
19:51:25 @uaa@social.mikutter.hachune.net
icon

今更K&R本、それも初版なんか読んでも…というのはあるんだろうけど、K&Rスタイルの意図していたところってなんなのかなーというのがちょいと気になって。

19:49:11 @uaa@social.mikutter.hachune.net
icon

流石に「プログラミング言語C」の初版(第2版のANSI対応版じゃない方)を探すのは困難か…

14:21:31 @uaa@social.mikutter.hachune.net
icon

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';
とか、なによ?💢

14:17:34 @uaa@social.mikutter.hachune.net
icon

sjrk用意してないのでローマ字かな変換が動かない…

14:15:59 @uaa@social.mikutter.hachune.net
icon

…これで良いはず。

Attach image
14:09:27 @uaa@social.mikutter.hachune.net
icon

てーかこれに気づかず4日以上の時間使ってるじゃないですかーもうー💢

14:03:44 @uaa@social.mikutter.hachune.net
icon

ああ、sjrcを置くデフォルトのパスが違っていて、原典版はそこにsjrcがあるけどFUJIMI版は置いてないとかそういう話ね。それじゃあ確かにおかしくなる。

13:53:07 @uaa@social.mikutter.hachune.net
icon

(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)

13:52:53 @uaa@social.mikutter.hachune.net
icon

~/.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)

13:46:32 @uaa@social.mikutter.hachune.net
icon

set_init_mode()のブレークポイントすら抜けるからもっと前に何か起きてんのか

13:44:45 @uaa@social.mikutter.hachune.net
icon

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を設定せずにウォッチポイントすり抜けてる

13:36:51 @uaa@social.mikutter.hachune.net
icon

ん゛っ?
(原典)
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)

11:04:40 @uaa@social.mikutter.hachune.net
icon

sj3(tty client)が死んだときに、/tmpにcore吐かせるのは良いのかどうか…sj3を動作させたカレントディレクトリで良いじゃんよという気がしなくもないんだけど(確実に残すという意味で/tmpなのかなあ)

07:15:00 @uaa@social.mikutter.hachune.net
icon

うむむ…openpty()化したsj3.c, sjgetchar.cを原典に戻してもファンクションキーの表示は問題ないから、それ以外に原因があるような気がしてならないんだけどなあ。

06:58:11 @uaa@social.mikutter.hachune.net
icon

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$
この辺のコードを原典に置き換えても起動時のステータスライン(ファンクションキーの状態)表示がおかしいのは何故なんだろう…他に原因があるか、それ以外の何かか…丹念に追わないとダメなのかも。

06:24:11 @uaa@social.mikutter.hachune.net
icon

コワイ

06:24:03 @uaa@social.mikutter.hachune.net
2024-01-21 06:22:09 らりお・ザ・何らかの🈗然㊌ソムリエの投稿 lo48576@mastodon.cardina1.red
icon

Cこわ

06:23:58 @uaa@social.mikutter.hachune.net
icon

なので、SJ_getchar()をうっかり直しそうになって元のままにして、inkey()の戻り値の型だけ直すことにします(助言感謝です!)。

sjgetchar.c: wchar16_t SJ_getchar()が原典(sj3-2.0.1.20)の時点からこうなってるというのがなんとも…

06:20:24 @uaa@social.mikutter.hachune.net
2024-01-21 06:18:30 らりお・ザ・何らかの🈗然㊌ソムリエの投稿 lo48576@mastodon.cardina1.red
icon

まあ c を int にしたらしたで、今度は wchar_t からの変換で符号拡張がされなくて云々みたいなトラブルの種はあるので……

06:19:43 @uaa@social.mikutter.hachune.net
icon

でも一番嫌らしいのって

if ((c = SJ_getchar ()) == (wchar16_t) EOF)
/* ここの空白 */
return ((short) c);

sj3ってなんかコメントを全部取っ払ってる感じで、あの空白はコメントがあったと思しき箇所なんですよねえ。多分何か意図があるんだと思うんだけど…ああ、もうっ💢

06:17:06 @uaa@social.mikutter.hachune.net
icon

その後の(short)のキャストをうっかり削ると大怪我するとか、SJ_getchar()自体wchar16_tにする必要あるの?(intじゃダメなんですかねー)とか、頭痛いですこれ

06:15:50 @uaa@social.mikutter.hachune.net
2024-01-21 06:15:15 らりお・ザ・何らかの🈗然㊌ソムリエの投稿 lo48576@mastodon.cardina1.red
icon

あー、そういうことならまあ素直っちゃ素直なのかな。
「SJ_getchar() が EOF のとき」を (c = SJ_getchar()) で wchar_t にキャストされてしまうので両辺揃えて比較の右辺にも (wchar_t) を付けてやったと。

06:15:10 @uaa@social.mikutter.hachune.net
icon

とりあえずK&R→ANSI化した際に関数の戻り値の型が正しくない箇所を見つけたから直しちゃおう

06:14:15 @uaa@social.mikutter.hachune.net
icon

うぇぇぇC全然ワカラン…

06:13:32 @uaa@social.mikutter.hachune.net
icon

@lo48576 すみません、ここのcはwchar16_tです

06:12:50 @uaa@social.mikutter.hachune.net
icon

<stdio.h>
<stdint.h>

int main(int argc, char *argv[])
{
uint16_t c = EOF;

if (c == (uint16_t)EOF)
printf("%d\n", (int)((short)c));
else
printf("???\n");

return 0;

}

uaa@framboise:~$ cc test2.c
uaa@framboise:~$ ./a.out
-1
uaa@framboise:~$

06:09:11 @uaa@social.mikutter.hachune.net
icon

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)で帰ってきそうなはずなんだけど、いまいち確信が持てない。ちょいとコード書いて試せばいいか。