From a3469d648a4d0f276d979ceb14b8716b46f4f72e Mon Sep 17 00:00:00 2001 From: dzwdz Date: Wed, 6 Oct 2021 06:28:04 +0000 Subject: init: printf base --- src/init/stdlib.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/init/stdlib.c') diff --git a/src/init/stdlib.c b/src/init/stdlib.c index 6ed5a0a..ac80c28 100644 --- a/src/init/stdlib.c +++ b/src/init/stdlib.c @@ -1,4 +1,6 @@ #include +#include +#include int memcmp(const void *s1, const void *s2, size_t n) { const unsigned char *c1 = s1, *c2 = s2; @@ -10,3 +12,19 @@ int memcmp(const void *s1, const void *s2, size_t n) { } return 0; } + +int printf(const char *fmt, ...) { + const char *seg = fmt; // beginning of the current segment + int total = 0; + va_list argp; + va_start(argp, fmt); + for (;;) { + char c = *fmt++; + switch (c) { + case '\0': + // TODO don't assume that stdout is @ fd 0 + _syscall_write(0, seg, fmt - seg, 0); + return total + (fmt - seg); + } + } +} -- cgit v1.2.3 From 381f9b26bd31072530d795c38c19ce3dd69954a6 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Wed, 6 Oct 2021 06:32:29 +0000 Subject: init: implement strlen --- src/init/stdlib.c | 6 ++++++ src/init/stdlib.h | 2 ++ 2 files changed, 8 insertions(+) (limited to 'src/init/stdlib.c') diff --git a/src/init/stdlib.c b/src/init/stdlib.c index ac80c28..56d6da6 100644 --- a/src/init/stdlib.c +++ b/src/init/stdlib.c @@ -13,6 +13,12 @@ int memcmp(const void *s1, const void *s2, size_t n) { return 0; } +size_t strlen(const char *s) { + size_t c = 0; + while (*s++) c++; + return c; +} + int printf(const char *fmt, ...) { const char *seg = fmt; // beginning of the current segment int total = 0; diff --git a/src/init/stdlib.h b/src/init/stdlib.h index 357a396..3e56beb 100644 --- a/src/init/stdlib.h +++ b/src/init/stdlib.h @@ -6,4 +6,6 @@ int memcmp(const void *s1, const void *s2, size_t n); +size_t strlen(const char *s); + int printf(const char *fmt, ...); -- cgit v1.2.3 From 44d308149282debf314cb48789b9084767c1c288 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Wed, 6 Oct 2021 06:34:23 +0000 Subject: init printf: implement %s --- src/init/main.c | 2 +- src/init/stdlib.c | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'src/init/stdlib.c') diff --git a/src/init/main.c b/src/init/main.c index a819152..7c827eb 100644 --- a/src/init/main.c +++ b/src/init/main.c @@ -29,7 +29,7 @@ int main(void) { fs_test(); test_await(); - printf("printf test\n"); + printf("%s\n", "printf test"); char c; while (_syscall_read(tty_fd, &c, 1, 0)) diff --git a/src/init/stdlib.c b/src/init/stdlib.c index 56d6da6..876c74c 100644 --- a/src/init/stdlib.c +++ b/src/init/stdlib.c @@ -29,8 +29,22 @@ int printf(const char *fmt, ...) { switch (c) { case '\0': // TODO don't assume that stdout is @ fd 0 - _syscall_write(0, seg, fmt - seg, 0); - return total + (fmt - seg); + _syscall_write(0, seg, fmt - seg - 1, 0); + return total + (fmt - seg - 1); + + case '%': + _syscall_write(0, seg, fmt - seg - 1, 0); + total += fmt - seg - 1; + c = *fmt++; + switch (c) { + case 's': + const char *s = va_arg(argp, char*); + _syscall_write(0, s, strlen(s), 0); + total += strlen(s); + break; + } + seg = fmt; + break; } } } -- cgit v1.2.3 From a41f08402e78e9066551d72a9835a352db4069e4 Mon Sep 17 00:00:00 2001 From: dzwdz Date: Wed, 6 Oct 2021 06:43:27 +0000 Subject: init printf: implement %x --- src/init/main.c | 2 +- src/init/stdlib.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) (limited to 'src/init/stdlib.c') diff --git a/src/init/main.c b/src/init/main.c index 7c827eb..2029bc9 100644 --- a/src/init/main.c +++ b/src/init/main.c @@ -29,7 +29,7 @@ int main(void) { fs_test(); test_await(); - printf("%s\n", "printf test"); + printf("%s %x\n", "printf test", 0xACAB1312); char c; while (_syscall_read(tty_fd, &c, 1, 0)) diff --git a/src/init/stdlib.c b/src/init/stdlib.c index 876c74c..a60854b 100644 --- a/src/init/stdlib.c +++ b/src/init/stdlib.c @@ -42,6 +42,21 @@ int printf(const char *fmt, ...) { _syscall_write(0, s, strlen(s), 0); total += strlen(s); break; + + case 'x': + unsigned int n = va_arg(argp, int); + size_t i = 4; // nibbles * 4 + while (n >> i && i < (sizeof(int) * 8)) + i += 4; + + while (i > 0) { + i -= 4; + char h = '0' + ((n >> i) & 0xf); + if (h > '9') h += 'a' - '9' - 1; + _syscall_write(0, &h, 1, 0); + total++; + } + break; } seg = fmt; break; -- cgit v1.2.3