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
strfromf(char * __restrict s,size_t n,const char * __restrict fmt,float fp)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