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 は分割する。 コンストラクタ、デストラクタ、コピーコンストラクタは避ける。GC や setmem(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 signal で idle のときに描画などという方針でよさそう。 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 について、再調査。
https://badsector.pullup.net/?p=70
👇
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, FormList と mainloop keydispatch あたりを分離する。 片方向の参照。
バッファーローダーからグローバル変数を除去して、再入可能にする。 tab を平行動作可能にする。
TODO: lua 導入
DEFUN を lua で記述したい。 rc も?
TODO: libgc 減らす。止める
TODO: zig に移植
zig cc でビルドはできた。 じゃなくて、ソースを zig にしたい。
TODO
Windows ネイティブで動くようにしたい。 libuv + conpty できそうな気がするのだけど、まだまだ。