Skip to content

Commit 06fa935

Browse files
committed
🛠 Additional tweaks for MultiBytetoWideChar
1 parent 5192c5b commit 06fa935

File tree

2 files changed

+38
-16
lines changed

2 files changed

+38
-16
lines changed

source/include/ztd/cuneicode/detail/core_mcharn.hpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,14 +1125,26 @@ namespace cnc {
11251125
break;
11261126
}
11271127
}
1128-
const ztd_wchar_t* __p_intermediate_input = __intermediate_output;
1129-
cnc_mcerr __err
1130-
= ::cnc::__cnc_detail::__c16nrtoc32n<_IsCounting, _IsUnbounded, false>(
1131-
__p_maybe_dst_len, __p_maybe_dst, &__intermediate_size,
1132-
reinterpret_cast<const ztd_char16_t**>(&__p_intermediate_input),
1133-
__p_state);
1134-
if (__err != cnc_mcerr_ok) {
1135-
return __err;
1128+
const ztd_char16_t* __p_intermediate_input
1129+
= reinterpret_cast<const ztd_char16_t*>(&__intermediate_output[0]);
1130+
ztd_char32_t* __initial_dst = !_IsCounting ? *__p_maybe_dst : nullptr;
1131+
size_t __initial_dst_len = !_IsUnbounded ? *__p_maybe_dst_len : SIZE_MAX;
1132+
for (; __intermediate_size != 0;) {
1133+
// we may end up with multiple UTF-16 characters out of MultiBytetoWideChar and
1134+
// all that
1135+
cnc_mcerr __err
1136+
= ::cnc::__cnc_detail::__c16nrtoc32n<_IsCounting, _IsUnbounded, false>(
1137+
__p_maybe_dst_len, __p_maybe_dst, &__intermediate_size,
1138+
&__p_intermediate_input, __p_state);
1139+
if (__err != cnc_mcerr_ok) {
1140+
if (!_IsUnbounded) {
1141+
__p_maybe_dst_len[0] = __initial_dst_len;
1142+
}
1143+
if (!_IsCounting) {
1144+
__p_maybe_dst[0] = __initial_dst;
1145+
}
1146+
return __err;
1147+
}
11361148
}
11371149
__p_src[0] += __input_read_size;
11381150
__p_src_len[0] -= __input_read_size;

source/ztd/cuneicode/windows_code_page.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -176,21 +176,31 @@ cnc_mcerr cnc_mcnrtoc32n_windows_code_page(size_t* __p_maybe_dst_len, ztd_char32
176176
static_cast<DWORD>(__flags), __initial_src, static_cast<int>(__input_read_size),
177177
__p_intermediate_output, static_cast<int>(__intermediate_output_initial_size));
178178
if (__win32_err == 0) {
179-
DWORD __last_win32_err = ::GetLastError();
180-
if (__last_win32_err == ERROR_NO_UNICODE_TRANSLATION) {
181-
return cnc_mcerr_invalid_sequence;
182-
}
179+
// not sure; we have to keep looping, unfortunately.
180+
continue;
183181
}
184182
else {
185183
__intermediate_size = static_cast<size_t>(__win32_err);
186184
break;
187185
}
188186
}
187+
const bool __is_counting = __p_maybe_dst == nullptr || __p_maybe_dst[0] == nullptr;
188+
const bool __is_unbounded = __p_maybe_dst_len == nullptr;
189189
const ztd_wchar_t* __p_intermediate_input = __intermediate_output;
190-
cnc_mcerr __err = cnc_mwcnrtoc32n(__p_maybe_dst_len, __p_maybe_dst, &__intermediate_size,
191-
&__p_intermediate_input, __p_state);
192-
if (__err != cnc_mcerr_ok) {
193-
return __err;
190+
ztd_char32_t* __initial_dst = !__is_counting ? *__p_maybe_dst : nullptr;
191+
size_t __initial_dst_len = !__is_unbounded ? *__p_maybe_dst_len : SIZE_MAX;
192+
for (; __intermediate_size != 0;) {
193+
cnc_mcerr __err = cnc_mwcnrtoc32n(__p_maybe_dst_len, __p_maybe_dst, &__intermediate_size,
194+
&__p_intermediate_input, __p_state);
195+
if (__err != cnc_mcerr_ok) {
196+
if (!__is_unbounded) {
197+
__p_maybe_dst_len[0] = __initial_dst_len;
198+
}
199+
if (!__is_counting) {
200+
__p_maybe_dst[0] = __initial_dst;
201+
}
202+
return __err;
203+
}
194204
}
195205
__p_src[0] += __input_read_size;
196206
__p_src_len[0] -= __input_read_size;

0 commit comments

Comments
 (0)