#include <wchar.h>
#include <wctype.h>

#include "floatscan.h"
#include "shgetc.h"
#include "stdio_impl.h"

/* This read function heavily cheats. It knows:
 *  (1) len will always be 1
 *  (2) non-ascii characters don't matter */

static size_t do_read(FILE* f, unsigned char* buf, size_t len) {
  size_t i;
  const wchar_t* wcs = f->cookie;

  if (!wcs[0])
    wcs = L"@";
  for (i = 0; i < f->buf_size && wcs[i]; i++)
    f->buf[i] = wcs[i] < 128 ? wcs[i] : '@';
  f->rpos = f->buf;
  f->rend = f->buf + i;
  f->cookie = (void*)(wcs + i);

  if (i && len) {
    *buf = *f->rpos++;
    return 1;
  }
  return 0;
}

static long double wcstox(const wchar_t* s, wchar_t** p, int prec) {
  wchar_t* t = (wchar_t*)s;
  unsigned char buf[64];
  FILE f = {};
  f.flags = 0;
  f.rpos = f.rend = 0;
  f.buf = buf + 4;
  f.buf_size = sizeof buf - 4;
  f.lock = -1;
  f.read = do_read;
  while (iswspace(*t))
    t++;
  f.cookie = (void*)t;
  shlim(&f, 0);
  long double y = __floatscan(&f, prec, 1);
  if (p) {
    size_t cnt = shcnt(&f);
    *p = cnt ? t + cnt : (wchar_t*)s;
  }
  return y;
}

float wcstof(const wchar_t* restrict s, wchar_t** restrict p) { return wcstox(s, p, 0); }

double wcstod(const wchar_t* restrict s, wchar_t** restrict p) { return wcstox(s, p, 1); }

long double wcstold(const wchar_t* restrict s, wchar_t** restrict p) { return wcstox(s, p, 2); }
