From b9038b1c6b31a8f8d6b8b648cee0cf3b457dc24c Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Thu, 15 Dec 2022 22:46:25 +0100 Subject: first version of io and wstdf --- lib/io/Makefile | 3 +++ lib/io/io.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ lib/io/io.h | 17 +++++++++++++++++ lib/io/test | Bin 0 -> 20240 bytes 4 files changed, 70 insertions(+) create mode 100644 lib/io/Makefile create mode 100644 lib/io/io.c create mode 100644 lib/io/io.h create mode 100755 lib/io/test (limited to 'lib/io') diff --git a/lib/io/Makefile b/lib/io/Makefile new file mode 100644 index 0000000..e60a656 --- /dev/null +++ b/lib/io/Makefile @@ -0,0 +1,3 @@ +unit_test: + gcc io.c ../cstr/cstr.c ../sys/start.S -o test -static -nostdlib -fno-stack-protector -Wno-implicit-function-declaration -g + ./test diff --git a/lib/io/io.c b/lib/io/io.c new file mode 100644 index 0000000..41cd3e0 --- /dev/null +++ b/lib/io/io.c @@ -0,0 +1,50 @@ +#include "io.h" + +#include "../cstr/cstr.h" + +void __wstdn(const char *buf, u64 n) +{ + write(STDOUT_FD, buf, n); +} + + +void wstd(const char *buf) +{ + __wstdn(buf, cstr_length(buf)); +} + + +void rstd(char *buf, unsigned long count) +{ + read(STDIN_FD, buf, count); +} + +void wstdf__(const char *buf, void **args) +{ + const char *start = buf; + for (; *buf; ++buf) { + if (*buf == '%') { + if (buf - start > 0) + __wstdn(start, buf - start); + + ++buf; + + switch (*buf) { + case '%': __wstdn("%", 1); break; + case 's': + __wstdn(((const char **)args)[0], cstr_length(((const char**)args)[0])); + ++args; break; + } + + start = buf + 1; + } + } + + if (buf - start > 0) + __wstdn(start, buf - start); +} + +int main() { + void *args[] = { "hallo", "welt" }; + wstdf__("%s %s\n", args); +} diff --git a/lib/io/io.h b/lib/io/io.h new file mode 100644 index 0000000..b68a75d --- /dev/null +++ b/lib/io/io.h @@ -0,0 +1,17 @@ +#ifndef IO_H +#define IO_H + +#include "../sys/io.h" + +void wstd(const char *buf); +void rstd(char *buf, unsigned long count); + +void wstdf__(const char *buf, void **args); + +#define wstdf(buf, ...) { \ + void *__wstdf__args__[] = { __VA_ARGS__ }; \ + wstdf__(buf, __wstdf__args__); \ +} + + +#endif diff --git a/lib/io/test b/lib/io/test new file mode 100755 index 0000000..560b047 Binary files /dev/null and b/lib/io/test differ -- cgit v1.2.3-70-g09d2