aboutsummaryrefslogtreecommitdiffstats
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
parent197a3c41624b28800ed039202933f193bc97d59d (diff)
downloadrunes-e6ca55231efac74945c4e90a7d27d9923071cd4a.tar.gz
runes-e6ca55231efac74945c4e90a7d27d9923071cd4a.zip
function to get a stringified version of a screen region
-rw-r--r--src/screen.c42
-rw-r--r--src/screen.h3
2 files changed, 45 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;
diff --git a/src/screen.h b/src/screen.h
index f3e1e57..9554375 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -113,6 +113,9 @@ struct runes_screen {
void runes_screen_init(RunesTerm *t);
void runes_screen_set_window_size(RunesTerm *t);
void runes_screen_process_string(RunesTerm *t, char *buf, size_t len);
+void runes_screen_get_string(
+ RunesTerm *t, struct runes_loc *start, struct runes_loc *end,
+ char **strp, size_t *lenp);
void runes_screen_audible_bell(RunesTerm *t);
void runes_screen_visual_bell(RunesTerm *t);
void runes_screen_show_string_ascii(RunesTerm *t, char *buf, size_t len);