From aa49e41a80d322575553598fb6f299f8e53b8e4a Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Mon, 10 May 2021 14:32:47 +0900 Subject: [PATCH] Impl arg parsing --- cpp_impl/src/argparse.cpp | 62 ++++++++++++++++++++++++++++++++++++++- cpp_impl/src/argparse.hpp | 7 ++++- cpp_impl/src/main.cpp | 8 +++++ 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/cpp_impl/src/argparse.cpp b/cpp_impl/src/argparse.cpp index aa6dbc7..611ab24 100644 --- a/cpp_impl/src/argparse.cpp +++ b/cpp_impl/src/argparse.cpp @@ -1,7 +1,67 @@ #include "argparse.hpp" -std::unordered_map ArgParse::parseArgs(int argc, char **argv) { +#include +#include + +std::unordered_map ArgParse::parseArgs( + int argc, + char **argv, + const std::vector &simpleArgs, + const std::vector &pairedArgs) { std::unordered_map mapping; + --argc; ++argv; + std::string temp; + bool mappingFound; + while(argc > 0) { + mappingFound = false; + for(const auto &s : simpleArgs) { + if(s.size() == 1) { + temp = std::string("-") + s; + } else { + temp = std::string("--") + s; + } + if(std::strcmp(temp.c_str(), argv[0]) == 0) { + mapping.insert({s, ""}); + mappingFound = true; + break; + } + } + if(mappingFound) { + --argc; ++argv; + continue; + } + for(const auto &s : pairedArgs) { + if(s.size() == 1) { + temp = std::string("-") + s; + } else { + temp = std::string("--") + s; + } + if(std::strncmp(temp.c_str(), argv[0], temp.size()) == 0) { + std::string arg; + if(argv[0][temp.size()] == '=') { + arg = argv[0] + temp.size() + 1; + } else { + if(argc > 1) { + --argc; + ++argv; + arg = argv[0]; + } else { + throw std::invalid_argument("Paired arg missing pair"); + } + } + mapping.insert({s, arg}); + mappingFound = true; + break; + } + } + + if(!mappingFound) { + throw std::invalid_argument("Got invalid arg"); + } + + --argc; ++argv; + } + return mapping; } diff --git a/cpp_impl/src/argparse.hpp b/cpp_impl/src/argparse.hpp index 0fb0987..485778d 100644 --- a/cpp_impl/src/argparse.hpp +++ b/cpp_impl/src/argparse.hpp @@ -3,9 +3,14 @@ #include #include +#include namespace ArgParse { - std::unordered_map parseArgs(int argc, char **argv); + std::unordered_map parseArgs( + int argc, + char **argv, + const std::vector &simpleArgs, + const std::vector &pairedArgs); } // namespace ArgParse #endif diff --git a/cpp_impl/src/main.cpp b/cpp_impl/src/main.cpp index 95d6c1a..b36f90e 100644 --- a/cpp_impl/src/main.cpp +++ b/cpp_impl/src/main.cpp @@ -1,5 +1,13 @@ +#include +#include "argparse.hpp" int main(int argc, char **argv) { + auto parsed = ArgParse::parseArgs(argc, argv, {"a", "b"}, {"apple"}); + + for(auto pair : parsed) { + std::cout << pair.first << ", " << pair.second << std::endl; + } + return 0; }