1 /* 2 * Copyright (c) 2026 Faraz Vahedi <kfv@kfv.io> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7 #include <ctype.h> 8 #include <stdlib.h> 9 10 #include "strfrom.h" 11 12 int 13 strfromd(char * __restrict s, size_t n, const char * __restrict fmt, double fp) 14 { 15 char conv, lc, *digits, *dend; 16 int prec, decpt, signflag, ret, mode, ndig_req; 17 18 conv = __sf_parse_fmt(fmt, &prec); 19 if (conv == '\0') 20 return (__sf_edoofus(s, n)); 21 lc = tolower((unsigned char)conv); 22 23 if (lc == 'a') { 24 digits = __hdtoa(fp, __sf_xdigits(conv), 25 prec >= 0 ? prec + 1 : -1, &decpt, &signflag, &dend); 26 ret = __sf_render_hex(s, n, conv, prec, digits, dend, decpt, 27 signflag); 28 freedtoa(digits); 29 return (ret); 30 } 31 32 if (prec < 0) 33 prec = 6; 34 35 __sf_decimal_mode(lc, prec, &mode, &ndig_req); 36 37 digits = dtoa(fp, mode, ndig_req, &decpt, &signflag, &dend); 38 39 ret = __sf_render_decimal(s, n, conv, lc, prec, digits, dend, decpt, 40 signflag, decpt == 9999); 41 42 freedtoa(digits); 43 44 return (ret); 45 } 46