1*ba7e1cddSMichael Jones //===-- Implementation of fprintf -------------------------------*- C++ -*-===// 2*ba7e1cddSMichael Jones // 3*ba7e1cddSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*ba7e1cddSMichael Jones // See https://llvm.org/LICENSE.txt for license information. 5*ba7e1cddSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*ba7e1cddSMichael Jones // 7*ba7e1cddSMichael Jones //===----------------------------------------------------------------------===// 8*ba7e1cddSMichael Jones 9*ba7e1cddSMichael Jones #include "src/stdio/fprintf.h" 10*ba7e1cddSMichael Jones 11*ba7e1cddSMichael Jones #include "src/__support/arg_list.h" 12*ba7e1cddSMichael Jones #include "src/stdio/ferror.h" 13*ba7e1cddSMichael Jones #include "src/stdio/printf_core/file_writer.h" 14*ba7e1cddSMichael Jones #include "src/stdio/printf_core/printf_main.h" 15*ba7e1cddSMichael Jones #include "src/stdio/printf_core/writer.h" 16*ba7e1cddSMichael Jones 17*ba7e1cddSMichael Jones #include <stdarg.h> 18*ba7e1cddSMichael Jones #include <stdio.h> 19*ba7e1cddSMichael Jones 20*ba7e1cddSMichael Jones namespace __llvm_libc { 21*ba7e1cddSMichael Jones 22*ba7e1cddSMichael Jones LLVM_LIBC_FUNCTION(int, fprintf, 23*ba7e1cddSMichael Jones (::FILE *__restrict stream, const char *__restrict format, 24*ba7e1cddSMichael Jones ...)) { 25*ba7e1cddSMichael Jones va_list vlist; 26*ba7e1cddSMichael Jones va_start(vlist, format); 27*ba7e1cddSMichael Jones internal::ArgList args(vlist); // This holder class allows for easier copying 28*ba7e1cddSMichael Jones // and pointer semantics, as well as handling 29*ba7e1cddSMichael Jones // destruction automatically. 30*ba7e1cddSMichael Jones va_end(vlist); 31*ba7e1cddSMichael Jones printf_core::Writer writer(reinterpret_cast<void *>(stream), 32*ba7e1cddSMichael Jones printf_core::write_to_file); 33*ba7e1cddSMichael Jones 34*ba7e1cddSMichael Jones int ret_val = printf_core::printf_main(&writer, format, args); 35*ba7e1cddSMichael Jones if (__llvm_libc::ferror(stream)) 36*ba7e1cddSMichael Jones return -1; 37*ba7e1cddSMichael Jones return ret_val; 38*ba7e1cddSMichael Jones } 39*ba7e1cddSMichael Jones 40*ba7e1cddSMichael Jones } // namespace __llvm_libc 41