@@ -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