# 設計ノート

## 断片表 (piece table)
Puting の編集バッファには断片表を用いる。
利点として、
* mmap と親和性がある
* バッファ作成時のオーバーヘッドが小さい（時空ともに）
* 上書きだけでなく挿入削除が可能
* マルチレベルアンドゥのためのデータを保持できる
が挙げられる。一方で、
* 多数の小さな変更を行った時のオーバーヘッドが大きい（時空ともに）
* 単純な上書きだけならより効率的な手段がある
という欠点がある（気がする）。

最初にひとつの文字を削除する機能を考える。
これは表の操作だけで済むため、断片表の処理のうち易しいものである。
文字が断片の先頭の場合、断片のオフセットをインクリメントしてサイズをデクリメントする。
文字が断片の末尾の場合、サイズをデクリメントする。
文字が断片の先頭かつ末尾の場合、断片の最後の文字なので、断片そのものを表から削除する。
連続する複数の文字を削除する場合、上記の処理を繰り返すのが簡単でよい。
削除する文字が複数の断片にまたがっている場合があるからである。

次にひとつの文字を挿入する機能を考える。
まず挿入位置が断片と断片の間であるかを確認する。
断片の中ほどであれば、断片を分割する。
追記バッファの末尾に文字を書き込み、新しい断片を作って書き込んだ文字を指す。
新しい断片を挿入位置に挿入する。
なお、特別の場合として、挿入位置が最後に挿入した文字の直後の場合は、
新しい断片を作る必要はなく、以前の断片を伸ばす（サイズをインクリメントする）だけでよい。（未実装）

## ファイルを受け取る方法
ファイルを受け取る方法として、現段階では
* コマンドライン引数
* ドラァグアンドドロップ
の二つがある。
コマンドライン引数は、エクスプローラ上でアプリのアイコンにファイルをドラァグアンドドロップすることで得られる。
つまりどちらにせよドラァグアンドドロップなのだが。
いずれの場合も、与えられたファイルの数とファイル名は、ファイルを開く前に知ることができる。
しかし、ファイルが正しく開かれるかは、開いてみないとわからない。
※開く前にファイルの存在チェックなどしても、僅差でファイルが作られることもあるため、正確ではない。
したがって、バッファ管理におけるバッファ作成の観点では、
ファイルは一つずつ開き、正しく開いたごとにバッファリストに加えていくのがよい。
事前に必要な数だけバッファリストに空きを作りたいところだが。
やるとすれば、最初に与えられたファイルの数だけ空きを作っておき、
正しく開いたごとにバッファリストの末尾の空きスペースに追加していく。
最後に、使わなかった空きスペースを解放する（解放せずに保持していてもよい）。
いずれにしても、入っている項目の数を把握しておくことが重要。
確保したメモリのサイズは、メモリ管理システムに管理させておけばよい。

## ソースコードをファイル分割する計画
hi.c  - higher layer
low.c - lower layer win32
lox.c - lower layer x11
