Rev 3022 | Rev 4420 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3022 | Rev 4296 | ||
---|---|---|---|
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 | */ |