From e1e7aea55beae31fd0ab067f087401012236cd96 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 13 Sep 2014 15:19:46 -0400 Subject: add functions to allocate memory for the screen too --- examples/test1.c | 17 ++++++++--------- src/screen.c | 16 ++++++++++++++++ src/screen.h | 2 ++ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/examples/test1.c b/examples/test1.c index bad0023..5531fbd 100644 --- a/examples/test1.c +++ b/examples/test1.c @@ -6,14 +6,13 @@ int main(int argc, char *argv[]) { - VT100Screen vt; + VT100Screen *vt; char buf[4096]; size_t offset = 0; int i, j, skip; - memset(&vt, 0, sizeof(VT100Screen)); - vt100_screen_init(&vt); - vt100_screen_set_window_size(&vt); + vt = vt100_screen_new(); + vt100_screen_set_window_size(vt); for (;;) { size_t bytes, parsed; @@ -22,7 +21,7 @@ int main(int argc, char *argv[]) if (bytes < 1) break; - parsed = vt100_screen_process_string(&vt, buf, bytes + offset); + parsed = vt100_screen_process_string(vt, buf, bytes + offset); if (parsed < bytes + offset) { memcpy(buf, buf + parsed, bytes - parsed); offset = bytes - parsed; @@ -30,13 +29,13 @@ int main(int argc, char *argv[]) } skip = 0; - for (i = vt.grid->row_top; i < vt.grid->row_top + vt.grid->max.row; ++i) { - for (j = 0; j < vt.grid->max.col; ++j) { + for (i = vt->grid->row_top; i < vt->grid->row_top + vt->grid->max.row; ++i) { + for (j = 0; j < vt->grid->max.col; ++j) { if (skip) { skip = 0; continue; } - struct vt100_cell *cell = &vt.grid->rows[i].cells[j]; + struct vt100_cell *cell = &vt->grid->rows[i].cells[j]; printf("%*s", cell->len, cell->contents); if (cell->is_wide) skip = 1; @@ -44,7 +43,7 @@ int main(int argc, char *argv[]) printf("\n"); } - vt100_screen_cleanup(&vt); + vt100_screen_delete(vt); return 0; } diff --git a/src/screen.c b/src/screen.c index ea16498..ab65adf 100644 --- a/src/screen.c +++ b/src/screen.c @@ -17,6 +17,16 @@ static int vt100_screen_loc_is_between( struct vt100_loc start, struct vt100_loc end); static int vt100_screen_row_max_col(VT100Screen *vt, int row); +VT100Screen *vt100_screen_new() +{ + VT100Screen *vt; + + vt = calloc(1, sizeof(VT100Screen)); + vt100_screen_init(vt); + + return vt; +} + void vt100_screen_init(VT100Screen *vt) { vt->grid = calloc(1, sizeof(struct vt100_grid)); @@ -773,6 +783,12 @@ void vt100_screen_cleanup(VT100Screen *vt) vt100_parser_yylex_destroy(vt->scanner); } +void vt100_screen_delete(VT100Screen *vt) +{ + vt100_screen_cleanup(vt); + free(vt); +} + static void vt100_screen_ensure_capacity(VT100Screen *vt, int size) { int old_capacity = vt->grid->row_capacity; diff --git a/src/screen.h b/src/screen.h index 2ac4b9e..822b28c 100644 --- a/src/screen.h +++ b/src/screen.h @@ -111,6 +111,7 @@ struct vt100_screen { unsigned char dirty: 1; }; +VT100Screen *vt100_screen_new(); void vt100_screen_init(VT100Screen *vt); void vt100_screen_set_window_size(VT100Screen *vt); int vt100_screen_process_string(VT100Screen *vt, char *buf, size_t len); @@ -171,5 +172,6 @@ void vt100_screen_reset_bracketed_paste(VT100Screen *vt); void vt100_screen_set_window_title(VT100Screen *vt, char *buf, size_t len); void vt100_screen_set_icon_name(VT100Screen *vt, char *buf, size_t len); void vt100_screen_cleanup(VT100Screen *vt); +void vt100_screen_delete(VT100Screen *vt); #endif -- cgit v1.2.3-54-g00ecf