1ebdea529SPetr Hosek //===-- Implementation of vprintf -------------------------------*- C++ -*-===// 2ebdea529SPetr Hosek // 3ebdea529SPetr Hosek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4ebdea529SPetr Hosek // See https://llvm.org/LICENSE.txt for license information. 5ebdea529SPetr Hosek // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ebdea529SPetr Hosek // 7ebdea529SPetr Hosek //===----------------------------------------------------------------------===// 8ebdea529SPetr Hosek 9ebdea529SPetr Hosek #include "src/stdio/vprintf.h" 10ebdea529SPetr Hosek #include "src/__support/OSUtil/io.h" 11ebdea529SPetr Hosek #include "src/__support/arg_list.h" 12*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 13ebdea529SPetr Hosek #include "src/stdio/printf_core/core_structs.h" 14ebdea529SPetr Hosek #include "src/stdio/printf_core/printf_main.h" 15ebdea529SPetr Hosek #include "src/stdio/printf_core/writer.h" 16ebdea529SPetr Hosek 17ebdea529SPetr Hosek #include <stdarg.h> 185aed6d67SMichael Jones #include <stddef.h> 19ebdea529SPetr Hosek 20*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 21ebdea529SPetr Hosek 22ebdea529SPetr Hosek namespace { 23ebdea529SPetr Hosek 24ebdea529SPetr Hosek LIBC_INLINE int raw_write_hook(cpp::string_view new_str, void *) { 25ebdea529SPetr Hosek write_to_stderr(new_str); 26ebdea529SPetr Hosek return printf_core::WRITE_OK; 27ebdea529SPetr Hosek } 28ebdea529SPetr Hosek 29ebdea529SPetr Hosek } // namespace 30ebdea529SPetr Hosek 31ebdea529SPetr Hosek LLVM_LIBC_FUNCTION(int, vprintf, 32ebdea529SPetr Hosek (const char *__restrict format, va_list vlist)) { 33ebdea529SPetr Hosek internal::ArgList args(vlist); // This holder class allows for easier copying 34ebdea529SPetr Hosek // and pointer semantics, as well as handling 35ebdea529SPetr Hosek // destruction automatically. 36ebdea529SPetr Hosek constexpr size_t BUFF_SIZE = 1024; 37ebdea529SPetr Hosek char buffer[BUFF_SIZE]; 38ebdea529SPetr Hosek 39ebdea529SPetr Hosek printf_core::WriteBuffer wb(buffer, BUFF_SIZE, &raw_write_hook, nullptr); 40ebdea529SPetr Hosek printf_core::Writer writer(&wb); 41ebdea529SPetr Hosek 42ebdea529SPetr Hosek int retval = printf_core::printf_main(&writer, format, args); 43ebdea529SPetr Hosek 44ebdea529SPetr Hosek int flushval = wb.overflow_write(""); 45ebdea529SPetr Hosek if (flushval != printf_core::WRITE_OK) 46ebdea529SPetr Hosek retval = flushval; 47ebdea529SPetr Hosek 48ebdea529SPetr Hosek return retval; 49ebdea529SPetr Hosek } 50ebdea529SPetr Hosek 51*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 52