Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/vt/vt_buf.c
Show First 20 Lines • Show All 735 Lines • ▼ Show 20 Lines | vtbuf_get_marked_len(struct vt_buf *vb) | ||||
} else { | } else { | ||||
POS_COPY(s, vb->vb_mark_start); | POS_COPY(s, vb->vb_mark_start); | ||||
POS_COPY(e, vb->vb_mark_end); | POS_COPY(e, vb->vb_mark_end); | ||||
} | } | ||||
si = s.tp_row * vb->vb_scr_size.tp_col + s.tp_col; | si = s.tp_row * vb->vb_scr_size.tp_col + s.tp_col; | ||||
ei = e.tp_row * vb->vb_scr_size.tp_col + e.tp_col; | ei = e.tp_row * vb->vb_scr_size.tp_col + e.tp_col; | ||||
/* Number symbols and number of rows to inject \n */ | /* Number symbols and number of rows to inject \r */ | ||||
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)); | return (sz * sizeof(term_char_t)); | ||||
} | } | ||||
void | void | ||||
vtbuf_extract_marked(struct vt_buf *vb, term_char_t *buf, int sz) | 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; | term_pos_t s, e; | ||||
/* Swap according to window coordinates. */ | /* Swap according to window coordinates. */ | ||||
if (POS_INDEX(vtbuf_htw(vb, vb->vb_mark_start.tp_row), | if (POS_INDEX(vtbuf_htw(vb, vb->vb_mark_start.tp_row), | ||||
vb->vb_mark_start.tp_col) > | vb->vb_mark_start.tp_col) > | ||||
POS_INDEX(vtbuf_htw(vb, vb->vb_mark_end.tp_row), | POS_INDEX(vtbuf_htw(vb, vb->vb_mark_end.tp_row), | ||||
vb->vb_mark_end.tp_col)) { | vb->vb_mark_end.tp_col)) { | ||||
POS_COPY(e, vb->vb_mark_start); | POS_COPY(e, vb->vb_mark_start); | ||||
POS_COPY(s, vb->vb_mark_end); | POS_COPY(s, vb->vb_mark_end); | ||||
} else { | } else { | ||||
POS_COPY(s, vb->vb_mark_start); | POS_COPY(s, vb->vb_mark_start); | ||||
POS_COPY(e, vb->vb_mark_end); | POS_COPY(e, vb->vb_mark_end); | ||||
} | } | ||||
i = 0; | i = 0; | ||||
for (r = s.tp_row; r <= e.tp_row; r++) { | for (r = s.tp_row; r <= e.tp_row; r++) { | ||||
cs = (r == s.tp_row)?s.tp_col:0; | cs = (r == s.tp_row)?s.tp_col:0; | ||||
ce = (r == e.tp_row)?e.tp_col:vb->vb_scr_size.tp_col; | 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]; | buf[i++] = vb->vb_rows[r][c]; | ||||
} | |||||
/* Add new line for all rows, but not for last one. */ | /* For all rows, but the last one. */ | ||||
if (r != e.tp_row) { | if (r != e.tp_row) { | ||||
/* Trim trailing word separators, if any. */ | |||||
for (; i != j; i--) { | |||||
if (TCHAR_CHARACTER(buf[i - 1]) != ' ') | |||||
break; | |||||
} | |||||
/* Add newline character as expected by TTY. */ | |||||
buf[i++] = '\r'; | buf[i++] = '\r'; | ||||
buf[i++] = '\n'; | |||||
} | } | ||||
} | } | ||||
/* Zero rest of expected buffer size, if any. */ | |||||
while ((i * sizeof(buf[0])) < sz) | |||||
buf[i++] = '\0'; | |||||
MPASS((i * sizeof(buf[0])) == sz); | |||||
} | } | ||||
int | int | ||||
vtbuf_set_mark(struct vt_buf *vb, int type, int col, int row) | vtbuf_set_mark(struct vt_buf *vb, int type, int col, int row) | ||||
{ | { | ||||
term_char_t *r; | term_char_t *r; | ||||
int i; | int i; | ||||
▲ Show 20 Lines • Show All 101 Lines • Show Last 20 Lines |