Moving an updated position-history item to the end of the list,

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
This commit is contained in:
Benno Schulenberg 2016-01-24 14:49:42 +00:00
parent cd1d435ac7
commit 8c705b5dc2
2 changed files with 30 additions and 17 deletions

View File

@ -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> 2016-01-22 Benno Schulenberg <bensberg@justemail.net>
* src/utils.c (get_homedir): Don't use $HOME when we're root, because * 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 some sudos don't filter it out of the environment (which can lead to

View File

@ -3183,33 +3183,41 @@ void save_poshistory(void)
* and a column. If no entry is found, add a new one at the end. */ * 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) 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); char *fullpath = get_full_path(filename);
if (fullpath == NULL) if (fullpath == NULL)
return; return;
/* Look for a matching filename in the list. */
for (posptr = position_history; posptr != NULL; posptr = posptr->next) { for (posptr = position_history; posptr != NULL; posptr = posptr->next) {
if (!strcmp(posptr->filename, fullpath)) { if (!strcmp(posptr->filename, fullpath))
posptr->lineno = lineno; break;
posptr->xno = xpos;
free(fullpath);
return;
}
posprev = posptr; posprev = posptr;
} }
/* Didn't find it, make a new node yo! */ theone = posptr;
posptr = (poshiststruct *)nmalloc(sizeof(poshiststruct));
posptr->filename = mallocstrcpy(NULL, fullpath);
posptr->lineno = lineno;
posptr->xno = xpos;
posptr->next = NULL;
if (position_history == NULL) /* If we didn't find it, make a new node; otherwise, if we're
position_history = posptr; * not at the end, move the matching one to the end. */
else if (theone == NULL) {
posprev->next = posptr; 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); free(fullpath);
} }