Mercurial > hg > RemoteEditor > emacs
changeset 45:653a9b9b7775 v20080823
*** empty log message ***
author | gongo |
---|---|
date | Sat, 23 Aug 2008 17:09:19 +0900 |
parents | 24ec88b5c1d3 |
children | 991526bc3f16 |
files | test/packet/README test/packet/redit-test-packet-recv.el test/packet/redit-test-packet-send.pl |
diffstat | 3 files changed, 74 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/test/packet/redit-test-packet-recv.el Fri Aug 22 22:15:12 2008 +0900 +++ b/test/packet/redit-test-packet-recv.el Sat Aug 23 17:09:19 2008 +0900 @@ -5,6 +5,11 @@ ;; プロセス変数 (defvar redit-test-client-process nil) +;; +(defvar redit-test-filter-resume nil) + +(defconst redit-test-command-header-size 24) + (defun redit-test-unpack-int-loop (pkt pos count) (if (> count 1) @@ -17,6 +22,14 @@ (defun redit-test-unpack-int (pkt pos) (redit-test-unpack-int-loop pkt (* pos 4) 4)) +;; binary この時点では、pkt は binary 形式なので +;; substring でも抽出できる。。。ってことかな(何 +;; utf-8 とかで decode されていれば多分出来ないはず +;; (length "あいうえお") => 5 +;; (string-bytes "あいうえお") => 15 (utf-8の場合) +(defun redit-test-unpack-str (pkt pos length) + (substring pkt (* pos 4) (+ (* pos 4) length))) + (defun rep-test-get-command-from-pkt (pkt) (redit-test-unpack-int pkt 1)) (defun rep-test-get-session-id-from-pkt (pkt) @@ -30,6 +43,13 @@ (defun rep-test-get-text-size-from-pkt (pkt) (redit-test-unpack-int pkt 6)) +;; text のサイズが指定されていればそれを使い、 +;; そうでなければ、get-text-size-from-pkt を実行する +(defun rep-test-get-text-from-pkt (pkt &optional _siz) + (let (size) + (setq size (if (null _siz) (rep-test-get-text-size-from-pkt pkt) _siz)) + (redit-test-unpack-str pkt 6 size))) + ;; process (send.pl) を起動する。 ;; send.pl がパケットを送るトリガー(?)として @@ -58,16 +78,48 @@ (redit-test-start)) ;; process からのパケットを受け取る。 -;; パケットは REPcommand。 -;; バイトデータと、unpack して取得した値を出力する +;; *Messages* に バイトデータ、現在のバッファに unpack して取得した値を出力する +;; +;; パケットには複数の REPcommand がある(連結されている)場合があるので +;; 全体のサイズを見て、分割しながら判別していく (defun redit-test-client-process-filter (proc string) - (let ((cmd (rep-test-get-command-from-pkt string)) - (sid (rep-test-get-session-id-from-pkt string)) - (eid (rep-test-get-editor-id-from-pkt string)) - (seq (rep-test-get-sequence-id-from-pkt string)) - (lno (rep-test-get-line-number-from-pkt string)) - (siz (rep-test-get-text-size-from-pkt string))) + (let (cmd sid eid seq lno siz txt allsize cursize) + + ;; 前回に余った奴があれば、それを前方追加する + (setq string (concat redit-test-filter-resume string)) + (setq allsize (length string)) + + (block loop + ;; process-filter が受け取れるのは1024byteまで。 + ;; なので、string に入っているパケットが途中で切れてる可能性がある + (while (> allsize redit-test-command-header-size) + (setq cmd (rep-test-get-command-from-pkt string)) + (setq sid (rep-test-get-session-id-from-pkt string)) + (setq eid (rep-test-get-editor-id-from-pkt string)) + (setq seq (rep-test-get-sequence-id-from-pkt string)) + (setq lno (rep-test-get-line-number-from-pkt string)) + (setq siz (rep-test-get-text-size-from-pkt string)) + + ;; ヘッダ(redit-test-command-header-size) + テキストサイズ + (setq cursize (+ redit-test-command-header-size siz)) - (message (concat string "\n")) - (message (format "%d %d %d %d %d %d" - cmd sid eid seq lno siz)))) \ No newline at end of file + ;; パケットが 1024 byte の壁で途切れてる場合、 + ;; テキストが読めないので、ループを抜ける + (if (> cursize allsize) (return-from loop)) + + (setq txt (rep-test-get-text-from-pkt string siz)) + + (insert (format "%d %d %d %d %d %d %s\n" + cmd sid eid seq lno siz + (decode-coding-string txt 'utf-8))) + (insert (format "残り %d byte\n" (- allsize cursize))) + + (setq allsize (- allsize cursize)) + ;; string の分割 + (setq string (substring string cursize)))) + + ;; 途切れたやつは次の process-filter の string に入っているので + ;; この時点で余った奴を保存し、 + ;; 次の process-filter の string の前に連結する + (setq redit-test-filter-resume string) + )) \ No newline at end of file
--- a/test/packet/redit-test-packet-send.pl Fri Aug 22 22:15:12 2008 +0900 +++ b/test/packet/redit-test-packet-send.pl Sat Aug 23 17:09:19 2008 +0900 @@ -2,27 +2,34 @@ use IO::Select; use Time::HiRes; # sleep で 1秒未満も扱えるように +use NKF; my $selector = new IO::Select(\*STDIN) or die "Cannot select stdin : $!\n"; # パケット送信する回数 -my $send_count = 10; +my $send_count = 320; # パケット送信の間隔(秒) -my $send_interval = 0.05; +my $send_interval = 0; sub make_packet { my ($cmd, $sid, $eid, $seqno, $lineno, $text) = @_; - return pack("NNNNNN", $cmd, $sid, $eid, $seqno, $lineno, length($text)).$text; + my $txt = NKF::nkf("-w", $text); + return pack("NNNNNN", $cmd, $sid, $eid, $seqno, $lineno, length($txt)).$txt; } +@strarr = ('あいうえお', 'abcdefg', 'ひゃしゃjさいsn', 'さんまんま', + 'gongo', '琉球大学', '宜野湾農工大学', 'ほいほい', + '☆ふほほ'); +$strsiz = @strarr; + # パケット送信のトリガー(?)的な意味なので # 特に STDIN から拾う必要は無い(多分) $selector->can_read(0); for ($i = 0; $i < $send_count; $i++) { # REPcommand を生成 - my $packet = &make_packet(41, 1, 1, 0, $i, ""); + my $packet = &make_packet(41, 1, 1, 0, $i, $strarr[$i%$strsiz]); syswrite(STDOUT, $packet, length($packet)); Time::HiRes::sleep($send_interval); }