fix bug #474:
0000474: vi crashes often problem was that the buffer used for "." command ("last_modifying_cmd") wasn't being maintined correctly -- the recording code was walking back over the front of that buffer when a repeatable insert command included backspacing (e.g. "i\b\b\bfoo"). the fix is to simply record the backspaces along with the rest of the command. also, cleaned up start_new_cmd_q() slightly.
This commit is contained in:
parent
5a16a89427
commit
d957b9537e
17
editors/vi.c
17
editors/vi.c
@ -1615,16 +1615,6 @@ static Byte *char_insert(Byte * p, Byte c) // insert the char c at 'p'
|
|||||||
if ((p[-1] != '\n') && (dot>text)) {
|
if ((p[-1] != '\n') && (dot>text)) {
|
||||||
p--;
|
p--;
|
||||||
p = text_hole_delete(p, p); // shrink buffer 1 char
|
p = text_hole_delete(p, p); // shrink buffer 1 char
|
||||||
#ifdef CONFIG_FEATURE_VI_DOT_CMD
|
|
||||||
// also rmove char from last_modifying_cmd
|
|
||||||
if (last_modifying_cmd != 0 && strlen((char *) last_modifying_cmd) > 0) {
|
|
||||||
Byte *q;
|
|
||||||
|
|
||||||
q = last_modifying_cmd;
|
|
||||||
q[strlen((char *) q) - 1] = '\0'; // erase BS
|
|
||||||
q[strlen((char *) q) - 1] = '\0'; // erase prev char
|
|
||||||
}
|
|
||||||
#endif /* CONFIG_FEATURE_VI_DOT_CMD */
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// insert a char into text[]
|
// insert a char into text[]
|
||||||
@ -2009,11 +1999,10 @@ static void start_new_cmd_q(Byte c)
|
|||||||
memset(last_modifying_cmd, '\0', BUFSIZ); // clear new cmd queue
|
memset(last_modifying_cmd, '\0', BUFSIZ); // clear new cmd queue
|
||||||
// if there is a current cmd count put it in the buffer first
|
// if there is a current cmd count put it in the buffer first
|
||||||
if (cmdcnt > 0)
|
if (cmdcnt > 0)
|
||||||
sprintf((char *) last_modifying_cmd, "%d", cmdcnt);
|
sprintf((char *) last_modifying_cmd, "%d%c", cmdcnt, c);
|
||||||
// save char c onto queue
|
else // just save char c onto queue
|
||||||
last_modifying_cmd[strlen((char *) last_modifying_cmd)] = c;
|
last_modifying_cmd[0] = c;
|
||||||
adding2q = 1;
|
adding2q = 1;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void end_cmd_q(void)
|
static void end_cmd_q(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user