From 41a4f5309ef298da764bf1dca1254e734a4417f0 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Fri, 13 Mar 2015 15:37:30 +0100 Subject: Basis for a shell. --- src/lib/include/stdio.h | 14 ++++++++++ src/lib/libkogata/Makefile | 3 ++- src/lib/libkogata/stdio.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 src/lib/include/stdio.h create mode 100644 src/lib/libkogata/stdio.c (limited to 'src/lib') 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 +#include +#include + +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 + +#include +#include + + +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 :*/ -- cgit v1.2.3