aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2015-08-20 01:37:52 -0400
committerJesse Luehrs <doy@tozt.net>2015-08-20 01:37:52 -0400
commit7f3b17bd263ac512e59354a33c43fd3b225ecc6d (patch)
tree6233b741b2c39989b8470da2d3618321fb7a9982
parent9670e562fc024b4048927d691210aaa542dd3e67 (diff)
downloadrunes-7f3b17bd263ac512e59354a33c43fd3b225ecc6d.tar.gz
runes-7f3b17bd263ac512e59354a33c43fd3b225ecc6d.zip
use the libvt100 library
-rw-r--r--.gitmodules3
-rw-r--r--Makefile12
m---------libvt1000
-rw-r--r--src/display.c87
-rw-r--r--src/display.h8
-rw-r--r--src/parser.c2925
-rw-r--r--src/parser.h338
-rw-r--r--src/parser.l794
-rw-r--r--src/pty-unix.c4
-rw-r--r--src/runes.h4
-rw-r--r--src/screen.c1062
-rw-r--r--src/screen.h175
-rw-r--r--src/term.c5
-rw-r--r--src/term.h2
-rw-r--r--src/window-xlib.c34
15 files changed, 116 insertions, 5337 deletions
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..0077c76
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "libvt100"]
+ path = libvt100
+ url = https://github.com/doy/libvt100
diff --git a/Makefile b/Makefile
index 110ca62..bbccdad 100644
--- a/Makefile
+++ b/Makefile
@@ -4,8 +4,6 @@ SRC = src/
OBJ = $(BUILD)runes.o \
$(BUILD)display.o \
$(BUILD)term.o \
- $(BUILD)parser.o \
- $(BUILD)screen.o \
$(BUILD)config.o \
$(BUILD)window-xlib.o \
$(BUILD)pty-unix.o \
@@ -14,16 +12,19 @@ LIBS = cairo cairo-xlib libuv pangocairo
CFLAGS ?= -g -Wall -Wextra -Werror
LDFLAGS ?= -g -Wall -Wextra -Werror
-ALLCFLAGS = $(shell pkg-config --cflags $(LIBS)) $(CFLAGS)
-ALLLDFLAGS = $(shell pkg-config --libs $(LIBS)) $(LDFLAGS)
+ALLCFLAGS = $(shell pkg-config --cflags $(LIBS)) -Ilibvt100/src $(CFLAGS)
+ALLLDFLAGS = $(shell pkg-config --libs $(LIBS)) -Llibvt100 -lvt100 $(LDFLAGS)
MAKEDEPEND = $(CC) $(ALLCFLAGS) -M -MP -MT '$@ $(@:$(BUILD)%.o=$(BUILD).%.d)'
build: $(OUT)
-$(OUT): $(OBJ)
+$(OUT): $(OBJ) libvt100/libvt100.so
$(CC) $(ALLLDFLAGS) -o $@ $^
+libvt100/libvt100.so:
+ cd libvt100 && make
+
$(BUILD)%.o: $(SRC)%.c
@mkdir -p $(BUILD)
@$(MAKEDEPEND) -o $(<:$(SRC)%.c=$(BUILD).%.d) $<
@@ -38,6 +39,7 @@ $(SRC)%.h: $(SRC)%.l
$(LEX) --header-file=$(<:.l=.h) -o /dev/null $<
clean:
+ cd libvt100 && make clean
rm -f $(OUT) $(OBJ) $(OBJ:$(BUILD)%.o=$(BUILD).%.d)
@rmdir -p $(BUILD) > /dev/null 2>&1
diff --git a/libvt100 b/libvt100
new file mode 160000
+Subproject c59da47832a34a016da82782ff39dc83b0c3890
diff --git a/src/display.c b/src/display.c
index 8c9d909..167605d 100644
--- a/src/display.c
+++ b/src/display.c
@@ -10,7 +10,7 @@ static void runes_display_paint_rectangle(
int row, int col, int width, int height);
static void runes_display_draw_glyph(
RunesTerm *t, cairo_t *cr, cairo_pattern_t *pattern,
- struct runes_cell_attrs attrs, char *buf, size_t len, int row, int col);
+ struct vt100_cell_attrs attrs, char *buf, size_t len, int row, int col);
void runes_display_init(RunesTerm *t)
{
@@ -80,7 +80,8 @@ void runes_display_set_window_size(RunesTerm *t)
cairo_destroy(old_cr);
}
- runes_screen_set_window_size(t);
+ vt100_screen_set_window_size(&t->scr,
+ height / t->display.fonty, width / t->display.fontx);
runes_pty_backend_set_window_size(t);
}
@@ -128,7 +129,7 @@ void runes_display_draw_cursor(RunesTerm *t, cairo_t *cr)
cairo_stroke(cr);
}
else {
- struct runes_cell *cell = &t->scr.grid->rows[t->scr.grid->row_top + row].cells[col];
+ struct vt100_cell *cell = &t->scr.grid->rows[t->scr.grid->row_top + row].cells[col];
cairo_rectangle(
cr,
@@ -145,6 +146,66 @@ void runes_display_draw_cursor(RunesTerm *t, cairo_t *cr)
}
}
+int runes_display_loc_is_selected(RunesTerm *t, struct vt100_loc loc)
+{
+ RunesDisplay *display = &t->display;
+ struct vt100_loc start = display->selection_start;
+ struct vt100_loc end = display->selection_end;
+
+ if (!display->has_selection) {
+ return 0;
+ }
+
+ if (loc.row == start.row) {
+ int start_max_col;
+
+ start_max_col = vt100_screen_row_max_col(&t->scr, start.row);
+ if (start.col > start_max_col) {
+ start.col = t->scr.grid->max.col;
+ }
+ }
+
+ if (loc.row == end.row) {
+ int end_max_col;
+
+ end_max_col = vt100_screen_row_max_col(&t->scr, end.row);
+ if (end.col > end_max_col) {
+ end.col = t->scr.grid->max.col;
+ }
+ }
+
+ return runes_display_loc_is_between(t, loc, start, end);
+}
+
+int runes_display_loc_is_between(
+ RunesTerm *t, struct vt100_loc loc,
+ struct vt100_loc start, struct vt100_loc end)
+{
+ UNUSED(t);
+
+ if (end.row < start.row || (end.row == start.row && end.col < start.col)) {
+ struct vt100_loc tmp;
+
+ tmp = start;
+ start = end;
+ end = tmp;
+ }
+
+ if (loc.row < start.row || loc.row > end.row) {
+ return 0;
+ }
+
+ if (loc.row == start.row && loc.col < start.col) {
+ return 0;
+ }
+
+ if (loc.row == end.row && loc.col >= end.col) {
+ return 0;
+ }
+
+ return 1;
+}
+
void runes_display_cleanup(RunesTerm *t)
{
RunesDisplay *display = &t->display;
@@ -190,23 +251,23 @@ static void runes_display_recalculate_font_metrics(RunesTerm *t)
static int runes_display_draw_cell(RunesTerm *t, int row, int col)
{
RunesDisplay *display = &t->display;
- struct runes_loc loc = {
+ struct vt100_loc loc = {
row + t->scr.grid->row_top - display->row_visible_offset, col };
- struct runes_cell *cell = &t->scr.grid->rows[loc.row].cells[loc.col];
+ struct vt100_cell *cell = &t->scr.grid->rows[loc.row].cells[loc.col];
cairo_pattern_t *bg = NULL, *fg = NULL;
int bg_is_custom = 0, fg_is_custom = 0;
int selected;
- selected = runes_screen_loc_is_selected(t, loc);
+ selected = runes_display_loc_is_selected(t, loc);
switch (cell->attrs.bgcolor.type) {
- case RUNES_COLOR_DEFAULT:
+ case VT100_COLOR_DEFAULT:
bg = t->config.bgdefault;
break;
- case RUNES_COLOR_IDX:
+ case VT100_COLOR_IDX:
bg = t->config.colors[cell->attrs.bgcolor.idx];
break;
- case RUNES_COLOR_RGB:
+ case VT100_COLOR_RGB:
bg = cairo_pattern_create_rgb(
cell->attrs.bgcolor.r / 255.0,
cell->attrs.bgcolor.g / 255.0,
@@ -216,10 +277,10 @@ static int runes_display_draw_cell(RunesTerm *t, int row, int col)
}
switch (cell->attrs.fgcolor.type) {
- case RUNES_COLOR_DEFAULT:
+ case VT100_COLOR_DEFAULT:
fg = t->config.fgdefault;
break;
- case RUNES_COLOR_IDX: {
+ case VT100_COLOR_IDX: {
unsigned char idx = cell->attrs.fgcolor.idx;
if (t->config.bold_is_bright && cell->attrs.bold && idx < 8) {
@@ -228,7 +289,7 @@ static int runes_display_draw_cell(RunesTerm *t, int row, int col)
fg = t->config.colors[idx];
break;
}
- case RUNES_COLOR_RGB:
+ case VT100_COLOR_RGB:
fg = cairo_pattern_create_rgb(
cell->attrs.fgcolor.r / 255.0,
cell->attrs.fgcolor.g / 255.0,
@@ -286,7 +347,7 @@ static void runes_display_paint_rectangle(
static void runes_display_draw_glyph(
RunesTerm *t, cairo_t *cr, cairo_pattern_t *pattern,
- struct runes_cell_attrs attrs, char *buf, size_t len, int row, int col)
+ struct vt100_cell_attrs attrs, char *buf, size_t len, int row, int col)
{
RunesDisplay *display = &t->display;
PangoAttrList *pango_attrs;
diff --git a/src/display.h b/src/display.h
index 1a63af0..1491cb9 100644
--- a/src/display.h
+++ b/src/display.h
@@ -12,13 +12,21 @@ struct runes_display {
int fontx;
int fonty;
+ struct vt100_loc selection_start;
+ struct vt100_loc selection_end;
+
char unfocused: 1;
+ char has_selection: 1;
};
void runes_display_init(RunesTerm *t);
void runes_display_set_window_size(RunesTerm *t);
void runes_display_draw_screen(RunesTerm *t);
void runes_display_draw_cursor(RunesTerm *t, cairo_t *cr);
+int runes_display_loc_is_selected(RunesTerm *t, struct vt100_loc loc);
+int runes_display_loc_is_between(
+ RunesTerm *t, struct vt100_loc loc,
+ struct vt100_loc start, struct vt100_loc end);
void runes_display_cleanup(RunesTerm *t);
#endif
diff --git a/src/parser.c b/src/parser.c
deleted file mode 100644
index 1b1cfc8..0000000
--- a/src/parser.c
+++ /dev/null
@@ -1,2925 +0,0 @@
-#line 2 "src/parser.c"
-
-#line 4 "src/parser.c"
-
-#define YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 39
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* First, we deal with platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-
-/* end standard C headers. */
-
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-
-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
- */
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS 1
-#endif
-
-#include <inttypes.h>
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX (4294967295U)
-#endif
-
-#endif /* ! C99 */
-
-#endif /* ! FLEXINT_H */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif /* defined (__STDC__) */
-#endif /* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* Returned upon end-of-file. */
-#define YY_NULL 0
-
-/* Promotes a possibly negative, possibly signed char to an unsigned
- * integer for use as an array index. If the signed char is negative,
- * we want to instead treat it as an 8-bit unsigned char, hence the
- * double cast.
- */
-#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
-
-/* An opaque pointer. */
-#ifndef YY_TYPEDEF_YY_SCANNER_T
-#define YY_TYPEDEF_YY_SCANNER_T
-typedef void* yyscan_t;
-#endif
-
-/* For convenience, these vars (plus the bison vars far below)
- are macros in the reentrant scanner. */
-#define yyin yyg->yyin_r
-#define yyout yyg->yyout_r
-#define yyextra yyg->yyextra_r
-#define yyleng yyg->yyleng_r
-#define yytext yyg->yytext_r
-#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
-#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
-#define yy_flex_debug yyg->yy_flex_debug_r
-
-/* Enter a start condition. This macro really ought to take a parameter,
- * but we do it the disgusting crufty way forced on us by the ()-less
- * definition of BEGIN.
- */
-#define BEGIN yyg->yy_start = 1 + 2 *
-
-/* Translate the current start state into a value that can be later handed
- * to BEGIN to return to the state. The YYSTATE alias is for lex
- * compatibility.
- */
-#define YY_START ((yyg->yy_start - 1) / 2)
-#define YYSTATE YY_START
-
-/* Action number for EOF rule of a given start state. */
-#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
-
-/* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE runes_parser_yyrestart(yyin ,yyscanner )
-
-#define YY_END_OF_BUFFER_CHAR 0
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#define YY_BUF_SIZE 16384
-#endif
-
-/* The state buf must be large enough to hold one state per character in the main buffer.
- */
-#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-#define EOB_ACT_CONTINUE_SCAN 0
-#define EOB_ACT_END_OF_FILE 1
-#define EOB_ACT_LAST_MATCH 2
-
- #define YY_LESS_LINENO(n)
- #define YY_LINENO_REWIND_TO(ptr)
-
-/* Return all but the first "n" matched characters back to the input stream. */
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
- YY_LESS_LINENO(yyless_macro_arg);\
- *yy_cp = yyg->yy_hold_char; \
- YY_RESTORE_YY_MORE_OFFSET \
- yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
- YY_DO_BEFORE_ACTION; /* set up yytext again */ \
- } \
- while ( 0 )
-
-#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
- {
- FILE *yy_input_file;
-
- char *yy_ch_buf; /* input buffer */
- char *yy_buf_pos; /* current position in input buffer */
-
- /* Size of input buffer in bytes, not including room for EOB
- * characters.
- */
- yy_size_t yy_buf_size;
-
- /* Number of characters read into yy_ch_buf, not including EOB
- * characters.
- */
- yy_size_t yy_n_chars;
-
- /* Whether we "own" the buffer - i.e., we know we created it,
- * and can realloc() it to grow it, and should free() it to
- * delete it.
- */
- int yy_is_our_buffer;
-
- /* Whether this is an "interactive" input source; if so, and
- * if we're using stdio for input, then we want to use getc()
- * instead of fread(), to make sure we stop fetching input after
- * each newline.
- */
- int yy_is_interactive;
-
- /* Whether we're considered to be at the beginning of a line.
- * If so, '^' rules will be active on the next match, otherwise
- * not.
- */
- int yy_at_bol;
-
- int yy_bs_lineno; /**< The line count. */
- int yy_bs_column; /**< The column count. */
-
- /* Whether to try to fill the input buffer when we reach the
- * end of it.
- */
- int yy_fill_buffer;
-
- int yy_buffer_status;
-
-#define YY_BUFFER_NEW 0
-#define YY_BUFFER_NORMAL 1
- /* When an EOF's been seen but there's still some text to process
- * then we mark the buffer as YY_EOF_PENDING, to indicate that we
- * shouldn't try reading from the input source any more. We might
- * still have a bunch of tokens to match, though, because of
- * possible backing-up.
- *
- * When we actually see the EOF, we change the status to "new"
- * (via runes_parser_yyrestart()), so that the user can continue scanning by
- * just pointing yyin at a new input file.
- */
-#define YY_BUFFER_EOF_PENDING 2
-
- };
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-/* We provide macros for accessing buffer states in case in the
- * future we want to put the buffer states in a more general
- * "scanner state".
- *
- * Returns the top of the stack, or NULL.
- */
-#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
- ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
- : NULL)
-
-/* Same as previous macro, but useful when we know that the buffer stack is not
- * NULL or when we need an lvalue. For internal use only.
- */
-#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]
-
-void runes_parser_yyrestart (FILE *input_file ,yyscan_t yyscanner );
-void runes_parser_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
-YY_BUFFER_STATE runes_parser_yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner );
-void runes_parser_yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
-void runes_parser_yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
-void runes_parser_yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
-void runes_parser_yypop_buffer_state (yyscan_t yyscanner );
-
-static void runes_parser_yyensure_buffer_stack (yyscan_t yyscanner );
-static void runes_parser_yy_load_buffer_state (yyscan_t yyscanner );
-static void runes_parser_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );
-
-#define YY_FLUSH_BUFFER runes_parser_yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)
-
-YY_BUFFER_STATE runes_parser_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
-YY_BUFFER_STATE runes_parser_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
-YY_BUFFER_STATE runes_parser_yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );
-
-void *runes_parser_yyalloc (yy_size_t ,yyscan_t yyscanner );
-void *runes_parser_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );
-void runes_parser_yyfree (void * ,yyscan_t yyscanner );
-
-#define yy_new_buffer runes_parser_yy_create_buffer
-
-#define yy_set_interactive(is_interactive) \
- { \
- if ( ! YY_CURRENT_BUFFER ){ \
- runes_parser_yyensure_buffer_stack (yyscanner); \
- YY_CURRENT_BUFFER_LVALUE = \
- runes_parser_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
- } \
- YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
- }
-
-#define yy_set_bol(at_bol) \
- { \
- if ( ! YY_CURRENT_BUFFER ){\
- runes_parser_yyensure_buffer_stack (yyscanner); \
- YY_CURRENT_BUFFER_LVALUE = \
- runes_parser_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
- } \
- YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
- }
-
-#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
-
-/* Begin user sect3 */
-
-#define runes_parser_yywrap(yyscanner) 1
-#define YY_SKIP_YYWRAP
-
-typedef unsigned char YY_CHAR;
-
-typedef int yy_state_type;
-
-#define yytext_ptr yytext_r
-
-static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
-static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner);
-static int yy_get_next_buffer (yyscan_t yyscanner );
-static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
-
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
- yyg->yytext_ptr = yy_bp; \
- yyleng = (size_t) (yy_cp - yy_bp); \
- yyg->yy_hold_char = *yy_cp; \
- *yy_cp = '\0'; \
- yyg->yy_c_buf_p = yy_cp;
-
-#define YY_NUM_RULES 57
-#define YY_END_OF_BUFFER 58
-/* This struct is not used in this scanner,
- but its presence is necessary. */
-struct yy_trans_info
- {
- flex_int32_t yy_verify;
- flex_int32_t yy_nxt;
- };
-static yyconst flex_int16_t yy_accept[149] =
- { 0,
- 0, 0, 58, 55, 1, 2, 3, 4, 5, 6,
- 7, 8, 48, 40, 56, 42, 43, 44, 53, 54,
- 54, 54, 54, 54, 14, 15, 9, 10, 11, 46,
- 47, 12, 13, 0, 0, 0, 40, 0, 0, 0,
- 41, 43, 44, 0, 36, 0, 37, 0, 38, 0,
- 39, 49, 50, 45, 45, 50, 50, 16, 17, 18,
- 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
- 29, 30, 0, 0, 0, 51, 52, 52, 52, 52,
- 0, 0, 0, 0, 0, 0, 0, 44, 45, 45,
- 45, 31, 32, 0, 0, 0, 0, 0, 0, 0,
-
- 0, 0, 0, 0, 45, 0, 33, 0, 0, 0,
- 0, 34, 0, 0, 0, 0, 35, 0, 0, 0,
- 0, 0, 45, 45, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 27, 28, 45, 0, 0, 0,
- 45, 45, 0, 45, 45, 0, 45, 0
- } ;
-
-static yyconst flex_int32_t yy_ec[256] =
- { 0,
- 1, 1, 1, 1, 1, 1, 2, 3, 4, 5,
- 6, 7, 8, 1, 9, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 10, 1, 1, 1,
- 1, 11, 11, 11, 11, 11, 11, 11, 11, 12,
- 13, 14, 15, 11, 11, 11, 11, 16, 17, 18,
- 19, 19, 19, 19, 20, 21, 19, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 31, 32, 22, 22,
- 22, 33, 22, 34, 35, 36, 37, 22, 22, 38,
- 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 39, 22, 40, 22, 22, 22, 22, 22, 41, 22,
-
- 22, 22, 42, 43, 22, 22, 22, 44, 45, 22,
- 22, 22, 22, 46, 22, 22, 22, 22, 22, 22,
- 22, 22, 22, 22, 22, 22, 1, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
- 47, 48, 48, 48, 48, 48, 48, 48, 48, 48,
-
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
- 48, 48, 48, 49, 49, 49, 49, 49, 49, 49,
- 49, 49, 49, 49, 49, 49, 49, 49, 49, 50,
- 50, 50, 50, 50, 50, 50, 50, 51, 51, 51,
- 51, 51, 51, 51, 51
- } ;
-
-static yyconst flex_int32_t yy_meta[52] =
- { 0,
- 1, 2, 1, 1, 1, 1, 1, 1, 1, 1,
- 3, 3, 3, 3, 3, 4, 4, 4, 4, 4,
- 4, 3, 5, 6, 6, 3, 6, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 5, 5, 3, 3, 7, 8, 8, 8,
- 7
- } ;
-
-static yyconst flex_int16_t yy_base[167] =
- { 0,
- 0, 51, 379, 556, 556, 556, 556, 556, 556, 556,
- 556, 556, 102, 14, 556, 331, 330, 329, 556, 556,
- 0, 5, 10, 15, 556, 556, 556, 556, 556, 152,
- 202, 556, 556, 328, 327, 325, 17, 324, 323, 312,
- 20, 311, 310, 20, 556, 25, 556, 30, 556, 60,
- 556, 556, 556, 190, 556, 237, 268, 556, 556, 556,
- 556, 556, 556, 556, 556, 556, 556, 556, 556, 556,
- 556, 556, 309, 308, 307, 556, 556, 330, 329, 328,
- 302, 294, 292, 283, 282, 281, 277, 274, 52, 198,
- 288, 556, 556, 273, 272, 44, 197, 228, 271, 263,
-
- 254, 253, 317, 64, 62, 252, 556, 242, 251, 250,
- 246, 556, 246, 216, 202, 196, 556, 277, 188, 186,
- 181, 177, 0, 198, 216, 348, 169, 102, 50, 49,
- 48, 44, 368, 202, 556, 556, 386, 43, 41, 31,
- 406, 207, 424, 0, 213, 296, 327, 556, 470, 476,
- 482, 486, 490, 494, 500, 506, 511, 516, 523, 530,
- 535, 538, 541, 543, 546, 549
- } ;
-
-static yyconst flex_int16_t yy_def[167] =
- { 0,
- 149, 149, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 148, 148, 150, 148, 148, 148, 148, 148, 148,
- 151, 152, 153, 154, 148, 148, 148, 148, 148, 148,
- 155, 148, 148, 148, 148, 148, 150, 148, 148, 148,
- 156, 148, 148, 151, 148, 152, 148, 153, 148, 154,
- 148, 148, 148, 30, 148, 30, 56, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 157, 56,
- 56, 148, 148, 148, 148, 158, 159, 160, 148, 148,
-
- 148, 148, 56, 148, 161, 148, 148, 158, 148, 148,
- 148, 148, 159, 148, 148, 148, 148, 160, 148, 148,
- 148, 148, 103, 162, 163, 91, 148, 148, 148, 148,
- 148, 148, 103, 164, 148, 148, 91, 148, 148, 148,
- 103, 165, 91, 143, 166, 143, 143, 0, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148
- } ;
-
-static yyconst flex_int16_t yy_nxt[608] =
- { 0,
- 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
- 44, 44, 44, 44, 44, 46, 46, 46, 46, 46,
- 48, 48, 48, 48, 48, 50, 50, 50, 50, 50,
- 44, 44, 44, 44, 44, 46, 46, 46, 46, 46,
- 48, 48, 48, 48, 48, 107, 15, 16, 17, 18,
- 15, 4, 5, 6, 7, 8, 9, 10, 11, 12,
- 13, 38, 39, 40, 38, 39, 40, 38, 39, 40,
- 50, 50, 50, 50, 50, 104, 104, 118, 104, 125,
- 125, 125, 125, 125, 125, 104, 104, 113, 104, 108,
- 140, 109, 110, 111, 118, 139, 113, 15, 16, 17,
-
- 18, 15, 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 20, 21, 22, 23, 24, 20, 20, 20,
- 20, 25, 26, 20, 20, 20, 27, 28, 20, 20,
- 20, 20, 20, 20, 20, 20, 20, 20, 29, 20,
- 30, 31, 32, 33, 20, 20, 20, 20, 138, 34,
- 35, 36, 52, 52, 52, 52, 52, 52, 52, 52,
- 52, 52, 53, 53, 53, 53, 53, 54, 54, 54,
- 54, 54, 54, 53, 55, 56, 56, 53, 57, 58,
- 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
- 53, 53, 53, 53, 69, 70, 71, 72, 112, 73,
-
- 74, 75, 76, 76, 76, 76, 76, 76, 76, 76,
- 76, 76, 89, 53, 53, 108, 53, 78, 79, 80,
- 105, 104, 104, 77, 104, 104, 104, 132, 104, 117,
- 104, 104, 131, 104, 118, 53, 104, 104, 134, 104,
- 69, 70, 130, 107, 114, 115, 116, 112, 129, 81,
- 82, 83, 90, 90, 90, 90, 90, 90, 135, 136,
- 53, 53, 113, 53, 53, 53, 53, 53, 53, 53,
- 53, 53, 53, 53, 53, 119, 120, 121, 117, 53,
- 53, 53, 53, 91, 91, 91, 91, 91, 91, 109,
- 110, 111, 128, 114, 115, 116, 127, 108, 53, 41,
-
- 20, 92, 93, 91, 91, 91, 91, 91, 91, 122,
- 105, 147, 147, 147, 147, 147, 147, 77, 106, 53,
- 41, 92, 93, 102, 119, 120, 121, 41, 101, 20,
- 69, 70, 123, 123, 123, 123, 123, 123, 100, 124,
- 99, 53, 147, 147, 147, 147, 147, 147, 77, 63,
- 98, 97, 96, 95, 94, 53, 88, 41, 87, 69,
- 70, 71, 72, 137, 137, 137, 137, 137, 137, 86,
- 41, 85, 53, 84, 20, 43, 42, 41, 148, 148,
- 148, 53, 53, 141, 141, 141, 141, 141, 141, 148,
- 142, 148, 148, 148, 148, 148, 148, 148, 148, 148,
-
- 53, 137, 137, 137, 137, 137, 137, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 53,
- 53, 141, 141, 141, 141, 141, 141, 148, 142, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 53, 144,
- 144, 144, 144, 144, 144, 148, 145, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 53, 53, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 71, 72,
- 14, 14, 14, 14, 14, 14, 14, 14, 37, 37,
- 37, 37, 148, 37, 45, 45, 45, 45, 47, 47,
- 47, 47, 49, 49, 49, 49, 51, 51, 51, 51,
-
- 77, 77, 77, 77, 77, 77, 148, 77, 41, 41,
- 41, 41, 148, 41, 103, 148, 103, 108, 108, 108,
- 108, 108, 148, 108, 113, 113, 113, 113, 113, 148,
- 113, 118, 118, 118, 118, 118, 148, 118, 126, 148,
- 126, 133, 148, 133, 125, 125, 125, 148, 125, 143,
- 148, 143, 146, 148, 146, 3, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
-
- 148, 148, 148, 148, 148, 148, 148
- } ;
-
-static yyconst flex_int16_t yy_chk[608] =
- { 0,
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- 21, 21, 21, 21, 21, 22, 22, 22, 22, 22,
- 23, 23, 23, 23, 23, 24, 24, 24, 24, 24,
- 44, 44, 44, 44, 44, 46, 46, 46, 46, 46,
- 48, 48, 48, 48, 48, 96, 1, 1, 1, 1,
- 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 14, 14, 14, 37, 37, 37, 41, 41, 41,
- 50, 50, 50, 50, 50, 89, 89, 140, 89, 104,
- 104, 104, 104, 104, 104, 105, 105, 139, 105, 138,
- 132, 96, 96, 96, 131, 130, 129, 2, 2, 2,
-
- 2, 2, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13, 128, 13,
- 13, 13, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30, 97, 30,
-
- 30, 30, 31, 31, 31, 31, 31, 31, 31, 31,
- 31, 31, 54, 54, 54, 127, 54, 31, 31, 31,
- 90, 124, 124, 122, 124, 134, 134, 121, 134, 98,
- 142, 142, 120, 142, 119, 54, 145, 145, 125, 145,
- 90, 90, 116, 108, 97, 97, 97, 113, 115, 31,
- 31, 31, 56, 56, 56, 56, 56, 56, 125, 125,
- 56, 56, 114, 56, 56, 56, 56, 56, 56, 56,
- 56, 56, 56, 56, 56, 98, 98, 98, 118, 56,
- 56, 56, 56, 57, 57, 57, 57, 57, 57, 108,
- 108, 108, 111, 113, 113, 113, 110, 109, 106, 102,
-
- 101, 57, 57, 91, 91, 91, 91, 91, 91, 100,
- 91, 146, 146, 146, 146, 146, 146, 99, 95, 94,
- 88, 91, 91, 87, 118, 118, 118, 86, 85, 84,
- 91, 91, 103, 103, 103, 103, 103, 103, 83, 103,
- 82, 146, 147, 147, 147, 147, 147, 147, 81, 103,
- 80, 79, 78, 75, 74, 73, 43, 42, 40, 103,
- 103, 103, 103, 126, 126, 126, 126, 126, 126, 39,
- 38, 36, 147, 35, 34, 18, 17, 16, 3, 0,
- 0, 126, 126, 133, 133, 133, 133, 133, 133, 0,
- 133, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
- 133, 137, 137, 137, 137, 137, 137, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 137,
- 137, 141, 141, 141, 141, 141, 141, 0, 141, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 141, 143,
- 143, 143, 143, 143, 143, 0, 143, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 143, 143, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 143, 143,
- 149, 149, 149, 149, 149, 149, 149, 149, 150, 150,
- 150, 150, 0, 150, 151, 151, 151, 151, 152, 152,
- 152, 152, 153, 153, 153, 153, 154, 154, 154, 154,
-
- 155, 155, 155, 155, 155, 155, 0, 155, 156, 156,
- 156, 156, 0, 156, 157, 0, 157, 158, 158, 158,
- 158, 158, 0, 158, 159, 159, 159, 159, 159, 0,
- 159, 160, 160, 160, 160, 160, 0, 160, 161, 0,
- 161, 162, 0, 162, 163, 163, 164, 0, 164, 165,
- 0, 165, 166, 0, 166, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
- 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
-
- 148, 148, 148, 148, 148, 148, 148
- } ;
-
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-#line 1 "src/parser.l"
-#line 2 "src/parser.l"
-#include <string.h>
-
-#include "runes.h"
-
-#define RUNES_PARSER_CSI_MAX_PARAMS 256
-
-#define YY_EXIT_FAILURE (UNUSED(yyscanner), 2)
-#define YY_NO_INPUT 1
-#line 82 "src/parser.l"
-static void runes_parser_handle_bel(RunesTerm *t);
-static void runes_parser_handle_bs(RunesTerm *t);
-static void runes_parser_handle_tab(RunesTerm *t);
-static void runes_parser_handle_lf(RunesTerm *t);
-static void runes_parser_handle_cr(RunesTerm *t);
-static void runes_parser_handle_deckpam(RunesTerm *t);
-static void runes_parser_handle_deckpnm(RunesTerm *t);
-static void runes_parser_handle_ri(RunesTerm *t);
-static void runes_parser_handle_ris(RunesTerm *t);
-static void runes_parser_handle_vb(RunesTerm *t);
-static void runes_parser_handle_decsc(RunesTerm *t);
-static void runes_parser_handle_decrc(RunesTerm *t);
-static void runes_parser_extract_csi_params(
- char *buf, size_t len, int *params, int *nparams);
-static void runes_parser_extract_sm_params(
- char *buf, size_t len, char *modes, int *params, int *nparams);
-static void runes_parser_handle_ich(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_cuu(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_cud(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_cuf(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_cub(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_cup(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_ed(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_el(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_il(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_dl(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_dch(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_sm(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_rm(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_csr(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_decsed(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_decsel(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_osc0(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_osc1(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_osc2(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_ascii(RunesTerm *t, char *text, size_t len);
-static void runes_parser_handle_text(RunesTerm *t, char *text, size_t len);
-#line 668 "src/parser.c"
-
-#define INITIAL 0
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-#include <unistd.h>
-#endif
-
-#define YY_EXTRA_TYPE RunesTerm *
-
-/* Holds the entire state of the reentrant scanner. */
-struct yyguts_t
- {
-
- /* User-defined. Not touched by flex. */
- YY_EXTRA_TYPE yyextra_r;
-
- /* The rest are the same as the globals declared in the non-reentrant scanner. */
- FILE *yyin_r, *yyout_r;
- size_t yy_buffer_stack_top; /**< index of top of stack. */
- size_t yy_buffer_stack_max; /**< capacity of stack. */
- YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
- char yy_hold_char;
- yy_size_t yy_n_chars;
- yy_size_t yyleng_r;
- char *yy_c_buf_p;
- int yy_init;
- int yy_start;
- int yy_did_buffer_switch_on_eof;
- int yy_start_stack_ptr;
- int yy_start_stack_depth;
- int *yy_start_stack;
- yy_state_type yy_last_accepting_state;
- char* yy_last_accepting_cpos;
-
- int yylineno_r;
- int yy_flex_debug_r;
-
- char *yytext_r;
- int yy_more_flag;
- int yy_more_len;
-
- }; /* end struct yyguts_t */
-
-static int yy_init_globals (yyscan_t yyscanner );
-
-int runes_parser_yylex_init (yyscan_t* scanner);
-
-int runes_parser_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
-
-/* Accessor methods to globals.
- These are made visible to non-reentrant scanners for convenience. */
-
-int runes_parser_yylex_destroy (yyscan_t yyscanner );
-
-int runes_parser_yyget_debug (yyscan_t yyscanner );
-
-void runes_parser_yyset_debug (int debug_flag ,yyscan_t yyscanner );
-
-YY_EXTRA_TYPE runes_parser_yyget_extra (yyscan_t yyscanner );
-
-void runes_parser_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
-
-FILE *runes_parser_yyget_in (yyscan_t yyscanner );
-
-void runes_parser_yyset_in (FILE * in_str ,yyscan_t yyscanner );
-
-FILE *runes_parser_yyget_out (yyscan_t yyscanner );
-
-void runes_parser_yyset_out (FILE * out_str ,yyscan_t yyscanner );
-
-yy_size_t runes_parser_yyget_leng (yyscan_t yyscanner );
-
-char *runes_parser_yyget_text (yyscan_t yyscanner );
-
-int runes_parser_yyget_lineno (yyscan_t yyscanner );
-
-void runes_parser_yyset_lineno (int line_number ,yyscan_t yyscanner );
-
-int runes_parser_yyget_column (yyscan_t yyscanner );
-
-void runes_parser_yyset_column (int column_no ,yyscan_t yyscanner );
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int runes_parser_yywrap (yyscan_t yyscanner );
-#else
-extern int runes_parser_yywrap (yyscan_t yyscanner );
-#endif
-#endif
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
-#endif
-
-#ifndef YY_NO_INPUT
-
-#ifdef __cplusplus
-static int yyinput (yyscan_t yyscanner );
-#else
-static int input (yyscan_t yyscanner );
-#endif
-
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Copy whatever the last rule matched to the standard output. */
-#ifndef ECHO
-/* This used to be an fputs(), but since the string might contain NUL's,
- * we now use fwrite().
- */
-#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0)
-#endif
-
-/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,
- * is returned in "result".
- */
-#ifndef YY_INPUT
-#define YY_INPUT(buf,result,max_size) \
- if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
- { \
- int c = '*'; \
- size_t n; \
- for ( n = 0; n < max_size && \
- (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
- buf[n] = (char) c; \
- if ( c == '\n' ) \
- buf[n++] = (char) c; \
- if ( c == EOF && ferror( yyin ) ) \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- result = n; \
- } \
- else \
- { \
- errno=0; \
- while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
- { \
- if( errno != EINTR) \
- { \
- YY_FATAL_ERROR( "input in flex scanner failed" ); \
- break; \
- } \
- errno=0; \
- clearerr(yyin); \
- } \
- }\
-\
-
-#endif
-
-/* No semi-colon after return; correct usage is to write "yyterminate();" -
- * we don't want an extra ';' after the "return" because that will cause
- * some compilers to complain about unreachable statements.
- */
-#ifndef yyterminate
-#define yyterminate() return YY_NULL
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Report a fatal error. */
-#ifndef YY_FATAL_ERROR
-#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
-#endif
-
-/* end tables serialization structures and prototypes */
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-
-extern int runes_parser_yylex (yyscan_t yyscanner);
-
-#define YY_DECL int runes_parser_yylex (yyscan_t yyscanner)
-#endif /* !YY_DECL */
-
-/* Code executed at the beginning of each rule, after yytext and yyleng
- * have been set up.
- */
-#ifndef YY_USER_ACTION
-#define YY_USER_ACTION
-#endif
-
-/* Code executed at the end of each rule. */
-#ifndef YY_BREAK
-#define YY_BREAK break;
-#endif
-
-#define YY_RULE_SETUP \
- YY_USER_ACTION
-
-/** The main scanner function which does all the work.
- */
-YY_DECL
-{
- register yy_state_type yy_current_state;
- register char *yy_cp, *yy_bp;
- register int yy_act;
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- if ( !yyg->yy_init )
- {
- yyg->yy_init = 1;
-
-#ifdef YY_USER_INIT
- YY_USER_INIT;
-#endif
-
- if ( ! yyg->yy_start )
- yyg->yy_start = 1; /* first start state */
-
- if ( ! yyin )
- yyin = stdin;
-
- if ( ! yyout )
- yyout = stdout;
-
- if ( ! YY_CURRENT_BUFFER ) {
- runes_parser_yyensure_buffer_stack (yyscanner);
- YY_CURRENT_BUFFER_LVALUE =
- runes_parser_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
- }
-
- runes_parser_yy_load_buffer_state(yyscanner );
- }
-
- {
-#line 122 "src/parser.l"
-
-
-#line 919 "src/parser.c"
-
- while ( 1 ) /* loops until end-of-file is reached */
- {
- yy_cp = yyg->yy_c_buf_p;
-
- /* Support of yytext. */
- *yy_cp = yyg->yy_hold_char;
-
- /* yy_bp points to the position in yy_ch_buf of the start of
- * the current run.
- */
- yy_bp = yy_cp;
-
- yy_current_state = yyg->yy_start;
-yy_match:
- do
- {
- register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
- if ( yy_accept[yy_current_state] )
- {
- yyg->yy_last_accepting_state = yy_current_state;
- yyg->yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 149 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- ++yy_cp;
- }
- while ( yy_current_state != 148 );
- yy_cp = yyg->yy_last_accepting_cpos;
- yy_current_state = yyg->yy_last_accepting_state;
-
-yy_find_action:
- yy_act = yy_accept[yy_current_state];
-
- YY_DO_BEFORE_ACTION;
-
-do_action: /* This label is used only to access EOF actions. */
-
- switch ( yy_act )
- { /* beginning of action switch */
- case 0: /* must back up */
- /* undo the effects of YY_DO_BEFORE_ACTION */
- *yy_cp = yyg->yy_hold_char;
- yy_cp = yyg->yy_last_accepting_cpos;
- yy_current_state = yyg->yy_last_accepting_state;
- goto yy_find_action;
-
-case 1:
-YY_RULE_SETUP
-#line 124 "src/parser.l"
-runes_parser_handle_bel(yyextra);
- YY_BREAK
-case 2:
-YY_RULE_SETUP
-#line 125 "src/parser.l"
-runes_parser_handle_bs(yyextra);
- YY_BREAK
-case 3:
-YY_RULE_SETUP
-#line 126 "src/parser.l"
-runes_parser_handle_tab(yyextra);
- YY_BREAK
-case 4:
-/* rule 4 can match eol */
-#line 128 "src/parser.l"
-case 5:
-/* rule 5 can match eol */
-#line 129 "src/parser.l"
-case 6:
-/* rule 6 can match eol */
-YY_RULE_SETUP
-#line 129 "src/parser.l"
-runes_parser_handle_lf(yyextra);
- YY_BREAK
-case 7:
-YY_RULE_SETUP
-#line 130 "src/parser.l"
-runes_parser_handle_cr(yyextra);
- YY_BREAK
-case 8:
-YY_RULE_SETUP
-#line 131 "src/parser.l"
-
- YY_BREAK
-case 9:
-YY_RULE_SETUP
-#line 133 "src/parser.l"
-runes_parser_handle_deckpam(yyextra);
- YY_BREAK
-case 10:
-YY_RULE_SETUP
-#line 134 "src/parser.l"
-runes_parser_handle_deckpnm(yyextra);
- YY_BREAK
-case 11:
-YY_RULE_SETUP
-#line 135 "src/parser.l"
-runes_parser_handle_ri(yyextra);
- YY_BREAK
-case 12:
-YY_RULE_SETUP
-#line 136 "src/parser.l"
-runes_parser_handle_ris(yyextra);
- YY_BREAK
-case 13:
-YY_RULE_SETUP
-#line 137 "src/parser.l"
-runes_parser_handle_vb(yyextra);
- YY_BREAK
-case 14:
-YY_RULE_SETUP
-#line 138 "src/parser.l"
-runes_parser_handle_decsc(yyextra);
- YY_BREAK
-case 15:
-YY_RULE_SETUP
-#line 139 "src/parser.l"
-runes_parser_handle_decrc(yyextra);
- YY_BREAK
-case 16:
-YY_RULE_SETUP
-#line 141 "src/parser.l"
-runes_parser_handle_ich(yyextra, yytext, yyleng);
- YY_BREAK
-case 17:
-YY_RULE_SETUP
-#line 142 "src/parser.l"
-runes_parser_handle_cuu(yyextra, yytext, yyleng);
- YY_BREAK
-case 18:
-YY_RULE_SETUP
-#line 143 "src/parser.l"
-runes_parser_handle_cud(yyextra, yytext, yyleng);
- YY_BREAK
-case 19:
-YY_RULE_SETUP
-#line 144 "src/parser.l"
-runes_parser_handle_cuf(yyextra, yytext, yyleng);
- YY_BREAK
-case 20:
-YY_RULE_SETUP
-#line 145 "src/parser.l"
-runes_parser_handle_cub(yyextra, yytext, yyleng);
- YY_BREAK
-case 21:
-YY_RULE_SETUP
-#line 146 "src/parser.l"
-runes_parser_handle_cup(yyextra, yytext, yyleng);
- YY_BREAK
-case 22:
-YY_RULE_SETUP
-#line 147 "src/parser.l"
-runes_parser_handle_ed(yyextra, yytext, yyleng);
- YY_BREAK
-case 23:
-YY_RULE_SETUP
-#line 148 "src/parser.l"
-runes_parser_handle_el(yyextra, yytext, yyleng);
- YY_BREAK
-case 24:
-YY_RULE_SETUP
-#line 149 "src/parser.l"
-runes_parser_handle_il(yyextra, yytext, yyleng);
- YY_BREAK
-case 25:
-YY_RULE_SETUP
-#line 150 "src/parser.l"
-runes_parser_handle_dl(yyextra, yytext, yyleng);
- YY_BREAK
-case 26:
-YY_RULE_SETUP
-#line 151 "src/parser.l"
-runes_parser_handle_dch(yyextra, yytext, yyleng);
- YY_BREAK
-case 27:
-YY_RULE_SETUP
-#line 152 "src/parser.l"
-runes_parser_handle_sm(yyextra, yytext, yyleng);
- YY_BREAK
-case 28:
-YY_RULE_SETUP
-#line 153 "src/parser.l"
-runes_parser_handle_rm(yyextra, yytext, yyleng);
- YY_BREAK
-case 29:
-YY_RULE_SETUP
-#line 154 "src/parser.l"
-runes_parser_handle_sgr(yyextra, yytext, yyleng);
- YY_BREAK
-case 30:
-YY_RULE_SETUP
-#line 155 "src/parser.l"
-runes_parser_handle_csr(yyextra, yytext, yyleng);
- YY_BREAK
-case 31:
-YY_RULE_SETUP
-#line 157 "src/parser.l"
-runes_parser_handle_decsed(yyextra, yytext, yyleng);
- YY_BREAK
-case 32:
-YY_RULE_SETUP
-#line 158 "src/parser.l"
-runes_parser_handle_decsel(yyextra, yytext, yyleng);
- YY_BREAK
-case 33:
-YY_RULE_SETUP
-#line 160 "src/parser.l"
-runes_parser_handle_osc0(yyextra, yytext, yyleng);
- YY_BREAK
-case 34:
-YY_RULE_SETUP
-#line 161 "src/parser.l"
-runes_parser_handle_osc1(yyextra, yytext, yyleng);
- YY_BREAK
-case 35:
-YY_RULE_SETUP
-#line 162 "src/parser.l"
-runes_parser_handle_osc2(yyextra, yytext, yyleng);
- YY_BREAK
-case 36:
-#line 165 "src/parser.l"
-case 37:
-#line 166 "src/parser.l"
-case 38:
-#line 167 "src/parser.l"
-case 39:
-YY_RULE_SETUP
-#line 167 "src/parser.l"
-
- YY_BREAK
-case 40:
-YY_RULE_SETUP
-#line 169 "src/parser.l"
-runes_parser_handle_ascii(yyextra, yytext, yyleng);
- YY_BREAK
-case 41:
-YY_RULE_SETUP
-#line 170 "src/parser.l"
-runes_parser_handle_text(yyextra, yytext, yyleng);
- YY_BREAK
-case 42:
-#line 173 "src/parser.l"
-case 43:
-#line 174 "src/parser.l"
-case 44:
-#line 175 "src/parser.l"
-case 45:
-#line 176 "src/parser.l"
-case 46:
-#line 177 "src/parser.l"
-case 47:
-#line 178 "src/parser.l"
-case 48:
-YY_RULE_SETUP
-#line 178 "src/parser.l"
-return yyleng;
- YY_BREAK
-case YY_STATE_EOF(INITIAL):
-#line 180 "src/parser.l"
-return 0;
- YY_BREAK
-case 49:
-/* rule 49 can match eol */
-YY_RULE_SETUP
-#line 182 "src/parser.l"
-{
- runes_warn(
- "unhandled CSI sequence: \\033%*s\\%hho\n",
- (int)yyleng - 2, yytext + 1, yytext[yyleng - 1]);
-}
- YY_BREAK
-case 50:
-YY_RULE_SETUP
-#line 188 "src/parser.l"
-{
- runes_warn(
- "unhandled CSI sequence: \\033%*s\n",
- (int)yyleng - 1, yytext + 1);
-}
- YY_BREAK
-case 51:
-/* rule 51 can match eol */
-YY_RULE_SETUP
-#line 194 "src/parser.l"
-{
- runes_warn(
- "unhandled OSC sequence: \\033%*s\\%hho\n",
- (int)yyleng - 2, yytext + 1, yytext[yyleng - 1]);
-}
- YY_BREAK
-case 52:
-YY_RULE_SETUP
-#line 200 "src/parser.l"
-{
- runes_warn(
- "unhandled OSC sequence: \\033%*s\n",
- (int)yyleng - 1, yytext + 1);
-}
- YY_BREAK
-case 53:
-/* rule 53 can match eol */
-YY_RULE_SETUP
-#line 206 "src/parser.l"
-{
- runes_warn("unhandled escape sequence: \\%hho\n", yytext[1]);
-}
- YY_BREAK
-case 54:
-YY_RULE_SETUP
-#line 210 "src/parser.l"
-{
- runes_warn(
- "unhandled escape sequence: %*s\n",
- (int)yyleng - 1, yytext + 1);
-}
- YY_BREAK
-case 55:
-/* rule 55 can match eol */
-YY_RULE_SETUP
-#line 216 "src/parser.l"
-{
- runes_warn("unhandled control character: \\%hho\n", yytext[0]);
-}
- YY_BREAK
-case 56:
-YY_RULE_SETUP
-#line 220 "src/parser.l"
-{
- runes_warn("invalid utf8 byte: \\%hho\n", yytext[0]);
-}
- YY_BREAK
-case 57:
-YY_RULE_SETUP
-#line 224 "src/parser.l"
-YY_FATAL_ERROR( "flex scanner jammed" );
- YY_BREAK
-#line 1261 "src/parser.c"
-
- case YY_END_OF_BUFFER:
- {
- /* Amount of text matched not including the EOB char. */
- int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;
-
- /* Undo the effects of YY_DO_BEFORE_ACTION. */
- *yy_cp = yyg->yy_hold_char;
- YY_RESTORE_YY_MORE_OFFSET
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
- {
- /* We're scanning a new file or input source. It's
- * possible that this happened because the user
- * just pointed yyin at a new source and called
- * runes_parser_yylex(). If so, then we have to assure
- * consistency between YY_CURRENT_BUFFER and our
- * globals. Here is the right place to do so, because
- * this is the first action (other than possibly a
- * back-up) that will match for the new input source.
- */
- yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
- YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
- }
-
- /* Note that here we test for yy_c_buf_p "<=" to the position
- * of the first EOB in the buffer, since yy_c_buf_p will
- * already have been incremented past the NUL character
- * (since all states make transitions on EOB to the
- * end-of-buffer state). Contrast this with the test
- * in input().
- */
- if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
- { /* This was really a NUL. */
- yy_state_type yy_next_state;
-
- yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state( yyscanner );
-
- /* Okay, we're now positioned to make the NUL
- * transition. We couldn't have
- * yy_get_previous_state() go ahead and do it
- * for us because it doesn't know how to deal
- * with the possibility of jamming (and we don't
- * want to build jamming into it because then it
- * will run more slowly).
- */
-
- yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);
-
- yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
-
- if ( yy_next_state )
- {
- /* Consume the NUL. */
- yy_cp = ++yyg->yy_c_buf_p;
- yy_current_state = yy_next_state;
- goto yy_match;
- }
-
- else
- {
- yy_cp = yyg->yy_last_accepting_cpos;
- yy_current_state = yyg->yy_last_accepting_state;
- goto yy_find_action;
- }
- }
-
- else switch ( yy_get_next_buffer( yyscanner ) )
- {
- case EOB_ACT_END_OF_FILE:
- {
- yyg->yy_did_buffer_switch_on_eof = 0;
-
- if ( runes_parser_yywrap(yyscanner ) )
- {
- /* Note: because we've taken care in
- * yy_get_next_buffer() to have set up
- * yytext, we can now set up
- * yy_c_buf_p so that if some total
- * hoser (like flex itself) wants to
- * call the scanner after we return the
- * YY_NULL, it'll still work - another
- * YY_NULL will get returned.
- */
- yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;
-
- yy_act = YY_STATE_EOF(YY_START);
- goto do_action;
- }
-
- else
- {
- if ( ! yyg->yy_did_buffer_switch_on_eof )
- YY_NEW_FILE;
- }
- break;
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- yyg->yy_c_buf_p =
- yyg->yytext_ptr + yy_amount_of_matched_text;
-
- yy_current_state = yy_get_previous_state( yyscanner );
-
- yy_cp = yyg->yy_c_buf_p;
- yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
- goto yy_match;
-
- case EOB_ACT_LAST_MATCH:
- yyg->yy_c_buf_p =
- &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];
-
- yy_current_state = yy_get_previous_state( yyscanner );
-
- yy_cp = yyg->yy_c_buf_p;
- yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
- goto yy_find_action;
- }
- break;
- }
-
- default:
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--no action found" );
- } /* end of action switch */
- } /* end of scanning one token */
- } /* end of user's declarations */
-} /* end of runes_parser_yylex */
-
-/* yy_get_next_buffer - try to read in a new buffer
- *
- * Returns a code representing an action:
- * EOB_ACT_LAST_MATCH -
- * EOB_ACT_CONTINUE_SCAN - continue scanning from current position
- * EOB_ACT_END_OF_FILE - end of file
- */
-static int yy_get_next_buffer (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
- register char *source = yyg->yytext_ptr;
- register int number_to_move, i;
- int ret_val;
-
- if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
- YY_FATAL_ERROR(
- "fatal flex scanner internal error--end of buffer missed" );
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
- { /* Don't try to fill the buffer, so this is an EOF. */
- if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
- {
- /* We matched a single character, the EOB, so
- * treat this as a final EOF.
- */
- return EOB_ACT_END_OF_FILE;
- }
-
- else
- {
- /* We matched some text prior to the EOB, first
- * process it.
- */
- return EOB_ACT_LAST_MATCH;
- }
- }
-
- /* Try to read more data. */
-
- /* First move last chars to start of buffer. */
- number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
-
- for ( i = 0; i < number_to_move; ++i )
- *(dest++) = *(source++);
-
- if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
- /* don't do the read, it's not guaranteed to return an EOF,
- * just force an EOF
- */
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;
-
- else
- {
- yy_size_t num_to_read =
- YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
-
- while ( num_to_read <= 0 )
- { /* Not enough room in the buffer - grow it. */
-
- /* just a shorter name for the current buffer */
- YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
-
- int yy_c_buf_p_offset =
- (int) (yyg->yy_c_buf_p - b->yy_ch_buf);
-
- if ( b->yy_is_our_buffer )
- {
- yy_size_t new_size = b->yy_buf_size * 2;
-
- if ( new_size <= 0 )
- b->yy_buf_size += b->yy_buf_size / 8;
- else
- b->yy_buf_size *= 2;
-
- b->yy_ch_buf = (char *)
- /* Include room in for 2 EOB chars. */
- runes_parser_yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner );
- }
- else
- /* Can't grow it, we don't own it. */
- b->yy_ch_buf = 0;
-
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR(
- "fatal error - scanner input buffer overflow" );
-
- yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
-
- num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
- number_to_move - 1;
-
- }
-
- if ( num_to_read > YY_READ_BUF_SIZE )
- num_to_read = YY_READ_BUF_SIZE;
-
- /* Read in more data. */
- YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
- yyg->yy_n_chars, num_to_read );
-
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
- }
-
- if ( yyg->yy_n_chars == 0 )
- {
- if ( number_to_move == YY_MORE_ADJ )
- {
- ret_val = EOB_ACT_END_OF_FILE;
- runes_parser_yyrestart(yyin ,yyscanner);
- }
-
- else
- {
- ret_val = EOB_ACT_LAST_MATCH;
- YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
- YY_BUFFER_EOF_PENDING;
- }
- }
-
- else
- ret_val = EOB_ACT_CONTINUE_SCAN;
-
- if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
- /* Extend the array by 50%, plus the number we really need. */
- yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) runes_parser_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );
- if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
- }
-
- yyg->yy_n_chars += number_to_move;
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
- YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
-
- yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
-
- return ret_val;
-}
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
- static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
-{
- register yy_state_type yy_current_state;
- register char *yy_cp;
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- yy_current_state = yyg->yy_start;
-
- for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
- {
- register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
- if ( yy_accept[yy_current_state] )
- {
- yyg->yy_last_accepting_state = yy_current_state;
- yyg->yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 149 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- }
-
- return yy_current_state;
-}
-
-/* yy_try_NUL_trans - try to make a transition on the NUL character
- *
- * synopsis
- * next_state = yy_try_NUL_trans( current_state );
- */
- static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner)
-{
- register int yy_is_jam;
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
- register char *yy_cp = yyg->yy_c_buf_p;
-
- register YY_CHAR yy_c = 1;
- if ( yy_accept[yy_current_state] )
- {
- yyg->yy_last_accepting_state = yy_current_state;
- yyg->yy_last_accepting_cpos = yy_cp;
- }
- while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
- {
- yy_current_state = (int) yy_def[yy_current_state];
- if ( yy_current_state >= 149 )
- yy_c = yy_meta[(unsigned int) yy_c];
- }
- yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
- yy_is_jam = (yy_current_state == 148);
-
- (void)yyg;
- return yy_is_jam ? 0 : yy_current_state;
-}
-
-#ifndef YY_NO_INPUT
-#ifdef __cplusplus
- static int yyinput (yyscan_t yyscanner)
-#else
- static int input (yyscan_t yyscanner)
-#endif
-
-{
- int c;
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- *yyg->yy_c_buf_p = yyg->yy_hold_char;
-
- if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
- {
- /* yy_c_buf_p now points to the character we want to return.
- * If this occurs *before* the EOB characters, then it's a
- * valid NUL; if not, then we've hit the end of the buffer.
- */
- if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
- /* This was really a NUL. */
- *yyg->yy_c_buf_p = '\0';
-
- else
- { /* need more input */
- yy_size_t offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
- ++yyg->yy_c_buf_p;
-
- switch ( yy_get_next_buffer( yyscanner ) )
- {
- case EOB_ACT_LAST_MATCH:
- /* This happens because yy_g_n_b()
- * sees that we've accumulated a
- * token and flags that we need to
- * try matching the token before
- * proceeding. But for input(),
- * there's no matching to consider.
- * So convert the EOB_ACT_LAST_MATCH
- * to EOB_ACT_END_OF_FILE.
- */
-
- /* Reset buffer status. */
- runes_parser_yyrestart(yyin ,yyscanner);
-
- /*FALLTHROUGH*/
-
- case EOB_ACT_END_OF_FILE:
- {
- if ( runes_parser_yywrap(yyscanner ) )
- return EOF;
-
- if ( ! yyg->yy_did_buffer_switch_on_eof )
- YY_NEW_FILE;
-#ifdef __cplusplus
- return yyinput(yyscanner);
-#else
- return input(yyscanner);
-#endif
- }
-
- case EOB_ACT_CONTINUE_SCAN:
- yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
- break;
- }
- }
- }
-
- c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */
- *yyg->yy_c_buf_p = '\0'; /* preserve yytext */
- yyg->yy_hold_char = *++yyg->yy_c_buf_p;
-
- return c;
-}
-#endif /* ifndef YY_NO_INPUT */
-
-/** Immediately switch to a different input stream.
- * @param input_file A readable stream.
- * @param yyscanner The scanner object.
- * @note This function does not reset the start condition to @c INITIAL .
- */
- void runes_parser_yyrestart (FILE * input_file , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- if ( ! YY_CURRENT_BUFFER ){
- runes_parser_yyensure_buffer_stack (yyscanner);
- YY_CURRENT_BUFFER_LVALUE =
- runes_parser_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
- }
-
- runes_parser_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
- runes_parser_yy_load_buffer_state(yyscanner );
-}
-
-/** Switch to a different input buffer.
- * @param new_buffer The new input buffer.
- * @param yyscanner The scanner object.
- */
- void runes_parser_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- /* TODO. We should be able to replace this entire function body
- * with
- * runes_parser_yypop_buffer_state();
- * runes_parser_yypush_buffer_state(new_buffer);
- */
- runes_parser_yyensure_buffer_stack (yyscanner);
- if ( YY_CURRENT_BUFFER == new_buffer )
- return;
-
- if ( YY_CURRENT_BUFFER )
- {
- /* Flush out information for old buffer. */
- *yyg->yy_c_buf_p = yyg->yy_hold_char;
- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
- }
-
- YY_CURRENT_BUFFER_LVALUE = new_buffer;
- runes_parser_yy_load_buffer_state(yyscanner );
-
- /* We don't actually know whether we did this switch during
- * EOF (runes_parser_yywrap()) processing, but the only time this flag
- * is looked at is after runes_parser_yywrap() is called, so it's safe
- * to go ahead and always set it.
- */
- yyg->yy_did_buffer_switch_on_eof = 1;
-}
-
-static void runes_parser_yy_load_buffer_state (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
- yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
- yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
- yyg->yy_hold_char = *yyg->yy_c_buf_p;
-}
-
-/** Allocate and initialize an input buffer state.
- * @param file A readable stream.
- * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
- * @param yyscanner The scanner object.
- * @return the allocated buffer state.
- */
- YY_BUFFER_STATE runes_parser_yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)
-{
- YY_BUFFER_STATE b;
-
- b = (YY_BUFFER_STATE) runes_parser_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in runes_parser_yy_create_buffer()" );
-
- b->yy_buf_size = size;
-
- /* yy_ch_buf has to be 2 characters longer than the size given because
- * we need to put in 2 end-of-buffer characters.
- */
- b->yy_ch_buf = (char *) runes_parser_yyalloc(b->yy_buf_size + 2 ,yyscanner );
- if ( ! b->yy_ch_buf )
- YY_FATAL_ERROR( "out of dynamic memory in runes_parser_yy_create_buffer()" );
-
- b->yy_is_our_buffer = 1;
-
- runes_parser_yy_init_buffer(b,file ,yyscanner);
-
- return b;
-}
-
-/** Destroy the buffer.
- * @param b a buffer created with runes_parser_yy_create_buffer()
- * @param yyscanner The scanner object.
- */
- void runes_parser_yy_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- if ( ! b )
- return;
-
- if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
- YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
-
- if ( b->yy_is_our_buffer )
- runes_parser_yyfree((void *) b->yy_ch_buf ,yyscanner );
-
- runes_parser_yyfree((void *) b ,yyscanner );
-}
-
-/* Initializes or reinitializes a buffer.
- * This function is sometimes called more than once on the same buffer,
- * such as during a runes_parser_yyrestart() or at EOF.
- */
- static void runes_parser_yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner)
-
-{
- int oerrno = errno;
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- runes_parser_yy_flush_buffer(b ,yyscanner);
-
- b->yy_input_file = file;
- b->yy_fill_buffer = 1;
-
- /* If b is the current buffer, then runes_parser_yy_init_buffer was _probably_
- * called from runes_parser_yyrestart() or through yy_get_next_buffer.
- * In that case, we don't want to reset the lineno or column.
- */
- if (b != YY_CURRENT_BUFFER){
- b->yy_bs_lineno = 1;
- b->yy_bs_column = 0;
- }
-
- b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-
- errno = oerrno;
-}
-
-/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
- * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
- * @param yyscanner The scanner object.
- */
- void runes_parser_yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- if ( ! b )
- return;
-
- b->yy_n_chars = 0;
-
- /* We always need two end-of-buffer characters. The first causes
- * a transition to the end-of-buffer state. The second causes
- * a jam in that state.
- */
- b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
- b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
-
- b->yy_buf_pos = &b->yy_ch_buf[0];
-
- b->yy_at_bol = 1;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- if ( b == YY_CURRENT_BUFFER )
- runes_parser_yy_load_buffer_state(yyscanner );
-}
-
-/** Pushes the new state onto the stack. The new state becomes
- * the current state. This function will allocate the stack
- * if necessary.
- * @param new_buffer The new state.
- * @param yyscanner The scanner object.
- */
-void runes_parser_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- if (new_buffer == NULL)
- return;
-
- runes_parser_yyensure_buffer_stack(yyscanner);
-
- /* This block is copied from runes_parser_yy_switch_to_buffer. */
- if ( YY_CURRENT_BUFFER )
- {
- /* Flush out information for old buffer. */
- *yyg->yy_c_buf_p = yyg->yy_hold_char;
- YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
- YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
- }
-
- /* Only push if top exists. Otherwise, replace top. */
- if (YY_CURRENT_BUFFER)
- yyg->yy_buffer_stack_top++;
- YY_CURRENT_BUFFER_LVALUE = new_buffer;
-
- /* copied from runes_parser_yy_switch_to_buffer. */
- runes_parser_yy_load_buffer_state(yyscanner );
- yyg->yy_did_buffer_switch_on_eof = 1;
-}
-
-/** Removes and deletes the top of the stack, if present.
- * The next element becomes the new top.
- * @param yyscanner The scanner object.
- */
-void runes_parser_yypop_buffer_state (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- if (!YY_CURRENT_BUFFER)
- return;
-
- runes_parser_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner);
- YY_CURRENT_BUFFER_LVALUE = NULL;
- if (yyg->yy_buffer_stack_top > 0)
- --yyg->yy_buffer_stack_top;
-
- if (YY_CURRENT_BUFFER) {
- runes_parser_yy_load_buffer_state(yyscanner );
- yyg->yy_did_buffer_switch_on_eof = 1;
- }
-}
-
-/* Allocates the stack if it does not exist.
- * Guarantees space for at least one push.
- */
-static void runes_parser_yyensure_buffer_stack (yyscan_t yyscanner)
-{
- yy_size_t num_to_alloc;
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- if (!yyg->yy_buffer_stack) {
-
- /* First allocation is just for 2 elements, since we don't know if this
- * scanner will even need a stack. We use 2 instead of 1 to avoid an
- * immediate realloc on the next call.
- */
- num_to_alloc = 1;
- yyg->yy_buffer_stack = (struct yy_buffer_state**)runes_parser_yyalloc
- (num_to_alloc * sizeof(struct yy_buffer_state*)
- , yyscanner);
- if ( ! yyg->yy_buffer_stack )
- YY_FATAL_ERROR( "out of dynamic memory in runes_parser_yyensure_buffer_stack()" );
-
- memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));
-
- yyg->yy_buffer_stack_max = num_to_alloc;
- yyg->yy_buffer_stack_top = 0;
- return;
- }
-
- if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
-
- /* Increase the buffer to prepare for a possible push. */
- int grow_size = 8 /* arbitrary grow size */;
-
- num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
- yyg->yy_buffer_stack = (struct yy_buffer_state**)runes_parser_yyrealloc
- (yyg->yy_buffer_stack,
- num_to_alloc * sizeof(struct yy_buffer_state*)
- , yyscanner);
- if ( ! yyg->yy_buffer_stack )
- YY_FATAL_ERROR( "out of dynamic memory in runes_parser_yyensure_buffer_stack()" );
-
- /* zero only the new slots.*/
- memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
- yyg->yy_buffer_stack_max = num_to_alloc;
- }
-}
-
-/** Setup the input buffer state to scan directly from a user-specified character buffer.
- * @param base the character buffer
- * @param size the size in bytes of the character buffer
- * @param yyscanner The scanner object.
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE runes_parser_yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)
-{
- YY_BUFFER_STATE b;
-
- if ( size < 2 ||
- base[size-2] != YY_END_OF_BUFFER_CHAR ||
- base[size-1] != YY_END_OF_BUFFER_CHAR )
- /* They forgot to leave room for the EOB's. */
- return 0;
-
- b = (YY_BUFFER_STATE) runes_parser_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
- if ( ! b )
- YY_FATAL_ERROR( "out of dynamic memory in runes_parser_yy_scan_buffer()" );
-
- b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */
- b->yy_buf_pos = b->yy_ch_buf = base;
- b->yy_is_our_buffer = 0;
- b->yy_input_file = 0;
- b->yy_n_chars = b->yy_buf_size;
- b->yy_is_interactive = 0;
- b->yy_at_bol = 1;
- b->yy_fill_buffer = 0;
- b->yy_buffer_status = YY_BUFFER_NEW;
-
- runes_parser_yy_switch_to_buffer(b ,yyscanner );
-
- return b;
-}
-
-/** Setup the input buffer state to scan a string. The next call to runes_parser_yylex() will
- * scan from a @e copy of @a str.
- * @param yystr a NUL-terminated string to scan
- * @param yyscanner The scanner object.
- * @return the newly allocated buffer state object.
- * @note If you want to scan bytes that may contain NUL values, then use
- * runes_parser_yy_scan_bytes() instead.
- */
-YY_BUFFER_STATE runes_parser_yy_scan_string (yyconst char * yystr , yyscan_t yyscanner)
-{
-
- return runes_parser_yy_scan_bytes(yystr,strlen(yystr) ,yyscanner);
-}
-
-/** Setup the input buffer state to scan the given bytes. The next call to runes_parser_yylex() will
- * scan from a @e copy of @a bytes.
- * @param yybytes the byte buffer to scan
- * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
- * @param yyscanner The scanner object.
- * @return the newly allocated buffer state object.
- */
-YY_BUFFER_STATE runes_parser_yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len , yyscan_t yyscanner)
-{
- YY_BUFFER_STATE b;
- char *buf;
- yy_size_t n;
- yy_size_t i;
-
- /* Get memory for full buffer, including space for trailing EOB's. */
- n = _yybytes_len + 2;
- buf = (char *) runes_parser_yyalloc(n ,yyscanner );
- if ( ! buf )
- YY_FATAL_ERROR( "out of dynamic memory in runes_parser_yy_scan_bytes()" );
-
- for ( i = 0; i < _yybytes_len; ++i )
- buf[i] = yybytes[i];
-
- buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
-
- b = runes_parser_yy_scan_buffer(buf,n ,yyscanner);
- if ( ! b )
- YY_FATAL_ERROR( "bad buffer in runes_parser_yy_scan_bytes()" );
-
- /* It's okay to grow etc. this buffer, and we should throw it
- * away when we're done.
- */
- b->yy_is_our_buffer = 1;
-
- return b;
-}
-
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
-
-static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
-{
- (void) fprintf( stderr, "%s\n", msg );
- exit( YY_EXIT_FAILURE );
-}
-
-/* Redefine yyless() so it works in section 3 code. */
-
-#undef yyless
-#define yyless(n) \
- do \
- { \
- /* Undo effects of setting up yytext. */ \
- int yyless_macro_arg = (n); \
- YY_LESS_LINENO(yyless_macro_arg);\
- yytext[yyleng] = yyg->yy_hold_char; \
- yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
- yyg->yy_hold_char = *yyg->yy_c_buf_p; \
- *yyg->yy_c_buf_p = '\0'; \
- yyleng = yyless_macro_arg; \
- } \
- while ( 0 )
-
-/* Accessor methods (get/set functions) to struct members. */
-
-/** Get the user-defined data for this scanner.
- * @param yyscanner The scanner object.
- */
-YY_EXTRA_TYPE runes_parser_yyget_extra (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- return yyextra;
-}
-
-/** Get the current line number.
- * @param yyscanner The scanner object.
- */
-int runes_parser_yyget_lineno (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- if (! YY_CURRENT_BUFFER)
- return 0;
-
- return yylineno;
-}
-
-/** Get the current column number.
- * @param yyscanner The scanner object.
- */
-int runes_parser_yyget_column (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- if (! YY_CURRENT_BUFFER)
- return 0;
-
- return yycolumn;
-}
-
-/** Get the input stream.
- * @param yyscanner The scanner object.
- */
-FILE *runes_parser_yyget_in (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- return yyin;
-}
-
-/** Get the output stream.
- * @param yyscanner The scanner object.
- */
-FILE *runes_parser_yyget_out (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- return yyout;
-}
-
-/** Get the length of the current token.
- * @param yyscanner The scanner object.
- */
-yy_size_t runes_parser_yyget_leng (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- return yyleng;
-}
-
-/** Get the current token.
- * @param yyscanner The scanner object.
- */
-
-char *runes_parser_yyget_text (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- return yytext;
-}
-
-/** Set the user-defined data. This data is never touched by the scanner.
- * @param user_defined The data to be associated with this scanner.
- * @param yyscanner The scanner object.
- */
-void runes_parser_yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- yyextra = user_defined ;
-}
-
-/** Set the current line number.
- * @param line_number
- * @param yyscanner The scanner object.
- */
-void runes_parser_yyset_lineno (int line_number , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- /* lineno is only valid if an input buffer exists. */
- if (! YY_CURRENT_BUFFER )
- YY_FATAL_ERROR( "runes_parser_yyset_lineno called with no buffer" );
-
- yylineno = line_number;
-}
-
-/** Set the current column.
- * @param line_number
- * @param yyscanner The scanner object.
- */
-void runes_parser_yyset_column (int column_no , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- /* column is only valid if an input buffer exists. */
- if (! YY_CURRENT_BUFFER )
- YY_FATAL_ERROR( "runes_parser_yyset_column called with no buffer" );
-
- yycolumn = column_no;
-}
-
-/** Set the input stream. This does not discard the current
- * input buffer.
- * @param in_str A readable stream.
- * @param yyscanner The scanner object.
- * @see runes_parser_yy_switch_to_buffer
- */
-void runes_parser_yyset_in (FILE * in_str , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- yyin = in_str ;
-}
-
-void runes_parser_yyset_out (FILE * out_str , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- yyout = out_str ;
-}
-
-int runes_parser_yyget_debug (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- return yy_flex_debug;
-}
-
-void runes_parser_yyset_debug (int bdebug , yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- yy_flex_debug = bdebug ;
-}
-
-/* Accessor methods for yylval and yylloc */
-
-/* User-visible API */
-
-/* runes_parser_yylex_init is special because it creates the scanner itself, so it is
- * the ONLY reentrant function that doesn't take the scanner as the last argument.
- * That's why we explicitly handle the declaration, instead of using our macros.
- */
-
-int runes_parser_yylex_init(yyscan_t* ptr_yy_globals)
-
-{
- if (ptr_yy_globals == NULL){
- errno = EINVAL;
- return 1;
- }
-
- *ptr_yy_globals = (yyscan_t) runes_parser_yyalloc ( sizeof( struct yyguts_t ), NULL );
-
- if (*ptr_yy_globals == NULL){
- errno = ENOMEM;
- return 1;
- }
-
- /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */
- memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
-
- return yy_init_globals ( *ptr_yy_globals );
-}
-
-/* runes_parser_yylex_init_extra has the same functionality as runes_parser_yylex_init, but follows the
- * convention of taking the scanner as the last argument. Note however, that
- * this is a *pointer* to a scanner, as it will be allocated by this call (and
- * is the reason, too, why this function also must handle its own declaration).
- * The user defined value in the first argument will be available to runes_parser_yyalloc in
- * the yyextra field.
- */
-
-int runes_parser_yylex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals )
-
-{
- struct yyguts_t dummy_yyguts;
-
- runes_parser_yyset_extra (yy_user_defined, &dummy_yyguts);
-
- if (ptr_yy_globals == NULL){
- errno = EINVAL;
- return 1;
- }
-
- *ptr_yy_globals = (yyscan_t) runes_parser_yyalloc ( sizeof( struct yyguts_t ), &dummy_yyguts );
-
- if (*ptr_yy_globals == NULL){
- errno = ENOMEM;
- return 1;
- }
-
- /* By setting to 0xAA, we expose bugs in
- yy_init_globals. Leave at 0x00 for releases. */
- memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));
-
- runes_parser_yyset_extra (yy_user_defined, *ptr_yy_globals);
-
- return yy_init_globals ( *ptr_yy_globals );
-}
-
-static int yy_init_globals (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
- /* Initialization is the same as for the non-reentrant scanner.
- * This function is called from runes_parser_yylex_destroy(), so don't allocate here.
- */
-
- yyg->yy_buffer_stack = 0;
- yyg->yy_buffer_stack_top = 0;
- yyg->yy_buffer_stack_max = 0;
- yyg->yy_c_buf_p = (char *) 0;
- yyg->yy_init = 0;
- yyg->yy_start = 0;
-
- yyg->yy_start_stack_ptr = 0;
- yyg->yy_start_stack_depth = 0;
- yyg->yy_start_stack = NULL;
-
-/* Defined in main.c */
-#ifdef YY_STDINIT
- yyin = stdin;
- yyout = stdout;
-#else
- yyin = (FILE *) 0;
- yyout = (FILE *) 0;
-#endif
-
- /* For future reference: Set errno on error, since we are called by
- * runes_parser_yylex_init()
- */
- return 0;
-}
-
-/* runes_parser_yylex_destroy is for both reentrant and non-reentrant scanners. */
-int runes_parser_yylex_destroy (yyscan_t yyscanner)
-{
- struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-
- /* Pop the buffer stack, destroying each element. */
- while(YY_CURRENT_BUFFER){
- runes_parser_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
- YY_CURRENT_BUFFER_LVALUE = NULL;
- runes_parser_yypop_buffer_state(yyscanner);
- }
-
- /* Destroy the stack itself. */
- runes_parser_yyfree(yyg->yy_buffer_stack ,yyscanner);
- yyg->yy_buffer_stack = NULL;
-
- /* Destroy the start condition stack. */
- runes_parser_yyfree(yyg->yy_start_stack ,yyscanner );
- yyg->yy_start_stack = NULL;
-
- /* Reset the globals. This is important in a non-reentrant scanner so the next time
- * runes_parser_yylex() is called, initialization will occur. */
- yy_init_globals( yyscanner);
-
- /* Destroy the main struct (reentrant only). */
- runes_parser_yyfree ( yyscanner , yyscanner );
- yyscanner = NULL;
- return 0;
-}
-
-/*
- * Internal utility routines.
- */
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
-{
- register int i;
- for ( i = 0; i < n; ++i )
- s1[i] = s2[i];
-}
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
-{
- register int n;
- for ( n = 0; s[n]; ++n )
- ;
-
- return n;
-}
-#endif
-
-#define YYTABLES_NAME "yytables"
-
-#line 224 "src/parser.l"
-
-
-
-static void runes_parser_handle_bel(RunesTerm *t)
-{
- if (t->config.audible_bell) {
- runes_screen_audible_bell(t);
- }
- else {
- runes_screen_visual_bell(t);
- }
-}
-
-static void runes_parser_handle_bs(RunesTerm *t)
-{
- runes_screen_move_to(t, t->scr.grid->cur.row, t->scr.grid->cur.col - 1);
-}
-
-static void runes_parser_handle_tab(RunesTerm *t)
-{
- runes_screen_move_to(
- t, t->scr.grid->cur.row,
- t->scr.grid->cur.col - (t->scr.grid->cur.col % 8) + 8);
-}
-
-static void runes_parser_handle_lf(RunesTerm *t)
-{
- runes_screen_move_to(t, t->scr.grid->cur.row + 1, t->scr.grid->cur.col);
-}
-
-static void runes_parser_handle_cr(RunesTerm *t)
-{
- runes_screen_move_to(t, t->scr.grid->cur.row, 0);
-}
-
-static void runes_parser_handle_deckpam(RunesTerm *t)
-{
- runes_screen_set_application_keypad(t);
-}
-
-static void runes_parser_handle_deckpnm(RunesTerm *t)
-{
- runes_screen_reset_application_keypad(t);
-}
-
-static void runes_parser_handle_ri(RunesTerm *t)
-{
- runes_screen_move_to(t, t->scr.grid->cur.row - 1, t->scr.grid->cur.col);
-}
-
-static void runes_parser_handle_ris(RunesTerm *t)
-{
- runes_screen_use_normal_buffer(t);
- runes_screen_set_scroll_region(
- t, 0, t->scr.grid->max.row - 1, 0, t->scr.grid->max.col - 1);
- runes_screen_clear_screen(t);
- runes_screen_save_cursor(t);
- runes_screen_reset_text_attributes(t);
- runes_screen_show_cursor(t);
- runes_screen_reset_application_keypad(t);
- runes_screen_reset_application_cursor(t);
- runes_screen_reset_mouse_reporting_press(t);
- runes_screen_reset_mouse_reporting_press_release(t);
-}
-
-static void runes_parser_handle_vb(RunesTerm *t)
-{
- runes_screen_visual_bell(t);
-}
-
-static void runes_parser_handle_decsc(RunesTerm *t)
-{
- runes_screen_save_cursor(t);
-}
-
-static void runes_parser_handle_decrc(RunesTerm *t)
-{
- runes_screen_restore_cursor(t);
-}
-
-static void runes_parser_extract_csi_params(
- char *buf, size_t len, int *params, int *nparams)
-{
- runes_parser_extract_sm_params(buf, len, NULL, params, nparams);
-}
-
-static void runes_parser_extract_sm_params(
- char *buf, size_t len, char *modes, int *params, int *nparams)
-{
- char *pos = buf;
-
- /* this assumes that it will only ever be called on a fully matched CSI
- * sequence: accessing one character beyond the end is safe because CSI
- * sequences always have one character after the parameters (to determine
- * the type of sequence), and the parameters can only ever be digits,
- * separated by semicolons. */
- buf[len] = '\0';
- *nparams = 0;
- while ((size_t)(pos - buf) < len) {
- if (*nparams >= RUNES_PARSER_CSI_MAX_PARAMS) {
- runes_warn("max CSI parameter length exceeded\n");
- break;
- }
-
- if (modes && (size_t)(pos - buf) < len) {
- if (strspn(pos, "0123456789")) {
- modes[*nparams] = '\0';
- }
- else {
- modes[*nparams] = *pos++;
- }
- }
-
- params[(*nparams)++] = atoi(pos);
-
- pos = strchr(pos, ';');
- if (pos) {
- pos++;
- }
- else {
- break;
- }
- }
-}
-
-static void runes_parser_handle_ich(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_insert_characters(t, params[0]);
-}
-
-static void runes_parser_handle_cuu(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_move_to(
- t, t->scr.grid->cur.row - params[0], t->scr.grid->cur.col);
-}
-
-static void runes_parser_handle_cud(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_move_to(
- t, t->scr.grid->cur.row + params[0], t->scr.grid->cur.col);
-}
-
-static void runes_parser_handle_cuf(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_move_to(
- t, t->scr.grid->cur.row, t->scr.grid->cur.col + params[0]);
-}
-
-static void runes_parser_handle_cub(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_move_to(
- t, t->scr.grid->cur.row, t->scr.grid->cur.col - params[0]);
-}
-
-static void runes_parser_handle_cup(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 0, 0 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- if (params[0] == 0) {
- params[0] = 1;
- }
- if (params[1] == 0) {
- params[1] = 1;
- }
- runes_screen_move_to(t, params[0] - 1, params[1] - 1);
-}
-
-static void runes_parser_handle_ed(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 0 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- switch (params[0]) {
- case 0:
- runes_screen_clear_screen_forward(t);
- break;
- case 1:
- runes_screen_clear_screen_backward(t);
- break;
- case 2:
- runes_screen_clear_screen(t);
- break;
- default:
- runes_warn("unknown ED parameter %d\n", params[0]);
- break;
- }
-}
-
-static void runes_parser_handle_el(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 0 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- switch (params[0]) {
- case 0:
- runes_screen_kill_line_forward(t);
- break;
- case 1:
- runes_screen_kill_line_backward(t);
- break;
- case 2:
- runes_screen_kill_line(t);
- break;
- default:
- runes_warn("unknown EL parameter %d\n", params[0]);
- break;
- }
-}
-
-static void runes_parser_handle_il(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_insert_lines(t, params[0]);
- runes_screen_move_to(t, t->scr.grid->cur.row, 0);
-}
-
-static void runes_parser_handle_dl(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_delete_lines(t, params[0]);
- runes_screen_move_to(t, t->scr.grid->cur.row, 0);
-}
-
-static void runes_parser_handle_dch(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_delete_characters(t, params[0]);
-}
-
-static void runes_parser_handle_sm(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS], nparams, i;
- char modes[RUNES_PARSER_CSI_MAX_PARAMS] = { 0 };
-
- runes_parser_extract_sm_params(buf + 2, len - 3, modes, params, &nparams);
- for (i = 0; i < nparams; ++i) {
- switch (modes[i]) {
- case 0:
- switch (params[i]) {
- case 34:
- /* do nothing, no idea what this is even for */
- break;
- default:
- runes_warn("unknown SM parameter: %d\n", params[i]);
- break;
- }
- break;
- case '?':
- switch (params[i]) {
- case 1:
- runes_screen_set_application_cursor(t);
- break;
- case 9:
- runes_screen_set_mouse_reporting_press(t);
- break;
- case 25:
- runes_screen_show_cursor(t);
- break;
- case 1000:
- runes_screen_set_mouse_reporting_press_release(t);
- break;
- case 47:
- case 1049:
- runes_screen_use_alternate_buffer(t);
- break;
- case 2004:
- runes_screen_set_bracketed_paste(t);
- break;
- default:
- runes_warn(
- "unknown SM parameter: %c%d\n", modes[i], params[i]);
- break;
- }
- break;
- default:
- runes_warn("unknown SM parameter: %c%d\n", modes[i], params[i]);
- break;
- }
- }
-}
-
-static void runes_parser_handle_rm(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS], nparams, i;
- char modes[RUNES_PARSER_CSI_MAX_PARAMS] = { 0 };
-
- runes_parser_extract_sm_params(buf + 2, len - 3, modes, params, &nparams);
- for (i = 0; i < nparams; ++i) {
- switch (modes[i]) {
- case 0:
- switch (params[i]) {
- case 34:
- /* do nothing, no idea what this is even for */
- break;
- default:
- runes_warn("unknown RM parameter: %d\n", params[i]);
- break;
- }
- break;
- case '?':
- switch (params[i]) {
- case 1:
- runes_screen_set_application_cursor(t);
- break;
- case 9:
- runes_screen_set_mouse_reporting_press(t);
- break;
- case 25:
- runes_screen_hide_cursor(t);
- break;
- case 1000:
- runes_screen_set_mouse_reporting_press_release(t);
- break;
- case 47:
- case 1049:
- runes_screen_use_normal_buffer(t);
- break;
- case 2004:
- runes_screen_reset_bracketed_paste(t);
- break;
- default:
- runes_warn(
- "unknown RM parameter: %c%d\n", modes[i], params[i]);
- break;
- }
- break;
- default:
- runes_warn("unknown RM parameter: %c%d\n", modes[i], params[i]);
- break;
- }
- }
-}
-
-static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 0 }, nparams, i;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- if (nparams < 1) {
- nparams = 1;
- }
- for (i = 0; i < nparams; ++i) {
- switch (params[i]) {
- case 0:
- runes_screen_reset_text_attributes(t);
- break;
- case 1:
- runes_screen_set_bold(t);
- break;
- case 3:
- runes_screen_set_italic(t);
- break;
- case 4:
- runes_screen_set_underline(t);
- break;
- case 7:
- runes_screen_set_inverse(t);
- break;
- case 22:
- runes_screen_reset_bold(t);
- break;
- case 23:
- runes_screen_reset_italic(t);
- break;
- case 24:
- runes_screen_reset_underline(t);
- break;
- case 27:
- runes_screen_reset_inverse(t);
- break;
- case 30: case 31: case 32: case 33:
- case 34: case 35: case 36: case 37:
- runes_screen_set_fg_color(t, params[i] - 30);
- break;
- case 38: {
- i++;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d (too few parameters)\n",
- params[i - 1]);
- break;
- }
-
- switch (params[i]) {
- case 2:
- i += 3;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d;%d (too few parameters)\n",
- params[i - 4], params[i - 3]);
- break;
- }
- runes_screen_set_fg_color_rgb(
- t, params[i - 2], params[i - 1], params[i]);
- break;
- case 5:
- i++;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d;%d (too few parameters)\n",
- params[i - 2], params[i - 1]);
- break;
- }
- runes_screen_set_fg_color(t, params[i]);
- break;
- default:
- i++;
- runes_warn(
- "unknown SGR parameter: %d;%d\n",
- params[i - 2], params[i - 1]);
- break;
- }
- break;
- }
- case 39:
- runes_screen_reset_fg_color(t);
- break;
- case 40: case 41: case 42: case 43:
- case 44: case 45: case 46: case 47:
- runes_screen_set_bg_color(t, params[i] - 40);
- break;
- case 48: {
- i++;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d (too few parameters)\n",
- params[i - 1]);
- break;
- }
-
- switch (params[i]) {
- case 2:
- i += 3;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d;%d (too few parameters)\n",
- params[i - 4], params[i - 3]);
- break;
- }
- runes_screen_set_bg_color_rgb(
- t, params[i - 2], params[i - 1], params[i]);
- break;
- case 5:
- i++;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d;%d (too few parameters)\n",
- params[i - 2], params[i - 1]);
- break;
- }
- runes_screen_set_bg_color(t, params[i]);
- break;
- default:
- i++;
- runes_warn(
- "unknown SGR parameter: %d;%d\n",
- params[i - 2], params[i - 1]);
- break;
- }
- break;
- }
- case 49:
- runes_screen_reset_bg_color(t);
- break;
- case 90: case 91: case 92: case 93:
- case 94: case 95: case 96: case 97:
- runes_screen_set_fg_color(t, params[i] - 82);
- break;
- case 100: case 101: case 102: case 103:
- case 104: case 105: case 106: case 107:
- runes_screen_set_bg_color(t, params[i] - 92);
- break;
- default:
- runes_warn("unknown SGR parameter: %d\n", params[i]);
- break;
- }
- }
-}
-
-static void runes_parser_handle_csr(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = {
- 1, t->scr.grid->max.row, 1, t->scr.grid->max.col };
- int nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
-
- runes_screen_set_scroll_region(
- t, params[0] - 1, params[1] - 1, params[2] - 1, params[3] - 1);
-}
-
-static void runes_parser_handle_decsed(RunesTerm *t, char *buf, size_t len)
-{
- /* XXX not quite correct, but i don't think programs really use anything
- * that would show a difference */
- runes_parser_handle_ed(t, buf, len);
-}
-
-static void runes_parser_handle_decsel(RunesTerm *t, char *buf, size_t len)
-{
- /* XXX not quite correct, but i don't think programs really use anything
- * that would show a difference */
- runes_parser_handle_el(t, buf, len);
-}
-
-static void runes_parser_handle_osc0(RunesTerm *t, char *buf, size_t len)
-{
- runes_screen_set_icon_name(t, buf + 4, len - 5);
- runes_screen_set_window_title(t, buf + 4, len - 5);
-}
-
-static void runes_parser_handle_osc1(RunesTerm *t, char *buf, size_t len)
-{
- runes_screen_set_icon_name(t, buf + 4, len - 5);
-}
-
-static void runes_parser_handle_osc2(RunesTerm *t, char *buf, size_t len)
-{
- runes_screen_set_window_title(t, buf + 4, len - 5);
-}
-
-static void runes_parser_handle_ascii(RunesTerm *t, char *text, size_t len)
-{
- runes_screen_show_string_ascii(t, text, len);
-}
-
-static void runes_parser_handle_text(RunesTerm *t, char *text, size_t len)
-{
- runes_screen_show_string_utf8(t, text, len);
-}
-
-/* XXX these are copied from the generated file so that I can add the UNUSED
- * declarations, otherwise we get compilation errors */
-void *runes_parser_yyalloc(yy_size_t size, yyscan_t yyscanner)
-{
- UNUSED(yyscanner);
- return (void *)malloc(size);
-}
-
-void *runes_parser_yyrealloc(void *ptr, yy_size_t size, yyscan_t yyscanner)
-{
- UNUSED(yyscanner);
- return (void *)realloc((char *)ptr, size);
-}
-
-void runes_parser_yyfree(void *ptr, yyscan_t yyscanner)
-{
- UNUSED(yyscanner);
- free((char *) ptr);
-}
-
diff --git a/src/parser.h b/src/parser.h
deleted file mode 100644
index 4f7399d..0000000
--- a/src/parser.h
+++ /dev/null
@@ -1,338 +0,0 @@
-#ifndef runes_parser_yyHEADER_H
-#define runes_parser_yyHEADER_H 1
-#define runes_parser_yyIN_HEADER 1
-
-#line 6 "src/parser.h"
-
-#line 8 "src/parser.h"
-
-#define YY_INT_ALIGNED short int
-
-/* A lexical scanner generated by flex */
-
-#define FLEX_SCANNER
-#define YY_FLEX_MAJOR_VERSION 2
-#define YY_FLEX_MINOR_VERSION 5
-#define YY_FLEX_SUBMINOR_VERSION 39
-#if YY_FLEX_SUBMINOR_VERSION > 0
-#define FLEX_BETA
-#endif
-
-/* First, we deal with platform-specific or compiler-specific issues. */
-
-/* begin standard C headers. */
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <stdlib.h>
-
-/* end standard C headers. */
-
-/* flex integer type definitions */
-
-#ifndef FLEXINT_H
-#define FLEXINT_H
-
-/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
-
-#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-
-/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
- * if you want the limit (max/min) macros for int types.
- */
-#ifndef __STDC_LIMIT_MACROS
-#define __STDC_LIMIT_MACROS 1
-#endif
-
-#include <inttypes.h>
-typedef int8_t flex_int8_t;
-typedef uint8_t flex_uint8_t;
-typedef int16_t flex_int16_t;
-typedef uint16_t flex_uint16_t;
-typedef int32_t flex_int32_t;
-typedef uint32_t flex_uint32_t;
-#else
-typedef signed char flex_int8_t;
-typedef short int flex_int16_t;
-typedef int flex_int32_t;
-typedef unsigned char flex_uint8_t;
-typedef unsigned short int flex_uint16_t;
-typedef unsigned int flex_uint32_t;
-
-/* Limits of integral types. */
-#ifndef INT8_MIN
-#define INT8_MIN (-128)
-#endif
-#ifndef INT16_MIN
-#define INT16_MIN (-32767-1)
-#endif
-#ifndef INT32_MIN
-#define INT32_MIN (-2147483647-1)
-#endif
-#ifndef INT8_MAX
-#define INT8_MAX (127)
-#endif
-#ifndef INT16_MAX
-#define INT16_MAX (32767)
-#endif
-#ifndef INT32_MAX
-#define INT32_MAX (2147483647)
-#endif
-#ifndef UINT8_MAX
-#define UINT8_MAX (255U)
-#endif
-#ifndef UINT16_MAX
-#define UINT16_MAX (65535U)
-#endif
-#ifndef UINT32_MAX
-#define UINT32_MAX (4294967295U)
-#endif
-
-#endif /* ! C99 */
-
-#endif /* ! FLEXINT_H */
-
-#ifdef __cplusplus
-
-/* The "const" storage-class-modifier is valid. */
-#define YY_USE_CONST
-
-#else /* ! __cplusplus */
-
-/* C99 requires __STDC__ to be defined as 1. */
-#if defined (__STDC__)
-
-#define YY_USE_CONST
-
-#endif /* defined (__STDC__) */
-#endif /* ! __cplusplus */
-
-#ifdef YY_USE_CONST
-#define yyconst const
-#else
-#define yyconst
-#endif
-
-/* An opaque pointer. */
-#ifndef YY_TYPEDEF_YY_SCANNER_T
-#define YY_TYPEDEF_YY_SCANNER_T
-typedef void* yyscan_t;
-#endif
-
-/* For convenience, these vars (plus the bison vars far below)
- are macros in the reentrant scanner. */
-#define yyin yyg->yyin_r
-#define yyout yyg->yyout_r
-#define yyextra yyg->yyextra_r
-#define yyleng yyg->yyleng_r
-#define yytext yyg->yytext_r
-#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
-#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
-#define yy_flex_debug yyg->yy_flex_debug_r
-
-/* Size of default input buffer. */
-#ifndef YY_BUF_SIZE
-#define YY_BUF_SIZE 16384
-#endif
-
-#ifndef YY_TYPEDEF_YY_BUFFER_STATE
-#define YY_TYPEDEF_YY_BUFFER_STATE
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-#endif
-
-#ifndef YY_TYPEDEF_YY_SIZE_T
-#define YY_TYPEDEF_YY_SIZE_T
-typedef size_t yy_size_t;
-#endif
-
-#ifndef YY_STRUCT_YY_BUFFER_STATE
-#define YY_STRUCT_YY_BUFFER_STATE
-struct yy_buffer_state
- {
- FILE *yy_input_file;
-
- char *yy_ch_buf; /* input buffer */
- char *yy_buf_pos; /* current position in input buffer */
-
- /* Size of input buffer in bytes, not including room for EOB
- * characters.
- */
- yy_size_t yy_buf_size;
-
- /* Number of characters read into yy_ch_buf, not including EOB
- * characters.
- */
- yy_size_t yy_n_chars;
-
- /* Whether we "own" the buffer - i.e., we know we created it,
- * and can realloc() it to grow it, and should free() it to
- * delete it.
- */
- int yy_is_our_buffer;
-
- /* Whether this is an "interactive" input source; if so, and
- * if we're using stdio for input, then we want to use getc()
- * instead of fread(), to make sure we stop fetching input after
- * each newline.
- */
- int yy_is_interactive;
-
- /* Whether we're considered to be at the beginning of a line.
- * If so, '^' rules will be active on the next match, otherwise
- * not.
- */
- int yy_at_bol;
-
- int yy_bs_lineno; /**< The line count. */
- int yy_bs_column; /**< The column count. */
-
- /* Whether to try to fill the input buffer when we reach the
- * end of it.
- */
- int yy_fill_buffer;
-
- int yy_buffer_status;
-
- };
-#endif /* !YY_STRUCT_YY_BUFFER_STATE */
-
-void runes_parser_yyrestart (FILE *input_file ,yyscan_t yyscanner );
-void runes_parser_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
-YY_BUFFER_STATE runes_parser_yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner );
-void runes_parser_yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
-void runes_parser_yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
-void runes_parser_yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
-void runes_parser_yypop_buffer_state (yyscan_t yyscanner );
-
-YY_BUFFER_STATE runes_parser_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
-YY_BUFFER_STATE runes_parser_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
-YY_BUFFER_STATE runes_parser_yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );
-
-void *runes_parser_yyalloc (yy_size_t ,yyscan_t yyscanner );
-void *runes_parser_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );
-void runes_parser_yyfree (void * ,yyscan_t yyscanner );
-
-/* Begin user sect3 */
-
-#define runes_parser_yywrap(yyscanner) 1
-#define YY_SKIP_YYWRAP
-
-#define yytext_ptr yytext_r
-
-#ifdef YY_HEADER_EXPORT_START_CONDITIONS
-#define INITIAL 0
-
-#endif
-
-#ifndef YY_NO_UNISTD_H
-/* Special case for "unistd.h", since it is non-ANSI. We include it way
- * down here because we want the user's section 1 to have been scanned first.
- * The user has a chance to override it with an option.
- */
-#include <unistd.h>
-#endif
-
-#define YY_EXTRA_TYPE RunesTerm *
-
-int runes_parser_yylex_init (yyscan_t* scanner);
-
-int runes_parser_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);
-
-/* Accessor methods to globals.
- These are made visible to non-reentrant scanners for convenience. */
-
-int runes_parser_yylex_destroy (yyscan_t yyscanner );
-
-int runes_parser_yyget_debug (yyscan_t yyscanner );
-
-void runes_parser_yyset_debug (int debug_flag ,yyscan_t yyscanner );
-
-YY_EXTRA_TYPE runes_parser_yyget_extra (yyscan_t yyscanner );
-
-void runes_parser_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );
-
-FILE *runes_parser_yyget_in (yyscan_t yyscanner );
-
-void runes_parser_yyset_in (FILE * in_str ,yyscan_t yyscanner );
-
-FILE *runes_parser_yyget_out (yyscan_t yyscanner );
-
-void runes_parser_yyset_out (FILE * out_str ,yyscan_t yyscanner );
-
-yy_size_t runes_parser_yyget_leng (yyscan_t yyscanner );
-
-char *runes_parser_yyget_text (yyscan_t yyscanner );
-
-int runes_parser_yyget_lineno (yyscan_t yyscanner );
-
-void runes_parser_yyset_lineno (int line_number ,yyscan_t yyscanner );
-
-int runes_parser_yyget_column (yyscan_t yyscanner );
-
-void runes_parser_yyset_column (int column_no ,yyscan_t yyscanner );
-
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
-
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int runes_parser_yywrap (yyscan_t yyscanner );
-#else
-extern int runes_parser_yywrap (yyscan_t yyscanner );
-#endif
-#endif
-
-#ifndef yytext_ptr
-static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
-#endif
-
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
-#endif
-
-#ifndef YY_NO_INPUT
-
-#endif
-
-/* Amount of stuff to slurp up with each read. */
-#ifndef YY_READ_BUF_SIZE
-#define YY_READ_BUF_SIZE 8192
-#endif
-
-/* Number of entries by which start-condition stack grows. */
-#ifndef YY_START_STACK_INCR
-#define YY_START_STACK_INCR 25
-#endif
-
-/* Default declaration of generated scanner - a define so the user can
- * easily add parameters.
- */
-#ifndef YY_DECL
-#define YY_DECL_IS_OURS 1
-
-extern int runes_parser_yylex (yyscan_t yyscanner);
-
-#define YY_DECL int runes_parser_yylex (yyscan_t yyscanner)
-#endif /* !YY_DECL */
-
-/* yy_get_previous_state - get the state just before the EOB char was reached */
-
-#undef YY_NEW_FILE
-#undef YY_FLUSH_BUFFER
-#undef yy_set_bol
-#undef yy_new_buffer
-#undef yy_set_interactive
-#undef YY_DO_BEFORE_ACTION
-
-#ifdef YY_DECL_IS_OURS
-#undef YY_DECL_IS_OURS
-#undef YY_DECL
-#endif
-
-#line 224 "src/parser.l"
-
-
-#line 337 "src/parser.h"
-#undef runes_parser_yyIN_HEADER
-#endif /* runes_parser_yyHEADER_H */
diff --git a/src/parser.l b/src/parser.l
deleted file mode 100644
index e45d642..0000000
--- a/src/parser.l
+++ /dev/null
@@ -1,794 +0,0 @@
-%{
-#include <string.h>
-
-#include "runes.h"
-
-#define RUNES_PARSER_CSI_MAX_PARAMS 256
-
-#define YY_EXIT_FAILURE (UNUSED(yyscanner), 2)
-%}
-
-%option reentrant nodefault batch
-%option noyywrap nounput noinput noyyalloc noyyrealloc noyyfree
-%option prefix="runes_parser_yy"
-%option extra-type="RunesTerm *"
-
-CTRL [\000-\037\177]
-ASCII [\040-\176]
-LEAD2 [\300-\337]
-LEAD3 [\340-\357]
-LEAD4 [\360-\367]
-CONT [\200-\277]
-UNICHAR ({LEAD2}{CONT}|{LEAD3}{CONT}{CONT}|{LEAD4}{CONT}{CONT}{CONT})
-CHAR ({ASCII}|{UNICHAR})
-
-ST \007
-BEL \007
-BS \010
-TAB \011
-LF \012
-VT \013
-FF \014
-CR \015
-SI \017
-ESC \033
-
-DECKPAM {ESC}=
-DECKPNM {ESC}>
-CSI {ESC}\[
-OSC {ESC}\]
-RI {ESC}M
-RIS {ESC}c
-VB {ESC}g
-DECSC {ESC}7
-DECRC {ESC}8
-
-DECCSI {CSI}\?
-CSIPARAM1 ([0-9]+)?
-CSIPARAM2 ([0-9]+(;[0-9]+)?)?
-CSIPARAM24 ([0-9]+(;[0-9]+){1,3})?
-CSIPARAMS ([0-9]+(;[0-9]+)*)?
-SMPARAMS ([<=?]?[0-9]+(;[<=?]?[0-9]+)*)?
-
-ICH {CSI}{CSIPARAM1}@
-CUU {CSI}{CSIPARAM1}A
-CUD {CSI}{CSIPARAM1}B
-CUF {CSI}{CSIPARAM1}C
-CUB {CSI}{CSIPARAM1}D
-CUP {CSI}{CSIPARAM2}H
-ED {CSI}{CSIPARAM1}J
-EL {CSI}{CSIPARAM1}K
-IL {CSI}{CSIPARAM1}L
-DL {CSI}{CSIPARAM1}M
-DCH {CSI}{CSIPARAM1}P
-SM {CSI}{SMPARAMS}h
-RM {CSI}{SMPARAMS}l
-SGR {CSI}{CSIPARAMS}m
-CSR {CSI}{CSIPARAM24}r
-
-DECSED {DECCSI}{CSIPARAM1}J
-DECSEL {DECCSI}{CSIPARAM1}K
-
-OSC0 {OSC}0;{CHAR}*{ST}
-OSC1 {OSC}1;{CHAR}*{ST}
-OSC2 {OSC}2;{CHAR}*{ST}
-
-GZD4 {ESC}\([\040-\057]*[\060-\176]
-G1D4 {ESC}\)[\040-\057]*[\060-\176]
-G2D4 {ESC}\*[\040-\057]*[\060-\176]
-G3D4 {ESC}\+[\040-\057]*[\060-\176]
-
-%{
-static void runes_parser_handle_bel(RunesTerm *t);
-static void runes_parser_handle_bs(RunesTerm *t);
-static void runes_parser_handle_tab(RunesTerm *t);
-static void runes_parser_handle_lf(RunesTerm *t);
-static void runes_parser_handle_cr(RunesTerm *t);
-static void runes_parser_handle_deckpam(RunesTerm *t);
-static void runes_parser_handle_deckpnm(RunesTerm *t);
-static void runes_parser_handle_ri(RunesTerm *t);
-static void runes_parser_handle_ris(RunesTerm *t);
-static void runes_parser_handle_vb(RunesTerm *t);
-static void runes_parser_handle_decsc(RunesTerm *t);
-static void runes_parser_handle_decrc(RunesTerm *t);
-static void runes_parser_extract_csi_params(
- char *buf, size_t len, int *params, int *nparams);
-static void runes_parser_extract_sm_params(
- char *buf, size_t len, char *modes, int *params, int *nparams);
-static void runes_parser_handle_ich(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_cuu(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_cud(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_cuf(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_cub(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_cup(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_ed(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_el(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_il(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_dl(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_dch(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_sm(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_rm(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_csr(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_decsed(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_decsel(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_osc0(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_osc1(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_osc2(RunesTerm *t, char *buf, size_t len);
-static void runes_parser_handle_ascii(RunesTerm *t, char *text, size_t len);
-static void runes_parser_handle_text(RunesTerm *t, char *text, size_t len);
-%}
-
-%%
-
-{BEL} runes_parser_handle_bel(yyextra);
-{BS} runes_parser_handle_bs(yyextra);
-{TAB} runes_parser_handle_tab(yyextra);
-{LF} |
-{VT} |
-{FF} runes_parser_handle_lf(yyextra);
-{CR} runes_parser_handle_cr(yyextra);
-{SI}
-
-{DECKPAM} runes_parser_handle_deckpam(yyextra);
-{DECKPNM} runes_parser_handle_deckpnm(yyextra);
-{RI} runes_parser_handle_ri(yyextra);
-{RIS} runes_parser_handle_ris(yyextra);
-{VB} runes_parser_handle_vb(yyextra);
-{DECSC} runes_parser_handle_decsc(yyextra);
-{DECRC} runes_parser_handle_decrc(yyextra);
-
-{ICH} runes_parser_handle_ich(yyextra, yytext, yyleng);
-{CUU} runes_parser_handle_cuu(yyextra, yytext, yyleng);
-{CUD} runes_parser_handle_cud(yyextra, yytext, yyleng);
-{CUF} runes_parser_handle_cuf(yyextra, yytext, yyleng);
-{CUB} runes_parser_handle_cub(yyextra, yytext, yyleng);
-{CUP} runes_parser_handle_cup(yyextra, yytext, yyleng);
-{ED} runes_parser_handle_ed(yyextra, yytext, yyleng);
-{EL} runes_parser_handle_el(yyextra, yytext, yyleng);
-{IL} runes_parser_handle_il(yyextra, yytext, yyleng);
-{DL} runes_parser_handle_dl(yyextra, yytext, yyleng);
-{DCH} runes_parser_handle_dch(yyextra, yytext, yyleng);
-{SM} runes_parser_handle_sm(yyextra, yytext, yyleng);
-{RM} runes_parser_handle_rm(yyextra, yytext, yyleng);
-{SGR} runes_parser_handle_sgr(yyextra, yytext, yyleng);
-{CSR} runes_parser_handle_csr(yyextra, yytext, yyleng);
-
-{DECSED} runes_parser_handle_decsed(yyextra, yytext, yyleng);
-{DECSEL} runes_parser_handle_decsel(yyextra, yytext, yyleng);
-
-{OSC0} runes_parser_handle_osc0(yyextra, yytext, yyleng);
-{OSC1} runes_parser_handle_osc1(yyextra, yytext, yyleng);
-{OSC2} runes_parser_handle_osc2(yyextra, yytext, yyleng);
-
-{GZD4} |
-{G1D4} |
-{G2D4} |
-{G3D4}
-
-{ASCII}+ runes_parser_handle_ascii(yyextra, yytext, yyleng);
-{CHAR}+ runes_parser_handle_text(yyextra, yytext, yyleng);
-
-{LEAD2} |
-{LEAD3}{CONT}? |
-{LEAD4}{CONT}?{CONT}? |
-{CSI}[<=?]?{CSIPARAMS}[0-9;] |
-{CSI} |
-{OSC} |
-{ESC} return yyleng;
-
-<<EOF>> return 0;
-
-{CSI}[<=?]?{CSIPARAMS}{CTRL} {
- runes_warn(
- "unhandled CSI sequence: \\033%*s\\%hho\n",
- (int)yyleng - 2, yytext + 1, yytext[yyleng - 1]);
-}
-
-{CSI}[<=?]?{CSIPARAMS}{CHAR} {
- runes_warn(
- "unhandled CSI sequence: \\033%*s\n",
- (int)yyleng - 1, yytext + 1);
-}
-
-{OSC}{CTRL} {
- runes_warn(
- "unhandled OSC sequence: \\033%*s\\%hho\n",
- (int)yyleng - 2, yytext + 1, yytext[yyleng - 1]);
-}
-
-{OSC}{CHAR} {
- runes_warn(
- "unhandled OSC sequence: \\033%*s\n",
- (int)yyleng - 1, yytext + 1);
-}
-
-{ESC}{CTRL} {
- runes_warn("unhandled escape sequence: \\%hho\n", yytext[1]);
-}
-
-{ESC}{CHAR} {
- runes_warn(
- "unhandled escape sequence: %*s\n",
- (int)yyleng - 1, yytext + 1);
-}
-
-{CTRL} {
- runes_warn("unhandled control character: \\%hho\n", yytext[0]);
-}
-
-(?s:.) {
- runes_warn("invalid utf8 byte: \\%hho\n", yytext[0]);
-}
-
-%%
-
-static void runes_parser_handle_bel(RunesTerm *t)
-{
- if (t->config.audible_bell) {
- runes_screen_audible_bell(t);
- }
- else {
- runes_screen_visual_bell(t);
- }
-}
-
-static void runes_parser_handle_bs(RunesTerm *t)
-{
- runes_screen_move_to(t, t->scr.grid->cur.row, t->scr.grid->cur.col - 1);
-}
-
-static void runes_parser_handle_tab(RunesTerm *t)
-{
- runes_screen_move_to(
- t, t->scr.grid->cur.row,
- t->scr.grid->cur.col - (t->scr.grid->cur.col % 8) + 8);
-}
-
-static void runes_parser_handle_lf(RunesTerm *t)
-{
- runes_screen_move_to(t, t->scr.grid->cur.row + 1, t->scr.grid->cur.col);
-}
-
-static void runes_parser_handle_cr(RunesTerm *t)
-{
- runes_screen_move_to(t, t->scr.grid->cur.row, 0);
-}
-
-static void runes_parser_handle_deckpam(RunesTerm *t)
-{
- runes_screen_set_application_keypad(t);
-}
-
-static void runes_parser_handle_deckpnm(RunesTerm *t)
-{
- runes_screen_reset_application_keypad(t);
-}
-
-static void runes_parser_handle_ri(RunesTerm *t)
-{
- runes_screen_move_to(t, t->scr.grid->cur.row - 1, t->scr.grid->cur.col);
-}
-
-static void runes_parser_handle_ris(RunesTerm *t)
-{
- runes_screen_use_normal_buffer(t);
- runes_screen_set_scroll_region(
- t, 0, t->scr.grid->max.row - 1, 0, t->scr.grid->max.col - 1);
- runes_screen_clear_screen(t);
- runes_screen_save_cursor(t);
- runes_screen_reset_text_attributes(t);
- runes_screen_show_cursor(t);
- runes_screen_reset_application_keypad(t);
- runes_screen_reset_application_cursor(t);
- runes_screen_reset_mouse_reporting_press(t);
- runes_screen_reset_mouse_reporting_press_release(t);
-}
-
-static void runes_parser_handle_vb(RunesTerm *t)
-{
- runes_screen_visual_bell(t);
-}
-
-static void runes_parser_handle_decsc(RunesTerm *t)
-{
- runes_screen_save_cursor(t);
-}
-
-static void runes_parser_handle_decrc(RunesTerm *t)
-{
- runes_screen_restore_cursor(t);
-}
-
-static void runes_parser_extract_csi_params(
- char *buf, size_t len, int *params, int *nparams)
-{
- runes_parser_extract_sm_params(buf, len, NULL, params, nparams);
-}
-
-static void runes_parser_extract_sm_params(
- char *buf, size_t len, char *modes, int *params, int *nparams)
-{
- char *pos = buf;
-
- /* this assumes that it will only ever be called on a fully matched CSI
- * sequence: accessing one character beyond the end is safe because CSI
- * sequences always have one character after the parameters (to determine
- * the type of sequence), and the parameters can only ever be digits,
- * separated by semicolons. */
- buf[len] = '\0';
- *nparams = 0;
- while ((size_t)(pos - buf) < len) {
- if (*nparams >= RUNES_PARSER_CSI_MAX_PARAMS) {
- runes_warn("max CSI parameter length exceeded\n");
- break;
- }
-
- if (modes && (size_t)(pos - buf) < len) {
- if (strspn(pos, "0123456789")) {
- modes[*nparams] = '\0';
- }
- else {
- modes[*nparams] = *pos++;
- }
- }
-
- params[(*nparams)++] = atoi(pos);
-
- pos = strchr(pos, ';');
- if (pos) {
- pos++;
- }
- else {
- break;
- }
- }
-}
-
-static void runes_parser_handle_ich(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_insert_characters(t, params[0]);
-}
-
-static void runes_parser_handle_cuu(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_move_to(
- t, t->scr.grid->cur.row - params[0], t->scr.grid->cur.col);
-}
-
-static void runes_parser_handle_cud(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_move_to(
- t, t->scr.grid->cur.row + params[0], t->scr.grid->cur.col);
-}
-
-static void runes_parser_handle_cuf(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_move_to(
- t, t->scr.grid->cur.row, t->scr.grid->cur.col + params[0]);
-}
-
-static void runes_parser_handle_cub(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_move_to(
- t, t->scr.grid->cur.row, t->scr.grid->cur.col - params[0]);
-}
-
-static void runes_parser_handle_cup(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 0, 0 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- if (params[0] == 0) {
- params[0] = 1;
- }
- if (params[1] == 0) {
- params[1] = 1;
- }
- runes_screen_move_to(t, params[0] - 1, params[1] - 1);
-}
-
-static void runes_parser_handle_ed(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 0 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- switch (params[0]) {
- case 0:
- runes_screen_clear_screen_forward(t);
- break;
- case 1:
- runes_screen_clear_screen_backward(t);
- break;
- case 2:
- runes_screen_clear_screen(t);
- break;
- default:
- runes_warn("unknown ED parameter %d\n", params[0]);
- break;
- }
-}
-
-static void runes_parser_handle_el(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 0 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- switch (params[0]) {
- case 0:
- runes_screen_kill_line_forward(t);
- break;
- case 1:
- runes_screen_kill_line_backward(t);
- break;
- case 2:
- runes_screen_kill_line(t);
- break;
- default:
- runes_warn("unknown EL parameter %d\n", params[0]);
- break;
- }
-}
-
-static void runes_parser_handle_il(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_insert_lines(t, params[0]);
- runes_screen_move_to(t, t->scr.grid->cur.row, 0);
-}
-
-static void runes_parser_handle_dl(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_delete_lines(t, params[0]);
- runes_screen_move_to(t, t->scr.grid->cur.row, 0);
-}
-
-static void runes_parser_handle_dch(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 1 }, nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- runes_screen_delete_characters(t, params[0]);
-}
-
-static void runes_parser_handle_sm(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS], nparams, i;
- char modes[RUNES_PARSER_CSI_MAX_PARAMS] = { 0 };
-
- runes_parser_extract_sm_params(buf + 2, len - 3, modes, params, &nparams);
- for (i = 0; i < nparams; ++i) {
- switch (modes[i]) {
- case 0:
- switch (params[i]) {
- case 34:
- /* do nothing, no idea what this is even for */
- break;
- default:
- runes_warn("unknown SM parameter: %d\n", params[i]);
- break;
- }
- break;
- case '?':
- switch (params[i]) {
- case 1:
- runes_screen_set_application_cursor(t);
- break;
- case 9:
- runes_screen_set_mouse_reporting_press(t);
- break;
- case 25:
- runes_screen_show_cursor(t);
- break;
- case 1000:
- runes_screen_set_mouse_reporting_press_release(t);
- break;
- case 47:
- case 1049:
- runes_screen_use_alternate_buffer(t);
- break;
- case 2004:
- runes_screen_set_bracketed_paste(t);
- break;
- default:
- runes_warn(
- "unknown SM parameter: %c%d\n", modes[i], params[i]);
- break;
- }
- break;
- default:
- runes_warn("unknown SM parameter: %c%d\n", modes[i], params[i]);
- break;
- }
- }
-}
-
-static void runes_parser_handle_rm(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS], nparams, i;
- char modes[RUNES_PARSER_CSI_MAX_PARAMS] = { 0 };
-
- runes_parser_extract_sm_params(buf + 2, len - 3, modes, params, &nparams);
- for (i = 0; i < nparams; ++i) {
- switch (modes[i]) {
- case 0:
- switch (params[i]) {
- case 34:
- /* do nothing, no idea what this is even for */
- break;
- default:
- runes_warn("unknown RM parameter: %d\n", params[i]);
- break;
- }
- break;
- case '?':
- switch (params[i]) {
- case 1:
- runes_screen_set_application_cursor(t);
- break;
- case 9:
- runes_screen_set_mouse_reporting_press(t);
- break;
- case 25:
- runes_screen_hide_cursor(t);
- break;
- case 1000:
- runes_screen_set_mouse_reporting_press_release(t);
- break;
- case 47:
- case 1049:
- runes_screen_use_normal_buffer(t);
- break;
- case 2004:
- runes_screen_reset_bracketed_paste(t);
- break;
- default:
- runes_warn(
- "unknown RM parameter: %c%d\n", modes[i], params[i]);
- break;
- }
- break;
- default:
- runes_warn("unknown RM parameter: %c%d\n", modes[i], params[i]);
- break;
- }
- }
-}
-
-static void runes_parser_handle_sgr(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = { 0 }, nparams, i;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
- if (nparams < 1) {
- nparams = 1;
- }
- for (i = 0; i < nparams; ++i) {
- switch (params[i]) {
- case 0:
- runes_screen_reset_text_attributes(t);
- break;
- case 1:
- runes_screen_set_bold(t);
- break;
- case 3:
- runes_screen_set_italic(t);
- break;
- case 4:
- runes_screen_set_underline(t);
- break;
- case 7:
- runes_screen_set_inverse(t);
- break;
- case 22:
- runes_screen_reset_bold(t);
- break;
- case 23:
- runes_screen_reset_italic(t);
- break;
- case 24:
- runes_screen_reset_underline(t);
- break;
- case 27:
- runes_screen_reset_inverse(t);
- break;
- case 30: case 31: case 32: case 33:
- case 34: case 35: case 36: case 37:
- runes_screen_set_fg_color(t, params[i] - 30);
- break;
- case 38: {
- i++;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d (too few parameters)\n",
- params[i - 1]);
- break;
- }
-
- switch (params[i]) {
- case 2:
- i += 3;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d;%d (too few parameters)\n",
- params[i - 4], params[i - 3]);
- break;
- }
- runes_screen_set_fg_color_rgb(
- t, params[i - 2], params[i - 1], params[i]);
- break;
- case 5:
- i++;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d;%d (too few parameters)\n",
- params[i - 2], params[i - 1]);
- break;
- }
- runes_screen_set_fg_color(t, params[i]);
- break;
- default:
- i++;
- runes_warn(
- "unknown SGR parameter: %d;%d\n",
- params[i - 2], params[i - 1]);
- break;
- }
- break;
- }
- case 39:
- runes_screen_reset_fg_color(t);
- break;
- case 40: case 41: case 42: case 43:
- case 44: case 45: case 46: case 47:
- runes_screen_set_bg_color(t, params[i] - 40);
- break;
- case 48: {
- i++;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d (too few parameters)\n",
- params[i - 1]);
- break;
- }
-
- switch (params[i]) {
- case 2:
- i += 3;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d;%d (too few parameters)\n",
- params[i - 4], params[i - 3]);
- break;
- }
- runes_screen_set_bg_color_rgb(
- t, params[i - 2], params[i - 1], params[i]);
- break;
- case 5:
- i++;
- if (i >= nparams) {
- runes_warn(
- "unknown SGR parameter: %d;%d (too few parameters)\n",
- params[i - 2], params[i - 1]);
- break;
- }
- runes_screen_set_bg_color(t, params[i]);
- break;
- default:
- i++;
- runes_warn(
- "unknown SGR parameter: %d;%d\n",
- params[i - 2], params[i - 1]);
- break;
- }
- break;
- }
- case 49:
- runes_screen_reset_bg_color(t);
- break;
- case 90: case 91: case 92: case 93:
- case 94: case 95: case 96: case 97:
- runes_screen_set_fg_color(t, params[i] - 82);
- break;
- case 100: case 101: case 102: case 103:
- case 104: case 105: case 106: case 107:
- runes_screen_set_bg_color(t, params[i] - 92);
- break;
- default:
- runes_warn("unknown SGR parameter: %d\n", params[i]);
- break;
- }
- }
-}
-
-static void runes_parser_handle_csr(RunesTerm *t, char *buf, size_t len)
-{
- int params[RUNES_PARSER_CSI_MAX_PARAMS] = {
- 1, t->scr.grid->max.row, 1, t->scr.grid->max.col };
- int nparams;
-
- runes_parser_extract_csi_params(buf + 2, len - 3, params, &nparams);
-
- runes_screen_set_scroll_region(
- t, params[0] - 1, params[1] - 1, params[2] - 1, params[3] - 1);
-}
-
-static void runes_parser_handle_decsed(RunesTerm *t, char *buf, size_t len)
-{
- /* XXX not quite correct, but i don't think programs really use anything
- * that would show a difference */
- runes_parser_handle_ed(t, buf, len);
-}
-
-static void runes_parser_handle_decsel(RunesTerm *t, char *buf, size_t len)
-{
- /* XXX not quite correct, but i don't think programs really use anything
- * that would show a difference */
- runes_parser_handle_el(t, buf, len);
-}
-
-static void runes_parser_handle_osc0(RunesTerm *t, char *buf, size_t len)
-{
- runes_screen_set_icon_name(t, buf + 4, len - 5);
- runes_screen_set_window_title(t, buf + 4, len - 5);
-}
-
-static void runes_parser_handle_osc1(RunesTerm *t, char *buf, size_t len)
-{
- runes_screen_set_icon_name(t, buf + 4, len - 5);
-}
-
-static void runes_parser_handle_osc2(RunesTerm *t, char *buf, size_t len)
-{
- runes_screen_set_window_title(t, buf + 4, len - 5);
-}
-
-static void runes_parser_handle_ascii(RunesTerm *t, char *text, size_t len)
-{
- runes_screen_show_string_ascii(t, text, len);
-}
-
-static void runes_parser_handle_text(RunesTerm *t, char *text, size_t len)
-{
- runes_screen_show_string_utf8(t, text, len);
-}
-
-/* XXX these are copied from the generated file so that I can add the UNUSED
- * declarations, otherwise we get compilation errors */
-void *runes_parser_yyalloc(yy_size_t size, yyscan_t yyscanner)
-{
- UNUSED(yyscanner);
- return (void *)malloc(size);
-}
-
-void *runes_parser_yyrealloc(void *ptr, yy_size_t size, yyscan_t yyscanner)
-{
- UNUSED(yyscanner);
- return (void *)realloc((char *)ptr, size);
-}
-
-void runes_parser_yyfree(void *ptr, yyscan_t yyscanner)
-{
- UNUSED(yyscanner);
- free((char *) ptr);
-}
diff --git a/src/pty-unix.c b/src/pty-unix.c
index b43ae6f..21e261b 100644
--- a/src/pty-unix.c
+++ b/src/pty-unix.c
@@ -152,8 +152,8 @@ static void runes_pty_backend_got_data(uv_work_t *req, int status)
UNUSED(status);
if (pty->readlen > 0) {
- runes_screen_process_string(
- t, pty->readbuf, pty->readlen + pty->remaininglen);
+ vt100_screen_process_string(
+ &t->scr, pty->readbuf, pty->readlen + pty->remaininglen);
uv_queue_work(
t->loop, req, runes_pty_backend_read, runes_pty_backend_got_data);
}
diff --git a/src/runes.h b/src/runes.h
index 18d6174..6012983 100644
--- a/src/runes.h
+++ b/src/runes.h
@@ -4,13 +4,13 @@
#include <cairo.h>
#include <pango/pangocairo.h>
#include <uv.h>
+#include <vt100.h>
#define RUNES_READ_BUFFER_LENGTH 4096
struct runes_term;
struct runes_window;
struct runes_pty;
-struct runes_screen;
struct runes_config;
struct runes_display;
struct runes_loop_data;
@@ -18,7 +18,6 @@ struct runes_loop_data;
typedef struct runes_term RunesTerm;
typedef struct runes_window RunesWindowBackend;
typedef struct runes_pty RunesPtyBackend;
-typedef struct runes_screen RunesScreen;
typedef struct runes_config RunesConfig;
typedef struct runes_display RunesDisplay;
typedef struct runes_loop_data RunesLoopData;
@@ -33,7 +32,6 @@ struct runes_loop_data {
#include "window-xlib.h"
#include "pty-unix.h"
-#include "screen.h"
#include "config.h"
#include "display.h"
diff --git a/src/screen.c b/src/screen.c
deleted file mode 100644
index 4619f41..0000000
--- a/src/screen.c
+++ /dev/null
@@ -1,1062 +0,0 @@
-#include <stdlib.h>
-#include <string.h>
-
-#include "runes.h"
-#include "parser.h"
-
-static void runes_screen_ensure_capacity(RunesTerm *t, int size);
-static struct runes_row *runes_screen_row_at(RunesTerm *t, int row);
-static struct runes_cell *runes_screen_cell_at(RunesTerm *t, int row, int col);
-static void runes_screen_scroll_down(RunesTerm *t, int count);
-static void runes_screen_scroll_up(RunesTerm *t, int count);
-static int runes_screen_scroll_region_is_active(RunesTerm *t);
-static int runes_screen_loc_is_between(
- RunesTerm *t, struct runes_loc loc,
- struct runes_loc start, struct runes_loc end);
-static int runes_screen_row_max_col(RunesTerm *t, int row);
-
-void runes_screen_init(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->grid = calloc(1, sizeof(struct runes_grid));
- runes_parser_yylex_init_extra(t, &scr->scanner);
-}
-
-void runes_screen_set_window_size(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
- struct runes_loc old_size;
- int i;
-
- old_size.row = scr->grid->max.row;
- old_size.col = scr->grid->max.col;
-
- scr->grid->max.row = t->display.ypixel / t->display.fonty;
- scr->grid->max.col = t->display.xpixel / t->display.fontx;
-
- if (scr->grid->max.row == 0) {
- scr->grid->max.row = 1;
- }
- if (scr->grid->max.col == 0) {
- scr->grid->max.col = 1;
- }
-
- if (scr->grid->max.row == old_size.row && scr->grid->max.col == old_size.col) {
- return;
- }
-
- if (scr->grid->cur.row >= scr->grid->max.row) {
- scr->grid->cur.row = scr->grid->max.row - 1;
- }
- if (scr->grid->cur.col > scr->grid->max.col) {
- scr->grid->cur.col = scr->grid->max.col;
- }
-
- runes_screen_ensure_capacity(t, scr->grid->max.row);
-
- for (i = 0; i < scr->grid->row_count; ++i) {
- scr->grid->rows[i].cells = realloc(
- scr->grid->rows[i].cells,
- scr->grid->max.col * sizeof(struct runes_cell));
- if (old_size.col < scr->grid->max.col) {
- memset(
- &scr->grid->rows[i].cells[old_size.col], 0,
- (scr->grid->max.col - old_size.col) * sizeof(struct runes_cell));
- }
- }
-
- for (i = scr->grid->row_count; i < scr->grid->max.row; ++i) {
- scr->grid->rows[i].cells = calloc(
- scr->grid->max.col, sizeof(struct runes_cell));
- }
-
- if (scr->grid->row_count < scr->grid->max.row) {
- scr->grid->row_count = scr->grid->max.row;
- scr->grid->row_top = 0;
- }
- else {
- scr->grid->row_top = scr->grid->row_count - scr->grid->max.row;
- }
-
- scr->grid->scroll_top = 0;
- scr->grid->scroll_bottom = scr->grid->max.row - 1;
-}
-
-void runes_screen_process_string(RunesTerm *t, char *buf, size_t len)
-{
- RunesScreen *scr = &t->scr;
- int remaining;
-
- scr->state = runes_parser_yy_scan_bytes(buf, len, scr->scanner);
- remaining = runes_parser_yylex(scr->scanner);
- t->pty.remaininglen = remaining;
- if (t->pty.remaininglen) {
- memmove(
- t->pty.readbuf, &buf[len - t->pty.remaininglen],
- t->pty.remaininglen);
- }
- runes_parser_yy_delete_buffer(scr->state, scr->scanner);
-}
-
-int runes_screen_loc_is_selected(RunesTerm *t, struct runes_loc loc)
-{
- RunesScreen *scr = &t->scr;
- struct runes_loc start = scr->grid->selection_start;
- struct runes_loc end = scr->grid->selection_end;
-
- if (!scr->has_selection) {
- return 0;
- }
-
- if (loc.row == start.row) {
- int start_max_col;
-
- start_max_col = runes_screen_row_max_col(t, start.row);
- if (start.col > start_max_col) {
- start.col = scr->grid->max.col;
- }
- }
-
- if (loc.row == end.row) {
- int end_max_col;
-
- end_max_col = runes_screen_row_max_col(t, end.row);
- if (end.col > end_max_col) {
- end.col = scr->grid->max.col;
- }
- }
-
- return runes_screen_loc_is_between(t, loc, start, end);
-}
-
-void runes_screen_get_string(
- RunesTerm *t, struct runes_loc *start, struct runes_loc *end,
- char **strp, size_t *lenp)
-{
- RunesScreen *scr = &t->scr;
- 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, end_col, max_col;
- struct runes_row *grid_row = &scr->grid->rows[row];
-
- max_col = runes_screen_row_max_col(t, row);
-
- if (row == start->row) {
- if (start->col > max_col) {
- start_col = scr->grid->max.col;
- }
- else {
- start_col = start->col;
- }
- }
- else {
- start_col = 0;
- }
-
- if (row == end->row) {
- if (end->col > max_col) {
- end_col = scr->grid->max.col;
- }
- else {
- end_col = end->col;
- }
- }
- else {
- end_col = scr->grid->max.col;
- }
-
- if (end_col > max_col) {
- end_col = max_col;
- }
-
- for (col = start_col; col < end_col; ++col) {
- struct runes_cell *cell = &grid_row->cells[col];
- char *contents = cell->contents;
- size_t len = cell->len;
-
- if (cell->len == 0) {
- contents = " ";
- len = 1;
- }
-
- if (*lenp + len > capacity) {
- capacity *= 1.5;
- *strp = realloc(*strp, capacity);
- }
- memcpy(*strp + *lenp, contents, len);
- *lenp += len;
- }
-
- if ((row != end->row || end->col > max_col) && !grid_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;
-
- scr->audible_bell = 1;
-}
-
-void runes_screen_visual_bell(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->visual_bell = 1;
-}
-
-void runes_screen_show_string_ascii(RunesTerm *t, char *buf, size_t len)
-{
- RunesScreen *scr = &t->scr;
- size_t i;
- int col = scr->grid->cur.col;
-
- for (i = 0; i < len; ++i) {
- struct runes_cell *cell;
-
- if (col >= scr->grid->max.col) {
- runes_screen_row_at(t, scr->grid->cur.row)->wrapped = 1;
- runes_screen_move_to(t, scr->grid->cur.row + 1, 0);
- col = 0;
- }
- cell = runes_screen_cell_at(t, scr->grid->cur.row, col++);
-
- cell->len = 1;
- cell->contents[0] = buf[i];
- cell->attrs = scr->attrs;
- cell->is_wide = 0;
- }
- runes_screen_move_to(t, scr->grid->cur.row, col);
-
- scr->dirty = 1;
-}
-
-void runes_screen_show_string_utf8(RunesTerm *t, char *buf, size_t len)
-{
- RunesScreen *scr = &t->scr;
- char *c = buf, *next;
- int col = scr->grid->cur.col;
-
- /* XXX need to detect combining characters and append them to the previous
- * cell */
- while ((next = g_utf8_next_char(c))) {
- gunichar uc;
- struct runes_cell *cell = NULL;
- int is_wide, is_combining;
- GUnicodeType ctype;
-
- uc = g_utf8_get_char(c);
- /* XXX handle zero width characters */
- is_wide = g_unichar_iswide(uc);
- ctype = g_unichar_type(uc);
- /* XXX should this also include spacing marks? */
- is_combining = ctype == G_UNICODE_ENCLOSING_MARK
- || ctype == G_UNICODE_NON_SPACING_MARK;
-
- if (is_combining) {
- if (col > 0) {
- cell = runes_screen_cell_at(
- t, scr->grid->cur.row, col - 1);
- }
- else if (scr->grid->cur.row > 0 && runes_screen_row_at(t, scr->grid->cur.row - 1)->wrapped) {
- cell = runes_screen_cell_at(
- t, scr->grid->cur.row - 1, scr->grid->max.col - 1);
- }
-
- if (cell) {
- char *normal;
-
- memcpy(cell->contents + cell->len, c, next - c);
- cell->len += next - c;
- /* some fonts have combined characters but can't handle
- * combining characters, so try to fix that here */
- /* XXX it'd be nice if there was a way to do this that didn't
- * require an allocation */
- normal = g_utf8_normalize(
- cell->contents, cell->len, G_NORMALIZE_NFC);
- memcpy(cell->contents, normal, cell->len);
- free(normal);
- }
- }
- else {
- if (col + (is_wide ? 2 : 1) > scr->grid->max.col) {
- runes_screen_row_at(t, scr->grid->cur.row)->wrapped = 1;
- runes_screen_move_to(t, scr->grid->cur.row + 1, 0);
- col = 0;
- }
- cell = runes_screen_cell_at(t, scr->grid->cur.row, col);
- cell->is_wide = is_wide;
-
- cell->len = next - c;
- memcpy(cell->contents, c, cell->len);
- cell->attrs = scr->attrs;
-
- col += is_wide ? 2 : 1;
- }
-
- c = next;
- if ((size_t)(c - buf) >= len) {
- break;
- }
- }
- runes_screen_move_to(t, scr->grid->cur.row, col);
-
- scr->dirty = 1;
-}
-
-void runes_screen_move_to(RunesTerm *t, int row, int col)
-{
- RunesScreen *scr = &t->scr;
- int top = scr->grid->scroll_top, bottom = scr->grid->scroll_bottom;
-
- if (row > bottom) {
- runes_screen_scroll_down(t, row - bottom);
- row = bottom;
- }
- else if (row < top) {
- runes_screen_scroll_up(t, top - row);
- row = top;
- }
-
- if (col < 0) {
- col = 0;
- }
-
- if (col > scr->grid->max.col) {
- col = scr->grid->max.col;
- }
-
- scr->grid->cur.row = row;
- scr->grid->cur.col = col;
-}
-
-void runes_screen_clear_screen(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
- int r;
-
- for (r = 0; r < scr->grid->max.row; ++r) {
- struct runes_row *row;
-
- row = runes_screen_row_at(t, r);
- memset(row->cells, 0, scr->grid->max.col * sizeof(struct runes_cell));
- row->wrapped = 0;
- }
-
- scr->dirty = 1;
-}
-
-void runes_screen_clear_screen_forward(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
- struct runes_row *row;
- int r;
-
- row = runes_screen_row_at(t, scr->grid->cur.row);
- memset(
- &row->cells[scr->grid->cur.col], 0,
- (scr->grid->max.col - scr->grid->cur.col) * sizeof(struct runes_cell));
- row->wrapped = 0;
- for (r = scr->grid->cur.row + 1; r < scr->grid->max.row; ++r) {
- row = runes_screen_row_at(t, r);
- memset(row->cells, 0, scr->grid->max.col * sizeof(struct runes_cell));
- row->wrapped = 0;
- }
-
- scr->dirty = 1;
-}
-
-void runes_screen_clear_screen_backward(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
- struct runes_row *row;
- int r;
-
- for (r = 0; r < scr->grid->cur.row - 1; ++r) {
- row = runes_screen_row_at(t, r);
- memset(row->cells, 0, scr->grid->max.col * sizeof(struct runes_cell));
- row->wrapped = 0;
- }
- row = runes_screen_row_at(t, scr->grid->cur.row);
- memset(row->cells, 0, scr->grid->cur.col * sizeof(struct runes_cell));
-
- scr->dirty = 1;
-}
-
-void runes_screen_kill_line(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
- struct runes_row *row;
-
- row = runes_screen_row_at(t, scr->grid->cur.row);
- memset(row->cells, 0, scr->grid->max.col * sizeof(struct runes_cell));
- row->wrapped = 0;
-
- scr->dirty = 1;
-}
-
-void runes_screen_kill_line_forward(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
- struct runes_row *row;
-
- row = runes_screen_row_at(t, scr->grid->cur.row);
- memset(
- &row->cells[scr->grid->cur.col], 0,
- (scr->grid->max.col - scr->grid->cur.col) * sizeof(struct runes_cell));
- row->wrapped = 0;
-
- scr->dirty = 1;
-}
-
-void runes_screen_kill_line_backward(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
- struct runes_row *row;
-
- row = runes_screen_row_at(t, scr->grid->cur.row);
- memset(row->cells, 0, scr->grid->cur.col * sizeof(struct runes_cell));
- if (scr->grid->cur.row > 0) {
- row = runes_screen_row_at(t, scr->grid->cur.row - 1);
- row->wrapped = 0;
- }
-
- scr->dirty = 1;
-}
-
-void runes_screen_insert_characters(RunesTerm *t, int count)
-{
- RunesScreen *scr = &t->scr;
- struct runes_row *row;
-
- row = runes_screen_row_at(t, scr->grid->cur.row);
- if (count >= scr->grid->max.col - scr->grid->cur.col) {
- runes_screen_kill_line_forward(t);
- }
- else {
- memmove(
- &row->cells[scr->grid->cur.col + count],
- &row->cells[scr->grid->cur.col],
- (scr->grid->max.col - scr->grid->cur.col - count) * sizeof(struct runes_cell));
- memset(
- &row->cells[scr->grid->cur.col], 0,
- count * sizeof(struct runes_cell));
- row->wrapped = 0;
- }
-
- scr->dirty = 1;
-}
-
-void runes_screen_insert_lines(RunesTerm *t, int count)
-{
- RunesScreen *scr = &t->scr;
-
- if (count >= scr->grid->max.row - scr->grid->cur.row) {
- runes_screen_clear_screen_forward(t);
- runes_screen_kill_line(t);
- }
- else {
- struct runes_row *row;
- int bottom = scr->grid->scroll_bottom + 1;
- int i;
-
- for (i = bottom - count; i < bottom; ++i) {
- row = runes_screen_row_at(t, i);
- free(row->cells);
- }
- row = runes_screen_row_at(t, scr->grid->cur.row);
- memmove(
- row + count, row,
- (bottom - scr->grid->cur.row - count) * sizeof(struct runes_row));
- memset(row, 0, count * sizeof(struct runes_row));
- for (i = scr->grid->cur.row; i < scr->grid->cur.row + count; ++i) {
- row = runes_screen_row_at(t, i);
- row->cells = calloc(scr->grid->max.col, sizeof(struct runes_cell));
- row->wrapped = 0;
- }
- }
-
- scr->dirty = 1;
-}
-
-void runes_screen_delete_characters(RunesTerm *t, int count)
-{
- RunesScreen *scr = &t->scr;
-
- if (count >= scr->grid->max.col - scr->grid->cur.col) {
- runes_screen_kill_line_forward(t);
- }
- else {
- struct runes_row *row;
-
- row = runes_screen_row_at(t, scr->grid->cur.row);
- memmove(
- &row->cells[scr->grid->cur.col],
- &row->cells[scr->grid->cur.col + count],
- (scr->grid->max.col - scr->grid->cur.col - count) * sizeof(struct runes_cell));
- memset(
- &row->cells[scr->grid->max.col - count], 0,
- count * sizeof(struct runes_cell));
- row->wrapped = 0;
- }
-
- scr->dirty = 1;
-}
-
-void runes_screen_delete_lines(RunesTerm *t, int count)
-{
- RunesScreen *scr = &t->scr;
-
- if (count >= scr->grid->max.row - scr->grid->cur.row) {
- runes_screen_clear_screen_forward(t);
- runes_screen_kill_line(t);
- }
- else {
- struct runes_row *row;
- int bottom = scr->grid->scroll_bottom + 1;
- int i;
-
- for (i = scr->grid->cur.row; i < scr->grid->cur.row + count; ++i) {
- row = runes_screen_row_at(t, i);
- free(row->cells);
- }
- row = runes_screen_row_at(t, scr->grid->cur.row);
- memmove(
- row, row + count,
- (bottom - scr->grid->cur.row - count) * sizeof(struct runes_row));
- row = runes_screen_row_at(t, bottom - count);
- memset(row, 0, count * sizeof(struct runes_row));
- for (i = bottom - count; i < bottom; ++i) {
- row = runes_screen_row_at(t, i);
- row->cells = calloc(scr->grid->max.col, sizeof(struct runes_cell));
- row->wrapped = 0;
- }
- }
-
- scr->dirty = 1;
-}
-
-void runes_screen_set_scroll_region(
- RunesTerm *t, int top, int bottom, int left, int right)
-{
- RunesScreen *scr = &t->scr;
-
- if (left > 0 || right < scr->grid->max.col - 1) {
- runes_warn("vertical scroll regions not yet implemented\n");
- }
-
- if (top > bottom) {
- return;
- }
-
- scr->grid->scroll_top = top < 0
- ? 0
- : top;
- scr->grid->scroll_bottom = bottom >= scr->grid->max.row
- ? scr->grid->max.row - 1
- : bottom;
-
- runes_screen_move_to(t, scr->grid->scroll_top, 0);
-}
-
-void runes_screen_reset_text_attributes(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- memset(&scr->attrs, 0, sizeof(struct runes_cell_attrs));
-}
-
-void runes_screen_set_fg_color(RunesTerm *t, int idx)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.fgcolor.type = RUNES_COLOR_IDX;
- scr->attrs.fgcolor.idx = idx;
-}
-
-void runes_screen_set_fg_color_rgb(
- RunesTerm *t, unsigned char r, unsigned char g, unsigned char b)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.fgcolor.type = RUNES_COLOR_RGB;
- scr->attrs.fgcolor.r = r;
- scr->attrs.fgcolor.g = g;
- scr->attrs.fgcolor.b = b;
-}
-
-void runes_screen_reset_fg_color(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.fgcolor.type = RUNES_COLOR_DEFAULT;
-}
-
-void runes_screen_set_bg_color(RunesTerm *t, int idx)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.bgcolor.type = RUNES_COLOR_IDX;
- scr->attrs.bgcolor.idx = idx;
-}
-
-void runes_screen_set_bg_color_rgb(
- RunesTerm *t, unsigned char r, unsigned char g, unsigned char b)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.bgcolor.type = RUNES_COLOR_RGB;
- scr->attrs.bgcolor.r = r;
- scr->attrs.bgcolor.g = g;
- scr->attrs.bgcolor.b = b;
-}
-
-void runes_screen_reset_bg_color(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.bgcolor.type = RUNES_COLOR_DEFAULT;
-}
-
-void runes_screen_set_bold(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.bold = 1;
-}
-
-void runes_screen_set_italic(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.italic = 1;
-}
-
-void runes_screen_set_underline(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.underline = 1;
-}
-
-void runes_screen_set_inverse(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.inverse = 1;
-}
-
-void runes_screen_reset_bold(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.bold = 0;
-}
-
-void runes_screen_reset_italic(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.italic = 0;
-}
-
-void runes_screen_reset_underline(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.underline = 0;
-}
-
-void runes_screen_reset_inverse(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->attrs.inverse = 0;
-}
-
-void runes_screen_use_alternate_buffer(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- if (scr->alternate) {
- return;
- }
-
- scr->alternate = scr->grid;
- scr->grid = calloc(1, sizeof(struct runes_grid));
- runes_screen_set_window_size(t);
-
- scr->dirty = 1;
-}
-
-void runes_screen_use_normal_buffer(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
- int i;
-
- if (!scr->alternate) {
- return;
- }
-
- for (i = 0; i < scr->grid->row_count; ++i) {
- free(scr->grid->rows[i].cells);
- }
- free(scr->grid->rows);
- free(scr->grid);
-
- scr->grid = scr->alternate;
- scr->alternate = NULL;
-
- runes_screen_set_window_size(t);
-
- scr->dirty = 1;
-}
-
-void runes_screen_save_cursor(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->grid->saved = scr->grid->cur;
-}
-
-void runes_screen_restore_cursor(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->grid->cur = scr->grid->saved;
-}
-
-void runes_screen_show_cursor(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->hide_cursor = 0;
-}
-
-void runes_screen_hide_cursor(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->hide_cursor = 1;
-}
-
-void runes_screen_set_application_keypad(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->application_keypad = 1;
-}
-
-void runes_screen_reset_application_keypad(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->application_keypad = 0;
-}
-
-void runes_screen_set_application_cursor(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->application_cursor = 1;
-}
-
-void runes_screen_reset_application_cursor(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->application_cursor = 0;
-}
-
-void runes_screen_set_mouse_reporting_press(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->mouse_reporting_press = 1;
-}
-
-void runes_screen_reset_mouse_reporting_press(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->mouse_reporting_press = 0;
-}
-
-void runes_screen_set_mouse_reporting_press_release(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->mouse_reporting_press_release = 1;
-}
-
-void runes_screen_reset_mouse_reporting_press_release(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->mouse_reporting_press_release = 0;
-}
-
-void runes_screen_set_bracketed_paste(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->bracketed_paste = 1;
-}
-
-void runes_screen_reset_bracketed_paste(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- scr->bracketed_paste = 0;
-}
-
-void runes_screen_set_window_title(RunesTerm *t, char *buf, size_t len)
-{
- RunesScreen *scr = &t->scr;
-
- free(scr->title);
- scr->title_len = len;
- scr->title = malloc(scr->title_len);
- memcpy(scr->title, buf, scr->title_len);
- scr->update_title = 1;
-}
-
-void runes_screen_set_icon_name(RunesTerm *t, char *buf, size_t len)
-{
- RunesScreen *scr = &t->scr;
-
- free(scr->icon_name);
- scr->icon_name_len = len;
- scr->icon_name = malloc(scr->icon_name_len);
- memcpy(scr->icon_name, buf, scr->icon_name_len);
- scr->update_icon_name = 1;
-}
-
-void runes_screen_cleanup(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
- int i;
-
- for (i = 0; i < scr->grid->row_count; ++i) {
- free(scr->grid->rows[i].cells);
- }
- free(scr->grid->rows);
- free(scr->grid);
-
- free(scr->title);
- free(scr->icon_name);
-
- runes_parser_yylex_destroy(scr->scanner);
-}
-
-static void runes_screen_ensure_capacity(RunesTerm *t, int size)
-{
- RunesScreen *scr = &t->scr;
- int old_capacity = scr->grid->row_capacity;
-
- if (scr->grid->row_capacity >= size) {
- return;
- }
-
- if (scr->grid->row_capacity == 0) {
- scr->grid->row_capacity = scr->grid->max.row;
- }
-
- while (scr->grid->row_capacity < size) {
- scr->grid->row_capacity *= 1.5;
- }
-
- scr->grid->rows = realloc(
- scr->grid->rows, scr->grid->row_capacity * sizeof(struct runes_row));
- memset(
- &scr->grid->rows[old_capacity], 0,
- (scr->grid->row_capacity - old_capacity) * sizeof(struct runes_row));
-}
-
-static struct runes_row *runes_screen_row_at(RunesTerm *t, int row)
-{
- RunesScreen *scr = &t->scr;
-
- return &scr->grid->rows[row + scr->grid->row_top];
-}
-
-static struct runes_cell *runes_screen_cell_at(RunesTerm *t, int row, int col)
-{
- RunesScreen *scr = &t->scr;
-
- return &scr->grid->rows[row + scr->grid->row_top].cells[col];
-}
-
-static void runes_screen_scroll_down(RunesTerm *t, int count)
-{
- RunesScreen *scr = &t->scr;
- struct runes_row *row;
- int i;
-
- if (runes_screen_scroll_region_is_active(t) || scr->alternate) {
- int bottom = scr->grid->scroll_bottom, top = scr->grid->scroll_top;
-
- if (bottom - top + 1 > count) {
- for (i = 0; i < count; ++i) {
- row = runes_screen_row_at(t, top + i);
- free(row->cells);
- }
- row = runes_screen_row_at(t, top);
- memmove(
- row, row + count,
- (bottom - top + 1 - count) * sizeof(struct runes_row));
- for (i = 0; i < count; ++i) {
- row = runes_screen_row_at(t, bottom - i);
- row->cells = calloc(
- scr->grid->max.col, sizeof(struct runes_cell));
- row->wrapped = 0;
- }
- }
- else {
- for (i = 0; i < bottom - top + 1; ++i) {
- row = runes_screen_row_at(t, top + i);
- memset(
- row->cells, 0,
- scr->grid->max.col * sizeof(struct runes_cell));
- row->wrapped = 0;
- }
- }
- }
- else {
- int scrollback = t->config.scrollback_length;
-
- if (scr->grid->row_count + count > scrollback) {
- int overflow = scr->grid->row_count + count - scrollback;
-
- runes_screen_ensure_capacity(t, scrollback);
- for (i = 0; i < overflow; ++i) {
- free(scr->grid->rows[i].cells);
- }
- memmove(
- &scr->grid->rows[0], &scr->grid->rows[overflow],
- (scrollback - overflow) * sizeof(struct runes_row));
- for (i = scrollback - count; i < scrollback; ++i) {
- scr->grid->rows[i].cells = calloc(
- scr->grid->max.col, sizeof(struct runes_cell));
- }
- scr->grid->row_count = scrollback;
- scr->grid->row_top = scrollback - scr->grid->max.row;
- }
- else {
- runes_screen_ensure_capacity(t, scr->grid->row_count + count);
- for (i = 0; i < count; ++i) {
- row = runes_screen_row_at(t, i + scr->grid->max.row);
- row->cells = calloc(
- scr->grid->max.col, sizeof(struct runes_cell));
- }
- scr->grid->row_count += count;
- scr->grid->row_top += count;
- }
- }
-
- scr->dirty = 1;
-}
-
-static void runes_screen_scroll_up(RunesTerm *t, int count)
-{
- RunesScreen *scr = &t->scr;
- struct runes_row *row;
- int bottom = scr->grid->scroll_bottom, top = scr->grid->scroll_top;
- int i;
-
- if (bottom - top + 1 > count) {
- for (i = 0; i < count; ++i) {
- row = runes_screen_row_at(t, bottom - i);
- free(row->cells);
- }
- row = runes_screen_row_at(t, top);
- memmove(
- row + count, row,
- (bottom - top + 1 - count) * sizeof(struct runes_row));
- for (i = 0; i < count; ++i) {
- row = runes_screen_row_at(t, top + i);
- row->cells = calloc(scr->grid->max.col, sizeof(struct runes_cell));
- row->wrapped = 0;
- }
- }
- else {
- for (i = 0; i < bottom - top + 1; ++i) {
- row = runes_screen_row_at(t, top + i);
- memset(
- row->cells, 0, scr->grid->max.col * sizeof(struct runes_cell));
- row->wrapped = 0;
- }
- }
-
- scr->dirty = 1;
-}
-
-static int runes_screen_scroll_region_is_active(RunesTerm *t)
-{
- RunesScreen *scr = &t->scr;
-
- return scr->grid->scroll_top != 0
- || scr->grid->scroll_bottom != scr->grid->max.row - 1;
-}
-
-static int runes_screen_loc_is_between(
- RunesTerm *t, struct runes_loc loc,
- struct runes_loc start, struct runes_loc end)
-{
- UNUSED(t);
-
- if (end.row < start.row || (end.row == start.row && end.col < start.col)) {
- struct runes_loc tmp;
-
- tmp = start;
- start = end;
- end = tmp;
- }
-
- if (loc.row < start.row || loc.row > end.row) {
- return 0;
- }
-
- if (loc.row == start.row && loc.col < start.col) {
- return 0;
- }
-
- if (loc.row == end.row && loc.col >= end.col) {
- return 0;
- }
-
- return 1;
-}
-
-static int runes_screen_row_max_col(RunesTerm *t, int row)
-{
- RunesScreen *scr = &t->scr;
- struct runes_cell *cells = scr->grid->rows[row].cells;
- int i, max = -1;
-
- for (i = 0; i < scr->grid->max.col; ++i) {
- if (cells[i].len) {
- max = i;
- }
- }
-
- return max + 1;
-}
diff --git a/src/screen.h b/src/screen.h
deleted file mode 100644
index 2e6a298..0000000
--- a/src/screen.h
+++ /dev/null
@@ -1,175 +0,0 @@
-#ifndef _RUNES_SCREEN_H
-#define _RUNES_SCREEN_H
-
-#include <stdint.h>
-
-enum RunesColorType {
- RUNES_COLOR_DEFAULT,
- RUNES_COLOR_IDX,
- RUNES_COLOR_RGB
-};
-
-struct runes_loc {
- int row;
- int col;
-};
-
-struct runes_color {
- union {
- struct {
- union {
- struct {
- unsigned char r;
- unsigned char g;
- unsigned char b;
- };
- unsigned char idx;
- };
- unsigned char type;
- };
- uint32_t id;
- };
-};
-
-struct runes_cell_attrs {
- struct runes_color fgcolor;
- struct runes_color bgcolor;
- union {
- struct {
- unsigned char bold: 1;
- unsigned char italic: 1;
- unsigned char underline: 1;
- unsigned char inverse: 1;
- };
- unsigned char attrs;
- };
-};
-
-struct runes_cell {
- char contents[8];
- size_t len;
- struct runes_cell_attrs attrs;
- unsigned char is_wide: 1;
-};
-
-struct runes_row {
- struct runes_cell *cells;
- unsigned char wrapped: 1;
-};
-
-struct runes_grid {
- struct runes_loc cur;
- struct runes_loc max;
- struct runes_loc saved;
-
- struct runes_loc selection_start;
- struct runes_loc selection_end;
-
- int scroll_top;
- int scroll_bottom;
-
- int row_count;
- int row_capacity;
- int row_top;
-
- struct runes_row *rows;
-};
-
-/* XXX including parser.h in a place which would be visible here breaks things,
- * so we copy these defintions over here */
-typedef void* yyscan_t;
-struct yy_buffer_state;
-typedef struct yy_buffer_state *YY_BUFFER_STATE;
-
-struct runes_screen {
- struct runes_grid *grid;
- struct runes_grid *alternate;
-
- char *title;
- size_t title_len;
- char *icon_name;
- size_t icon_name_len;
-
- struct runes_cell_attrs attrs;
-
- yyscan_t scanner;
- YY_BUFFER_STATE state;
-
- unsigned char hide_cursor: 1;
- unsigned char application_keypad: 1;
- unsigned char application_cursor: 1;
- unsigned char mouse_reporting_press: 1;
- unsigned char mouse_reporting_press_release: 1;
- unsigned char bracketed_paste: 1;
-
- unsigned char visual_bell: 1;
- unsigned char audible_bell: 1;
- unsigned char update_title: 1;
- unsigned char update_icon_name: 1;
- unsigned char has_selection: 1;
-
- unsigned char dirty: 1;
-};
-
-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);
-int runes_screen_loc_is_selected(RunesTerm *t, struct runes_loc loc);
-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);
-void runes_screen_show_string_utf8(RunesTerm *t, char *buf, size_t len);
-void runes_screen_move_to(RunesTerm *t, int row, int col);
-void runes_screen_clear_screen(RunesTerm *t);
-void runes_screen_clear_screen_forward(RunesTerm *t);
-void runes_screen_clear_screen_backward(RunesTerm *t);
-void runes_screen_kill_line(RunesTerm *t);
-void runes_screen_kill_line_forward(RunesTerm *t);
-void runes_screen_kill_line_backward(RunesTerm *t);
-void runes_screen_insert_characters(RunesTerm *t, int count);
-void runes_screen_insert_lines(RunesTerm *t, int count);
-void runes_screen_delete_characters(RunesTerm *t, int count);
-void runes_screen_delete_lines(RunesTerm *t, int count);
-void runes_screen_set_scroll_region(
- RunesTerm *t, int top, int bottom, int left, int right);
-void runes_screen_reset_text_attributes(RunesTerm *t);
-void runes_screen_set_fg_color(RunesTerm *t, int idx);
-void runes_screen_set_fg_color_rgb(
- RunesTerm *t, unsigned char r, unsigned char g, unsigned char b);
-void runes_screen_reset_fg_color(RunesTerm *t);
-void runes_screen_set_bg_color(RunesTerm *t, int idx);
-void runes_screen_set_bg_color_rgb(
- RunesTerm *t, unsigned char r, unsigned char g, unsigned char b);
-void runes_screen_reset_bg_color(RunesTerm *t);
-void runes_screen_set_bold(RunesTerm *t);
-void runes_screen_set_italic(RunesTerm *t);
-void runes_screen_set_underline(RunesTerm *t);
-void runes_screen_set_inverse(RunesTerm *t);
-void runes_screen_reset_bold(RunesTerm *t);
-void runes_screen_reset_italic(RunesTerm *t);
-void runes_screen_reset_underline(RunesTerm *t);
-void runes_screen_reset_inverse(RunesTerm *t);
-void runes_screen_use_alternate_buffer(RunesTerm *t);
-void runes_screen_use_normal_buffer(RunesTerm *t);
-void runes_screen_save_cursor(RunesTerm *t);
-void runes_screen_restore_cursor(RunesTerm *t);
-void runes_screen_show_cursor(RunesTerm *t);
-void runes_screen_hide_cursor(RunesTerm *t);
-void runes_screen_set_application_keypad(RunesTerm *t);
-void runes_screen_reset_application_keypad(RunesTerm *t);
-void runes_screen_set_application_cursor(RunesTerm *t);
-void runes_screen_reset_application_cursor(RunesTerm *t);
-void runes_screen_set_mouse_reporting_press(RunesTerm *t);
-void runes_screen_reset_mouse_reporting_press(RunesTerm *t);
-void runes_screen_set_mouse_reporting_press_release(RunesTerm *t);
-void runes_screen_reset_mouse_reporting_press_release(RunesTerm *t);
-void runes_screen_set_bracketed_paste(RunesTerm *t);
-void runes_screen_reset_bracketed_paste(RunesTerm *t);
-void runes_screen_set_window_title(RunesTerm *t, char *buf, size_t len);
-void runes_screen_set_icon_name(RunesTerm *t, char *buf, size_t len);
-void runes_screen_cleanup(RunesTerm *t);
-
-#endif
diff --git a/src/term.c b/src/term.c
index aa7f628..d5791e1 100644
--- a/src/term.c
+++ b/src/term.c
@@ -12,7 +12,8 @@ void runes_term_init(RunesTerm *t, int argc, char *argv[])
runes_window_backend_create_window(t, argc, argv);
runes_pty_backend_spawn_subprocess(t);
- runes_screen_init(t);
+ vt100_screen_init(&t->scr);
+ vt100_screen_set_scrollback_length(&t->scr, t->config.scrollback_length);
runes_display_set_window_size(t);
t->loop = uv_default_loop();
@@ -24,7 +25,7 @@ void runes_term_cleanup(RunesTerm *t)
{
runes_config_cleanup(t);
runes_display_cleanup(t);
- runes_screen_cleanup(t);
+ vt100_screen_cleanup(&t->scr);
runes_window_backend_cleanup(t);
runes_pty_backend_cleanup(t);
}
diff --git a/src/term.h b/src/term.h
index 2b1ad93..4a052d4 100644
--- a/src/term.h
+++ b/src/term.h
@@ -4,7 +4,7 @@
struct runes_term {
RunesWindowBackend w;
RunesPtyBackend pty;
- RunesScreen scr;
+ VT100Screen scr;
RunesConfig config;
RunesDisplay display;
diff --git a/src/window-xlib.c b/src/window-xlib.c
index f07cf41..041183a 100644
--- a/src/window-xlib.c
+++ b/src/window-xlib.c
@@ -119,7 +119,7 @@ static int runes_window_backend_handle_builtin_button_press(
RunesTerm *t, XButtonEvent *e);
static struct function_key *runes_window_backend_find_key_sequence(
RunesTerm *t, KeySym sym);
-static struct runes_loc runes_window_backend_get_mouse_position(
+static struct vt100_loc runes_window_backend_get_mouse_position(
RunesTerm *t, int xpixel, int ypixel);
void runes_window_backend_create_window(RunesTerm *t, int argc, char *argv[])
@@ -628,14 +628,14 @@ static void runes_window_backend_start_selection(
RunesTerm *t, int xpixel, int ypixel, Time time)
{
RunesWindowBackend *w = &t->w;
- struct runes_loc *start = &t->scr.grid->selection_start;
- struct runes_loc *end = &t->scr.grid->selection_end;
+ struct vt100_loc *start = &t->display.selection_start;
+ struct vt100_loc *end = &t->display.selection_end;
*start = runes_window_backend_get_mouse_position(t, xpixel, ypixel);
*end = *start;
XSetSelectionOwner(w->dpy, XA_PRIMARY, w->w, time);
- t->scr.has_selection = (XGetSelectionOwner(w->dpy, XA_PRIMARY) == w->w);
+ t->display.has_selection = (XGetSelectionOwner(w->dpy, XA_PRIMARY) == w->w);
t->scr.dirty = 1;
runes_window_backend_request_flush(t);
@@ -644,10 +644,10 @@ static void runes_window_backend_start_selection(
static void runes_window_backend_update_selection(
RunesTerm *t, int xpixel, int ypixel)
{
- struct runes_loc *end = &t->scr.grid->selection_end;
- struct runes_loc orig_end = *end;
+ struct vt100_loc *end = &t->display.selection_end;
+ struct vt100_loc orig_end = *end;
- if (!t->scr.has_selection) {
+ if (!t->display.has_selection) {
return;
}
@@ -664,7 +664,7 @@ static void runes_window_backend_clear_selection(RunesTerm *t)
RunesWindowBackend *w = &t->w;
XSetSelectionOwner(w->dpy, XA_PRIMARY, None, CurrentTime);
- t->scr.has_selection = 0;
+ t->display.has_selection = 0;
}
static void runes_window_backend_handle_key_event(RunesTerm *t, XKeyEvent *e)
@@ -728,7 +728,7 @@ static void runes_window_backend_handle_button_event(
if (t->scr.mouse_reporting_press_release) {
char response[7];
char status = 0;
- struct runes_loc loc;
+ struct vt100_loc loc;
if (e->type == ButtonRelease && e->button > 3) {
return;
@@ -775,7 +775,7 @@ static void runes_window_backend_handle_button_event(
}
else if (t->scr.mouse_reporting_press && e->type == ButtonPress) {
char response[7];
- struct runes_loc loc;
+ struct vt100_loc loc;
loc = runes_window_backend_get_mouse_position(t, e->x, e->y);
sprintf(
@@ -884,7 +884,7 @@ static void runes_window_backend_handle_selection_clear_event(
{
UNUSED(e);
- t->scr.has_selection = 0;
+ t->display.has_selection = 0;
t->scr.dirty = 1;
runes_window_backend_flush(t);
}
@@ -916,18 +916,18 @@ static void runes_window_backend_handle_selection_request_event(
else if (e->target == XA_STRING || e->target == w->atoms[RUNES_ATOM_UTF8_STRING]) {
char *contents;
size_t len;
- struct runes_loc *start = &t->scr.grid->selection_start;
- struct runes_loc *end = &t->scr.grid->selection_end;
+ struct vt100_loc *start = &t->display.selection_start;
+ struct vt100_loc *end = &t->display.selection_end;
if (end->row < start->row || (end->row == start->row && end->col < start->col)) {
- struct runes_loc *tmp;
+ struct vt100_loc *tmp;
tmp = start;
start = end;
end = tmp;
}
- runes_screen_get_string(t, start, end, &contents, &len);
+ vt100_screen_get_string_plaintext(&t->scr, start, end, &contents, &len);
XChangeProperty(
w->dpy, e->requestor, e->property,
e->target, 8, PropModeReplace,
@@ -1035,10 +1035,10 @@ static struct function_key *runes_window_backend_find_key_sequence(
return key;
}
-static struct runes_loc runes_window_backend_get_mouse_position(
+static struct vt100_loc runes_window_backend_get_mouse_position(
RunesTerm *t, int xpixel, int ypixel)
{
- struct runes_loc ret;
+ struct vt100_loc ret;
ret.row = ypixel / t->display.fonty;
ret.col = xpixel / t->display.fontx;