From 07530dd08e0b29573712b54543a7fc42672bb34b Mon Sep 17 00:00:00 2001
From: Marvin Borner
Date: Wed, 18 Dec 2019 17:59:22 +0100
Subject: Added very basic command support

---
 src/userspace/mlibc/stdio/readline.c | 15 ++++++++++++---
 src/userspace/mlibc/string.h         |  6 ++++++
 src/userspace/mlibc/string/memcmp.c  | 14 ++++++++++++++
 src/userspace/mlibc/string/memcpy.c  |  9 +++++++++
 src/userspace/mlibc/string/memset.c  |  8 ++++++++
 5 files changed, 49 insertions(+), 3 deletions(-)
 create mode 100644 src/userspace/mlibc/string/memcmp.c
 create mode 100644 src/userspace/mlibc/string/memcpy.c
 create mode 100644 src/userspace/mlibc/string/memset.c

(limited to 'src/userspace/mlibc')

diff --git a/src/userspace/mlibc/stdio/readline.c b/src/userspace/mlibc/stdio/readline.c
index a7082e6..b948884 100644
--- a/src/userspace/mlibc/stdio/readline.c
+++ b/src/userspace/mlibc/stdio/readline.c
@@ -1,7 +1,16 @@
-// #include <syscall.h>
+#include <syscall.h>
+#include <mlibc/string.h>
+#include <mlibc/stdio.h>
 
 char *readline()
 {
-    // return (char *) syscall_read();
-    return "0";
+    char *ret = "";
+    char buf = 0;
+    while (buf != '\n') {
+        buf = getch();
+        writec(buf);
+        strcpy(ret, buf);
+    }
+    strcpy(ret, buf);
+    return ret;
 }
\ No newline at end of file
diff --git a/src/userspace/mlibc/string.h b/src/userspace/mlibc/string.h
index fe925cb..153b7cb 100644
--- a/src/userspace/mlibc/string.h
+++ b/src/userspace/mlibc/string.h
@@ -19,4 +19,10 @@ char *strdup(const char *orig);
 
 void strinv(char *str);
 
+void *memcpy(void *dest, const void *src, size_t count);
+
+void *memset(void *dest, char val, size_t count);
+
+int memcmp(const void *a_ptr, const void *b_ptr, size_t size);
+
 #endif
diff --git a/src/userspace/mlibc/string/memcmp.c b/src/userspace/mlibc/string/memcmp.c
new file mode 100644
index 0000000..af2125c
--- /dev/null
+++ b/src/userspace/mlibc/string/memcmp.c
@@ -0,0 +1,14 @@
+#include <stddef.h>
+
+int memcmp(const void *a_ptr, const void *b_ptr, size_t size)
+{
+    const unsigned char *a = (const unsigned char *) a_ptr;
+    const unsigned char *b = (const unsigned char *) b_ptr;
+    for (size_t i = 0; i < size; i++) {
+        if (a[i] < b[i])
+            return -1;
+        else if (b[i] < a[i])
+            return 1;
+    }
+    return 0;
+}
\ No newline at end of file
diff --git a/src/userspace/mlibc/string/memcpy.c b/src/userspace/mlibc/string/memcpy.c
new file mode 100644
index 0000000..e4e9c76
--- /dev/null
+++ b/src/userspace/mlibc/string/memcpy.c
@@ -0,0 +1,9 @@
+#include <stddef.h>
+
+void *memcpy(void *dest, const void *src, size_t count)
+{
+    const char *sp = (const char *) src;
+    char *dp = (char *) dest;
+    for (; count != 0; count--) *dp++ = *sp++;
+    return dest;
+}
\ No newline at end of file
diff --git a/src/userspace/mlibc/string/memset.c b/src/userspace/mlibc/string/memset.c
new file mode 100644
index 0000000..fb5ab80
--- /dev/null
+++ b/src/userspace/mlibc/string/memset.c
@@ -0,0 +1,8 @@
+#include <stddef.h>
+
+void *memset(void *dest, char val, size_t count)
+{
+    char *temp = (char *) dest;
+    for (; count != 0; count--) *temp++ = val;
+    return dest;
+}
\ No newline at end of file
-- 
cgit v1.2.3