summaryrefslogtreecommitdiff
path: root/src/core/common/Location.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/common/Location.hpp')
-rw-r--r--src/core/common/Location.hpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/src/core/common/Location.hpp b/src/core/common/Location.hpp
new file mode 100644
index 0000000..0dd359d
--- /dev/null
+++ b/src/core/common/Location.hpp
@@ -0,0 +1,182 @@
+/*
+ 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 <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef _OUSIA_LOCATION_HPP_
+#define _OUSIA_LOCATION_HPP_
+
+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_ */
+