aboutsummaryrefslogtreecommitdiff
path: root/src/headless
diff options
context:
space:
mode:
author Spartan322 <Megacake1234@gmail.com>2023-09-03 23:54:18 +0200
committer Spartan322 <Megacake1234@gmail.com>2023-09-04 18:22:33 +0200
commita705b0223664f915d8bb00d4f89e05838da3e4bc (patch)
tree9833fa669651e04dea81b9b2b5875a8d21ea938e /src/headless
parent027828532837673a3631c8a9a8128f9b89a9db43 (diff)
Add Windows-1252 CSV Parser
Fix CsvGrammar counting behavior Add csv parse argument to headless/main.cpp Change LineObject contained value type to pair Add ostream print to LineObject Add vscode tasks.json Add vscode launch.json Move csv::Parser template class specialization to end of Parser.cpp Add detail/ClassExport.hpp to assist compiler export
Diffstat (limited to 'src/headless')
-rw-r--r--src/headless/main.cpp84
1 files changed, 80 insertions, 4 deletions
diff --git a/src/headless/main.cpp b/src/headless/main.cpp
index 94d6b8d..c3ca8c2 100644
--- a/src/headless/main.cpp
+++ b/src/headless/main.cpp
@@ -1,17 +1,71 @@
+#include <algorithm>
+#include <cctype>
#include <cstdio>
+#include <cstdlib>
#include <iostream>
+#include <iterator>
#include <string>
+#include <string_view>
#include <vector>
+#include <openvic-dataloader/ParseWarning.hpp>
+#include <openvic-dataloader/csv/LineObject.hpp>
+#include <openvic-dataloader/csv/Parser.hpp>
+#include <openvic-dataloader/v2script/AbstractSyntaxTree.hpp>
#include <openvic-dataloader/v2script/Parser.hpp>
-int main(int argc, char** argv) {
- if (argc < 2) {
- std::fprintf(stderr, "usage: %s <filename>", argv[0]);
+std::string_view trim(std::string_view str) {
+ std::string_view::iterator begin = str.begin();
+ std::string_view::iterator end = str.end();
+ for (;; begin++) {
+ if (begin == end) return std::string_view();
+ if (!std::isspace(*begin)) break;
+ }
+ end--;
+ for (;; end--) {
+ if (end == begin) return std::string_view();
+ if (!std::isspace(*end)) break;
+ }
+ return std::string_view(&*begin, std::distance(begin, end));
+}
+
+bool insenitive_trim_eq(std::string_view lhs, std::string_view rhs) {
+ lhs = trim(lhs);
+ rhs = trim(rhs);
+ return std::equal(
+ lhs.begin(), lhs.end(),
+ rhs.begin(), rhs.end(),
+ [](char a, char b) { return std::tolower(a) == std::tolower(b); });
+}
+
+template<ovdl::csv::EncodingType Encoding>
+int print_csv(const std::string_view path) {
+ auto parser = ovdl::csv::Parser<Encoding>::from_file(path);
+ if (parser.has_error()) {
return 1;
}
- auto parser = ovdl::v2script::Parser::from_file(argv[1]);
+ parser.parse_csv();
+ if (parser.has_error()) {
+ return 2;
+ }
+
+ if (parser.has_warning()) {
+ for (auto& warning : parser.get_warnings()) {
+ std::cerr << "Warning: " << warning.message << std::endl;
+ }
+ }
+
+ std::cout << "lines:\t\t" << parser.get_lines().size() << std::endl;
+ for (const auto& line : parser.get_lines()) {
+ std::cout << "line size:\t" << line.value_count() << std::endl;
+ std::cout << "values:\t\t" << line << std::endl;
+ }
+ return EXIT_SUCCESS;
+}
+
+int print_v2script_simple(const std::string_view path) {
+ auto parser = ovdl::v2script::Parser::from_file(path);
if (parser.has_error()) {
return 1;
}
@@ -28,6 +82,28 @@ int main(int argc, char** argv) {
}
std::cout << parser.get_file_node() << std::endl;
+ return EXIT_SUCCESS;
+}
+
+int main(int argc, char** argv) {
+ switch (argc) {
+ case 2:
+ return print_v2script_simple(argv[1]);
+ case 4:
+ if (insenitive_trim_eq(argv[1], "csv") && insenitive_trim_eq(argv[2], "utf"))
+ return print_csv<ovdl::csv::EncodingType::Utf8>(argv[3]);
+ goto default_jump;
+ case 3:
+ if (insenitive_trim_eq(argv[1], "csv"))
+ return print_csv<ovdl::csv::EncodingType::Windows1252>(argv[2]);
+ [[fallthrough]];
+ default:
+ default_jump:
+ std::fprintf(stderr, "usage: %s <filename>\n", argv[0]);
+ std::fprintf(stderr, "usage: %s csv <filename>\n", argv[0]);
+ std::fprintf(stderr, "usage: %s csv utf <filename>", argv[0]);
+ return EXIT_FAILURE;
+ }
return 0;
} \ No newline at end of file