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