9os

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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:
Minclude/rcode.h | 6+++++-
Msrc/debuglang/debuglang.c | 2+-
Msrc/libk/Makefile | 2++
Asrc/libk/kgetc-dragonfly.c | 1+
Asrc/libk/kgetc-linux.c | 1+
Asrc/libk/kgetc-netbsd.c | 1+
Asrc/libk/kgetc-openbsd.c | 1+
Asrc/libk/kgetc-posix.c | 7+++++++
Asrc/libk/kgetc-rmode.c | 12++++++++++++
Asrc/libk/kgetln.c | 20++++++++++++++++++++
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; +}