本稿は自作エディタをつくる Advent Calendar 2016の11日目です、レポジトリはこちら
文字位置の取得
前日分で行の先頭ポインタまでは取得できているので、行から編集したい文字の位置を取得します。
文字の位置は文字数で保持していますが、取得したいのはバイト数なので注意して実装します。
細切れになった文字を保持する構造体と、その中の何バイト目かを返す関数を作りました。
また、文字数はあらかじめ全ての行に対して計算して保持しておくようにしました。
#35w [9b,3p]私はそ -> [9b,3p]の人を -> [9b,3p]常に先 -> [9b,3p]生と呼 -> [9b,3p]んでい -> [7b,3p]た。
デバッグ用レンダラーの出力例です。
読み方としては、この行全体は35文字幅あって、9バイト3文字の「私はそ」を持っていて、->で単方向リストの次の構造体に移動して9バイト3文字の「の人を」があって・・・
という感じです。
表示するたびに毎回全て再計算していますが、必要がないときは前の計算結果を使うようにあとで直したいですね。
今風にいうとvirtual-domみたいに(言ってみただけ)
再計算必要フラグとかを行ごとに用意すればいいのかな。
コメントアウトすると動かなくなるセミコロンの謎
プログラムの途中にセミコロンだけの行があったとして
hoge();
;
fuga();
これをコメントアウトすると動かなくなりました
hoge();
//;
fuga();
なんだってー(AA略
理由はcase文の中だったからです。
case INSERT:
;
line* head = getLine();
ネットを検索すると、
- そもそもcase文のなかで宣言してはいけない
- defaultだと宣言しても大丈夫、他は宣言してはいけない
- {}でくくると大丈夫
等ありましたが、case先頭がセミコロンだと宣言できるようになる、というのは不思議な挙動です。
セミコロンを置いたらちゃんと動作したのですが、あまりに黒魔術っぽいので{}でくくることにしました。
単体テストが欲しい
文字の移動等に悪戦苦闘していると、単体テストが欲しくなってきます。
C言語のテストフレームワークはめぼしいものが見つからず(Visual Studioならできるらしい)
簡単なフレームワークを用意しようと思いました。
今日のまとめ
- ゲームマーケットに行ってきました
進捗よくないけど、充実した1日でした。ゲームマーケット楽しかったです!