diff options
author | Hop311 <Hop3114@gmail.com> | 2024-01-22 22:04:25 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-22 22:04:25 +0100 |
commit | 4f4a053dff51fe28e473ac8b3528a95dc6e5dec6 (patch) | |
tree | b22e63b6e247179df4069df8a0f902ed40a3471e | |
parent | 59ec8275b584d4a48f7836816114d4933c655799 (diff) | |
parent | afbd8024110aaa80a7b94cff9a9d96e763b13916 (diff) |
Merge pull request #36 from OpenVicProject/fix/file-path-memory
Fixed BasicParser::_file_path relying on externally controlled memory
-rw-r--r-- | include/openvic-dataloader/csv/LineObject.hpp | 2 | ||||
-rw-r--r-- | include/openvic-dataloader/detail/BasicParser.hpp | 5 | ||||
-rw-r--r-- | src/openvic-dataloader/detail/BasicParser.cpp | 4 | ||||
-rw-r--r-- | src/openvic-dataloader/detail/Errors.hpp | 6 | ||||
-rw-r--r-- | src/openvic-dataloader/detail/LexyReportError.hpp | 5 | ||||
-rw-r--r-- | src/openvic-dataloader/detail/Warnings.hpp | 8 | ||||
-rw-r--r-- | src/openvic-dataloader/v2script/Parser.cpp | 4 |
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(); |