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