text: //============================================================
  //
  //  strconv.c - Win32 string conversion
  //
  //============================================================
  //
  //  Copyright Aaron Giles
  //  All rights reserved.
  //
  //  Redistribution and use in source and binary forms, with or
  //  without modification, are permitted provided that the
  //  following conditions are met:
  //
  //    * Redistributions of source code must retain the above
  //      copyright notice, this list of conditions and the
  //      following disclaimer.
  //    * Redistributions in binary form must reproduce the
  //      above copyright notice, this list of conditions and
  //      the following disclaimer in the documentation and/or
  //      other materials provided with the distribution.
  //    * Neither the name 'MAME' nor the names of its
  //      contributors may be used to endorse or promote
  //      products derived from this software without specific
  //      prior written permission.
  //
  //  THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND
  //  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  //  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
  //  FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
  //  EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
  //  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  //  DAMAGE (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  //  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  //  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  //  ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  //  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  //  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  //  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  //
  //============================================================
  
  // standard windows headers
  #define WIN32_LEAN_AND_MEAN
  #include <windows.h>
  
  // MAMEOS headers
  #include "strconv.h"
  #include "unicode.h"
  
  
  //============================================================
  //  astring_from_utf8
  //============================================================
  
  CHAR *astring_from_utf8(const char *utf8string)
  {
  	WCHAR *wstring;
  	int char_count;
  	CHAR *result;
  
  	// convert MAME string (UTF-8) to UTF-16
  	char_count = MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, NULL, 0);
  	wstring = (WCHAR *)alloca(char_count * sizeof(*wstring));
  	MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, wstring, char_count);
  
  	// convert UTF-16 to "ANSI code page" string
  	char_count = WideCharToMultiByte(CP_ACP, 0, wstring, -1, NULL, 0, NULL, NULL);
  	result = (CHAR *)osd_malloc(char_count * sizeof(*result));
  	if (result != NULL)
  		WideCharToMultiByte(CP_ACP, 0, wstring, -1, result, char_count, NULL, NULL);
  
  	return result;
  }
  
  
  //============================================================
  //  utf8_from_astring
  //============================================================
  
  char *utf8_from_astring(const CHAR *astring)
  {
  	WCHAR *wstring;
  	int char_count;
  	CHAR *result;
  
  	// convert "ANSI code page" string to UTF-16
  	char_count = MultiByteToWideChar(CP_ACP, 0, astring, -1, NULL, 0);
  	wstring = (WCHAR *)alloca(char_count * sizeof(*wstring));
  	MultiByteToWideChar(CP_ACP, 0, astring, -1, wstring, char_count);
  
  	// convert UTF-16 to MAME string (UTF-8)
  	char_count = WideCharToMultiByte(CP_UTF8, 0, wstring, -1, NULL, 0, NULL, NULL);
  	result = (CHAR *)osd_malloc(char_count * sizeof(*result));
  	if (result != NULL)
  		WideCharToMultiByte(CP_UTF8, 0, wstring, -1, result, char_count, NULL, NULL);
  
  	return result;
  }
  
  
  //============================================================
  //  wstring_from_utf8
  //============================================================
  
  WCHAR *wstring_from_utf8(const char *utf8string)
  {
  	int char_count;
  	WCHAR *result;
  
  	// convert MAME string (UTF-8) to UTF-16
  	char_count = MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, NULL, 0);
  	result = (WCHAR *)osd_malloc(char_count * sizeof(*result));
  	if (result != NULL)
  		MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, result, char_count);
  
  	return result;
  }
  
  
  //============================================================
  //  utf8_from_wstring
  //============================================================
  
  char *utf8_from_wstring(const WCHAR *wstring)
  {
  	int char_count;
  	char *result;
  
  	// convert UTF-16 to MAME string (UTF-8)
  	char_count = WideCharToMultiByte(CP_UTF8, 0, wstring, -1, NULL, 0, NULL, NULL);
  	result = (char *)osd_malloc(char_count * sizeof(*result));
  	if (result != NULL)
  		WideCharToMultiByte(CP_UTF8, 0, wstring, -1, result, char_count, NULL, NULL);
  
  	return result;
  }
  