Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/bsd/nvi/dist/vi Fix a strange corner case in } comm...



details:   https://anonhg.NetBSD.org/src/rev/999639f3a7db
branches:  trunk
changeset: 821042:999639f3a7db
user:      rin <rin%NetBSD.org@localhost>
date:      Sat Jan 21 22:22:28 2017 +0000

description:
Fix a strange corner case in } command.

When } command is executed in the last paragraph including EOF, the original vi
(traditional/SVR4) moves the cursor to the *last* character in the last line.
However, nvi moves it to the *first* character in the last line.

diffstat:

 external/bsd/nvi/dist/vi/v_paragraph.c |  70 +++++++++++++++++----------------
 1 files changed, 36 insertions(+), 34 deletions(-)

diffs (135 lines):

diff -r ef061d2f3b76 -r 999639f3a7db external/bsd/nvi/dist/vi/v_paragraph.c
--- a/external/bsd/nvi/dist/vi/v_paragraph.c    Sat Jan 21 22:06:46 2017 +0000
+++ b/external/bsd/nvi/dist/vi/v_paragraph.c    Sat Jan 21 22:22:28 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: v_paragraph.c,v 1.4 2017/01/21 22:06:46 rin Exp $ */
+/*     $NetBSD: v_paragraph.c,v 1.5 2017/01/21 22:22:28 rin Exp $ */
 /*-
  * Copyright (c) 1992, 1993, 1994
  *     The Regents of the University of California.  All rights reserved.
@@ -16,7 +16,7 @@
 static const char sccsid[] = "Id: v_paragraph.c,v 10.10 2001/06/25 15:19:32 skimo Exp  (Berkeley) Date: 2001/06/25 15:19:32 ";
 #endif /* not lint */
 #else
-__RCSID("$NetBSD: v_paragraph.c,v 1.4 2017/01/21 22:06:46 rin Exp $");
+__RCSID("$NetBSD: v_paragraph.c,v 1.5 2017/01/21 22:22:28 rin Exp $");
 #endif
 
 #include <sys/types.h>
@@ -73,8 +73,8 @@
 v_paragraphf(SCR *sp, VICMD *vp)
 {
        enum { P_INTEXT, P_INBLANK } pstate;
-       size_t lastlen, len;
-       db_recno_t cnt, lastlno, lno;
+       size_t lastcno, cno, prevlen, len;
+       db_recno_t cnt, lastlno, prevlno, lno;
        int isempty;
        CHAR_T *p;
        char *lp;
@@ -93,23 +93,31 @@
         * line itself remained.  If somebody complains, don't pause, don't
         * hesitate, just hit them.
         */
-       if (ISMOTION(vp)) {
-               if (vp->m_start.cno == 0)
+       if (db_last(sp, &lastlno))
+               return 1;
+       lno = vp->m_start.lno;
+       if (ISMOTION(vp) && lno != lastlno) {
+               if ((cno = vp->m_start.cno) == 0)
                        F_SET(vp, VM_LMODE);
                else {
-                       vp->m_stop = vp->m_start;
-                       vp->m_stop.cno = 0;
-                       if (nonblank(sp, vp->m_stop.lno, &vp->m_stop.cno))
+                       if (nonblank(sp, lno, &len))
                                return 1;
-                       if (vp->m_start.cno <= vp->m_stop.cno)
+                       if (cno <= len)
                                F_SET(vp, VM_LMODE);
                }
        }
 
-       /* Figure out what state we're currently in. */
-       lno = vp->m_start.lno;
-       if (db_get(sp, lno, 0, &p, &len))
-               goto eof;
+       /*
+        * Figure out what state we're currently in.  It also historically
+        * worked on empty files, so we have to make it okay.
+        */
+       if (db_eget(sp, lno, &p, &len, &isempty)) {
+               if (isempty) {
+                       vp->m_stop = vp->m_final = vp->m_start;
+                       return 0;
+               } else
+                       return 1;
+       }
 
        /*
         * If we start in text, we want to switch states
@@ -125,10 +133,12 @@
        }
 
        for (;;) {
-               lastlno = lno;
-               lastlen = len;
-               if (db_get(sp, ++lno, 0, &p, &len))
+               prevlno = lno;
+               prevlen = len;
+               if (++lno > lastlno)
                        goto eof;
+               if (db_get(sp, lno, 0, &p, &len))
+                       return 1;
                switch (pstate) {
                case P_INTEXT:
                        INTEXT_CHECK;
@@ -150,8 +160,8 @@
                         * to the start of the new "paragraph".
                         */
 found:                 if (ISMOTION(vp)) {
-                               vp->m_stop.lno = lastlno;
-                               vp->m_stop.cno = lastlen ? lastlen - 1 : 0;
+                               vp->m_stop.lno = prevlno;
+                               vp->m_stop.cno = prevlen ? prevlen - 1 : 0;
                                vp->m_final = vp->m_start;
                        } else {
                                vp->m_stop.lno = lno;
@@ -169,20 +179,12 @@
         * Adjust end of the range for motion commands; EOF is a movement
         * sink.  The } command historically moved to the end of the last
         * line, not the beginning, from any position before the end of the
-        * last line.  It also historically worked on empty files, so we
-        * have to make it okay.
+        * last line.
         */
-eof:   if (vp->m_start.lno == lno || vp->m_start.lno == lno - 1) {
-               if (db_eget(sp, vp->m_start.lno, &p, &len, &isempty)) {
-                       if (!isempty)
-                               return 1;
-                       vp->m_start.cno = 0;
-                       return 0;
-               }
-               if (vp->m_start.cno == (len ? len - 1 : 0)) {
-                       v_eof(sp, NULL);
-                       return 1;
-               }
+eof:   lastcno = len ? len - 1 : 0;
+       if (vp->m_start.lno == lastlno && vp->m_start.cno == lastcno) {
+               v_eof(sp, NULL);
+               return 1;
        }
        /*
         * !!!
@@ -196,8 +198,8 @@
                F_CLR(vp, VM_RCM_MASK);
                F_SET(vp, VM_RCM_SETFNB);
        }
-       vp->m_stop.lno = lno - 1;
-       vp->m_stop.cno = len ? len - 1 : 0;
+       vp->m_stop.lno = lastlno;
+       vp->m_stop.cno = lastcno;
        vp->m_final = ISMOTION(vp) ? vp->m_start : vp->m_stop;
        return 0;
 }



Home | Main Index | Thread Index | Old Index