summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/kprintf.c25
-rw-r--r--lib/lib.h14
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);
+