aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author hop311 <hop3114@gmail.com>2024-01-22 17:32:18 +0100
committer hop311 <hop3114@gmail.com>2024-01-22 17:32:18 +0100
commitfe1938484ab359fb76712cb59a43830e6f852f00 (patch)
tree9ac450512b18730461c4eaeb3af29b03da6f9b71
parent77167fe3366b40b74abff45bcb62f7480963d617 (diff)
Fixed BasicParser::_file_path relying on externally controlled memoryfix/file-path-memory
-rw-r--r--include/openvic-dataloader/csv/LineObject.hpp2
-rw-r--r--include/openvic-dataloader/detail/BasicParser.hpp5
-rw-r--r--src/openvic-dataloader/detail/BasicParser.cpp4
-rw-r--r--src/openvic-dataloader/detail/Errors.hpp6
-rw-r--r--src/openvic-dataloader/detail/LexyReportError.hpp5
-rw-r--r--src/openvic-dataloader/detail/Warnings.hpp8
-rw-r--r--src/openvic-dataloader/v2script/Parser.cpp4
7 files changed, 25 insertions, 9 deletions
diff --git a/include/openvic-dataloader/csv/LineObject.hpp b/include/openvic-dataloader/csv/LineObject.hpp
index 6366c71..87b4d31 100644
--- a/include/openvic-dataloader/csv/LineObject.hpp
+++ b/include/openvic-dataloader/csv/LineObject.hpp
@@ -88,7 +88,7 @@ namespace ovdl::csv {
};
inline std::ostream& operator<<(std::ostream& stream, const LineObject& line) {
- static const char SEP = ';';
+ static constexpr char SEP = ';';
LineObject::position_type sep_index = 0;
for (const auto& [pos, val] : line) {
while (sep_index < pos) {
diff --git a/include/openvic-dataloader/detail/BasicParser.hpp b/include/openvic-dataloader/detail/BasicParser.hpp
index 1e2fd14..7524bb5 100644
--- a/include/openvic-dataloader/detail/BasicParser.hpp
+++ b/include/openvic-dataloader/detail/BasicParser.hpp
@@ -1,5 +1,7 @@
#pragma once
+#include <string>
+#include <string_view>
#include <vector>
#include <openvic-dataloader/ParseError.hpp>
@@ -22,13 +24,14 @@ namespace ovdl::detail {
const std::vector<ParseError>& get_errors() const;
const std::vector<ParseWarning>& get_warnings() const;
+ std::string_view get_file_path() const;
protected:
std::vector<ParseError> _errors;
std::vector<ParseWarning> _warnings;
std::reference_wrapper<std::ostream> _error_stream;
- const char* _file_path;
+ std::string _file_path;
bool _has_fatal_error = false;
};
} \ No newline at end of file
diff --git a/src/openvic-dataloader/detail/BasicParser.cpp b/src/openvic-dataloader/detail/BasicParser.cpp
index ee1b516..212bf00 100644
--- a/src/openvic-dataloader/detail/BasicParser.cpp
+++ b/src/openvic-dataloader/detail/BasicParser.cpp
@@ -44,4 +44,8 @@ const std::vector<ovdl::ParseError>& BasicParser::get_errors() const {
const std::vector<ovdl::ParseWarning>& BasicParser::get_warnings() const {
return _warnings;
+}
+
+std::string_view BasicParser::get_file_path() const {
+ return _file_path;
} \ No newline at end of file
diff --git a/src/openvic-dataloader/detail/Errors.hpp b/src/openvic-dataloader/detail/Errors.hpp
index bf7c831..fbebcc5 100644
--- a/src/openvic-dataloader/detail/Errors.hpp
+++ b/src/openvic-dataloader/detail/Errors.hpp
@@ -1,11 +1,13 @@
#pragma once
+#include <string_view>
+
#include <openvic-dataloader/ParseError.hpp>
namespace ovdl::errors {
- inline const ParseError make_no_file_error(const char* file_path) {
+ inline const ParseError make_no_file_error(std::string_view file_path) {
std::string message;
- if (!file_path) {
+ if (file_path.empty()) {
message = "File path not specified.";
} else {
message = "File '" + std::string(file_path) + "' was not found.";
diff --git a/src/openvic-dataloader/detail/LexyReportError.hpp b/src/openvic-dataloader/detail/LexyReportError.hpp
index 9629963..213090b 100644
--- a/src/openvic-dataloader/detail/LexyReportError.hpp
+++ b/src/openvic-dataloader/detail/LexyReportError.hpp
@@ -7,6 +7,7 @@
#include <openvic-dataloader/ParseData.hpp>
#include <openvic-dataloader/ParseError.hpp>
+#include <openvic-dataloader/detail/Concepts.hpp>
#include <lexy/input_location.hpp>
#include <lexy/visualize.hpp>
@@ -85,6 +86,10 @@ namespace ovdl::detail {
return { _iter, _opts, path };
}
+ constexpr _ReportError path(const detail::Has_c_str auto& path_object) const {
+ return path(path_object.c_str());
+ }
+
/// Specifies an output iterator where the errors are written to.
template<typename OI>
constexpr _ReportError<OI> to(OI out) const {
diff --git a/src/openvic-dataloader/detail/Warnings.hpp b/src/openvic-dataloader/detail/Warnings.hpp
index 6c0b34e..8fc09bd 100644
--- a/src/openvic-dataloader/detail/Warnings.hpp
+++ b/src/openvic-dataloader/detail/Warnings.hpp
@@ -1,13 +1,15 @@
#pragma once
-#include <openvic-dataloader/v2script/Parser.hpp>
+#include <string_view>
+
+#include <openvic-dataloader/ParseWarning.hpp>
namespace ovdl::v2script::warnings {
- inline const ParseWarning make_utf8_warning(const char* file_path) {
+ inline const ParseWarning make_utf8_warning(std::string_view file_path) {
constexpr std::string_view message_suffix = "This may cause problems. Prefer Windows-1252 encoding.";
std::string message;
- if (!file_path) {
+ if (file_path.empty()) {
message = "Buffer is a UTF-8 encoded string. " + std::string(message_suffix);
} else {
message = "File '" + std::string(file_path) + "' is a UTF-8 encoded file. " + std::string(message_suffix);
diff --git a/src/openvic-dataloader/v2script/Parser.cpp b/src/openvic-dataloader/v2script/Parser.cpp
index c46d326..3141550 100644
--- a/src/openvic-dataloader/v2script/Parser.cpp
+++ b/src/openvic-dataloader/v2script/Parser.cpp
@@ -273,7 +273,7 @@ const ast::Node::line_col Parser::get_node_end(const ast::NodeCPtr node) const {
const ast::Node::line_col ast::Node::get_begin_line_col(const Parser& parser) const {
if (!parser._buffer_handler->is_valid() || parser._buffer_handler->_location_map.empty()) return {};
- line_col result;
+ line_col result {};
auto [itr, range_end] = parser._buffer_handler->_location_map.equal_range(this);
if (itr != range_end) {
result.line = itr->second.line_nr();
@@ -293,7 +293,7 @@ const ast::Node::line_col ast::Node::get_begin_line_col(const Parser& parser) co
const ast::Node::line_col ast::Node::get_end_line_col(const Parser& parser) const {
if (!parser._buffer_handler->is_valid() || parser._buffer_handler->_location_map.empty()) return {};
- line_col result;
+ line_col result {};
auto [itr, range_end] = parser._buffer_handler->_location_map.equal_range(this);
if (itr != range_end) {
result.line = itr->second.line_nr();