vte: parse basic control codes
This adds a parser for basic control codes but does not implement their functionality, yet. Only the newline handler is kept. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
c4683b34ef
commit
0e31653eb1
73
src/vte.c
73
src/vte.c
@ -115,11 +115,75 @@ void kmscon_vte_bind(struct kmscon_vte *vte, struct kmscon_console *con)
|
||||
kmscon_console_ref(vte->con);
|
||||
}
|
||||
|
||||
static void parse_control(struct kmscon_vte *vte, uint32_t ctrl)
|
||||
{
|
||||
switch (ctrl) {
|
||||
case 0x00: /* NUL */
|
||||
/* Ignore on input */
|
||||
break;
|
||||
case 0x05: /* ENQ */
|
||||
/* Transmit answerback message */
|
||||
break;
|
||||
case 0x07: /* BEL */
|
||||
/* Sound bell tone */
|
||||
break;
|
||||
case 0x08: /* BS */
|
||||
/* Move cursor one position left */
|
||||
break;
|
||||
case 0x09: /* HT */
|
||||
/* Move to next tab stop or end of line */
|
||||
break;
|
||||
case 0x0a: /* LF */
|
||||
case 0x0b: /* VT */
|
||||
case 0x0c: /* FF */
|
||||
/* Line feed or newline (CR/NL mode) */
|
||||
kmscon_console_newline(vte->con);
|
||||
break;
|
||||
case 0x0d: /* CR */
|
||||
/* Move cursor to left margin */
|
||||
break;
|
||||
case 0x0e: /* SO */
|
||||
/* Invoke G1 character set */
|
||||
break;
|
||||
case 0x0f: /* SI */
|
||||
/* Select G0 character set */
|
||||
break;
|
||||
case 0x11: /* XON */
|
||||
/* Resume transmission */
|
||||
break;
|
||||
case 0x13: /* XOFF */
|
||||
/* Stop transmission */
|
||||
break;
|
||||
case 0x18: /* CAN */
|
||||
case 0x1a: /* SUB */
|
||||
/* Discard current escape sequence and show err-sym */
|
||||
break;
|
||||
case 0x1b: /* ESC */
|
||||
/* Invokes an escape sequence */
|
||||
break;
|
||||
case 0x7f: /* DEL */
|
||||
/* Ignored on input */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void parse_input(struct kmscon_vte *vte, uint32_t val)
|
||||
{
|
||||
kmscon_symbol_t sym;
|
||||
|
||||
if (val < 0x20) {
|
||||
parse_control(vte, val);
|
||||
return;
|
||||
}
|
||||
|
||||
sym = kmscon_symbol_make(val);
|
||||
kmscon_console_write(vte->con, sym);
|
||||
}
|
||||
|
||||
void kmscon_vte_input(struct kmscon_vte *vte, const char *u8, size_t len)
|
||||
{
|
||||
int state, i;
|
||||
uint32_t ucs4;
|
||||
kmscon_symbol_t sym;
|
||||
|
||||
if (!vte || !vte->con)
|
||||
return;
|
||||
@ -129,12 +193,7 @@ void kmscon_vte_input(struct kmscon_vte *vte, const char *u8, size_t len)
|
||||
if (state == KMSCON_UTF8_ACCEPT ||
|
||||
state == KMSCON_UTF8_REJECT) {
|
||||
ucs4 = kmscon_utf8_mach_get(vte->mach);
|
||||
if (ucs4 == '\n') {
|
||||
kmscon_console_newline(vte->con);
|
||||
} else {
|
||||
sym = kmscon_symbol_make(ucs4);
|
||||
kmscon_console_write(vte->con, sym);
|
||||
}
|
||||
parse_input(vte, ucs4);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user