diff --git a/sys/dev/vt/vt_buf.c b/sys/dev/vt/vt_buf.c --- a/sys/dev/vt/vt_buf.c +++ b/sys/dev/vt/vt_buf.c @@ -41,6 +41,7 @@ #include #include #include +#include #include @@ -742,7 +743,7 @@ ei = e.tp_row * vb->vb_scr_size.tp_col + e.tp_col; /* Number symbols and number of rows to inject \n */ - sz = ei - si + ((e.tp_row - s.tp_row) * 2); + sz = ei - si + (e.tp_row - s.tp_row); return (sz * sizeof(term_char_t)); } @@ -750,7 +751,7 @@ void vtbuf_extract_marked(struct vt_buf *vb, term_char_t *buf, int sz) { - int i, r, c, cs, ce; + int i, j, r, c, cs, ce; term_pos_t s, e; /* Swap according to window coordinates. */ @@ -769,15 +770,25 @@ for (r = s.tp_row; r <= e.tp_row; r++) { cs = (r == s.tp_row)?s.tp_col:0; ce = (r == e.tp_row)?e.tp_col:vb->vb_scr_size.tp_col; - for (c = cs; c < ce; c++) { + + /* Copy characters from terminal window. */ + j = i; + for (c = cs; c < ce; c++) buf[i++] = vb->vb_rows[r][c]; + + /* Trim trailing whitespace from each line. */ + for (; i != j; i--) { + if (isspace((unsigned char)buf[i - 1])) + buf[i - 1] = '\0'; + else + break; } + /* Add new line for all rows, but not for last one. */ - if (r != e.tp_row) { - buf[i++] = '\r'; + if (r != e.tp_row) buf[i++] = '\n'; - } } + MPASS(i <= sz); } int