15ea15203SVinayak Dev //===-- Implementation of strfromf ------------------------------*- C++ -*-===// 25ea15203SVinayak Dev // 35ea15203SVinayak Dev // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 45ea15203SVinayak Dev // See https://llvm.org/LICENSE.txt for license information. 55ea15203SVinayak Dev // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65ea15203SVinayak Dev // 75ea15203SVinayak Dev //===----------------------------------------------------------------------===// 85ea15203SVinayak Dev 95ea15203SVinayak Dev #include "src/stdlib/strfromf.h" 10*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 115ea15203SVinayak Dev #include "src/stdlib/str_from_util.h" 125ea15203SVinayak Dev 13*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 145ea15203SVinayak Dev 155ea15203SVinayak Dev LLVM_LIBC_FUNCTION(int, strfromf, 165ea15203SVinayak Dev (char *__restrict s, size_t n, const char *__restrict format, 175ea15203SVinayak Dev float fp)) { 185ea15203SVinayak Dev LIBC_ASSERT(s != nullptr); 195ea15203SVinayak Dev 205ea15203SVinayak Dev printf_core::FormatSection section = 215ea15203SVinayak Dev internal::parse_format_string(format, fp); 225ea15203SVinayak Dev printf_core::WriteBuffer wb(s, (n > 0 ? n - 1 : 0)); 235ea15203SVinayak Dev printf_core::Writer writer(&wb); 245ea15203SVinayak Dev 255ea15203SVinayak Dev int result = 0; 265ea15203SVinayak Dev if (section.has_conv) 275ea15203SVinayak Dev result = internal::strfromfloat_convert<float>(&writer, section); 285ea15203SVinayak Dev else 295ea15203SVinayak Dev result = writer.write(section.raw_string); 305ea15203SVinayak Dev 315ea15203SVinayak Dev if (result < 0) 325ea15203SVinayak Dev return result; 335ea15203SVinayak Dev 345ea15203SVinayak Dev if (n > 0) 355ea15203SVinayak Dev wb.buff[wb.buff_cur] = '\0'; 365ea15203SVinayak Dev 375ea15203SVinayak Dev return writer.get_chars_written(); 385ea15203SVinayak Dev } 395ea15203SVinayak Dev 40*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 41