1 //===-- Implementation of strfroml ------------------------------*- 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/strfroml.h" 10 #include "src/__support/macros/config.h" 11 #include "src/stdlib/str_from_util.h" 12 13 namespace LIBC_NAMESPACE_DECL { 14 15 LLVM_LIBC_FUNCTION(int, strfroml, 16 (char *__restrict s, size_t n, const char *__restrict format, 17 long double fp)) { 18 LIBC_ASSERT(s != nullptr); 19 20 printf_core::FormatSection section = 21 internal::parse_format_string(format, fp); 22 23 // To ensure that the conversion function actually uses long double, 24 // the length modifier has to be set to LenghtModifier::L 25 section.length_modifier = printf_core::LengthModifier::L; 26 27 printf_core::WriteBuffer wb(s, (n > 0 ? n - 1 : 0)); 28 printf_core::Writer writer(&wb); 29 30 int result = 0; 31 if (section.has_conv) 32 result = internal::strfromfloat_convert<long double>(&writer, section); 33 else 34 result = writer.write(section.raw_string); 35 36 if (result < 0) 37 return result; 38 39 if (n > 0) 40 wb.buff[wb.buff_cur] = '\0'; 41 42 return writer.get_chars_written(); 43 } 44 45 } // namespace LIBC_NAMESPACE_DECL 46