w3m 改造 再スタート
またもやりなおし。 だいぶ課題が整理されてきた。 そろそろうまくいくといいのだが。
https://github.com/ousttrue/w3m/tree/zig_string
なんだかんだで w3m を代替するツールは出てこない。 Cursor のある Pager という落としどころが良いのだと思う。 たいがいの Pager はカーソルが無いのだが、 カーソルがあると focus して action を起せるから機能が広がるのだ。
改造する上で課題となる点は以下のようなところだ。
Bohem GC
Bohem GC で文字列などを管理している。 当初 c++ 化して std::string に置き換えられるか試みていたのだが 、これは筋が良くなかった。 今回は zig やるつもりで、c++ はやらない意向。
文字列は以下のような型になっている。
typedef struct _Str {
char* ptr;
int length;
int area_size;
}* Str;今回は、ここから手を付けてみようかと。 GC を zig の allocator として管理してみようと考えている。 そこを足がかりに、すこしずつ動く状態を維持して zig 化しようと企んでいる。
Str.c を zig 化できた
va_list が arm64 でコンパイル通らない !(zig-0.15.2)
zig 化
zig 化すると C要素へのアクセスが module 経由になる都合上、 global 変数や、macro へのアクセスも明示的になるので、 整理作業上すこぶる便利だということがわかった。 ファイル単位でやると量的に大変になったりするが、 関数単位で一個ずつ zig 化するのはそれほど大変ではない。
test を本文中に書けるのも、C移植がうまくいっているか確認できるので非常に良い。
lua 化
さらに lua の導入をしたい。 keymap に登録する task の定義に使いたい。 元は C のマクロと awk の併せ技だったりするのだが、 無理にコンパイル時に解決せずにメンテナンス性重視にしたい。
描画スクリーンの vaxis 化
zig の TUI ライブラリの vaxis と合体してみる意向。 のだが、 epoll にしたかったので止めた。 rawmode の書き型を参考に自作した。
fork の debug が困難
どうも fork した子プロセスの方で問題が起きているようだったのだけど、 break point をアタッチする方法がわからず。 thread で代替しようと思ったが、 global 変数多用でスレッドセーフじゃなくて無理だった。