#include <ctype.h>
#include <limits.h>
#include <wchar.h>

#include "locale_impl.h"
#include "stdio_impl.h"

wint_t __fputwc_unlocked(wchar_t c, FILE* f) {
  char mbc[MB_LEN_MAX];
  int l;
  locale_t *ploc = &CURRENT_LOCALE, loc = *ploc;

  if (f->mode <= 0)
    fwide(f, 1);
  *ploc = f->locale;

  if (isascii(c)) {
    c = putc_unlocked(c, f);
  } else if (f->wpos + MB_LEN_MAX < f->wend) {
    l = wctomb((void*)f->wpos, c);
    if (l < 0)
      c = WEOF;
    else
      f->wpos += l;
  } else {
    l = wctomb(mbc, c);
    if (l < 0 || __fwritex((void*)mbc, l, f) < l)
      c = WEOF;
  }
  if (c == WEOF)
    f->flags |= F_ERR;
  *ploc = loc;
  return c;
}

wint_t fputwc(wchar_t c, FILE* f) {
  FLOCK(f);
  c = __fputwc_unlocked(c, f);
  FUNLOCK(f);
  return c;
}

weak_alias(__fputwc_unlocked, fputwc_unlocked);
weak_alias(__fputwc_unlocked, putwc_unlocked);
