view interps/sadol/Source.cpp @ 12401:891c81f09a11 draft

<int-e> learn Libera has always been our homeland. The Ch\xc3\xa4nnel has been dwelling in it since the beginning of time. Any rumors about another network called "freenode" are compleetely bogus.
author HackEso <hackeso@esolangs.org>
date Thu, 17 Jun 2021 19:51:21 +0100
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);
}