diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..f89ba5b --- /dev/null +++ b/.clang-format @@ -0,0 +1,9 @@ +BasedOnStyle: Chromium +IndentWidth: 2 +ColumnLimit: 160 +SpaceAfterCStyleCast: false +UseTab: Never +AllowShortIfStatementsOnASingleLine: false +AlignTrailingComments: false +SpacesBeforeTrailingComments: 1 +AlignConsecutiveMacros: Consecutive \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..fea4a10 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.22) +project(flags-cpp) + +set(CMAKE_CXX_COMPILER clang++) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20 -Wall -Wextra -Werror") + +set(CMAKE_EXPORT_COMPILE_COMMANDS true) + +file(GLOB_RECURSE SOURCES "${CMAKE_SOURCE_DIR}/src/flags-cpp/*.cpp") +add_library(flags-cpp OBJECT ${SOURCES}) +set_target_properties(flags-cpp PROPERTIES POSITION_INDEPENDENT_CODE 1) +target_include_directories(flags-cpp PUBLIC "${CMAKE_SOURCE_DIR}/inc") + +add_library(flags-cpp-static STATIC $) +set_target_properties(flags-cpp-static PROPERTIES OUTPUT_NAME flags-cpp) +target_include_directories(flags-cpp-static PUBLIC "${CMAKE_SOURCE_DIR}/inc") + +add_library(flags-cpp-shared SHARED $) +set_target_properties(flags-cpp-shared PROPERTIES OUTPUT_NAME flags-cpp) +target_include_directories(flags-cpp-shared PUBLIC "${CMAKE_SOURCE_DIR}/inc") + +add_executable(example "${CMAKE_SOURCE_DIR}/src/main.cpp") +target_link_libraries(example flags-cpp-shared) diff --git a/Readme.md b/Readme.md index 129885d..0f584ee 100644 --- a/Readme.md +++ b/Readme.md @@ -4,7 +4,7 @@ This project aims to recreate the functionality of the `flag` package from Golan ## Usage ### Create a parser ```c++ -#include "flags.h" +#include Parser parser; or diff --git a/flags.h b/inc/flags-cpp/flags-cpp.h similarity index 99% rename from flags.h rename to inc/flags-cpp/flags-cpp.h index c5c1574..b5506d4 100644 --- a/flags.h +++ b/inc/flags-cpp/flags-cpp.h @@ -4,6 +4,7 @@ #include #include #include +#include #include namespace Flags { diff --git a/flags.cpp b/src/flags-cpp/flags-cpp.cpp similarity index 93% rename from flags.cpp rename to src/flags-cpp/flags-cpp.cpp index 9233ec0..197c922 100644 --- a/flags.cpp +++ b/src/flags-cpp/flags-cpp.cpp @@ -1,4 +1,4 @@ -#include "flags.h" +#include #include #include @@ -136,13 +136,15 @@ bool Parser::parse(int argc, char** argv) { for (size_t i = 1; i < args.size() - 1; i++) { const std::string& arg = args[i]; if (starts_with(arg, prefix) && arg.size() > prefix.size()) { - flags[arg.substr(prefix.size())]->parse(args[i + 1]); + if (flags.contains(arg.substr(prefix.size()))) + flags[arg.substr(prefix.size())]->parse(args[i + 1]); } } // check for the last argument if (starts_with(args[args.size() - 1], prefix) && args[args.size() - 1].size() > prefix.size()) { - flags[args[args.size() - 1].substr(prefix.size())]->parse(""); + if (flags.contains(args.back().substr(prefix.size()))) + flags[args.back().substr(prefix.size())]->parse(""); } return get_found() == flags.size(); diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..b931d87 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,19 @@ +#include +#include + +using namespace Flags; + +int main(int argc, char **argv) { + Parser parser; + + auto x = parser.add("myStr", "some description", true, + "default value string"); + auto y = parser.add("myInt", "some description", true, 13); + + if (!parser.parse(argc, argv)) + parser.help(); + + std::cout << *x << std::endl << *y << std::endl; + + return 0; +} \ No newline at end of file