poaflocParser Of Arguments For Lines Of Commands |
git clone git://git.dimitrijedobrota.com/poafloc.git |
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING |
poafloc.hpp (3263B)
0 #ifndef POAFLOC_POAFLOC_HPP 1 #define POAFLOC_POAFLOC_HPP 2 3 #include <array> 4 #include <cstdarg> 5 #include <memory> 6 #include <string> 7 #include <unordered_map> 8 #include <vector> 9 10 #include "poafloc.h" 11 12 namespace poafloc { 13 14 using option_t = poafloc_option_t; 15 using arg_t = poafloc_arg_t; 16 17 int parse(const arg_t* argp, 18 int argc, 19 char* argv[], 20 unsigned flags, 21 void* input) noexcept; 22 23 void usage(const Parser* parser); 24 void help(const Parser* parser, FILE* stream, unsigned flags); 25 26 void failure(const Parser* parser, 27 int status, 28 int errnum, 29 const char* fmt, 30 va_list args); 31 32 void failure( 33 const Parser* parser, int status, int errnum, const char* fmt, ...); 34 35 struct Parser 36 { 37 Parser(const Parser&) = delete; 38 Parser(Parser&&) = delete; 39 Parser& operator=(const Parser&) = delete; 40 Parser& operator=(Parser&&) = delete; 41 42 void* input() const { return m_input; } 43 unsigned flags() const { return m_flags; } 44 const std::string& name() const { return m_name; } 45 46 private: 47 friend void help(const Parser* parser, FILE* stream, unsigned flags); 48 friend int parse(const arg_t* argp, 49 int argc, 50 char** argv, 51 unsigned flags, 52 void* input) noexcept; 53 54 Parser(const arg_t* argp, unsigned flags, void* input); 55 ~Parser() noexcept = default; 56 57 int parse(std::size_t argc, char* argv[]); 58 59 int handle_unknown(bool shrt, const char* argv); 60 int handle_missing(bool shrt, const char* argv); 61 int handle_excess(const char* argv); 62 63 void print_other_usages(FILE* stream) const; 64 void help(FILE* stream) const; 65 void usage(FILE* stream) const; 66 void see(FILE* stream) const; 67 68 static std::string basename(const std::string& name); 69 70 struct help_entry_t 71 { 72 help_entry_t(const char* arg, 73 const char* message, 74 int group, 75 bool opt = false) 76 : m_arg(arg) 77 , m_message(message) 78 , m_group(group) 79 , m_opt(opt) 80 { 81 } 82 83 void push(char shrt) { m_opt_short.push_back(shrt); } 84 void push(const char* lng) { m_opt_long.push_back(lng); } 85 86 bool operator<(const help_entry_t& rhs) const; 87 88 const char* m_arg; 89 const char* m_message; 90 int m_group; 91 bool m_opt; 92 93 std::vector<const char*> m_opt_long; 94 std::vector<char> m_opt_short; 95 }; 96 97 class trie_t 98 { 99 public: 100 trie_t() = default; 101 ~trie_t() noexcept = default; 102 103 trie_t(const trie_t&) = delete; 104 trie_t(trie_t&&) = delete; 105 trie_t& operator=(const trie_t&) = delete; 106 trie_t& operator=(trie_t&&) = delete; 107 108 bool insert(const std::string& option, int key); 109 int get(const std::string& option) const; 110 111 private: 112 static bool is_valid(const std::string& option); 113 114 std::array<std::unique_ptr<trie_t>, 26> m_children; 115 int m_count = 0; 116 int m_key = 0; 117 bool m_terminal = false; 118 }; 119 120 const arg_t* m_argp; 121 unsigned m_flags; 122 void* m_input; 123 124 std::string m_name; 125 126 std::unordered_map<int, const option_t*> m_options; 127 std::vector<help_entry_t> m_help_entries; 128 trie_t m_trie; 129 }; 130 131 } // namespace poafloc 132 133 #endif