forked from aniani/vim
A bit of cleanup and simplification for undofile.
This commit is contained in:
@@ -19,7 +19,7 @@ The ":messages" command can be used to view previously given messages. This
|
|||||||
is especially useful when messages have been overwritten or truncated. This
|
is especially useful when messages have been overwritten or truncated. This
|
||||||
depends on the 'shortmess' option.
|
depends on the 'shortmess' option.
|
||||||
|
|
||||||
The number of remembered messages is fixed at 20 for the tiny version and 100
|
The number of remembered messages is fixed at 20 for the tiny version and 200
|
||||||
for other versions.
|
for other versions.
|
||||||
|
|
||||||
*g<*
|
*g<*
|
||||||
|
@@ -1093,9 +1093,9 @@ Vim 7.3:
|
|||||||
Use register_shell_extension()? (George Reilly, 2010 May 26)
|
Use register_shell_extension()? (George Reilly, 2010 May 26)
|
||||||
Ron's version: http://dev.ronware.org/p/vim/finfo?name=gvim.nsi
|
Ron's version: http://dev.ronware.org/p/vim/finfo?name=gvim.nsi
|
||||||
- Persistent undo bugs / fixes:
|
- Persistent undo bugs / fixes:
|
||||||
- check for sizeof(time_t) results in compiler warning in misc2.c
|
|
||||||
- Memory leak reproduced by Dominique Pelle, 2010 May 28.
|
- Memory leak reproduced by Dominique Pelle, 2010 May 28.
|
||||||
- When there is no undo info (undolevels negative), delete the undo file.
|
- When there is no undo info (undolevels negative), delete the undo file.
|
||||||
|
Already done?
|
||||||
- Need to check all values for evil manipulation.
|
- Need to check all values for evil manipulation.
|
||||||
- Add undofile(name): get undo file name for buffer "name".
|
- Add undofile(name): get undo file name for buffer "name".
|
||||||
- patch for unused functions. (Dominique Pelle, 2010 May 29)
|
- patch for unused functions. (Dominique Pelle, 2010 May 29)
|
||||||
|
@@ -130,7 +130,7 @@
|
|||||||
* Message history is fixed at 100 message, 20 for the tiny version.
|
* Message history is fixed at 100 message, 20 for the tiny version.
|
||||||
*/
|
*/
|
||||||
#ifdef FEAT_SMALL
|
#ifdef FEAT_SMALL
|
||||||
# define MAX_MSG_HIST_LEN 100
|
# define MAX_MSG_HIST_LEN 200
|
||||||
#else
|
#else
|
||||||
# define MAX_MSG_HIST_LEN 20
|
# define MAX_MSG_HIST_LEN 20
|
||||||
#endif
|
#endif
|
||||||
|
@@ -341,18 +341,6 @@ struct m_info
|
|||||||
minfo_T *m_next; /* pointer to next free chunk in the list */
|
minfo_T *m_next; /* pointer to next free chunk in the list */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* structure used to link blocks in the list of allocated blocks.
|
|
||||||
*/
|
|
||||||
typedef struct m_block mblock_T;
|
|
||||||
struct m_block
|
|
||||||
{
|
|
||||||
mblock_T *mb_next; /* pointer to next allocated block */
|
|
||||||
size_t mb_size; /* total size of all chunks in this block */
|
|
||||||
size_t mb_maxsize; /* size of largest fee chunk */
|
|
||||||
minfo_T mb_info; /* head of free chunk list for this block */
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* things used in memfile.c
|
* things used in memfile.c
|
||||||
*/
|
*/
|
||||||
@@ -1286,14 +1274,6 @@ struct file_buffer
|
|||||||
linenr_T b_u_line_lnum; /* line number of line in u_line */
|
linenr_T b_u_line_lnum; /* line number of line in u_line */
|
||||||
colnr_T b_u_line_colnr; /* optional column number */
|
colnr_T b_u_line_colnr; /* optional column number */
|
||||||
|
|
||||||
/*
|
|
||||||
* The following only used in undo.c
|
|
||||||
*/
|
|
||||||
mblock_T b_block_head; /* head of allocated memory block list */
|
|
||||||
minfo_T *b_m_search; /* pointer to chunk before previously
|
|
||||||
allocated/freed chunk */
|
|
||||||
mblock_T *b_mb_current; /* block where m_search points in */
|
|
||||||
|
|
||||||
#ifdef FEAT_INS_EXPAND
|
#ifdef FEAT_INS_EXPAND
|
||||||
int b_scanned; /* ^N/^P have scanned this buffer */
|
int b_scanned; /* ^N/^P have scanned this buffer */
|
||||||
#endif
|
#endif
|
||||||
|
63
src/undo.c
63
src/undo.c
@@ -1075,6 +1075,11 @@ u_write_undo(name, forceit, buf, hash)
|
|||||||
if (p_verbose > 0)
|
if (p_verbose > 0)
|
||||||
smsg((char_u *)_("Writing undo file: %s"), file_name);
|
smsg((char_u *)_("Writing undo file: %s"), file_name);
|
||||||
|
|
||||||
|
#ifdef U_DEBUG
|
||||||
|
/* Check if there already is a problem before writing. */
|
||||||
|
u_check(FALSE);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef UNIX
|
#ifdef UNIX
|
||||||
/*
|
/*
|
||||||
* Try to set the group of the undo file same as the original file. If
|
* Try to set the group of the undo file same as the original file. If
|
||||||
@@ -1103,6 +1108,9 @@ u_write_undo(name, forceit, buf, hash)
|
|||||||
goto theend;
|
goto theend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Undo must be synced. */
|
||||||
|
u_sync(TRUE);
|
||||||
|
|
||||||
/* Start writing, first the undo file header. */
|
/* Start writing, first the undo file header. */
|
||||||
if (fwrite(UF_START_MAGIC, (size_t)UF_START_MAGIC_LEN, (size_t)1, fp) != 1)
|
if (fwrite(UF_START_MAGIC, (size_t)UF_START_MAGIC_LEN, (size_t)1, fp) != 1)
|
||||||
goto write_error;
|
goto write_error;
|
||||||
@@ -1359,7 +1367,6 @@ u_read_undo(name, hash)
|
|||||||
num_head * sizeof(u_header_T *));
|
num_head * sizeof(u_header_T *));
|
||||||
if (uhp_table == NULL)
|
if (uhp_table == NULL)
|
||||||
goto error;
|
goto error;
|
||||||
vim_memset(uhp_table, 0, num_head * sizeof(u_header_T *));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((c = get2c(fp)) == UF_HEADER_MAGIC)
|
while ((c = get2c(fp)) == UF_HEADER_MAGIC)
|
||||||
@@ -1436,38 +1443,14 @@ u_read_undo(name, hash)
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insertion sort the uhp into the table by its uh_seq. This is
|
uhp_table[num_read_uhps++] = uhp;
|
||||||
* required because, while the number of uhps is limited to
|
|
||||||
* num_head, and the uh_seq order is monotonic with respect to
|
|
||||||
* creation time, the starting uh_seq can be > 0 if any undolevel
|
|
||||||
* culling was done at undofile write time, and there can be uh_seq
|
|
||||||
* gaps in the uhps.
|
|
||||||
*/
|
|
||||||
for (i = num_read_uhps - 1; ; --i)
|
|
||||||
{
|
|
||||||
/* if i == -1, we've hit the leftmost side of the table, so insert
|
|
||||||
* at uhp_table[0]. */
|
|
||||||
if (i == -1 || uhp->uh_seq > uhp_table[i]->uh_seq)
|
|
||||||
{
|
|
||||||
/* If we've had to move from the rightmost side of the table,
|
|
||||||
* we have to shift everything to the right by one spot. */
|
|
||||||
if (num_read_uhps - i - 1 > 0)
|
|
||||||
{
|
|
||||||
memmove(uhp_table + i + 2, uhp_table + i + 1,
|
|
||||||
(num_read_uhps - i - 1) * sizeof(u_header_T *));
|
|
||||||
}
|
}
|
||||||
uhp_table[i + 1] = uhp;
|
|
||||||
break;
|
if (num_read_uhps != num_head)
|
||||||
}
|
|
||||||
else if (uhp->uh_seq == uhp_table[i]->uh_seq)
|
|
||||||
{
|
{
|
||||||
corruption_error("duplicate uh_seq", file_name);
|
corruption_error("num_head", file_name);
|
||||||
u_free_uhp(uhp);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
num_read_uhps++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (c != UF_HEADER_END_MAGIC)
|
if (c != UF_HEADER_END_MAGIC)
|
||||||
{
|
{
|
||||||
@@ -1483,11 +1466,9 @@ u_read_undo(name, hash)
|
|||||||
# define SET_FLAG(j)
|
# define SET_FLAG(j)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* We've organized all of the uhps into a table sorted by uh_seq. Now we
|
/* We have put all of the uhps into a table. Now we iterate through the
|
||||||
* iterate through the table and swizzle each sequence number we've
|
* table and swizzle each sequence number we've stored in uh_* into a
|
||||||
* stored in uh_* into a pointer corresponding to the header with that
|
* pointer corresponding to the header with that sequence number. */
|
||||||
* sequence number. Then free curbuf's old undo structure, give curbuf
|
|
||||||
* the updated {old,new,cur}head pointers, and then free the table. */
|
|
||||||
for (i = 0; i < num_head; i++)
|
for (i = 0; i < num_head; i++)
|
||||||
{
|
{
|
||||||
uhp = uhp_table[i];
|
uhp = uhp_table[i];
|
||||||
@@ -1497,6 +1478,12 @@ u_read_undo(name, hash)
|
|||||||
{
|
{
|
||||||
if (uhp_table[j] == NULL)
|
if (uhp_table[j] == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
if (i != j && uhp_table[i]->uh_seq == uhp_table[j]->uh_seq)
|
||||||
|
{
|
||||||
|
corruption_error("duplicate uh_seq", file_name);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (uhp_table[j]->uh_seq == (long)uhp->uh_next)
|
if (uhp_table[j]->uh_seq == (long)uhp->uh_next)
|
||||||
{
|
{
|
||||||
uhp->uh_next = uhp_table[j];
|
uhp->uh_next = uhp_table[j];
|
||||||
@@ -1541,6 +1528,10 @@ u_read_undo(name, hash)
|
|||||||
curbuf->b_u_oldhead = old_idx < 0 ? NULL : uhp_table[old_idx];
|
curbuf->b_u_oldhead = old_idx < 0 ? NULL : uhp_table[old_idx];
|
||||||
curbuf->b_u_newhead = new_idx < 0 ? NULL : uhp_table[new_idx];
|
curbuf->b_u_newhead = new_idx < 0 ? NULL : uhp_table[new_idx];
|
||||||
curbuf->b_u_curhead = cur_idx < 0 ? NULL : uhp_table[cur_idx];
|
curbuf->b_u_curhead = cur_idx < 0 ? NULL : uhp_table[cur_idx];
|
||||||
|
#ifdef U_DEBUG
|
||||||
|
if (curbuf->b_u_curhead != NULL)
|
||||||
|
corruption_error("curhead not NULL", file_name);
|
||||||
|
#endif
|
||||||
curbuf->b_u_line_ptr = line_ptr;
|
curbuf->b_u_line_ptr = line_ptr;
|
||||||
curbuf->b_u_line_lnum = line_lnum;
|
curbuf->b_u_line_lnum = line_lnum;
|
||||||
curbuf->b_u_line_colnr = line_colnr;
|
curbuf->b_u_line_colnr = line_colnr;
|
||||||
@@ -1548,6 +1539,8 @@ u_read_undo(name, hash)
|
|||||||
curbuf->b_u_seq_last = seq_last;
|
curbuf->b_u_seq_last = seq_last;
|
||||||
curbuf->b_u_seq_cur = seq_cur;
|
curbuf->b_u_seq_cur = seq_cur;
|
||||||
curbuf->b_u_seq_time = seq_time;
|
curbuf->b_u_seq_time = seq_time;
|
||||||
|
|
||||||
|
curbuf->b_u_synced = TRUE;
|
||||||
vim_free(uhp_table);
|
vim_free(uhp_table);
|
||||||
|
|
||||||
#ifdef U_DEBUG
|
#ifdef U_DEBUG
|
||||||
@@ -1566,7 +1559,7 @@ error:
|
|||||||
vim_free(line_ptr);
|
vim_free(line_ptr);
|
||||||
if (uhp_table != NULL)
|
if (uhp_table != NULL)
|
||||||
{
|
{
|
||||||
for (i = 0; i < num_head; i++)
|
for (i = 0; i < num_read_uhps; i++)
|
||||||
if (uhp_table[i] != NULL)
|
if (uhp_table[i] != NULL)
|
||||||
u_free_uhp(uhp_table[i]);
|
u_free_uhp(uhp_table[i]);
|
||||||
vim_free(uhp_table);
|
vim_free(uhp_table);
|
||||||
|
Reference in New Issue
Block a user