intp StringParser::ConvertToBuffer(const wchar_t* str, size_t length, HeapString& outBuffer) { outBuffer.Clear(); if (length == 0) { return 0; } constexpr bool isUTF16 = sizeof(wchar_t) == 2; if (isUTF16) { //sizeof(wchar_t)==2 size_t utf8Size = length * 3 + 1; outBuffer.ReserveSize(utf8Size); const UTF16* sourceStart = reinterpret_cast<const UTF16*>(str); const UTF16* sourceEnd = sourceStart + length; UTF8* targetStart = reinterpret_cast<UTF8*>(outBuffer.MutableBuffer()); UTF8* targetEnd = targetStart + utf8Size; ConversionResult res = ConvertUTF16toUTF8(&sourceStart, sourceEnd, &targetStart, targetEnd, strictConversion); *targetStart = 0; if (res == conversionOK) { intp count = targetStart - reinterpret_cast<UTF8*>(outBuffer.MutableBuffer()); outBuffer.ForceSetLength(count); return count; } } else { //sizeof(wchar_t)==4 size_t utf8Size = length * 4 + 1; outBuffer.ReserveSize(utf8Size); const UTF32* sourceStart = reinterpret_cast<const UTF32*>(str); const UTF32* sourceEnd = sourceStart + length; UTF8* targetStart = reinterpret_cast<UTF8*>(outBuffer.MutableBuffer()); UTF8* targetEnd = targetStart + utf8Size; ConversionResult res = ConvertUTF32toUTF8(&sourceStart, sourceEnd, &targetStart, targetEnd, strictConversion); *targetStart = 0; if (res == conversionOK) { intp count = targetStart - reinterpret_cast<UTF8*>(outBuffer.MutableBuffer()); outBuffer.ForceSetLength(count); return count; } } return 0; }
size_t IStream::ReadAllLinesTo(List<HeapString>& outLines, size_t maxCount/*=1024*/, bool isTrim/*=true*/, bool ignoreEmptyLine/*=true*/)const { size_t count = 0; HeapString temp; temp.ReserveLength(maxCount); while (true) { temp.Clear(); size_t readCount = ReadLineToString(temp); count += readCount; BREAK_IF_ZERO(readCount); if (ignoreEmptyLine) { CONTINUE_IF_EMPTY(temp); } if (isTrim) { temp.TrimAll(); } outLines.Add(temp); temp.ForceSetLength(0); } return count; }