58 lines
1.3 KiB
C++
58 lines
1.3 KiB
C++
#include "streams.h"
|
|
#include "exceptions.h"
|
|
#include "unicode.h"
|
|
|
|
|
|
UtfStreamReader::UtfStreamReader(std::ifstream *s)
|
|
{
|
|
stream = s;
|
|
}
|
|
|
|
UtfStreamReader::~UtfStreamReader()
|
|
{
|
|
}
|
|
|
|
// This function is very slow because of poor fromUtf8 function design
|
|
wchar_t UtfStreamReader::getNextChar()
|
|
{
|
|
unsigned char buf[10];
|
|
|
|
if (0 < backBuf.size()) {
|
|
wchar_t wc = backBuf.front();
|
|
backBuf.pop_front();
|
|
return wc;
|
|
}
|
|
|
|
if (! stream->good())
|
|
throw Exception(L"Error reading from stream 1");
|
|
|
|
int sz = stream->readsome((char*)buf, 1);
|
|
if (1 != sz)
|
|
throw Exception(L"Error reading from stream 2");
|
|
int size = getUtf8Length(buf[0]);
|
|
if (size > 1) {
|
|
sz = stream->readsome((char*)buf + 1, size - 1);
|
|
if (size - 1 != sz)
|
|
throw Exception(L"Error reading from stream 3");
|
|
}
|
|
buf[size] = 0;
|
|
std::string s((char*)buf);
|
|
std::wstring ws(fromUtf8(s));
|
|
if (1 != ws.length())
|
|
throw Exception(L"Error converting UTF-8 character to wide character");
|
|
return ws[0];
|
|
}
|
|
|
|
void UtfStreamReader::ungetChar(wchar_t ch)
|
|
{
|
|
backBuf.push_back(ch);
|
|
}
|
|
|
|
bool UtfStreamReader::isEof()
|
|
{
|
|
if (stream->eof())
|
|
return true; // FIXME: it doesn't work. why?
|
|
return EOF == stream->peek();
|
|
}
|
|
|