changeset 5:ee15fce75335 rep_camp_2006

add translat routine
author shinobu
date Sun, 22 Oct 2006 17:29:02 +0900
parents e73bf047eb19
children 5796f9efc332
files redit-client-sm.el
diffstat 1 files changed, 181 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/redit-client-sm.el	Sun Oct 22 13:51:18 2006 +0900
+++ b/redit-client-sm.el	Sun Oct 22 17:29:02 2006 +0900
@@ -1,7 +1,8 @@
 ;	$Id$
 ;  (defcustom redit-client-program "/usr/home/masasi/work/redit/reditclient"
 ;(defcustom redit-client-program "/usr/home/shinobu/redit/demo/reditclient"
- (defcustom redit-client-program "/Users/dot/work/REP_project/emacs/redit_client.pl"
+; (defcustom redit-client-program "/Users/dot/work/REP_project/emacs/redit_client.pl"
+(defcustom redit-client-program "/home/dot/work/REP_project/emacs/redit_client.pl"
   "The program to use as the remote-edit client."
   :group 'redit
   :type 'string)
@@ -78,6 +79,16 @@
 (defvar redit-quit-command           "53")
 (defvar redit-quit-ack-command       "54")
 
+; Queue struct
+(defstruct Queue (front nil) (rear nil))
+(setq redit-client-command-queue (make-Queue))
+(setq redit-client-receive-queue (make-Queue))
+(setq redit-client-send-queue (make-Queue))
+
+;line translated que
+(setq after-CQ (make-Queue))
+(setq after-RQ (make-Queue))
+
 (defun redit-client-start (host)
   "Allow this Emacs process to be a remote-edit client for client processes."
   (interactive "P")
@@ -236,6 +247,16 @@
 		  (setq endp
 				(progn (goto-line linenum) (end-of-line) (point)))
 		  (setq length (- endp beginp))
+
+      ; トークンが回ってくるのを待つ場合は、すぐに process-send-string せずに編集情報を保存するだけにとどめる
+
+      ; redit-client-command-queueに編集情報を保存する
+      (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
 	  ;の文字列を送る
 		  (process-send-string 
@@ -253,6 +274,16 @@
 (defun redit-client-delete-line (linenum)
   (if redit-client-process
       (save-restriction
+
+    ; トークンが回ってくるのを待つ場合は、すぐに process-send-string せずに編集情報を保存するだけにとどめる
+
+    ; redit-client-command-queueに編集情報を保存する
+    (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"))
+    
 	; write lines on server buffer
 	(process-send-string
 	 redit-client-process
@@ -578,3 +609,152 @@
     (string-to-number (substring pkt 50 60)))
 (defun rep-get-text-from-pkt (pkt)
     (substring pkt 60))
+
+; enqueue item in queue
+(defun enqueue (queue item)
+  (let ((new-cell (list item)))
+  (if (Queue-front queue)
+    ; 最終セルを書き換える
+    (setf (cdr (Queue-rear queue)) new-cell)
+    ; キューは空の状態
+    (setf (Queue-front queue) new-cell))
+    (setf (Queue-rear queue) new-cell)))
+
+; deque last queue
+(defun dequeue (queue)
+  (if (Queue-front queue)
+    (prog1
+    (pop (Queue-front queue))
+    (unless (Queue-front queue)
+  ; キューは空になった
+  (setf (Queue-rear queue) nil)))))
+
+
+(defun dequeue-all (queue)
+  "clean queue"
+  (while (Queue-front queue)
+    (dequeue queue)))
+
+(defun redit-line-translate-out (cque rque)
+  "redit line translate for output"
+  (let ((cc) (rc) (xcc) (xrc) (ccc) (crc) (cignore 0) (rignore 0))
+  (setq xcc 0)
+  (setq xrc 0)
+  (setq cignore 0)
+  (setq rignore 0)
+  (while cque
+    (setq cc (car cque))
+    (while rque
+      (setq rc (car rque))
+;-------- translation ------------
+
+      (if (< (+ (redit-get-line cc) xcc) (+ (redit-get-line rc) xrc))
+	  (if (= (redit-get-command cc) (string-to-number redit-write-command)) (setq xrc (- xrc 1)))
+	  (if (= (redit-get-command cc) (string-to-number redit-delete-line-command)) (setq xrc (- xrc 1))))
+
+      (if (> (+ (redit-get-line cc) xcc) (+ (redit-get-line rc) xrc))
+	  (if (= (redit-get-command rc) (string-to-number redit-write-command)) (setq xcc (+ xcc 1)))
+	  (if (= (redit-get-command rc) (string-to-number redit-delete-line-command)) (setq xcc (- xcc 1))))
+
+      (if (= (+ (redit-get-line cc) xcc) (+ (redit-get-line rc) xrc))
+	  (if (= (redit-get-command rc) (string-to-number redit-write-command)) (setq xcc (+ xcc 1)))
+	  (if (= (redit-get-command rc) (string-to-number redit-replace-command))
+	    (if (= (redit-get-command cc) (string-to-number redit-write-command)) (setq xrc (+ xrc 1)))
+	    (if (= (redit-get-command cc) (string-to-number redit-replace-command)) (setq cignore 1))
+	    (if (= (redit-get-command cc) (string-to-number redit-delete-line-command)) (setq crc redit-write-command) (setq cignore 1))))
+
+	  (if (= (redit-get-command rc) (string-to-number redit-delete-line-command))
+	    (if (= (redit-get-command cc) (string-to-number redit-write-command)) (setq xrc (+ (redit-get-line rc) 1)))
+	    (if (= (redit-get-command cc) (string-to-number redit-replace-command)) (setq cignore 1))
+	    (if (= (redit-get-command cc) (string-to-number redit-delete-line-command)) (setq cignore 1) (setq rignore 1)))
+
+;-------- translation ------------
+
+      (setq rque (cdr rque)))                    ; while rque
+
+	  ;ignore
+	  (if (= cignore 1)
+	      ;xxx
+	      (setq cignore 0))
+	  (if (= rignore 1)
+	      ;xxx
+	      (setq cignore 0))
+
+;-------- add after que ------------
+          (enqueue after-CQ (concat (format "%2d%2d%9d" (redit-get-command cc) (redit-get-uid cc) (+ (redit-get-line cc) xcc)) (redit-get-text cc)))
+;-------- add after que ------------
+
+    (setq cque (cdr cque)))                     ; while cque
+  ) ; let
+) ;defun
+
+(defun redit-line-translate-in (cque rque)
+  "redit line translate for input"
+  (let ((cc) (rc) (xcc) (xrc) (ccc) (crc) (cignore 0) (rignore 0))
+  (setq xcc 0)
+  (setq xrc 0)
+  (setq cignore 0)
+  (setq rignore 0)
+  (while rque
+    (setq rc (car rque))
+    (setq cignore 0)
+    (setq rignore 0)
+    (while cque
+      (setq cc (car cque))
+;-------- translation ------------
+
+      (if (and (= cignore 1) (= rignore 1))
+      (if (< (+ (redit-get-line rc) xrc) (+ (redit-get-line cc) xcc))
+	  (if (= (redit-get-command rc) (string-to-number redit-write-command)) (setq xcc (+ xcc 1)))
+	  (if (= (redit-get-command rc) (string-to-number redit-delete-line-command)) (setq xcc (- xcc 1))))
+
+      (if (> (+ (redit-get-line rc) xrc) (+ (redit-get-line cc) xcc))
+	  (if (= (redit-get-command cc) (string-to-number redit-write-command)) (setq xrc (- xrc 1)))
+	  (if (= (redit-get-command cc) (string-to-number redit-delete-line-command)) (setq xrc (+ xrc 1))))
+
+      (if (= (+ (redit-get-line rc) xrc) (+ (redit-get-line cc) xcc))
+	  (if (= (redit-get-command cc) (string-to-number redit-write-command)) (setq xcc (+ xcc 1)))
+	  (if (= (redit-get-command cc) (string-to-number redit-replace-command))
+	    (if (= (redit-get-command rc) (string-to-number redit-write-command)) (setq xcc (+ xcc 1)))
+	    (if (= (redit-get-command rc) (string-to-number redit-replace-command)) (setq cignore 1))
+	    (if (= (redit-get-command rc) (string-to-number redit-delete-line-command)) (setq crc redit-write-command) (setq cignore 1))))
+	  (if (= (redit-get-command cc) (string-to-number redit-delete-line-command))
+	    (if (= (redit-get-command rc) (string-to-number redit-write-command)) (setq xcc (+ (redit-get-line cc) 1)))
+	    (if (= (redit-get-command rc) (string-to-number redit-replace-command)) (setq crc redit-write-command) (setq cignore 1))
+	    (if (= (redit-get-command rc) (string-to-number redit-delete-line-command)) (setq cignore 1) (setq rignore 1))))
+
+;-------- translation ------------
+
+      (setq cque (cdr cque)))                    ; while rque
+
+	  ;ignore
+	  (if (= cignore 1)
+	      ;xxx
+	      (setq cignore 0))
+	  (if (= rignore 1)
+	      ;xxx
+	      (setq rignore 0))
+
+;-------- add after que ------------
+          (enqueue after-RQ (concat (format "%2d%2d%9d" (redit-get-command rc) (redit-get-uid rc) (+ (redit-get-line rc) xrc)) (redit-get-text rc)))
+;-------- add after que ------------
+
+    (setq rque (cdr rque)))                     ; while cque
+  ) ; let
+) ;defun
+
+; for debug
+(defun redit-client-print-command-queue ()
+  "Print command queue."
+  (interactive)
+  (print redit-client-command-queue))
+
+(defun redit-client-print-recive-queue ()
+  "Print command queue."
+  (interactive)
+  (print redit-client-receive-queue))
+
+(defun redit-client-print-send-queue ()
+  "Print command queue."
+  (interactive)
+  (print redit-client-send-queue))