diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/include/stdio.h | 14 | ||||
-rw-r--r-- | src/lib/libkogata/Makefile | 3 | ||||
-rw-r--r-- | src/lib/libkogata/stdio.c | 66 |
3 files changed, 82 insertions, 1 deletions
diff --git a/src/lib/include/stdio.h b/src/lib/include/stdio.h new file mode 100644 index 0000000..4b300da --- /dev/null +++ b/src/lib/include/stdio.h @@ -0,0 +1,14 @@ +#pragma once + +#include <stddef.h> +#include <stdarg.h> +#include <stdint.h> + +void putchar(int c); +void puts(char* s); +void printf(char* arg, ...); + +int getchar(); +void getline(char* buf, size_t l); + +/* vim: set ts=4 sw=4 tw=0 noet :*/ diff --git a/src/lib/libkogata/Makefile b/src/lib/libkogata/Makefile index a02a862..20c6dee 100644 --- a/src/lib/libkogata/Makefile +++ b/src/lib/libkogata/Makefile @@ -1,5 +1,6 @@ OBJ = start.o malloc.o debug.o syscall.o user_region.o \ - mainloop.o gip.o draw.o keyboard.o + mainloop.o gip.o draw.o keyboard.o \ + stdio.o LIB = ../../common/libkogata/libkogata.lib ../../common/libalgo/libalgo.lib ../../common/libc/libc.lib 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 :*/ |