# HG changeset patch # User kono # Date 1220795748 -32400 # Node ID 70868348fbd800ae549eee189b0bc5e1d421cdce # Parent efce76870846d7ee5415154daebac4b73e2deed2 *** empty log message *** diff -r efce76870846 -r 70868348fbd8 src/REPNOTE.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/REPNOTE.txt Sun Sep 07 22:55:48 2008 +0900 @@ -0,0 +1,49 @@ +Sun Sep 7 20:18:14 JST 2008 + +ml_replace + 文字のinsert の時には毎回呼ばれる + 文字のdeleteの時には、最初の一回しか呼ばれない +ml_append + 行のopen の時に一回だけ呼ばれる + 複数行appendしても、一回ずつ呼ばれる +ml_delete + 複数行deleteしても、一回ずつ呼ばれる + +changed_common + これらが呼ばれて変更があった時に呼ばれる + 複数行の変更は一回にまとめられて、変更行数がxtraに入る + +というわけなので、以下のようなアルゴリズムになると思われる + +ml_* で、prev_line_flushを呼ぶ。 + + prev_line とcurrent lineを比較して異なっていたら、 + insert されているdelete commandがあったらキャンセルする + 溜っているのは、changed_commonのreplaceのケースのみ + + prev_line をcurrent lineに設定して、 + + delete の場合は、DELETE_CMDとして現在の行をセーブして終了 + ml_deleteは1行毎に呼ばれる + 送ってしまっても構わない + + append の場合は何もしない + 最後にまとめてchanged_common でINSERT_CMDを発行すれば良い` + + あとはreplaceの場合となる + + 既にprev_lineがsaveしてあったら何もしないで終了 + 文字のinsertの場合 + + そうでなかったら、current lineを DELETE_CMD としてセーブする + 最初のreplaceの場合 + +changed_common で、 + + xtra < 0 の場合は何もしないで溜ったコマンドを送信 + ml_delete の分だけDELETE_CMDが送信される (送ってなければ) + xtra > 0 の場合は、INSERT_CMD を行数の分だけ送信 + xtra == 0 の場合は、INSERT_CMD を送信して、 + 現在行をDELETE_CMDとしてセーブ + (ml_replace は文字の削除では呼ばれないので、ここでセーブする必要がある) +