aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-04-11 17:42:24 -0400
committerJesse Luehrs <doy@tozt.net>2014-04-11 17:42:24 -0400
commit9e611718e883b3d3fa273fa437fa0d3b9a65b30f (patch)
treee4114232ff5705f9d84314863b2733dc54d6b5a6
parent023d33e900318bc963e41ad6c151d6f0f2e4d269 (diff)
downloadrunes-9e611718e883b3d3fa273fa437fa0d3b9a65b30f.tar.gz
runes-9e611718e883b3d3fa273fa437fa0d3b9a65b30f.zip
framework for handling OSC escape sequences
-rw-r--r--vt100.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/vt100.c b/vt100.c
index 188aa79..20483b3 100644
--- a/vt100.c
+++ b/vt100.c
@@ -16,10 +16,13 @@ static char *runes_vt100_handle_ctrl_char(RunesTerm *t, char *buf, size_t len);
static char *runes_vt100_handle_escape_sequence(
RunesTerm *t, char *buf, size_t len);
static char *runes_vt100_handle_csi(RunesTerm *t, char *buf, size_t len);
+static char *runes_vt100_handle_osc(RunesTerm *t, char *buf, size_t len);
static void runes_vt100_unhandled_escape_sequence(
RunesTerm *t, char type);
static void runes_vt100_unhandled_csi(
RunesTerm *t, int p[3], char type);
+static void runes_vt100_unhandled_osc(
+ RunesTerm *t, int type, char *arg, char terminator);
void runes_vt100_process_string(RunesTerm *t, char *buf, size_t len)
{
@@ -107,6 +110,10 @@ static char *runes_vt100_handle_escape_sequence(
buf++;
buf = runes_vt100_handle_csi(t, buf, len);
break;
+ case ']': /* OSC */
+ buf++;
+ buf = runes_vt100_handle_osc(t, buf, len);
+ break;
default:
runes_vt100_unhandled_escape_sequence(t, buf[0]);
buf++;
@@ -275,6 +282,27 @@ static char *runes_vt100_handle_csi(RunesTerm *t, char *buf, size_t len)
return buf + paramlen;
}
+static char *runes_vt100_handle_osc(RunesTerm *t, char *buf, size_t len)
+{
+ int type, prefix;
+
+ UNUSED(len);
+
+ if (sscanf(buf, "%d%n", &type, &prefix) != 1) {
+ runes_vt100_unhandled_osc(t, -1, "", buf[0]);
+ return buf + 1;
+ }
+
+ switch (type) {
+ default:
+ runes_vt100_unhandled_osc(t, type, "", -1);
+ prefix++;
+ break;
+ }
+
+ return buf + prefix;
+}
+
static void runes_vt100_unhandled_escape_sequence(
RunesTerm *t, char type)
{
@@ -300,3 +328,20 @@ static void runes_vt100_unhandled_csi(
}
fprintf(stderr, "%c\n", type);
}
+
+static void runes_vt100_unhandled_osc(
+ RunesTerm *t, int type, char *arg, char terminator)
+{
+ UNUSED(t);
+
+ fprintf(stderr, "unhandled escape sequence: \\033]");
+ if (type == -1) {
+ fprintf(stderr, "\\%hho\n", terminator);
+ }
+ else if (terminator == -1) {
+ fprintf(stderr, "%d;<unknown>\n", type);
+ }
+ else {
+ fprintf(stderr, "%d;%s\\%hho\n", type, arg, terminator);
+ }
+}