stamenStatic Menu Generator |
git clone git://git.dimitrijedobrota.com/stamen.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING | |
commit | 12c5ce88ce059481256dc028f9c672c1861655ca |
parent | e665a6f2bca782f688527dcf8232eeff412652a8 |
author | Dimitrije Dobrota <mail@dimitrijedobrota.com> |
date | Thu, 13 Jun 2024 23:00:28 +0200 |
Use args library in generator for better usability
Diffstat:M | CMakeLists.txt | | | ++ |
M | demo/CMakeLists.txt | | | ++-- |
M | src/CMakeLists.txt | | | +- |
M | src/generate.cpp | | | +++++++++++++++++++++++++++++++++++++++++++++++++++---------------- |
4 files changed, 56 insertions(+), 19 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
@@ -44,6 +44,8 @@ foreach(p LIB BIN INCLUDE CMAKE)
unset(_path)
endforeach()
find_package(args 1 CONFIG REQUIRED)
add_subdirectory(src)
add_subdirectory(demo)
diff --git a/demo/CMakeLists.txt b/demo/CMakeLists.txt
@@ -4,7 +4,7 @@ configure_file(demo_menu.conf ${GENERATE_OUT}/demo_menu.conf COPYONLY)
add_custom_command(
OUTPUT ${GENERATE_OUT}/demo_menu.hpp ${GENERATE_OUT}/demo_menu.cpp
COMMAND ${GENERATE_OUT}/stamen-generate ${GENERATE_OUT}/demo_menu.conf
COMMAND ${GENERATE_OUT}/stamen-generate --cpp ${GENERATE_OUT}/demo_menu.conf
DEPENDS demo_menu.conf stamen-generate
COMMENT "Generating menu files"
)
@@ -23,7 +23,7 @@ set_target_properties(demo PROPERTIES
add_custom_command(
OUTPUT ${GENERATE_OUT}/demo_menu.h ${GENERATE_OUT}/demo_menu.c
COMMAND ${GENERATE_OUT}/stamen-generate ${GENERATE_OUT}/demo_menu.conf c
COMMAND ${GENERATE_OUT}/stamen-generate --c ${GENERATE_OUT}/demo_menu.conf
DEPENDS demo_menu.conf stamen-generate
COMMENT "Generating cmenu files"
)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
@@ -13,7 +13,7 @@ set_target_properties(stamen PROPERTIES
)
add_executable(stamen-generate generate.cpp)
target_link_libraries(stamen-generate PRIVATE stamen)
target_link_libraries(stamen-generate PRIVATE args stamen)
target_include_directories(stamen-generate PRIVATE ../include)
set_target_properties(stamen-generate PROPERTIES
diff --git a/src/generate.cpp b/src/generate.cpp
@@ -1,3 +1,5 @@
#include <args/args.hpp>
#include "menu.h"
#include "stamen.h"
@@ -53,31 +55,64 @@ class Generator {
}
}
};
} // namespace stamen
using namespace stamen;
int main(const int argc, const char *argv[]) {
const auto args = std::span(argv, size_t(argc));
struct arguments_t {
std::string config;
bool cpp = false;
};
if (argc != 2 && argc != 3) {
std::cout << argv[0] << " config_file [c/cpp]" << std::endl;
return 1;
int parse_opt(int key, const char *arg, args::Parser *parser) {
auto arguments = (arguments_t *)parser->input();
switch (key) {
case 666: arguments->cpp = false; break;
case 777: arguments->cpp = true; break;
case args::ARG:
if (!arguments->config.empty()) {
args::failure(parser, 1, 0, "Too many arguments");
}
arguments->config = arg;
break;
case args::NO_ARGS:
args::failure(parser, 0, 0, "Missing an argument");
args::help(parser, stderr, args::STD_USAGE);
}
return 0;
}
static const args::option_t options[]{
{0, 0, 0, 0, "Output mode", 1},
{"c", 666, 0, 0, "Generate files for C"},
{"cpp", 777, 0, 0, "Generate files for C++"},
{0, 0, 0, 0, "Informational Options", -1},
{0},
};
const bool cpp = argc == 2 || std::string(args[2]) == "cpp";
static const args::argp_t argp{
options,
parse_opt,
"config_file",
"",
};
int main(int argc, char *argv[]) {
arguments_t arguments;
if (args::parse(&argp, argc, argv, 0, &arguments)) {
std::cerr << "There was an error while parsing arguments";
return 0;
}
std::string path = args[1];
Menu::read(path);
const auto &config = arguments.config;
stamen::Menu::read(config);
std::string::size_type pos = path.rfind('.');
std::string base = pos != std::string::npos ? path.substr(0, pos) : path;
std::string ext = cpp ? "pp" : "";
std::string::size_type pos = arguments.config.rfind('.');
std::string base =
pos != std::string::npos ? config.substr(0, pos) : config;
std::string ext = arguments.cpp ? "pp" : "";
std::ofstream source(base + ".c" + ext), include(base + ".h" + ext);
Generator::generateSource(source, cpp);
Generator::generateInclude(include, cpp);
stamen::Generator::generateSource(source, arguments.cpp);
stamen::Generator::generateInclude(include, arguments.cpp);
return 0;
}