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