*improved utf8 string input/output on windows.
This commit is contained in:
parent
66b42def89
commit
d16f6b74c7
@ -1196,7 +1196,9 @@ static char* mb_strupr(char* s);
|
|||||||
static bool_t mb_is_little_endian(void);
|
static bool_t mb_is_little_endian(void);
|
||||||
|
|
||||||
#if defined MB_CP_VC && defined MB_ENABLE_UNICODE
|
#if defined MB_CP_VC && defined MB_ENABLE_UNICODE
|
||||||
static bool_t mb_bytes_to_wchar(const char* sz, wchar_t** out, size_t size);
|
static int mb_bytes_to_wchar(const char* sz, wchar_t** out, size_t size);
|
||||||
|
static int mb_bytes_to_wchar_ansi(const char* sz, wchar_t** out, size_t size);
|
||||||
|
static int mb_wchar_to_bytes(const wchar_t* sz, char** out, size_t size);
|
||||||
#endif /* MB_CP_VC && MB_ENABLE_UNICODE */
|
#endif /* MB_CP_VC && MB_ENABLE_UNICODE */
|
||||||
|
|
||||||
/** Unicode handling */
|
/** Unicode handling */
|
||||||
@ -2961,14 +2963,34 @@ static bool_t mb_is_little_endian(void) {
|
|||||||
|
|
||||||
#if defined MB_CP_VC && defined MB_ENABLE_UNICODE
|
#if defined MB_CP_VC && defined MB_ENABLE_UNICODE
|
||||||
/* Map a UTF8 character string to a UTF16 (wide character) string */
|
/* Map a UTF8 character string to a UTF16 (wide character) string */
|
||||||
static bool_t mb_bytes_to_wchar(const char* sz, wchar_t** out, size_t size) {
|
static int mb_bytes_to_wchar(const char* sz, wchar_t** out, size_t size) {
|
||||||
int min_size = MultiByteToWideChar(CP_UTF8, 0, sz, -1, NULL, 0);
|
int result = MultiByteToWideChar(CP_UTF8, 0, sz, -1, 0, 0);
|
||||||
if((int)size < min_size)
|
if((int)size < result)
|
||||||
*out = (wchar_t*)mb_malloc(sizeof(wchar_t) * min_size);
|
*out = (wchar_t*)mb_malloc(sizeof(wchar_t) * result);
|
||||||
MultiByteToWideChar(CP_UTF8, 0, sz, -1, *out, min_size);
|
MultiByteToWideChar(CP_UTF8, 0, sz, -1, *out, result);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Map an ANSI character string to a UTF16 (wide character) string */
|
||||||
|
static int mb_bytes_to_wchar_ansi(const char* sz, wchar_t** out, size_t size) {
|
||||||
|
int result = MultiByteToWideChar(CP_ACP, 0, sz, -1, 0, 0);
|
||||||
|
if((int)size < result)
|
||||||
|
*out = (wchar_t*)mb_malloc(sizeof(wchar_t) * result);
|
||||||
|
MultiByteToWideChar(CP_ACP, 0, sz, -1, *out, result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Map a UTF16 (wide character) string to a UTF8 character string */
|
||||||
|
static int mb_wchar_to_bytes(const wchar_t* sz, char** out, size_t size) {
|
||||||
|
int result = WideCharToMultiByte(CP_UTF8, 0, sz, -1, 0, 0, 0, 0);
|
||||||
|
if((int)size < result)
|
||||||
|
*out = (char*)mb_malloc(result);
|
||||||
|
WideCharToMultiByte(CP_UTF8, 0, sz, -1, *out, result, 0, 0);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
#endif /* MB_CP_VC && MB_ENABLE_UNICODE */
|
#endif /* MB_CP_VC && MB_ENABLE_UNICODE */
|
||||||
|
|
||||||
/** Unicode handling */
|
/** Unicode handling */
|
||||||
@ -15708,7 +15730,24 @@ static int _std_input(mb_interpreter_t* s, void** l) {
|
|||||||
safe_free(obj->data.variable->data->data.string);
|
safe_free(obj->data.variable->data->data.string);
|
||||||
}
|
}
|
||||||
len = _get_inputer(s)(line, sizeof(line));
|
len = _get_inputer(s)(line, sizeof(line));
|
||||||
|
#if defined MB_CP_VC && defined MB_ENABLE_UNICODE
|
||||||
|
{
|
||||||
|
char str[16];
|
||||||
|
char* strp = str;
|
||||||
|
wchar_t wstr[16];
|
||||||
|
wchar_t* wstrp = wstr;
|
||||||
|
mb_bytes_to_wchar_ansi(line, &wstrp, countof(wstr));
|
||||||
|
len = mb_wchar_to_bytes(wstrp, &strp, countof(str));
|
||||||
|
if(wstrp != wstr)
|
||||||
|
mb_free(wstrp);
|
||||||
|
if(strp != str)
|
||||||
|
obj->data.variable->data->data.string = strp;
|
||||||
|
else
|
||||||
|
obj->data.variable->data->data.string = mb_memdup(strp, len + 1);
|
||||||
|
}
|
||||||
|
#else /* MB_CP_VC && MB_ENABLE_UNICODE */
|
||||||
obj->data.variable->data->data.string = mb_memdup(line, len + 1);
|
obj->data.variable->data->data.string = mb_memdup(line, len + 1);
|
||||||
|
#endif /* MB_CP_VC && MB_ENABLE_UNICODE */
|
||||||
ast = ast->next;
|
ast = ast->next;
|
||||||
} else {
|
} else {
|
||||||
result = MB_FUNC_ERR;
|
result = MB_FUNC_ERR;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user