diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/kprintf.c | 25 | ||||
| -rw-r--r-- | lib/lib.h | 14 |
2 files changed, 38 insertions, 1 deletions
diff --git a/lib/kprintf.c b/lib/kprintf.c index 075a547..18ae42c 100644 --- a/lib/kprintf.c +++ b/lib/kprintf.c @@ -45,7 +45,9 @@ enum specifier_integer_width struct method { int (*write_character)(struct method *m, char c); + int (*write_wcharacter)(struct method *m, wchar_t c); int (*write_string)(struct method *m, const char *s); + int (*write_wstring)(struct method *m, const wchar_t *s); void *output; int count; }; @@ -383,8 +385,11 @@ static int print_string( struct specifier *spec, va_list *arguments) { - (void)spec; // TODO: respect field width + if (spec->integer_width == LONG_WIDTH) + { + return m->write_wstring(m, va_arg(*arguments, const wchar_t *)); + } return m->write_string(m, va_arg(*arguments, const char *)); } @@ -561,6 +566,13 @@ static int kfp_write_character(struct method *m, char c) return 0; } +static int kfp_write_wcharacter(struct method *m, wchar_t c) +{ + kfputc((int)c, (FILE *)m->output); + m->count++; + return 0; +} + static int kfp_write_string(struct method *m, const char *c) { while (*c) @@ -570,11 +582,22 @@ static int kfp_write_string(struct method *m, const char *c) return 0; } +static int kfp_write_wstring(struct method *m, const wchar_t *s) +{ + while (*s) + { + m->write_wcharacter(m, *s++); + } + return 0; +} + int kvfprintf(FILE *f, const char *restrict format, va_list arguments) { struct method m = { kfp_write_character, + kfp_write_wcharacter, kfp_write_string, + kfp_write_wstring, (void *)f, 0}; va_list acopy; diff --git a/lib/lib.h b/lib/lib.h new file mode 100644 index 0000000..c28e17c --- /dev/null +++ b/lib/lib.h @@ -0,0 +1,14 @@ +#pragma once + +#include <stddef.h> + +void *memcpy(void *dest, const void *src, size_t size); +void *memmove(void *dest, const void *src, size_t size); +void *memset(void *dest, int val, size_t size); +int memcmp(const void *str1, const void *str2, size_t count); +size_t strlen(const char *s); +unsigned long long strtoull( + const char *restrict begin, + char **restrict end, + int base); + |
