/* Generated file. Do not edit. */

static teken_state_t	teken_state_2;
static teken_state_t	teken_state_6;
static teken_state_t	teken_state_1;
static teken_state_t	teken_state_7;
static teken_state_t	teken_state_8;
static teken_state_t	teken_state_3;
static teken_state_t	teken_state_5;
static teken_state_t	teken_state_4;

/* '' */
static void
teken_state_init(teken_t *t, teken_char_t c)
{

	switch (c) {
	case '\x1B':
		teken_state_switch(t, teken_state_1);
		return;
	default:
		teken_subr_regular_character(t, c);
		break;
	}
}

/* '^[[' */
static void
teken_state_2(teken_t *t, teken_char_t c)
{

	if (teken_state_numbers(t, c))
		return;

	switch (c) {
	case 'X': /* ECH: Erase character */
		teken_subr_erase_character(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'Z': /* CBT: Cursor Backward Tabulation */
		teken_subr_cursor_backward_tabulation(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case '`': /* HPA: Horizontal Position Absolute */
		teken_subr_horizontal_position_absolute(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'a': /* CUF: Cursor Forward */
		teken_subr_cursor_forward(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'c': /* DA1: Primary Device Attributes */
		teken_subr_primary_device_attributes(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'd': /* VPA: Vertical Position Absolute */
		teken_subr_vertical_position_absolute(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'e': /* CUD: Cursor Down */
		teken_subr_cursor_down(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'f': /* CUP: Cursor Position */
		teken_subr_cursor_position(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0], (t->t_curnum < 2 || t->t_nums[1] == 0) ? 1 : t->t_nums[1]);
		break;
	case 'g': /* TBC: Tab Clear */
		teken_subr_tab_clear(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'h': /* SM: Set Mode */
		teken_subr_set_mode(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'l': /* RM: Reset Mode */
		teken_subr_reset_mode(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'm': /* SGR: Set Graphic Rendition */
		teken_subr_set_graphic_rendition(t, t->t_curnum, t->t_nums);
		break;
	case 'n': /* CPR: Cursor Position Report */
		teken_subr_cursor_position_report(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'r': /* DECSTBM: Set top and bottom margins */
		teken_subr_set_top_and_bottom_margins(t, t->t_curnum < 1 ? 0 : t->t_nums[0], t->t_curnum < 2 ? 0 : t->t_nums[1]);
		break;
	case 's': /* DECSC: Save cursor */
		teken_subr_save_cursor(t);
		break;
	case 'u': /* DECRC: Restore cursor */
		teken_subr_restore_cursor(t);
		break;
	case 'x': /* C25SGR: Cons25 set graphic rendition */
		teken_subr_cons25_set_graphic_rendition(t, t->t_curnum < 1 ? 0 : t->t_nums[0], t->t_curnum < 2 ? 0 : t->t_nums[1]);
		break;
	case 'z': /* C25VTSW: Cons25 switch virtual terminal */
		teken_subr_cons25_switch_virtual_terminal(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case '@': /* ICH: Insert character */
		teken_subr_insert_character(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'A': /* CUU: Cursor Up */
		teken_subr_cursor_up(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'B': /* CUD: Cursor Down */
		teken_subr_cursor_down(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'C': /* CUF: Cursor Forward */
		teken_subr_cursor_forward(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'D': /* CUB: Cursor Backward */
		teken_subr_cursor_backward(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'E': /* CNL: Cursor Next Line */
		teken_subr_cursor_next_line(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'F': /* CPL: Cursor Previous Line */
		teken_subr_cursor_previous_line(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'G': /* HPA: Horizontal Position Absolute */
		teken_subr_horizontal_position_absolute(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'H': /* CUP: Cursor Position */
		teken_subr_cursor_position(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0], (t->t_curnum < 2 || t->t_nums[1] == 0) ? 1 : t->t_nums[1]);
		break;
	case 'I': /* CHT: Cursor Forward Tabulation */
		teken_subr_cursor_forward_tabulation(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'J': /* ED: Erase display */
		teken_subr_erase_display(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'K': /* EL: Erase line */
		teken_subr_erase_line(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'L': /* IL: Insert line */
		teken_subr_insert_line(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'M': /* DL: Delete line */
		teken_subr_delete_line(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'P': /* DC: Delete character */
		teken_subr_delete_character(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'S': /* SU: Pan Down */
		teken_subr_pan_down(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case 'T': /* SD: Pan Up */
		teken_subr_pan_up(t, (t->t_curnum < 1 || t->t_nums[0] == 0) ? 1 : t->t_nums[0]);
		break;
	case '=':
		teken_state_switch(t, teken_state_8);
		return;
	case '>':
		teken_state_switch(t, teken_state_3);
		return;
	case '?':
		teken_state_switch(t, teken_state_5);
		return;
	default:
		teken_printf("Unsupported sequence in teken_state_2: %u\n", (unsigned int)c);
		break;
	}

	teken_state_switch(t, teken_state_init);
}

/* '^[(' */
static void
teken_state_6(teken_t *t, teken_char_t c)
{

	switch (c) {
	case '0': /* G0SCS0: G0 SCS Special Graphics */
		teken_subr_g0_scs_special_graphics(t);
		break;
	case '1': /* G0SCS1: G0 SCS US ASCII */
		teken_subr_g0_scs_us_ascii(t);
		break;
	case '2': /* G0SCS2: G0 SCS Special Graphics */
		teken_subr_g0_scs_special_graphics(t);
		break;
	case 'A': /* G0SCSA: G0 SCS UK National */
		teken_subr_g0_scs_uk_national(t);
		break;
	case 'B': /* G0SCSB: G0 SCS US ASCII */
		teken_subr_g0_scs_us_ascii(t);
		break;
	default:
		teken_printf("Unsupported sequence in teken_state_6: %u\n", (unsigned int)c);
		break;
	}

	teken_state_switch(t, teken_state_init);
}

/* '^[' */
static void
teken_state_1(teken_t *t, teken_char_t c)
{

	switch (c) {
	case '7': /* DECSC: Save cursor */
		teken_subr_save_cursor(t);
		break;
	case '8': /* DECRC: Restore cursor */
		teken_subr_restore_cursor(t);
		break;
	case '=': /* DECKPAM: Keypad application mode */
		teken_subr_keypad_application_mode(t);
		break;
	case '>': /* DECKPNM: Keypad numeric mode */
		teken_subr_keypad_numeric_mode(t);
		break;
	case 'D': /* IND: Index */
		teken_subr_index(t);
		break;
	case 'E': /* NEL: Next line */
		teken_subr_next_line(t);
		break;
	case 'H': /* HTS: Horizontal Tab Set */
		teken_subr_horizontal_tab_set(t);
		break;
	case 'M': /* RI: Reverse index */
		teken_subr_reverse_index(t);
		break;
	case 'P': /* DCS: Device Control String */
		teken_subr_device_control_string(t);
		break;
	case ']': /* OSC: Operating System Command */
		teken_subr_operating_system_command(t);
		break;
	case 'c': /* RIS: Reset to Initial State */
		teken_subr_reset_to_initial_state(t);
		break;
	case '\\': /* ST: String Terminator */
		teken_subr_string_terminator(t);
		break;
	case '[':
		teken_state_switch(t, teken_state_2);
		return;
	case '(':
		teken_state_switch(t, teken_state_6);
		return;
	case ')':
		teken_state_switch(t, teken_state_7);
		return;
	case '#':
		teken_state_switch(t, teken_state_4);
		return;
	default:
		teken_printf("Unsupported sequence in teken_state_1: %u\n", (unsigned int)c);
		break;
	}

	teken_state_switch(t, teken_state_init);
}

/* '^[)' */
static void
teken_state_7(teken_t *t, teken_char_t c)
{

	switch (c) {
	case '0': /* G1SCS0: G1 SCS Special Graphics */
		teken_subr_g1_scs_special_graphics(t);
		break;
	case '1': /* G1SCS1: G1 SCS US ASCII */
		teken_subr_g1_scs_us_ascii(t);
		break;
	case '2': /* G1SCS2: G1 SCS Special Graphics */
		teken_subr_g1_scs_special_graphics(t);
		break;
	case 'A': /* G1SCSA: G1 SCS UK National */
		teken_subr_g1_scs_uk_national(t);
		break;
	case 'B': /* G1SCSB: G1 SCS US ASCII */
		teken_subr_g1_scs_us_ascii(t);
		break;
	default:
		teken_printf("Unsupported sequence in teken_state_7: %u\n", (unsigned int)c);
		break;
	}

	teken_state_switch(t, teken_state_init);
}

/* '^[[=' */
static void
teken_state_8(teken_t *t, teken_char_t c)
{

	if (teken_state_numbers(t, c))
		return;

	switch (c) {
	case 'B': /* C25BLPD: Cons25 set bell pitch duration */
		teken_subr_cons25_set_bell_pitch_duration(t, t->t_curnum < 1 ? 0 : t->t_nums[0], t->t_curnum < 2 ? 0 : t->t_nums[1]);
		break;
	case 'F': /* C25ADFG: Cons25 set adapter foreground */
		teken_subr_cons25_set_adapter_foreground(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'G': /* C25ADBG: Cons25 set adapter background */
		teken_subr_cons25_set_adapter_background(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'S': /* C25CURS: Cons25 set cursor type */
		teken_subr_cons25_set_cursor_type(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'T': /* C25MODE: Cons25 set terminal mode */
		teken_subr_cons25_set_terminal_mode(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	default:
		teken_printf("Unsupported sequence in teken_state_8: %u\n", (unsigned int)c);
		break;
	}

	teken_state_switch(t, teken_state_init);
}

/* '^[[>' */
static void
teken_state_3(teken_t *t, teken_char_t c)
{

	if (teken_state_numbers(t, c))
		return;

	switch (c) {
	case 'c': /* DA2: Secondary Device Attributes */
		teken_subr_secondary_device_attributes(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	default:
		teken_printf("Unsupported sequence in teken_state_3: %u\n", (unsigned int)c);
		break;
	}

	teken_state_switch(t, teken_state_init);
}

/* '^[[?' */
static void
teken_state_5(teken_t *t, teken_char_t c)
{

	if (teken_state_numbers(t, c))
		return;

	switch (c) {
	case 'h': /* DECSM: Set DEC mode */
		teken_subr_set_dec_mode(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'l': /* DECRM: Reset DEC mode */
		teken_subr_reset_dec_mode(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	case 'n': /* DSR: Device Status Report */
		teken_subr_device_status_report(t, t->t_curnum < 1 ? 0 : t->t_nums[0]);
		break;
	default:
		teken_printf("Unsupported sequence in teken_state_5: %u\n", (unsigned int)c);
		break;
	}

	teken_state_switch(t, teken_state_init);
}

/* '^[#' */
static void
teken_state_4(teken_t *t, teken_char_t c)
{

	switch (c) {
	case '3': /* DECDHL: Double Height Double Width Line Top */
		teken_subr_double_height_double_width_line_top(t);
		break;
	case '4': /* DECDHL: Double Height Double Width Line Bottom */
		teken_subr_double_height_double_width_line_bottom(t);
		break;
	case '5': /* DECSWL: Single Height Single Width Line */
		teken_subr_single_height_single_width_line(t);
		break;
	case '6': /* DECDWL: Single Height Double Width Line */
		teken_subr_single_height_double_width_line(t);
		break;
	case '8': /* DECALN: Alignment test */
		teken_subr_alignment_test(t);
		break;
	default:
		teken_printf("Unsupported sequence in teken_state_4: %u\n", (unsigned int)c);
		break;
	}

	teken_state_switch(t, teken_state_init);
}
