changeset 10:ccaeffb8975d

*** empty log message ***
author gongo
date Thu, 28 Dec 2006 21:11:09 +0900
parents ba0331fc7829
children 9cb8170fb25d
files ChangeLog redit-client-sm.el redit-client-sm.elc redit_client.pl
diffstat 4 files changed, 108 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Dec 15 13:24:56 2006 +0900
+++ b/ChangeLog	Thu Dec 28 21:11:09 2006 +0900
@@ -1,15 +1,87 @@
+2006-12-26  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
+
+	* 独り言
+	うん、やっぱりpack/unpackの処理はアホだな。
+	暫定版で出したんだからしょうがない、って言い訳をしておこう。
+	今のところ0〜255までしかできないので、以下のように変更
+
+	;; num   : packする整数
+	;; count : byte length
+	(defun pack-int-loop (num count)
+	  (if (> count 0)
+	      (concat
+	       (pack-int-loop (/ num 256) (- count 1))
+	       (char-to-string (% num 256)))))
+
+	(defun pack-int (num)
+	  (pack-int-loop num 4))
+
+	ex. num が 30000、byte length が4(32bit)の時 ('X'=不定)
+	;; loop start
+	count 4 -> (% num 256) => 48  を1バイト目
+	           (/ num 256) => 117 を2バイト目
+	XXXXXXXX XXXXXXXX XXXXXXXX 00110000 (0 0   0 48)
+	count 3 -> (% num 256) => 117 を2バイト目
+	           (/ num 256) =>   0 を3バイト目
+	XXXXXXXX XXXXXXXX 01110101 00110000 (0 0 117 48)
+	count 2 -> (% num 256) =>   0 を3バイト目
+	           (/ num 256) =>   0 を4バイト目
+	XXXXXXXX 00000000 01110101 00110000 (0 0   0 48)
+	count 1 -> (% num 256) =>   0 を4バイト目
+	           (/ num 256) =>   0 を5バイト目
+	00000000 00000000 01110101 00110000 (0 0 117 48)
+	;; loop end
+
+	これでおkでした。Perl側の unpack でデータ取得できました
+	こんな感じでいいのかな。packソース見たい。
+	あ〜あとはunpackか。まあ簡単かなpackと同じことすればいいのか。
+	int だけでいいのかな。浮動小数とかいやですね。
+
+	
+2006-12-24  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
+
+	* redit-client-sm.el - redit-client-after-change-function ()
+	< (progn (redit-client-write-line beginl nil)	;; t)
+	-----
+	> (progn (redit-client-write-line currline nil)	;; t)
+	while でループしてるのに
+	ずっとbeginlってのはおかしいかな〜と思った
+	
+	* 独り言
+	pack/unpackもどきができた。まだ使用段階なので組み込んでません。
+	- pack
+	(defun pack (num) ;; num=42
+	    (concat (char-to-string 0)     ;; 4バイト目
+	            (char-to-string 0)     ;; 3バイト目
+	            (char-to-string 0)     ;; 2バイト目
+	            (char-to-string num))) ;; 1バイト目
+	=> 00000000 00000000 00000000 00101010
+
+	lispでバイト列を扱うやりかたがよくわからなかったけど
+	これでなんとかrep_manager.plが unpack できてました。
+	エンディアンとか考える必要あるかな。
+
+	- unpack
+	受け取ったデータから、各値(command、eid 、etc...)を取り出す。
+
+	1〜4、5〜8、9〜12、13〜16、17〜20、21〜24
+	cmd    sid   eid     seq    line    t_siz
+
+	下位1バイト目(?)に値が入ってるので
+	(substring pkt 3 4) => "*" ;; (char-to-string 42) => "*" なので
+	(string-to-char "*") => 42 ・・・ 値取得成功!!
+
+	まだまだ見直す所ありそうだけど、
+	うまくいけば完全に lisp だけで REP できますね
+	
 2006-12-15  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
 
 	* 独り言
 	open-network-stream で rep_manager.pl に接続できた。
 	だけど、lisp 側で送信データがうまく作れてない。
 	(format "%4d%4d%4d%4d%4d%4d" 41 0 0 1 0 0)
-	じゃあなんかうまくいかない。
-	というか、rep-manager.pl に、24バイト以上送ると
-	なぜあバイト数が 0 に戻ってしまう(ex. send 25-> recv 1 (25-24))
-	たしかemacsでは 24 バイトしか扱えないからか?
-	でも navi2ch を見るに、24 バイト以上送ってる気がする。
-	あと、pack/unpackないかな・・・
+	だと、なんかうまくいかない。
+	pack/unpackないかな・・・
 	
 2006-12-14  Wataru MIYAGUNI  <gongo@cr.ie.u-ryukyu.ac.jp>
 
