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