/*
Ousía
Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef _OUSIA_LOCATION_HPP_
#define _OUSIA_LOCATION_HPP_
#include
namespace ousia {
/**
* Struct representing a location within a source file. A position is defined by
* a byte offset (which is always reproducable), a line number and a column
* number (which may differ depending on the encoding used).
*/
struct SourceLocation {
/**
* Current line, starting with one.
*/
int line;
/**
* Current column, starting with one.
*/
int column;
/**
* Current byte offset.
*/
size_t offs;
/**
* Default constructor of the SourceLocation struct, initializes all
* memebers with zero.
*/
SourceLocation() : line(0), column(0), offs(0) {}
/**
* Creates a new SourceLocation struct with only a line and no column.
*
* @param line is the line number.
* @param column is the column number.
*/
SourceLocation(int line) : line(line), column(0), offs(0) {}
/**
* Creates a new SourceLocation struct with a line and column.
*
* @param line is the line number.
* @param column is the column number.
*/
SourceLocation(int line, int column) : line(line), column(column), offs(0)
{
}
/**
* Creates a new SourceLocation struct with a line, column and byte offset.
*
* @param line is the line number.
* @param column is the column number.
* @param offs is the byte offset.
*/
SourceLocation(int line, int column, size_t offs)
: line(line), column(column), offs(offs)
{
}
/**
* Returns true, if the line number is valid, false otherwise.
*
* @return true for valid line numbers.
*/
bool hasLine() const { return line > 0; }
/**
* Returns true, if the column number is valid, false otherwise.
*
* @return true for valid column numbers.
*/
bool hasColumn() const { return column > 0; }
/**
* Returns true, if the position is valid, false otherwise. This function is
* equivalent to the hasLine() function.
*
* @return true if the Position struct is valid.
*/
bool valid() const { return hasLine(); }
};
/**
* Represents the context of a SourceLocation instance. Used to build error
* messages.
*/
struct SourceContext {
/**
* Set to the content of the current line.
*/
std::string text;
/**
* Relative position (in characters) within that line. May point to
* locations beyond the text content.
*/
int relPos;
/**
* Set to true if the beginning of the line has been truncated (because
* the reader position is too far away from the actual position of the
* line).
*/
bool truncatedStart;
/**
* Set to true if the end of the line has been truncated (because the
* reader position is too far away from the actual end position of the
* line.
*/
bool truncatedEnd;
/**
* Default constructor, initializes all members with zero values.
*/
SourceContext()
: text(), relPos(0), truncatedStart(false), truncatedEnd(false)
{
}
/**
* Constructor of the SourceContext class.
*
* @param text is the current line the text cursor is at.
* @param relPos is the relative position of the text cursor within that
* line.
* @param truncatedStart specifies whether the text was truncated at the
* beginning.
* @param truncatedEnd specifies whether the text was truncated at the
* end.
*/
SourceContext(std::string text, size_t relPos, bool truncatedStart,
bool truncatedEnd)
: text(std::move(text)),
relPos(relPos),
truncatedStart(truncatedStart),
truncatedEnd(truncatedEnd)
{
}
/**
* Returns true the context text is not empty.
*
* @return true if the context is valid and e.g. should be printed.
*/
bool valid() const { return !text.empty(); }
};
/**
* Callback used to lookup the context corresponding to the given source
* location.
*
* @param location is the location for which the context should be looked up.
* @param data is used defined data associated with the callback.
*/
using SourceContextCallback = SourceContext (*)(const SourceLocation &location,
void *data);
}
#endif /* _OUSIA_LOCATION_HPP_ */