ocaml/yacc/wstr.c

61 lines
2.1 KiB
C

/**************************************************************************/
/* */
/* OCaml */
/* */
/* David Allsopp, OCaml Labs, Cambridge. */
/* */
/* Copyright 2017 MetaStack Solutions Ltd. */
/* */
/* All rights reserved. This file is distributed under the terms of */
/* the GNU Lesser General Public License version 2.1, with the */
/* special exception on linking described in the file LICENSE. */
/* */
/**************************************************************************/
/* Need at least Windows Vista for WC_ERR_INVALID_CHARS */
#define _WIN32_WINNT 0x600
#define WINVER 0x600
#include <windows.h>
/* See corresponding values in runtime/win32.c */
static int windows_unicode_enabled = WINDOWS_UNICODE;
static int windows_unicode_strict = 1;
/* Adapted from runtime/win32.c */
int win_wide_char_to_multi_byte(const wchar_t *s, int slen,
char *out, int outlen)
{
int retcode;
if (slen == 0)
return 0;
if (windows_unicode_enabled != 0)
retcode =
WideCharToMultiByte(CP_UTF8,
windows_unicode_strict ? WC_ERR_INVALID_CHARS : 0,
s, slen, out, outlen, NULL, NULL);
else
retcode =
WideCharToMultiByte(CP_ACP, 0, s, slen, out, outlen, NULL, NULL);
if (retcode == 0)
return -1;
return retcode;
}
char* caml_stat_strdup_of_utf16(const wchar_t *s)
{
char *out = NULL;
int retcode;
retcode = win_wide_char_to_multi_byte(s, -1, NULL, 0);
if (retcode >= 0) {
out = (char *)malloc(retcode);
win_wide_char_to_multi_byte(s, -1, out, retcode);
}
return out;
}