view interps/sadol/Source.cpp @ 6842:76c0c1881313

<olsner> learn The internet is for everything. However many thing can done even without internet too, often better without use of internet, but internet is good too.
author HackBot
date Mon, 15 Feb 2016 01:09:11 +0000
parents 859f9b4339e6
children
line wrap: on
line source

/*
 * BDSM2
 * Author: Adam Sawicki
 * http://www.regedit.risp.pl
 * mailto:regedit@risp.pl
 */
#include "pch.hpp"
#include <sstream>
#include "Source.hpp"

string Source::Iterator::ToString() const
{
	std::ostringstream ss;
	ss << "index: " << (unsigned)Index << ", row: " << Row << ", col: " << Col;
	return ss.str();
}

void Source::Forward()
{
	if (Peek() == '\r')
	{
	}
	else if (Peek() == '\n')
	{
		m_Index.Row++;
		m_Index.Col = 1;
	}
	else
		m_Index.Col++;

	m_Index.Index++;
}

char Source::Get()
{
	char ch = Peek();
	Forward();
	return ch;
}

Source::Source(const string *Src) : m_Src(Src), m_ErrIndexSaved(false)
{
	m_Index.Index = 0;
	m_Index.Row = 1;
	m_Index.Col = 1;
}

char Source::GetS()
{
	if (End())
		SrcError("Unexpected end of file", ERR_PARSE);
	return Get();
}

void Source::Skip()
{
	char ch;
	while (!End())
	{
		ch = Peek();
		// Whitespace
		if (ch == ' ' || ch == '\t' || ch == '\v' || ch == '\r' || ch == '\n')
			Forward();
		// Comment
		else if (ch == '{')
		{
			Forward();
			for (;;)
			{
				if (End())
					SrcError("Unexpected end of comment", ERR_PARSE);
				ch = Peek();
				Forward();
				if (ch == '}')
					break;
			}
		}
		else
			break;
	}
}

void Source::SrcError(const string &msg, ERR_PLACE place)
{
	Error(msg + " (" + GetIterator().ToString() + ')', place);
}