|
@@ -40,9 +40,9 @@ |
|
|
|
|
|
#define MINIMAL_SIZE 20 /* minimal size for b_str */ |
|
|
|
|
|
static buffheader_T redobuff = {NULL, NULL, 0, 0}; |
|
|
static buffheader_T old_redobuff = {NULL, NULL, 0, 0}; |
|
|
static buffheader_T recordbuff = {NULL, NULL, 0, 0}; |
|
|
static buffheader_T redobuff = {{NULL, {NUL}}, NULL, 0, 0}; |
|
|
static buffheader_T old_redobuff = {{NULL, {NUL}}, NULL, 0, 0}; |
|
|
static buffheader_T recordbuff = {{NULL, {NUL}}, NULL, 0, 0}; |
|
|
|
|
|
static int typeahead_char = 0; /* typeahead char that's not flushed */ |
|
|
|
|
@@ -138,13 +138,12 @@ free_buff(buffheader_T *buf) |
|
|
{ |
|
|
buffblock_T *p, *np; |
|
|
|
|
|
for (p = buf->bh_first; p != NULL; p = np) |
|
|
for (p = buf->bh_first.b_next; p != NULL; p = np) |
|
|
{ |
|
|
np = p->b_next; |
|
|
vim_free(p); |
|
|
} |
|
|
buf->bh_first = NULL; |
|
|
buf->bh_curr = NULL; |
|
|
buf->bh_first.b_next = NULL; |
|
|
} |
|
|
|
|
|
/* |
|
@@ -160,16 +159,16 @@ get_buffcont( |
|
|
char_u *p = NULL; |
|
|
char_u *p2; |
|
|
char_u *str; |
|
|
buffblock_T *bp; |
|
|
buffblock_T *bp; |
|
|
|
|
|
/* compute the total length of the string */ |
|
|
for (bp = buffer->bh_first; bp != NULL; bp = bp->b_next) |
|
|
for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next) |
|
|
count += (long_u)STRLEN(bp->b_str); |
|
|
|
|
|
if ((count || dozero) && (p = lalloc(count + 1, TRUE)) != NULL) |
|
|
{ |
|
|
p2 = p; |
|
|
for (bp = buffer->bh_first; bp != NULL; bp = bp->b_next) |
|
|
for (bp = buffer->bh_first.b_next; bp != NULL; bp = bp->b_next) |
|
|
for (str = bp->b_str; *str; ) |
|
|
*p2++ = *str++; |
|
|
*p2 = NUL; |
|
@@ -233,27 +232,27 @@ add_buff( |
|
|
long slen) /* length of "s" or -1 */ |
|
|
{ |
|
|
buffblock_T *p; |
|
|
long_u len; |
|
|
long_u len; |
|
|
|
|
|
if (slen < 0) |
|
|
slen = (long)STRLEN(s); |
|
|
if (slen == 0) /* don't add empty strings */ |
|
|
return; |
|
|
|
|
|
if (buf->bh_first == NULL) /* first add to list */ |
|
|
if (buf->bh_first.b_next == NULL) /* first add to list */ |
|
|
{ |
|
|
buf->bh_space = 0; |
|
|
buf->bh_curr = NULL; |
|
|
buf->bh_curr = &(buf->bh_first); |
|
|
} |
|
|
else if (buf->bh_curr == NULL) /* buffer has already been read */ |
|
|
{ |
|
|
IEMSG(_("E222: Add to read buffer")); |
|
|
return; |
|
|
} |
|
|
else if (buf->bh_index != 0) |
|
|
mch_memmove(buf->bh_first->b_str, |
|
|
buf->bh_first->b_str + buf->bh_index, |
|
|
STRLEN(buf->bh_first->b_str + buf->bh_index) + 1); |
|
|
mch_memmove(buf->bh_first.b_next->b_str, |
|
|
buf->bh_first.b_next->b_str + buf->bh_index, |
|
|
STRLEN(buf->bh_first.b_next->b_str + buf->bh_index) + 1); |
|
|
buf->bh_index = 0; |
|
|
|
|
|
if (buf->bh_space >= (int)slen) |
|
@@ -268,25 +267,16 @@ add_buff( |
|
|
len = MINIMAL_SIZE; |
|
|
else |
|
|
len = slen; |
|
|
p = (buffblock_T *)lalloc((long_u)(sizeof(buffblock_T) + len + 1), |
|
|
TRUE); |
|
|
p = (buffblock_T *)lalloc((long_u)(sizeof(buffblock_T) + len), |
|
|
TRUE); |
|
|
if (p == NULL) |
|
|
return; /* no space, just forget it */ |
|
|
buf->bh_space = (int)(len - slen); |
|
|
vim_strncpy(p->b_str, s, (size_t)slen); |
|
|
|
|
|
if (buf->bh_curr == NULL) |
|
|
{ |
|
|
p->b_next = NULL; |
|
|
buf->bh_first = p; |
|
|
buf->bh_curr = p; |
|
|
} |
|
|
else |
|
|
{ |
|
|
p->b_next = buf->bh_curr->b_next; |
|
|
buf->bh_curr->b_next = p; |
|
|
buf->bh_curr = p; |
|
|
} |
|
|
p->b_next = buf->bh_curr->b_next; |
|
|
buf->bh_curr->b_next = p; |
|
|
buf->bh_curr = p; |
|
|
} |
|
|
return; |
|
|
} |
|
@@ -358,10 +348,10 @@ add_char_buff(buffheader_T *buf, int c) |
|
|
} |
|
|
|
|
|
/* First read ahead buffer. Used for translated commands. */ |
|
|
static buffheader_T readbuf1 = {NULL, NULL, 0, 0}; |
|
|
static buffheader_T readbuf1 = {{NULL, {NUL}}, NULL, 0, 0}; |
|
|
|
|
|
/* Second read ahead buffer. Used for redo. */ |
|
|
static buffheader_T readbuf2 = {NULL, NULL, 0, 0}; |
|
|
static buffheader_T readbuf2 = {{NULL, {NUL}}, NULL, 0, 0}; |
|
|
|
|
|
/* |
|
|
* Get one byte from the read buffers. Use readbuf1 one first, use readbuf2 |
|
@@ -386,17 +376,17 @@ read_readbuf(buffheader_T *buf, int advance) |
|
|
char_u c; |
|
|
buffblock_T *curr; |
|
|
|
|
|
if (buf->bh_first == NULL) /* buffer is empty */ |
|
|
if (buf->bh_first.b_next == NULL) /* buffer is empty */ |
|
|
return NUL; |
|
|
|
|
|
curr = buf->bh_first; |
|
|
curr = buf->bh_first.b_next; |
|
|
c = curr->b_str[buf->bh_index]; |
|
|
|
|
|
if (advance) |
|
|
{ |
|
|
if (curr->b_str[++buf->bh_index] == NUL) |
|
|
{ |
|
|
buf->bh_first = curr->b_next; |
|
|
buf->bh_first.b_next = curr->b_next; |
|
|
vim_free(curr); |
|
|
buf->bh_index = 0; |
|
|
} |
|
@@ -410,14 +400,14 @@ read_readbuf(buffheader_T *buf, int advance) |
|
|
static void |
|
|
start_stuff(void) |
|
|
{ |
|
|
if (readbuf1.bh_first != NULL) |
|
|
if (readbuf1.bh_first.b_next != NULL) |
|
|
{ |
|
|
readbuf1.bh_curr = readbuf1.bh_first; |
|
|
readbuf1.bh_curr = &(readbuf1.bh_first); |
|
|
readbuf1.bh_space = 0; |
|
|
} |
|
|
if (readbuf2.bh_first != NULL) |
|
|
if (readbuf2.bh_first.b_next != NULL) |
|
|
{ |
|
|
readbuf2.bh_curr = readbuf2.bh_first; |
|
|
readbuf2.bh_curr = &(readbuf2.bh_first); |
|
|
readbuf2.bh_space = 0; |
|
|
} |
|
|
} |
|
@@ -428,8 +418,8 @@ start_stuff(void) |
|
|
int |
|
|
stuff_empty(void) |
|
|
{ |
|
|
return (readbuf1.bh_first == NULL |
|
|
&& readbuf2.bh_first == NULL); |
|
|
return (readbuf1.bh_first.b_next == NULL |
|
|
&& readbuf2.bh_first.b_next == NULL); |
|
|
} |
|
|
|
|
|
/* |
|
@@ -439,7 +429,7 @@ stuff_empty(void) |
|
|
int |
|
|
readbuf1_empty(void) |
|
|
{ |
|
|
return (readbuf1.bh_first == NULL); |
|
|
return (readbuf1.bh_first.b_next == NULL); |
|
|
} |
|
|
|
|
|
/* |
|
@@ -504,7 +494,7 @@ ResetRedobuff(void) |
|
|
{ |
|
|
free_buff(&old_redobuff); |
|
|
old_redobuff = redobuff; |
|
|
redobuff.bh_first = NULL; |
|
|
redobuff.bh_first.b_next = NULL; |
|
|
} |
|
|
} |
|
|
|
|
@@ -519,7 +509,7 @@ CancelRedo(void) |
|
|
{ |
|
|
free_buff(&redobuff); |
|
|
redobuff = old_redobuff; |
|
|
old_redobuff.bh_first = NULL; |
|
|
old_redobuff.bh_first.b_next = NULL; |
|
|
start_stuff(); |
|
|
while (read_readbuffers(TRUE) != NUL) |
|
|
; |
|
@@ -536,9 +526,9 @@ saveRedobuff(save_redo_T *save_redo) |
|
|
char_u *s; |
|
|
|
|
|
save_redo->sr_redobuff = redobuff; |
|
|
redobuff.bh_first = NULL; |
|
|
redobuff.bh_first.b_next = NULL; |
|
|
save_redo->sr_old_redobuff = old_redobuff; |
|
|
old_redobuff.bh_first = NULL; |
|
|
old_redobuff.bh_first.b_next = NULL; |
|
|
|
|
|
/* Make a copy, so that ":normal ." in a function works. */ |
|
|
s = get_buffcont(&save_redo->sr_redobuff, FALSE); |
|
@@ -757,9 +747,9 @@ read_redo(int init, int old_redo) |
|
|
if (init) |
|
|
{ |
|
|
if (old_redo) |
|
|
bp = old_redobuff.bh_first; |
|
|
bp = old_redobuff.bh_first.b_next; |
|
|
else |
|
|
bp = redobuff.bh_first; |
|
|
bp = redobuff.bh_first.b_next; |
|
|
if (bp == NULL) |
|
|
return FAIL; |
|
|
p = bp->b_str; |
|
@@ -1382,9 +1372,9 @@ save_typeahead(tasave_T *tp) |
|
|
old_char = -1; |
|
|
|
|
|
tp->save_readbuf1 = readbuf1; |
|
|
readbuf1.bh_first = NULL; |
|
|
readbuf1.bh_first.b_next = NULL; |
|
|
tp->save_readbuf2 = readbuf2; |
|
|
readbuf2.bh_first = NULL; |
|
|
readbuf2.bh_first.b_next = NULL; |
|
|
# ifdef USE_INPUT_BUF |
|
|
tp->save_inputbuf = get_input_buf(); |
|
|
# endif |
|
|