1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
ScannerBase::Input::Input()
:
d_in(0),
d_lineNr(1)
{}
ScannerBase::Input::Input(std::istream *iStream, size_t lineNr)
:
d_in(iStream),
d_lineNr(lineNr)
{}
size_t ScannerBase::Input::get()
{
switch (size_t ch = next()) // get the next input char
{
case '\n':
++d_lineNr;
[[fallthrough]];
default:
return ch;
}
}
size_t ScannerBase::Input::next()
{
size_t ch;
if (d_deque.empty()) // deque empty: next char fm d_in
{
if (d_in == 0)
return AT_EOF;
ch = d_in->get();
return *d_in ? ch : static_cast<size_t>(AT_EOF);
}
ch = d_deque.front();
d_deque.pop_front();
return ch;
}
void ScannerBase::Input::reRead(size_t ch)
{
if (ch < 0x100)
{
if (ch == '\n')
--d_lineNr;
d_deque.push_front(ch);
}
}
void ScannerBase::Input::reRead(std::string const &str, size_t fm)
{
for (size_t idx = str.size(); idx-- > fm; )
reRead(str[idx]);
}
|