/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include "mb_wc_common.h"
#include <wchar.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
#include <windows.h>


static int __MINGW_ATTRIB_NONNULL(1)
 __wcrtomb_cp (char *dst, wchar_t wc, const unsigned int cp,
	       const unsigned int mb_max)
{       
  if (cp == 0)
    {
      if (wc > 255)
	{
	  errno = EILSEQ;
	  return -1;
	}
      *dst = (char) wc;
      return 1;
    }
  else
    {
      int invalid_char = 0;
   
      int size = WideCharToMultiByte (cp, 0 /* Is this correct flag? */,
				      &wc, 1, dst, mb_max,
				      NULL, &invalid_char);
      if (size == 0 || invalid_char)  
        {
          errno = EILSEQ;
          return -1;
        }
      return size;
    }
}

size_t
wcrtomb (char *dst, wchar_t wc, mbstate_t * __UNUSED_PARAM (ps))
{
  char byte_bucket [MB_LEN_MAX];
  char* tmp_dst = dst ? dst : byte_bucket;      
  return (size_t)__wcrtomb_cp (tmp_dst, wc, __mingw_get_codepage (),
			       MB_CUR_MAX);
}

size_t wcsrtombs (char *dst, const wchar_t **src, size_t len,
		  mbstate_t * __UNUSED_PARAM (ps))
{
  int ret = 0;
  size_t n = 0;
  const unsigned int cp = __mingw_get_codepage();
  const unsigned int mb_max = MB_CUR_MAX;
  const wchar_t *pwc = *src;
  
  if (src == NULL || *src == NULL) /* undefined behavior */
     return 0;

  if (dst != NULL)
    {
       while (n < len)
        {
          if ((ret = __wcrtomb_cp (dst, *pwc, cp, mb_max)) <= 0)
	     return (size_t) -1;
  	  n += ret;
   	  dst += ret;
          if (*(dst - 1) == '\0')
	    {
	      *src = (wchar_t*) NULL;;
	      return (n  - 1);
	    }
	  pwc++;
        }
      *src = pwc;
    }
  else
    {
      char byte_bucket [MB_LEN_MAX];
      while (n < len)
        {
	  if ((ret = __wcrtomb_cp (byte_bucket, *pwc, cp, mb_max))
		 <= 0)
 	    return (size_t) -1;    
	  n += ret;
	  if (byte_bucket [ret - 1] == '\0')
	    return (n - 1);
          pwc++;
        }
    }
 
  return n;
}
