1#include "shgetc.h"
2#include "floatscan.h"
3#include <wchar.h>
4#include <wctype.h>
5
6static long double wcstox(const wchar_t * restrict s,
7                          wchar_t ** restrict p,
8                          int prec)
9{
10    wchar_t *t = (wchar_t *)s;
11    struct fake_file_t f;
12    while (iswspace(*t)) t++;
13    shinit_wcstring(&f, t);
14    long double y = __floatscan(&f, prec, 1);
15    if (p) {
16        size_t cnt = shcnt(&f);
17        *p = cnt ? t + cnt : (wchar_t *)s;
18    }
19    return y;
20}
21
22float wcstof(const wchar_t *restrict s, wchar_t **restrict p)
23{
24    return wcstox(s, p, 0);
25}
26
27double wcstod(const wchar_t *restrict s, wchar_t **restrict p)
28{
29    return wcstox(s, p, 1);
30}
31
32long double wcstold(const wchar_t *restrict s, wchar_t **restrict p)
33{
34    return wcstox(s, p, 2);
35}
36