vi: reduce amount of memset'ing on each screen refresh

This commit is contained in:
Denis Vlasenko 2007-12-22 17:31:29 +00:00
parent e3cbfb91d2
commit 4baed3a080

View File

@ -2516,9 +2516,9 @@ static void place_cursor(int row, int col, int optimize)
} }
skip: ; skip: ;
} }
last_row = row;
#endif /* FEATURE_VI_OPTIMIZE_CURSOR */ #endif /* FEATURE_VI_OPTIMIZE_CURSOR */
write1(cm); write1(cm);
last_row = row;
} }
//----- Erase from cursor to end of line ----------------------- //----- Erase from cursor to end of line -----------------------
@ -2762,10 +2762,9 @@ static char* format_line(char *src, int li)
int ofs = offset; int ofs = offset;
char *dest = scr_out_buf; // [MAX_SCR_COLS + MAX_TABSTOP * 2] char *dest = scr_out_buf; // [MAX_SCR_COLS + MAX_TABSTOP * 2]
memset(dest, ' ', MAX_SCR_COLS + MAX_TABSTOP * 2);
c = '~'; // char in col 0 in non-existent lines is '~' c = '~'; // char in col 0 in non-existent lines is '~'
for (co = 0; co < columns + MAX_TABSTOP; co++) { co = 0;
while (co < columns + tabstop) {
// have we gone past the end? // have we gone past the end?
if (src < end) { if (src < end) {
c = *src++; c = *src++;
@ -2790,11 +2789,11 @@ static char* format_line(char *src, int li)
} }
} }
} }
dest[co] = c; dest[co++] = c;
// discard scrolled-off-to-the-left portion, // discard scrolled-off-to-the-left portion,
// in tabstop-sized pieces // in tabstop-sized pieces
if (ofs >= tabstop && co >= tabstop) { if (ofs >= tabstop && co >= tabstop) {
memmove(dest, dest + tabstop, co + 1); memmove(dest, dest + tabstop, co);
co -= tabstop; co -= tabstop;
ofs -= tabstop; ofs -= tabstop;
} }
@ -2803,9 +2802,14 @@ static char* format_line(char *src, int li)
} }
// check "short line, gigantic offset" case // check "short line, gigantic offset" case
if (co < ofs) if (co < ofs)
ofs = co + 1; ofs = co;
dest[ofs + MAX_SCR_COLS] = '\0'; // discard last scrolled off part
return &dest[ofs]; co -= ofs;
dest += ofs;
// fill the rest with spaces
if (co < columns)
memset(&dest[co], ' ', columns - co);
return dest;
} }
//----- Refresh the changed screen lines ----------------------- //----- Refresh the changed screen lines -----------------------