Rev 2927 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2927 | Rev 4348 | ||
---|---|---|---|
Line 36... | Line 36... | ||
36 | #include <stdio.h> |
36 | #include <stdio.h> |
37 | #include <unistd.h> |
37 | #include <unistd.h> |
38 | #include <io/printf_core.h> |
38 | #include <io/printf_core.h> |
39 | #include <futex.h> |
39 | #include <futex.h> |
40 | #include <async.h> |
40 | #include <async.h> |
- | 41 | #include <console.h> |
|
41 | 42 | ||
42 | static atomic_t printf_futex = FUTEX_INITIALIZER; |
43 | static atomic_t printf_futex = FUTEX_INITIALIZER; |
43 | 44 | ||
44 | static int vprintf_write(const char *str, size_t count, void *unused) |
45 | static int vprintf_str_write(const char *str, size_t size, void *data) |
45 | { |
46 | { |
- | 47 | size_t offset = 0; |
|
- | 48 | size_t prev; |
|
- | 49 | count_t chars = 0; |
|
- | 50 | ||
- | 51 | while (offset < size) { |
|
- | 52 | prev = offset; |
|
46 | return write_stdout(str, count); |
53 | str_decode(str, &offset, size); |
- | 54 | console_write(str + prev, offset - prev); |
|
- | 55 | chars++; |
|
- | 56 | } |
|
- | 57 | ||
- | 58 | return chars; |
|
47 | } |
59 | } |
48 | 60 | ||
- | 61 | static int vprintf_wstr_write(const wchar_t *str, size_t size, void *data) |
|
- | 62 | { |
|
- | 63 | size_t offset = 0; |
|
- | 64 | size_t boff; |
|
- | 65 | count_t chars = 0; |
|
- | 66 | char buf[4]; |
|
- | 67 | ||
- | 68 | while (offset < size) { |
|
- | 69 | boff = 0; |
|
- | 70 | chr_encode(str[chars], buf, &boff, 4); |
|
- | 71 | console_write(buf, boff); |
|
- | 72 | chars++; |
|
- | 73 | offset += sizeof(wchar_t); |
|
- | 74 | } |
|
- | 75 | ||
- | 76 | return chars; |
|
- | 77 | } |
|
- | 78 | ||
- | 79 | ||
49 | /** Print formatted text. |
80 | /** Print formatted text. |
50 | * @param fmt format string |
81 | * @param fmt format string |
51 | * @param ap format parameters |
82 | * @param ap format parameters |
52 | * \see For more details about format string see printf_core. |
83 | * \see For more details about format string see printf_core. |
53 | */ |
84 | */ |
54 | int vprintf(const char *fmt, va_list ap) |
85 | int vprintf(const char *fmt, va_list ap) |
55 | { |
86 | { |
56 | struct printf_spec ps = { |
87 | struct printf_spec ps = { |
- | 88 | vprintf_str_write, |
|
57 | (int (*)(void *, size_t, void *)) vprintf_write, |
89 | vprintf_wstr_write, |
58 | NULL |
90 | NULL |
59 | }; |
91 | }; |
60 | /* |
92 | /* |
61 | * Prevent other threads to execute printf_core() |
93 | * Prevent other threads to execute printf_core() |
62 | */ |
94 | */ |