]> git.wh0rd.org Git - nano.git/commitdiff
Moving an updated position-history item to the end of the list,
authorBenno Schulenberg <bensberg@justemail.net>
Sun, 24 Jan 2016 14:49:42 +0000 (14:49 +0000)
committerBenno Schulenberg <bensberg@justemail.net>
Sun, 24 Jan 2016 14:49:42 +0000 (14:49 +0000)
so that it won't be dropped any time soon.

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5582 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/files.c

index 4a16352bbb10649282e02207fcf6f0836e5539e2..997096dbcd84cc9d8617001f2687fa54025b8a9c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2016-01-24  Benno Schulenberg  <bensberg@justemail.net>
+       * src/files.c (update_poshistory): Move an updated item to the end
+       of the list, so that it won't be dropped any time soon.  The problem
+       was pointed out by David Niklas.
+
 2016-01-22  Benno Schulenberg  <bensberg@justemail.net>
        * src/utils.c (get_homedir): Don't use $HOME when we're root, because
        some sudos don't filter it out of the environment (which can lead to
index 906970fa8e9f6936df5e9dac211592c95f86f920..51e9c9cfb1dcd17c916cedc70b9091ca501f0561 100644 (file)
@@ -3183,33 +3183,41 @@ void save_poshistory(void)
  * and a column.  If no entry is found, add a new one at the end. */
 void update_poshistory(char *filename, ssize_t lineno, ssize_t xpos)
 {
-    poshiststruct *posptr, *posprev = NULL;
+    poshiststruct *posptr, *theone, *posprev = NULL;
     char *fullpath = get_full_path(filename);
 
     if (fullpath == NULL)
        return;
 
+    /* Look for a matching filename in the list. */
     for (posptr = position_history; posptr != NULL; posptr = posptr->next) {
-       if (!strcmp(posptr->filename, fullpath)) {
-           posptr->lineno = lineno;
-           posptr->xno = xpos;
-           free(fullpath);
-           return;
-       }
+       if (!strcmp(posptr->filename, fullpath))
+           break;
        posprev = posptr;
     }
 
-    /* Didn't find it, make a new node yo! */
-    posptr = (poshiststruct *)nmalloc(sizeof(poshiststruct));
-    posptr->filename = mallocstrcpy(NULL, fullpath);
-    posptr->lineno = lineno;
-    posptr->xno = xpos;
-    posptr->next = NULL;
+    theone = posptr;
 
-    if (position_history == NULL)
-       position_history = posptr;
-    else
-       posprev->next = posptr;
+    /* If we didn't find it, make a new node; otherwise, if we're
+     * not at the end, move the matching one to the end. */
+    if (theone == NULL) {
+       theone = (poshiststruct *)nmalloc(sizeof(poshiststruct));
+       theone->filename = mallocstrcpy(NULL, fullpath);
+       if (position_history == NULL)
+           position_history = theone;
+       else
+           posprev->next = theone;
+    } else if (posptr->next != NULL) {
+       posprev->next = posptr->next;
+       while (posptr->next != NULL)
+           posptr = posptr->next;
+       posptr->next = theone;
+    }
+
+    /* Store the last cursor position. */
+    theone->lineno = lineno;
+    theone->xno = xpos;
+    theone->next = NULL;
 
     free(fullpath);
 }