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