2 * Copyright (c) 2006 Josef Cejka
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 #include <io/printf_core.h>
38 #include <fibril_synch.h>
42 static FIBRIL_MUTEX_INITIALIZE(printf_mutex
);
44 static int vprintf_str_write(const char *str
, size_t size
, void *stream
)
46 size_t wr
= fwrite(str
, 1, size
, (FILE *) stream
);
47 return str_nlength(str
, wr
);
50 static int vprintf_wstr_write(const wchar_t *str
, size_t size
, void *stream
)
55 while (offset
< size
) {
56 if (fputc(str
[chars
], (FILE *) stream
) <= 0)
60 offset
+= sizeof(wchar_t);
66 /** Print formatted text.
68 * @param stream Output stream
69 * @param fmt Format string
70 * @param ap Format parameters
72 * \see For more details about format string see printf_core.
75 int vfprintf(FILE *stream
, const char *fmt
, va_list ap
)
84 * Prevent other threads to execute printf_core()
86 fibril_mutex_lock(&printf_mutex
);
88 int ret
= printf_core(fmt
, &ps
, ap
);
90 fibril_mutex_unlock(&printf_mutex
);
95 /** Print formatted text to stdout.
97 * @param fmt Format string
98 * @param ap Format parameters
100 * \see For more details about format string see printf_core.
103 int vprintf(const char *fmt
, va_list ap
)
105 return vfprintf(stdout
, fmt
, ap
);