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:
David Herrmann 2012-02-01 17:13:22 +01:00
parent c4683b34ef
commit 0e31653eb1

View File

@ -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);
}
}
}