Mercurial > hg > RemoteEditor > emacs
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))