blob: fcdcac43f143eabac1529e68c4675b06692d8b6d [file] [log] [blame]
/* Author: macote */
#include "StreamLineReader.h"
void StreamLineReader::AllocateBuffer()
{
buffer_ = (PBYTE)VirtualAlloc(NULL, buffersize_, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
}
void StreamLineReader::FreeBuffer()
{
if (buffer_ != NULL)
{
VirtualFree(buffer_, 0, MEM_RELEASE);
}
}
DWORD StreamLineReader::ReadBytes()
{
if (readlength_ - readindex_ == 0)
{
readindex_ = 0;
readlength_ = filestream_.Read(buffer_, buffersize_);
}
return readlength_;
}
std::wstring StreamLineReader::ReadLine()
{
BOOL eol = FALSE;
std::string raw;
while (!eol)
{
DWORD bufferbytes = readlength_ - readindex_;
if (bufferbytes == 0)
{
bufferbytes = ReadBytes();
if (bufferbytes == 0) break;
}
char* p = (char *)buffer_ + readindex_;
while (*p != '\r' && *p != '\n' && p <= (char *)buffer_ + readindex_)
{
raw.append(p, 1);
readindex_++;
if (readlength_ - readindex_ == 0) break;
p++;
}
if (*p == '\r' || *p == '\n')
{
eol = TRUE;
readindex_++;
if (*p == '\r' && (readlength_ - readindex_ > 0) && *(p + 1) == '\n')
{
readindex_++;
}
}
}
if (raw.size() > 0)
{
DWORD cchWideChar = MultiByteToWideChar(CP_UTF8, 0, raw.c_str(), -1, NULL, 0);
WCHAR* wideChars = (WCHAR *)HeapAlloc(GetProcessHeap(), 0, cchWideChar * sizeof(WCHAR));
cchWideChar = MultiByteToWideChar(CP_UTF8, 0, raw.c_str(), -1, wideChars, cchWideChar);
std::wstring line(wideChars);
HeapFree(GetProcessHeap(), 0, wideChars);
return line;
}
return L"";
}
BOOL StreamLineReader::EndOfStream()
{
return ReadBytes() == 0;
}
void StreamLineReader::Close()
{
filestream_.Close();
}