commit 23dd177eb3058f03c5e55d3f0ab0c3a82bfefeaf
parent 86ba759b7819f15d888e5735ccad13926b5f6adb
Author: Dimitris Papastamos <dimitris.papastamos@arm.com>
Date: Thu, 8 Nov 2018 22:59:13 +0000
Implement getln() and kgetc()
We cannot use stdio in dlang because that brings in memory allocation
which is unacceptable for the rmode target.
Change-Id: I858c64ed8d51eca4789f0911f2b1a2dfbc8734c6
Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
Diffstat:
10 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/include/rcode.h b/include/rcode.h
@@ -133,10 +133,14 @@ extern _Noreturn void panic(const char *msg);
extern _Noreturn void swtch(struct trapframe *fp);
extern _Noreturn void trap(struct trapframe *fp);
extern _Noreturn void badcmd(int error);
-extern void printk(const char * restrict fmt, ...) PRINTKFMT;
extern void rmc(Rmucmd *cmd);
extern int debug(void);
+
+/* libk */
+extern void printk(const char * restrict fmt, ...) PRINTKFMT;
extern struct bssmap *bss(void);
+extern char *getln(char *s, int n);
+extern int kgetc(void);
/* architectural functions */
extern _Noreturn void dohalt(void);
diff --git a/src/debuglang/debuglang.c b/src/debuglang/debuglang.c
@@ -283,7 +283,7 @@ run(struct args *args)
size_t len;
char buffer[BUFSIZ];
- if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
+ if (getln(buffer, sizeof(buffer)) == NULL) {
args->status = 1;
return -1;
}
diff --git a/src/libk/Makefile b/src/libk/Makefile
@@ -4,6 +4,8 @@ include $(PROJECTDIR)/scripts/rules.mk
OBJS = printk.o \
bss-$(SYS).o \
+ kgetc-$(SYS).o \
+ kgetln.o \
__assert.o \
TARGET = $(LIBDIR)/libk.a
diff --git a/src/libk/kgetc-dragonfly.c b/src/libk/kgetc-dragonfly.c
@@ -0,0 +1 @@
+#include "kgetc-posix.c"
diff --git a/src/libk/kgetc-linux.c b/src/libk/kgetc-linux.c
@@ -0,0 +1 @@
+#include "kgetc-posix.c"
diff --git a/src/libk/kgetc-netbsd.c b/src/libk/kgetc-netbsd.c
@@ -0,0 +1 @@
+#include "kgetc-posix.c"
diff --git a/src/libk/kgetc-openbsd.c b/src/libk/kgetc-openbsd.c
@@ -0,0 +1 @@
+#include "kgetc-posix.c"
diff --git a/src/libk/kgetc-posix.c b/src/libk/kgetc-posix.c
@@ -0,0 +1,7 @@
+#include <stdio.h>
+
+int
+kgetc(void)
+{
+ return getc(stdin);
+}
diff --git a/src/libk/kgetc-rmode.c b/src/libk/kgetc-rmode.c
@@ -0,0 +1,12 @@
+#include <uart.h>
+#include <rcode.h>
+
+int
+kgetc(void)
+{
+ int ch;
+
+ while ((ch = uartgetc()) == -1)
+ ;
+ return ch;
+}
diff --git a/src/libk/kgetln.c b/src/libk/kgetln.c
@@ -0,0 +1,20 @@
+#include <stdio.h>
+
+#include <rcode.h>
+
+char *
+kgetln(char *s, int n)
+{
+ int ch = 0;
+ char *t;
+
+ for (t = s; --n > 0; ++t) {
+ if ((ch = kgetc()) == EOF || (*t = ch) == '\n')
+ break;
+ }
+ if (ch == EOF && s == t)
+ return NULL;
+ *t = '\0';
+
+ return s;
+}