diff options
author | Alex Auvolat <alex@adnab.me> | 2015-03-13 15:37:30 +0100 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2015-03-13 15:37:30 +0100 |
commit | 41a4f5309ef298da764bf1dca1254e734a4417f0 (patch) | |
tree | 43e2e820f39c09db36d3a12e3fb2495cb38adca7 /src/lib/libkogata/stdio.c | |
parent | d0dc9f38184956af49379d7e2585756523cfa4c1 (diff) | |
download | kogata-41a4f5309ef298da764bf1dca1254e734a4417f0.tar.gz kogata-41a4f5309ef298da764bf1dca1254e734a4417f0.zip |
Basis for a shell.
Diffstat (limited to 'src/lib/libkogata/stdio.c')
-rw-r--r-- | src/lib/libkogata/stdio.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/lib/libkogata/stdio.c b/src/lib/libkogata/stdio.c new file mode 100644 index 0000000..1c298ad --- /dev/null +++ b/src/lib/libkogata/stdio.c @@ -0,0 +1,66 @@ +#include <syscall.h> + +#include <printf.h> +#include <stdio.h> + + +fd_t stdio = 1; + +int getc() { + sel_fd_t fd; + fd.fd = stdio; + fd.req_flags = SEL_READ; + ASSERT(select(&fd, 1, -1)); + ASSERT(fd.got_flags & SEL_READ); + + char chr; + size_t sz = read(stdio, 0, 1, &chr); + ASSERT(sz == 1); + return chr; +} + + +void putc(int c) { + char chr = c; + write(stdio, 0, 1, &chr); +} + +void puts(char* s) { + while (*s) putc(*(s++)); +} + +void getline(char* buf, size_t l) { + size_t i = 0; + while (true) { + int c = getc(); + if (c == '\n') { + putc('\n'); + buf[i] = 0; + break; + } else if (c == '\b') { + if (i > 0) { + i--; + putc('\b'); + } + } else if (c >= ' ') { + buf[i] = c; + if (i < l-1) { + i++; + putc(c); + } + } + } +} + +void printf(char* fmt, ...) { + va_list ap; + char buffer[256]; + + va_start(ap, fmt); + vsnprintf(buffer, 256, fmt, ap); + va_end(ap); + + puts(buffer); +} + +/* vim: set ts=4 sw=4 tw=0 noet :*/ |