changeset 15:8634ceb0aeef

add copy_and_get_memline
author shinobu
date Sun, 31 Aug 2008 17:38:54 +0900
parents 1e44fe6dcfaa
children 8571aeab184c
files src/reditor.c
diffstat 1 files changed, 42 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/reditor.c	Sun Aug 31 15:24:59 2008 +0900
+++ b/src/reditor.c	Sun Aug 31 17:38:54 2008 +0900
@@ -90,6 +90,8 @@
 
 static int append_newline_sep_text(Session *sn, char *text);
 
+static char_u *copy_and_get_memline(BUFTYPE *buf, long lnum);
+
 /* g_rep has an all information of Remote Editor */
 rep_T g_rep;
 
@@ -1018,8 +1020,7 @@
     rep_cmd *cmd;
     rep_T *rep = get_rep();
     char *text;
-    char *prev_text = NULL;
-    
+
     cursn = rep->cursession;
 
     if ((cursn == NULL) || (cursn->prevline == -1)) return;
@@ -1032,18 +1033,17 @@
         rep->cursession = cursn;
     }
 
-    text = get_memline_wrp(cursn->buf, cursn->prevline);
-    
-    //cmd = make_cmd(REP_REPLACE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, text);
+    //text = get_memline_wrp(cursn->buf, cursn->prevline);
+    text = copy_and_get_memline(cursn->buf, cursn->prevline);
 
-    // TODO : 変更前のテキストを UNDO バッファから取得する
-    cmd = make_cmd(REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, prev_text);
+    cmd = make_cmd(REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, cursn->prev_text);
     cmd->next = make_cmd(REP_INSERT_CMD, cursn->sid, rep->eid, rep->seqno++, cursn->prevline, text);
-    
+
+    // 現在のバッファを取っておく
+    cursn->prev_text = text;
+
     add_cmd_to_list(&(cursn->new_cmdlist), cmd);
 
-    
-    
     if (cursn->sent_cmdlist.num == 0) { // 自トークンを送信してない場合
         rep_send_cur_cmdlist();
     }
@@ -1051,6 +1051,21 @@
     cursn->prevline = -1;
 }
 
+static char_u *
+copy_and_get_memline(buf, lnum)
+    BUFTYPE *buf;
+    linenr_T    lnum;
+{
+    char_u      *src;
+    char_u      *dst;
+    unsigned    len;
+
+    src = get_memline_wrp(buf,lnum);
+    len = (unsigned)STRLEN(src);
+    if ((dst = lalloc((long_u)((len) + 1), FALSE)) != NULL)
+        mch_memmove(dst, src, (size_t)(len + 1));
+    return (dst);
+}
 
 static void
 check_line_change(sn, lnum)
@@ -1069,8 +1084,13 @@
         sn->prevline = lnum;
         return;
     }
-    cmd = make_cmd(REP_REPLACE_CMD, sn->sid, rep->eid, rep->seqno++, sn->prevline,
-                   get_memline_wrp(sn->buf, sn->prevline));
+    //cmd = make_cmd(REP_REPLACE_CMD, sn->sid, rep->eid, rep->seqno++, sn->prevline, get_memline_wrp(sn->buf, sn->prevline));
+    // DELETE
+    cmd = make_cmd(REP_DELETE_LINE_CMD, sn->sid, rep->eid, rep->seqno++, sn->prevline, sn->prev_text);
+    add_cmd_to_list(&(sn->new_cmdlist), cmd);
+
+    // INSERT
+    cmd = make_cmd(REP_INSERT_CMD, sn->sid, rep->eid, rep->seqno++, sn->prevline, get_memline_wrp(sn->buf, sn->prevline));
     add_cmd_to_list(&(sn->new_cmdlist), cmd);
 
     sn->prevline = lnum;
@@ -1105,9 +1125,15 @@
         }
     } else if (xtra > 0) {
         if (lnum != lnume) { /* 行の途中から改行 */
-            cmd = make_cmd( REP_REPLACE_CMD, cursn->sid, rep->eid, rep->seqno++, lnum,
-                            get_memline_wrp(cursn->buf, lnum));
+            // cmd = make_cmd( REP_REPLACE_CMD, cursn->sid, rep->eid, rep->seqno++, lnum, get_memline_wrp(cursn->buf, lnum));
+            // DELETE
+            cmd = make_cmd( REP_DELETE_LINE_CMD, cursn->sid, rep->eid, rep->seqno++, lnum, cursn->prev_text);
             add_cmd_to_list(&(cursn->new_cmdlist), cmd);
+
+            // INSERT
+            cmd = make_cmd( REP_INSERT_CMD, cursn->sid, rep->eid, rep->seqno++, lnum, get_memline_wrp(cursn->buf, lnum));
+            add_cmd_to_list(&(cursn->new_cmdlist), cmd);
+
             lnum++;
         }
         for (i = 0; xtra > 0; i++, xtra--) {
@@ -1193,7 +1219,8 @@
         rep->slineup = make_session(SLINEUP_NAME, make_new_buf_wrp(SLINEUP_NAME));
         append_newline_sep_text(rep->slineup, text);
         set_cursession(rep->slineup);
-        update_screen_now_wrp();
+        rep_start_create_cmds();
+        //update_screen_now_wrp();
 
         if (rep->eid == 0) {
             rep->eid = eid;