Author: mesyeti <mesyeti@mesyeti.uk>
fix escape sequence parsing + add cursor controls
source/interpreter/vt100.c | 64 +++++++++++++++++++++++++++++++++++++++ source/sysTerm/unix.c | 4 +- source/util.c | 28 ++++++---------- source/util.h | 2
diff --git a/source/interpreter/vt100.c b/source/interpreter/vt100.c index 419f0bf47437e6f3a96a2ad1be5faf05560dca54..213cb5b1e08740168832b403b26a309a4318df28 100644 --- a/source/interpreter/vt100.c +++ b/source/interpreter/vt100.c @@ -55,9 +55,71 @@ ++ str; } size_t num; - char** parts = Split(str, &num); + char** parts = Split(str, &num, ';'); switch (ch) { + case 'A': { // move cursor up # lines + if (num < 1) return; + + terminal->cursor.y -= atoi(parts[0]); + if (terminal->cursor.y < 0) { + terminal->cursor.y = 0; + } + break; + } + case 'B': { // move cursor down # lines + if (num < 1) return; + + terminal->cursor.y += atoi(parts[0]); + if (terminal->cursor.y >= terminal->buffer.height) { + terminal->cursor.y = terminal->buffer.height - 1; + } + break; + } + case 'C': { // move cursor right # columns + if (num < 1) return; + + terminal->cursor.x += atoi(parts[0]); + if (terminal->cursor.x >= terminal->buffer.width) { + terminal->cursor.x = terminal->buffer.width - 1; + } + break; + } + case 'D': { // move cursor left # columns + if (num < 1) return; + + terminal->cursor.x -= atoi(parts[0]); + if (terminal->cursor.x < 0) { + terminal->cursor.x = 0; + } + break; + } + case 'H': + case 'f': { + if (num < 2) return; + + int y = atoi(parts[0]) - 1; + int x = atoi(parts[1]) - 1; + + if (x < 0) x = 0; + if (y < 0) y = 0; + if (x >= terminal->buffer.width) x = terminal->buffer.width - 1; + if (y >= terminal->buffer.height) y = terminal->buffer.height - 1; + + terminal->cursor = (Vec2) {x, y}; + break; + } + case 'J': { + if (num < 1) return; + + switch (atoi(parts[0])) { + case 2: { + Buffer_Clear(&terminal->buffer); + break; + } + } + break; + } case 'm': { for (size_t i = 0; i < num; ++ i) { int part = atoi(parts[i]); diff --git a/source/sysTerm/unix.c b/source/sysTerm/unix.c index 03f3a33c5de8c0d1418b6bd7cf105ef04dd56b96..7b306224d6f284b4164be3c9d692bb2765f540c2 100644 --- a/source/sysTerm/unix.c +++ b/source/sysTerm/unix.c @@ -15,8 +15,8 @@ #include "../mem.h" #include "../util.h" #include "../sysTerm.h" -// #define TERM "xterm-16color" -#define TERM "dumb" +#define TERM "xterm-16color" +// #define TERM "dumb" extern char** environ; diff --git a/source/util.c b/source/util.c index 38c7d237aae21bc235127e9afa7f99d0d40bc488..d8d941ce49723bc2e16e5ff223bdb977b1c38713 100644 --- a/source/util.c +++ b/source/util.c @@ -192,7 +192,7 @@ return memcmp(str, with, strlen(with)) == 0; } -char** Split(const char* str, size_t* length) { +char** Split(const char* str, size_t* length, char ch) { char** ret; *length = 0; @@ -202,24 +202,18 @@ char* thisString = NewString(""); for (size_t i = 0; i <= strlen(str); ++ i) { - switch (str[i]) { - case ' ': - case '\t': - case '\0': { - ret[*length] = thisString; - ++ *length; + if ((str[i] == ch) || (str[i] == '\0')) { + ret[*length] = thisString; + ++ *length; - ret = SafeRealloc(ret, sizeof(char*) * (*length + 1)); - ret[*length] = NULL; + ret = SafeRealloc(ret, sizeof(char*) * (*length + 1)); + ret[*length] = NULL; - thisString = NewString(""); - break; - } - default: { - char str2[2] = {str[i], 0}; - thisString = ConcatString(thisString, str2); - break; - } + thisString = NewString(""); + } + else { + char str2[2] = {str[i], 0}; + thisString = ConcatString(thisString, str2); } } diff --git a/source/util.h b/source/util.h index c85ff16367d5bbe694c33a4a63366980bc3faa2e..2e8ea3ce28922ad27da367de37f8c150e9fd9c3d 100644 --- a/source/util.h +++ b/source/util.h @@ -43,7 +43,7 @@ bool StrArrayContains(char** array, char* string); size_t StrArrayFind(char** array, char* string); void FreeStrArray(char** array); bool StringStartsWith(char* str, char* with); -char** Split(const char* str, size_t* length); +char** Split(const char* str, size_t* length, char ch); const char* BaseName(const char* path);