yterm

commit 0f96cec9c7e22ee9ff25edc34d0ea017a6ccd1d3

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