@@ -31,7 +103,7 @@
 	-----
 	> (call-interactively 'end-of-buffer)
 
-	end-of-buffer はinteractive 関数以外で
+	end-of-buffer は interactive 関数以外で
 	呼び出したら駄目らしいです。
 	いろいろ調べてたらこれで Warning 出ないので落ち着きました。
 	いいのかなこれで。。。
--- a/redit-client-sm.el	Fri Dec 15 13:24:56 2006 +0900
+++ b/redit-client-sm.el	Thu Dec 28 21:11:09 2006 +0900
@@ -247,7 +247,7 @@
 	(let ((beginp) (endp) (length))
 	  ;; write lines on server buffer
 	  (setq beginp
-		(progn (goto-line linenum) (point)))
+		(progn (goto-line linenum) (beginning-of-line) (point)))
 	  (setq endp
 		(progn (goto-line linenum) (end-of-line) (point)))
 	  (setq length (- endp beginp))
@@ -255,12 +255,13 @@
 	  ;; トークンが回ってくるのを待つ場合は、
 	  ;; すぐに process-send-string せずに
 	  ;; 編集情報を保存するだけにとどめる
-	  (enqueue redit-client-command-queue
-		   (concat (format "%10d%10d%10d%10d%10d%10d" (string-to-number redit-write-command) redit-client-session-id redit-client-editor-id (gen-seqno) linenum length)
-			   (buffer-substring beginp endp)
-			   (if (eq isnewline t) "\n")
-			   "\n"))
-
+	  (enqueue
+	   redit-client-command-queue
+	   (concat (format "%10d%10d%10d%10d%10d%10d" (string-to-number redit-write-command) redit-client-session-id redit-client-editor-id (gen-seqno) linenum length)
+		   (buffer-substring beginp endp)
+		   (if (eq isnewline t) "\n")
+		   "\n"))
+	  
 	  ;; redit-client-process へ
 	  ;; command_num + buffer_num + line_num + string
 	  ;; の文字列を送る
@@ -270,6 +271,9 @@
 		   (buffer-substring beginp endp)
 		   (if (eq isnewline t) "\n")
 		   "\n"))
+
+	  (message (concat "msg = " (buffer-substring beginp endp)
+			   ", line = " (number-to-string linenum)))
 	  ))
     (error "redit-client is not running.")))
 
@@ -324,6 +328,7 @@
 
   (let ((command (rep-get-command-from-pkt string)))
     ;; command がどの命令かを判断し、対応した処理をする。case みたい
+    (message string)
     (cond 
      ;; FIXME
      ((if (= command (string-to-number redit-open-ack))
@@ -443,15 +448,19 @@
 ;; バッファに変更があるたびに呼ばれる。バッファが変更される前に呼ばれる。
 ;; begin と end には変更前の変更部分の始まりと終わりの point が入る
 (defun redit-client-before-change-function (begin end)
-  ;; check delete
-  ;; (message "call redit-client-before-change-function")
   (let ((beginl (real-count-lines begin)) ;; begin の行番号
 	(endl (real-count-lines end))	  ;; end の行番号
 	(currline))			  ;; currline = nil
-    ;; 前回の編集した行と今回の編集した行が違っていたら前回の編集をサーバへ送る
-    (message (concat "before = " (number-to-string beginl) " : " (number-to-string endl)))
+
+    (message "before-change-function")
+
+    ;; 前回の編集した行と今回の編集した行が
+    ;; 違っていたら前回の編集をサーバへ送る
     (if (not (= beginl redit-client-previous-edited-line))
 	(redit-client-write-line redit-client-previous-edited-line nil))
+
+    ;; 削除処理で起こる。
+    ;; (ex. BackSpaceによる行そのものの削除, C-Space C-wなどのカット, ...)
     (if (< beginl endl)
 	(progn
 	  (setq currline endl)
@@ -459,22 +468,25 @@
 	  (while (> currline beginl) 
 	    (redit-client-delete-line endl)
 	    (setq currline (- currline 1)))))))
+
 ;; after-change-functions に hook される
 ;; バッファに変更があるたびに呼ばれる。バッファが変更された後に呼ばれる
 ;; begin と end には変更後の変更部分の始まりと終わりの point が入る
 (defun redit-client-after-change-function (begin end length)
-  ;; check insert
-  ;; (message "call redit-client-after-change-function")
   (let ((beginl (real-count-lines begin))
 	(endl (real-count-lines end))
 	(currline))
-    (message (concat "after = " (number-to-string beginl) " : " (number-to-string endl)))
+
+    (message "after-change-function")
+
+    ;; 挿入処理で起こる。
+    ;; (ex. 改行, C-y などのペースト, ...)
     (if (< beginl endl)
 	(progn
 	  (setq currline beginl)
 	  ;; beginlからendlまで挿入命令を出す
 	  (while (<= currline endl)
-	    (progn (redit-client-write-line beginl nil)	;; t)
+	    (progn (redit-client-write-line currline nil)
 		   (setq currline (+ currline 1))))))
     (setq redit-client-previous-edited-line endl)))
 
@@ -490,6 +502,7 @@
     (delete-region (progn (beginning-of-line) (point)) ;; 行の頭から
 		   (progn (end-of-line) (point))) ;; 行の末尾まで削除
     (insert text) ;; テキストデータを挿入
+    (message (concat "recv = " text ", line = " (number-to-string linenum)))
     ))
 
 ;; 引き数 string (line_num + text_data) で指定された行を削除する
Binary file redit-client-sm.elc has changed
--- a/redit_client.pl	Fri Dec 15 13:24:56 2006 +0900
+++ b/redit_client.pl	Thu Dec 28 21:11:09 2006 +0900
@@ -70,7 +70,7 @@
 	    or $sm_message->{'cmd'} == SMCMD_SELECT_ACK) {
 
 	    my $text = nkf("-eW", $sm_message->{'text'});
-	    $text =~ s/\n//g;
+	    # $text =~ s/\n//g;
 	    # バイト数ではなく文字数で
 	    my $textsiz = length(decode('euc-jp', $text));