stamen

Static Menu Generator
git clone git://git.dimitrijedobrota.com/stamen.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

commit 0ca7539acca2a05ac12c268598ee3cd1881515fc
parent d5a343ef60d087a9e9ed648a14478f491ffe5a56
author Dimitrije Dobrota <mail@dimitrijedobrota.com>
date Fri, 1 Dec 2023 22:42:12 +0000

Modernize the codebase using clang-tidy

Diffstat:
M CMakeLists.txt | + -
M demo/main.cpp | +++++ -----
M include/stamen.h | +++++++++++++++ ------------
M include/stamenc.h | + -
M src/generate.cpp | +++++ ---
M src/stamen.cpp | ++++ ---

6 files changed, 31 insertions(+), 25 deletions(-)


diff --git a/ CMakeLists.txt b/ CMakeLists.txt

@@ -3,7 +3,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) project( Stamen
VERSION 0.0.14
VERSION 0.0.15
DESCRIPTION "Static menu generator" LANGUAGES C CXX )

diff --git a/ demo/main.cpp b/ demo/main.cpp

@@ -7,30 +7,30 @@ // in order to use stamen::BuiltinDisplay const stamen_display_f stamen_display = stamen::builtinDisplay;
int operation1(void) {
int operation1() {
std::cout << "operation 1" << std::endl; std::cout << "Some operation is done" << std::endl; return 1; }
int operation2(void) {
int operation2() {
std::cout << "operation 2" << std::endl; std::cout << "Some other operation is done" << std::endl; return 1; }
int operation3(void) {
int operation3() {
std::cout << "operation 3" << std::endl; std::cout << "Yet another operation is done" << std::endl; return 1; }
int finish(void) {
int finish() {
std::cout << "finishing..." << std::endl; exit(0); }
int main(void) {
int main() {
stamen::menu_main(); return 0; }

diff --git a/ include/stamen.h b/ include/stamen.h

@@ -11,6 +11,7 @@ #include <string> #include <tuple> #include <unordered_map>
#include <utility>
#include <vector> namespace stamen {

@@ -21,11 +22,13 @@ class Menu { public: friend class Generator;
typedef stamen_callback_f callback_f;
typedef stamen_display_f display_f;
using callback_f = stamen_callback_f;
using display_f = stamen_display_f;
Menu(const Menu &) = delete;
Menu(Menu &&) = delete;
Menu &operator=(const Menu &) = delete;
Menu &operator=(Menu &&) = delete;
// Tag type dispatch Menu(private_ctor_t, const std::string &code, const std::string &prompt)

@@ -39,14 +42,14 @@ public: static void insert(const std::string &code, const callback_f callback); private:
Menu(const std::string &code, const std::string &prompt)
: code(code), title(prompt) {}
Menu(std::string code, std::string prompt)
: code(std::move(code)), title(std::move(prompt)) {}
Menu(const std::string &code, const callback_f callback) : code(code), title(code), callback(callback) {}
typedef std::unordered_map<std::string, Menu> lookup_t;
static lookup_t &getLookup(void) {
using lookup_t = std::unordered_map<std::string, Menu>;
static lookup_t &getLookup() {
static lookup_t lookup; return lookup; }

@@ -54,7 +57,7 @@ private: static void internal_print(const std::string &entry, const int depth); static const Menu *getMenu(const std::string &code) {
static lookup_t &lookup = getLookup();
const static lookup_t &lookup = getLookup();
const auto it = lookup.find(code); if (it == lookup.end()) return nullptr; return &it->second;

@@ -63,17 +66,17 @@ private: const std::string code, title; const callback_f callback = nullptr;
typedef std::pair<std::string, std::string> lookup_item_t;
using lookup_item_t = std::pair<std::string, std::string>;
std::vector<lookup_item_t> items; }; inline void Menu::read(const std::string &s) { std::string line, delim, code, prompt; std::fstream fs(s);
char tmp;
char tmp = 0;
lookup_t &lookup = getLookup();
lookup_t::iterator last = lookup.end();
auto last = lookup.end();
while (std::getline(fs, line)) { if (line.empty()) continue; std::istringstream ss(line);

@@ -85,7 +88,7 @@ inline void Menu::read(const std::string &s) { std::forward_as_tuple(private_ctor_t{}, code, prompt)); last = iter; } else {
last->second.items.push_back({code, prompt});
last->second.items.emplace_back(code, prompt);
} } }

@@ -110,7 +113,7 @@ inline void Menu::internal_print(const std::string &code, const int depth) { } }
int builtinDisplay(const char *title, const ::item_t items[], int size);
int builtinDisplay(const char *title, const ::item_t itemv[], int size);
} // namespace stamen

diff --git a/ include/stamenc.h b/ include/stamenc.h

@@ -12,6 +12,6 @@ EXTERNC void stamen_read(const char *file); EXTERNC void stamen_print(const char *entry); EXTERNC void stamen_insert(const char *code, stamen_callback_f callback);
EXTERNC int stamen_builtin_display(const char *title, const item_t items[], int size);
EXTERNC int stamen_builtin_display(const char *title, const item_t itemv[], int size);
#endif

diff --git a/ src/generate.cpp b/ src/generate.cpp

@@ -8,7 +8,7 @@ namespace stamen { class Generator { public: class EGenerate : std::exception {
virtual const char *what() const noexcept override {
[[nodiscard]] const char *what() const noexcept override {
return "Trying to access unknown code"; } };

@@ -56,14 +56,16 @@ public: } // namespace stamen int main(const int argc, const char *argv[]) {
const auto args = std::span(argv, size_t(argc));
if (argc != 2 && argc != 3) { std::cout << "please enter exaclty one config file" << std::endl; return 1; }
const bool cpp = argc == 2 || std::string(argv[2]) == "cpp";
const bool cpp = argc == 2 || std::string(args[2]) == "cpp";
std::string path = argv[1];
std::string path = args[1];
Menu::read(path); std::string::size_type pos = path.rfind('.');

diff --git a/ src/stamen.cpp b/ src/stamen.cpp

@@ -7,9 +7,10 @@ namespace stamen {
int builtinDisplay(const char *title, const ::item_t items[], int size) {
const int digits = std::log10(size) + 1;
int choice;
int builtinDisplay(const char *title, const ::item_t itemv[], int size) {
const size_t digits = size_t(std::log10(size)) + 1;
const auto items = std::span(itemv, size_t(size));
int choice = 0;
while (true) { std::cout << std::format("{}:\n", title);