1 //===-- Implementation of strfromd ------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "src/stdlib/strfromd.h" 10 #include "src/stdlib/str_from_util.h" 11 12 namespace LIBC_NAMESPACE { 13 14 LLVM_LIBC_FUNCTION(int, strfromd, 15 (char *__restrict s, size_t n, const char *__restrict format, 16 double fp)) { 17 LIBC_ASSERT(s != nullptr); 18 19 printf_core::FormatSection section = 20 internal::parse_format_string(format, fp); 21 printf_core::WriteBuffer wb(s, (n > 0 ? n - 1 : 0)); 22 printf_core::Writer writer(&wb); 23 24 int result = 0; 25 if (section.has_conv) 26 result = internal::strfromfloat_convert<double>(&writer, section); 27 else 28 result = writer.write(section.raw_string); 29 30 if (result < 0) 31 return result; 32 33 if (n > 0) 34 wb.buff[wb.buff_cur] = '\0'; 35 36 return writer.get_chars_written(); 37 } 38 39 } // namespace LIBC_NAMESPACE 40