summaryrefslogtreecommitdiffstats
path: root/src/screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen.c')
-rw-r--r--src/screen.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/screen.c b/src/screen.c
index 5ba16e7..8e8f783 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -6,6 +6,11 @@
#include "vt100.h"
#include "parser.h"
+struct vt100_parser_state {
+ yyscan_t scanner;
+ YY_BUFFER_STATE state;
+};
+
static void vt100_screen_get_string(
VT100Screen *vt, struct vt100_loc *start, struct vt100_loc *end,
char **strp, size_t *lenp, int formatted);
@@ -33,7 +38,8 @@ VT100Screen *vt100_screen_new(int rows, int cols)
void vt100_screen_init(VT100Screen *vt)
{
vt->grid = calloc(1, sizeof(struct vt100_grid));
- vt100_parser_yylex_init_extra(vt, &vt->scanner);
+ vt->parser_state = calloc(1, sizeof(struct vt100_parser_state));
+ vt100_parser_yylex_init_extra(vt, &vt->parser_state->scanner);
}
void vt100_screen_set_window_size(VT100Screen *vt, int rows, int cols)
@@ -105,11 +111,12 @@ void vt100_screen_set_scrollback_length(VT100Screen *vt, int rows)
int vt100_screen_process_string(VT100Screen *vt, char *buf, size_t len)
{
+ struct vt100_parser_state *state = vt->parser_state;
int remaining;
- vt->state = vt100_parser_yy_scan_bytes(buf, len, vt->scanner);
- remaining = vt100_parser_yylex(vt->scanner);
- vt100_parser_yy_delete_buffer(vt->state, vt->scanner);
+ state->state = vt100_parser_yy_scan_bytes(buf, len, state->scanner);
+ remaining = vt100_parser_yylex(state->scanner);
+ vt100_parser_yy_delete_buffer(state->state, state->scanner);
return len - remaining;
}
@@ -745,7 +752,8 @@ void vt100_screen_cleanup(VT100Screen *vt)
free(vt->title);
free(vt->icon_name);
- vt100_parser_yylex_destroy(vt->scanner);
+ vt100_parser_yylex_destroy(vt->parser_state->scanner);
+ free(vt->parser_state);
}
void vt100_screen_delete(VT100Screen *vt)