/*============================================================================
  KWSys - Kitware System Library
  Copyright 2000-2009 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#include "kwsysPrivate.h"
#include KWSYS_HEADER(Encoding.h)

/* Work-around CMake dependency scanning limitation.  This must
   duplicate the above list of headers.  */
#if 0
# include "Encoding.h.in"
#endif

#include <stdlib.h>

#ifdef _WIN32
#include <windows.h>
#endif

size_t kwsysEncoding_mbstowcs(wchar_t* dest, const char* str, size_t n)
{
  if(str == 0)
    {
    return (size_t)-1;
    }
#ifdef _WIN32
  return MultiByteToWideChar(KWSYS_ENCODING_DEFAULT_CODEPAGE, 0,
                             str, -1, dest, (int)n) - 1;
#else
  return mbstowcs(dest, str, n);
#endif
}

wchar_t* kwsysEncoding_DupToWide(const char* str)
{
  wchar_t* ret = NULL;
  size_t length = kwsysEncoding_mbstowcs(NULL, str, 0) + 1;
  if(length > 0)
    {
    ret = (wchar_t*)malloc((length)*sizeof(wchar_t));
    if(ret)
      {
      ret[0] = 0;
      kwsysEncoding_mbstowcs(ret, str, length);
      }
    }
  return ret;
}

size_t kwsysEncoding_wcstombs(char* dest, const wchar_t* str, size_t n)
{
  if(str == 0)
    {
    return (size_t)-1;
    }
#ifdef _WIN32
  return WideCharToMultiByte(KWSYS_ENCODING_DEFAULT_CODEPAGE, 0, str, -1,
                             dest, (int)n, NULL, NULL) - 1;
#else
  return wcstombs(dest, str, n);
#endif
}

char* kwsysEncoding_DupToNarrow(const wchar_t* str)
{
  char* ret = NULL;
  size_t length = kwsysEncoding_wcstombs(0, str, 0) + 1;
  if(length > 0)
    {
    ret = (char*)malloc(length);
    if(ret)
      {
      ret[0] = 0;
      kwsysEncoding_wcstombs(ret, str, length);
      }
    }
  return ret;
}
