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 strfromf(char * __restrict s, size_t n, const char * __restrict fmt, float fp) 14 { 15 char conv, lc, *digits, *dend; 16 int prec, decpt, signflag, ret, mode, ndig_req; 17 double dbl; 18 19 dbl = (double)fp; 20 conv = __sf_parse_fmt(fmt, &prec); 21 if (conv == '\0') 22 return (__sf_edoofus(s, n)); 23 lc = tolower((unsigned char)conv); 24 25 if (lc == 'a') { 26 digits = __hdtoa(dbl, __sf_xdigits(conv), 27 prec >= 0 ? prec + 1 : -1, &decpt, &signflag, &dend); 28 ret = __sf_render_hex(s, n, conv, prec, digits, dend, decpt, 29 signflag); 30 freedtoa(digits); 31 return (ret); 32 } 33 34 if (prec < 0) 35 prec = 6; 36 37 __sf_decimal_mode(lc, prec, &mode, &ndig_req); 38 39 digits = dtoa(dbl, mode, ndig_req, &decpt, &signflag, &dend); 40 41 ret = __sf_render_decimal(s, n, conv, lc, prec, digits, dend, decpt, 42 signflag, decpt == 9999); 43 44 freedtoa(digits); 45 46 return (ret); 47 } 48