LINUX.ORG.RU

История изменений

Исправление kvpfs, (текущая версия) :

Нет ли здесь ошибки?

// convets from [in_begin : in_end) to *o_out
void cvt(const wchar_t *in_begin,
		const wchar_t *in_end,
		std::basic_string<char> *o_out)
{
	using namespace std;
	auto& cvt = use_facet<codecvt<wchar_t, char, mbstate_t>>(locale());
	// expect SBO
	o_out->resize(15);
	mbstate_t mb{};
	const wchar_t *from_next = in_begin;
	char *to_next = &(*o_out)[0];
	while (cvt.out(mb, from_next, in_end, from_next,
			to_next, &(*o_out)[o_out->size()], to_next) ==
			std::codecvt_base::partial  &&
			from_next != in_end) {
		std::ptrdiff_t diff = to_next - &(*o_out)[0];
		o_out->resize(o_out->size() * 2);
		to_next = &(*o_out)[0] + diff;
	}
	o_out->resize(to_next - &(*o_out)[0]);
}

Меня смущает mbstate_t, я плохо понимаю зачем оно нужно. Я не нашёл ни одно примера, где бы кто-то повторно входил в cvt.out()

Исходная версия kvpfs, :

Нет ли здесь ошибки?

void cvt(const wchar_t *in_begin,
		const wchar_t *in_end,
		std::basic_string<char> *o_out)
{
	using namespace std;
	auto& cvt = use_facet<codecvt<wchar_t, char, mbstate_t>>(locale());
	// expect SBO
	o_out->resize(15);
	mbstate_t mb{};
	const wchar_t *from_next = in_begin;
	char *to_next = &(*o_out)[0];
	while (cvt.out(mb, from_next, in_end, from_next,
			to_next, &(*o_out)[o_out->size()], to_next) ==
			std::codecvt_base::partial  &&
			from_next != in_end) {
		std::ptrdiff_t diff = to_next - &(*o_out)[0];
		o_out->resize(o_out->size() * 2);
		to_next = &(*o_out)[0] + diff;
	}
	o_out->resize(to_next - &(*o_out)[0]);
}

Меня смущает mbstate_t, я плохо понимаю зачем оно нужно. Я не нашёл ни одно примера, где бы кто-то повторно входил в cvt.out()