aboutsummaryrefslogtreecommitdiffstats
path: root/src/screen.c
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-05-17 23:25:29 -0400
committerJesse Luehrs <doy@tozt.net>2014-07-04 22:39:07 -0400
commite6ca55231efac74945c4e90a7d27d9923071cd4a (patch)
tree2a17c7f5546f479a746c70bb63cdfc82dee07cbc /src/screen.c
parent197a3c41624b28800ed039202933f193bc97d59d (diff)
downloadrunes-e6ca55231efac74945c4e90a7d27d9923071cd4a.tar.gz
runes-e6ca55231efac74945c4e90a7d27d9923071cd4a.zip
function to get a stringified version of a screen region
Diffstat (limited to 'src/screen.c')
-rw-r--r--src/screen.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/screen.c b/src/screen.c
index b7e0a49..6179970 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -95,6 +95,48 @@ void runes_screen_process_string(RunesTerm *t, char *buf, size_t len)
runes_parser_yy_delete_buffer(scr->state, scr->scanner);
}
+void runes_screen_get_string(
+ RunesTerm *t, struct runes_loc *start, struct runes_loc *end,
+ char **strp, size_t *lenp)
+{
+ int row, col;
+ size_t capacity = 8;
+
+ *lenp = 0;
+
+ if (end->row < start->row || (end->row == start->row && end->col <= start->col)) {
+ return;
+ }
+
+ *strp = malloc(capacity);
+
+ for (row = start->row; row <= end->row; ++row) {
+ int start_col = row == start->row ? start->col : 0;
+ int end_col = row == end->row ? end->col : t->scr.grid->max.col;
+
+ for (col = start_col; col < end_col; ++col) {
+ struct runes_cell *cell;
+
+ cell = runes_screen_cell_at(t, row, col);
+ if (*lenp + cell->len > capacity) {
+ capacity *= 1.5;
+ *strp = realloc(*strp, capacity);
+ }
+ memcpy(*strp + *lenp, cell->contents, cell->len);
+ *lenp += cell->len;
+ }
+
+ if (row != end->row && !runes_screen_row_at(t, row)->wrapped) {
+ if (*lenp + 1 > capacity) {
+ capacity *= 1.5;
+ *strp = realloc(*strp, capacity);
+ }
+ memcpy(*strp + *lenp, "\n", 1);
+ *lenp += 1;
+ }
+ }
+}
+
void runes_screen_audible_bell(RunesTerm *t)
{
RunesScreen *scr = &t->scr;