diff options
author | aqua <aqua@iserlohn-fortress.net> | 2022-03-28 20:03:38 +0300 |
---|---|---|
committer | aqua <aqua@iserlohn-fortress.net> | 2022-08-12 10:13:59 +0300 |
commit | edf9e71e2a7b6b89775c29cf28c19c6b89992c25 (patch) | |
tree | 3adbf944d9e47a743063487c4facb7eed1fbdee0 /lib/stdio | |
download | kernel-edf9e71e2a7b6b89775c29cf28c19c6b89992c25.tar.xz |
Initial commit
x86 kernel that prints a hello world message to com1
Diffstat (limited to 'lib/stdio')
-rw-r--r-- | lib/stdio/printf.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/stdio/printf.c b/lib/stdio/printf.c new file mode 100644 index 0000000..f6b8ef6 --- /dev/null +++ b/lib/stdio/printf.c @@ -0,0 +1,38 @@ +#include <stdarg.h> +#include <stdio.h> + +#include <devices/uart_16550.h> + +int +printf(const char *restrict format, ...) +{ + int written = 0; + va_list params; + va_start(params, format); + + int s = 0; + int l = 0; + for (int i = 0; format[i] != '\0'; ++i) { + if (format[i] == '%') { + written += uart_puts(COM1, &format[s], l); + s = i + 2; + ++i; + + switch (format[i]) { + case 's': + written += uart_puts(COM1, va_arg(params, const char *), -1); + break; + } + + l = 0; + } + + else + ++l; + } + + if (l > 0) written += uart_puts(COM1, &format[s], l); + + va_end(params); + return written; +} |