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