w3m改造に再突入

なんとなく最初からやり直し。

マクロカッター

今回は、 python でマクロカッターを作って前処理してみた。

#ifdef USE_UNICODE
// hogehoge
#endif

みたいな #ifdef 事前に解決しえカットしていくツールである。 めんどくさいので if defined(HOGE) などは実装していない。 true, false, none の3値で判断。 true であれば #if を削除。 false であれば #if ブロックをコードごと削除し。 none であれば保持するというロジック。 わりとうまくいって、コードがかなり簡単になった。

いつも通り C++ 化

C++ 化しないとCの暗黙の型変換が緩すぎてコンパイルエラー追うのが難しくなるので、 次の一手はこれ。

c++ できたら、 typdef struct Some {} Some;struct Some; に書き換える。 これでストレスをかなり低減できる。

局所性の高い関数をメンバー関数にする。 なるべくメンバーを private にして、名前も _ などの prefix を付ける。 大きい struct は分割する。 コンストラクタ、デストラクタ、コピーコンストラクタは避ける。GCsetmem(0) で死ぬ。 同様に、 std::vector, std::string は慎重に導入する。

macro 減らす

macro 関数をinline 関数 に置き換えたり、 macro 定数を enum に置き換える。int, char などを enum に置き換える。 使えれば bitfield とかも駆使。

fm.h, proto.h, file.c の分配

  • .c.h をペアにして関数を一致させる
  • struct 毎にヘッダを分ける。
  • global 変数を散らす
  • const char* との戦い。順次

膨大な global 変数があるので、使わないもの思い切って削除する。

file.c

file.c が 7000 行とかあってすごい。

  • html のロードが 4500 くらい。 table.c, frame.c も関連?
  • http を操作が 500 くらい

http アクセスや、html パース、ローカルCGI とか Buffer 操作が色々入っている。

libuv

mainloop

あっさりできてしまった。

tty input, resize signalidle のときに描画などという方針でよさそう。 raw モード切り替えなども libuv 移行できそう。

入力ストリーム

tcp, fd, FILE*, Str と圧縮 decoder のランタイム polymorphism. c++ の継承に置き換えて、 void* の cast より、型チェックの聞く状態にできる。

TODO: libuv を使う

linein / readline

出力

signal

読み込みを ctrl-c で中断するなど。

使わない機能を削る

  • backend, dump など
  • pager 系の機能
  • news, gopher など使わないプロトコル
  • mouse 系の機能
  • search_header 系の機能

wtf-8 とは?

謎の文字コード wtf-8 について、再調査。

WTF-8?
CESU-8とは違う内部用UTF-8亜種エンコード。
WTF-8? favicon https://badsector.pullup.net/?p=70
WTF-8?

👇

The WTF-8 encoding
The WTF-8 encoding favicon https://simonsapin.github.io/wtf-8/

vt100 分離

Buffer = Screen => tty_out という流れに統一する。 各所からローレベルの描画機能を呼ばない。

メッセージ表示も抽象化して、text を push するだけに。

  • カーソル移動
  • out
  • flush
  • カーソル復帰

とかしない。

TODO: logger 導入

UIとデータ構造の分離

+----+
|DATA| TabBuffer, Buffer, Anchor, Form, Image...
+----+
A
|
+----+
| UI | mainloop... tty, key dispatch
+----+

TabBuffer, Buffer, Anchor, FormListmainloop keydispatch あたりを分離する。 片方向の参照。

バッファーローダーからグローバル変数を除去して、再入可能にする。 tab を平行動作可能にする。

TODO: lua 導入

DEFUN を lua で記述したい。 rc も?

TODO: libgc 減らす。止める

TODO: zig に移植

zig cc でビルドはできた。 じゃなくて、ソースを zig にしたい。

TODO

Windows ネイティブで動くようにしたい。 libuv + conpty できそうな気がするのだけど、まだまだ。