Mercurial > hg > RemoteEditor > emacs
view translate.el @ 31:ccd1ad69a852 rep_camp_20071111
*** empty log message ***
author | gongo |
---|---|
date | Fri, 21 Dec 2007 13:30:50 +0900 |
parents | 40626191b1fa |
children |
line wrap: on
line source
(eval-when-compile (require 'cl)) (load-file "redit.el") (defstruct Queue (front nil) (rear nil)) (defvar lc-queue nil "local command queue.") (defvar rc-queue nil "remote command queue.") (defvar cmd-array nil "") (setq lc-queue (make-Queue)) (setq rc-queue (make-Queue)) ;; ランダムで i,r,d を出力するための配列 ;; 決めうちでごめんなさい (setq cmd-array [6 9 13]) ;; return 0 or 1 or 2 ;; cmd-array で使います。 (defun random3 () (let (rd) (setq rd (random)) (setq rd (if (< rd 0) (* rd -1) rd )) (setq rd (% rd 3)))) ;; @param queue REPcommand queue ;; @param item REPcommand (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))) ;; @param queue REPcommand queue ;; @return REPcommand (defun dequeue (queue) (if (Queue-front queue) (prog1 (pop (Queue-front queue)) (unless (Queue-front queue) ;; queue is empty (setf (Queue-rear queue) nil))))) (defun redit-pack-int-loop (num count) (if (> count 0) (concat (redit-pack-int-loop (/ num 256) (- count 1)) (char-to-string (% num 256))))) (defun redit-pack-int (num) (redit-pack-int-loop num 4)) (defun redit-pack (cmd sid eid seq lno siz) (concat (redit-pack-int cmd) (redit-pack-int sid) (redit-pack-int eid) (redit-pack-int seq) (redit-pack-int lno) (redit-pack-int siz))) (defun unpack-int (pkt byte) (let (num) (setq num (* byte 4)) (string-to-char (substring pkt (- num 1) num)))) ;; @param rcmd REPcommand queue of Remote Host ;; @param lcmd REPcommand queue of Local Host ;; ;; by kent ;; ;; 比較時に行番号が重なったときの処理は以下の表。 ;; なるべくテキストが残るようにしている。 ;; 0 -- なにもしない ;; +1 -- 行番号を +1 ;; INS -- コマンド id を 'REPCMD_INSERT' にする。 ;; NOP -- コマンドをNOP(何もしない)にする。 ;; ?* -- TOKENがMasterを通っていなければ ;; REMOTE ;; | i | r | d ;; ---|------------------ ;; U i | +1* | +1 | +1 ;; S ---|------------------ ;; E r | 0 | NOP*| NOP ;; R ---|------------------ ;; d | 0 | INS | NOP ;; ;; @exec 今は上の表通りに message で出力。 ;; (defun translate (rcmd lcmd) (let ((rc (rep-get-command-from-pkt rcmd)) (lc (rep-get-command-from-pkt lcmd)) (rlno (rep-get-line-number-from-pkt rcmd)) (llno (rep-get-line-number-from-pkt lcmd))) (if (= rlno llno) ;;(progn (cond ((= lc redit-insert-command) ;; local REPcommand is insert (cond ((= rc redit-insert-command) ;; remote REPcommand is insert (message "local=i, remote=i lineno++ *") ) ((= rc redit-replace-command) ;; remote REPcommand is replace (message "local=i, remote=r lineno++") ) ((= rc redit-delete-line-command) ;; remote REPcommand is delete (message "local=i, remote=d lineno++") )) ) ((= lc redit-replace-command) ;; local REPcommand is replace (cond ((= rc redit-insert-command) ;; remote REPcommand is insert (message "local=r, remote=i 0") ) ((= rc redit-replace-command) ;; remote REPcommand is replace (message "local=r, remote=r cmd = NOP *") ) ((= rc redit-delete-line-command) ;; remote REPcommand is delete (message "local=r, remote=d cmd = NOP") )) ) ((= lc redit-delete-line-command) ;; local REPcommand is delete (cond ((= rc redit-insert-command) ;; remote REPcommand is insert (message "local=d, remote=i 0") ) ((= rc redit-replace-command) ;; remote REPcommand is replace (message "local=d, remote=r cmd = insert") ) ((= rc redit-delete-line-command) ;; remote REPcommand is delete (message "local=d, remote=d cmd = nop") )) ) )) )) ;; rcmd[0] <> lcmd[0] ;; rcmd[1] <> lcmd[1] ;; rcmd[2] <> lcmd[2] ;; .... ;; って感じで、queue の command を translate するテストルーチン (defun translate-test () (interactive) (let (num Rcmd Lcmd) (setq num 0) (while (< num 30) (setq Rcmd (concat (redit-pack (aref cmd-array (random3)) 0 0 0 31 0))) (setq Lcmd (concat (redit-pack (aref cmd-array (random3)) 0 0 0 31 0))) (enqueue rc-queue Rcmd) (enqueue lc-queue Lcmd) (setq num (+ num 1))) (while (> num 0) (translate (dequeue rc-queue) (dequeue lc-queue)) (setq num (- num 1)))))