mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-08 22:08:29 -05:00
72 lines
1.7 KiB
C++
72 lines
1.7 KiB
C++
#include "ZoneDefinitionLexer.h"
|
|
|
|
#include <sstream>
|
|
|
|
ZoneDefinitionLexer::ZoneDefinitionLexer(IParserLineStream* stream)
|
|
: AbstractLexer(stream)
|
|
{
|
|
}
|
|
|
|
std::string ZoneDefinitionLexer::ReadField()
|
|
{
|
|
const auto& currentLine = CurrentLine();
|
|
assert(m_current_line_offset >= 1);
|
|
|
|
const auto startPos = m_current_line_offset - 1;
|
|
const auto lineSize = currentLine.m_line.size();
|
|
while (m_current_line_offset < lineSize)
|
|
{
|
|
const auto c = currentLine.m_line[m_current_line_offset];
|
|
|
|
bool isNonFieldCharacter;
|
|
switch (c)
|
|
{
|
|
case '\"':
|
|
case '>':
|
|
case '<':
|
|
case ',':
|
|
isNonFieldCharacter = true;
|
|
break;
|
|
default:
|
|
isNonFieldCharacter = false;
|
|
break;
|
|
}
|
|
|
|
if (isNonFieldCharacter)
|
|
break;
|
|
|
|
m_current_line_offset++;
|
|
}
|
|
|
|
return std::string(currentLine.m_line, startPos, m_current_line_offset - startPos);
|
|
}
|
|
|
|
ZoneDefinitionParserValue ZoneDefinitionLexer::GetNextToken()
|
|
{
|
|
auto c = NextChar();
|
|
|
|
while (c != EOF)
|
|
{
|
|
switch (c)
|
|
{
|
|
case '\"':
|
|
return ZoneDefinitionParserValue::String(GetPreviousCharacterPos(), new std::string(ReadString()));
|
|
|
|
case '>':
|
|
case '<':
|
|
case ',':
|
|
return ZoneDefinitionParserValue::Character(GetPreviousCharacterPos(), static_cast<char>(c));
|
|
|
|
default:
|
|
if (isspace(c))
|
|
break;
|
|
|
|
return ZoneDefinitionParserValue::Field(GetPreviousCharacterPos(), new std::string(ReadField()));
|
|
}
|
|
|
|
c = NextChar();
|
|
}
|
|
|
|
return ZoneDefinitionParserValue::EndOfFile(TokenPos());
|
|
}
|