mirror of
https://github.com/holub/mame
synced 2025-05-06 22:35:43 +03:00
137 lines
4.5 KiB
C
137 lines
4.5 KiB
C
//============================================================
|
|
//
|
|
// 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;
|
|
}
|