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:
Paul Fox 2005-11-28 18:07:53 +00:00
parent 5a16a89427
commit d957b9537e

View File

@ -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)