1 #ifndef GETOPT_LONG_HH 2 #define GETOPT_LONG_HH 3 4 #include <cstdio> 5 6 #include "std-string.hh" 7 8 /** 9 a struct this for initialising the commandline options. 10 */ 11 struct Long_option_init 12 { 13 char const *take_arg_str0_; 14 char const *longname_str0_; 15 16 /* 17 = 0: don't take short version. 18 */ 19 char shortname_char_; 20 21 char const *help_str0_; 22 23 std::string to_string () const; 24 std::string str_for_help () const; 25 // NO constructor! 26 27 static int compare (Long_option_init const &, Long_option_init const &); 28 static std::string table_string (Long_option_init *); 29 }; 30 31 /** C++ for version of long_getopt. For processing GNU style command 32 line arguments. No pointer (return values, arguments) contents are 33 copied. 34 35 TODO: handle 36 command - , and command -- 37 38 argument reordering 39 */ 40 class Getopt_long 41 { 42 43 /// the option info. 44 const Long_option_init *option_a_; 45 int table_len_; 46 47 /// if doing short option, arg_value_char_a_a_[optind][optindind] is processed next. 48 int argument_index_; 49 50 /// the option found 51 const Long_option_init *found_option_; 52 53 public: 54 /** errorcodes: no error, argument expected, no argument expected, 55 unknown option, illegal argument (eg. int expected). */ 56 enum Errorcod { E_NOERROR = 0, E_ARGEXPECT, E_NOARGEXPECT, E_UNKNOWNOPTION, 57 E_ILLEGALARG 58 }; 59 60 /// argument. Set to 0 if not present 61 char const *optional_argument_str0_; 62 63 /// current error status 64 Errorcod error_; 65 66 /// arg_value_char_a_a_[array_index_] will be processed next. 67 int array_index_; 68 69 /// the arguments 70 char **arg_value_char_a_a_; 71 72 /// the arg. count 73 int argument_count_; 74 75 FILE *error_out_; 76 77 public: 78 /// get ready for processing next error. 79 void next (); 80 const Long_option_init *parselong (); 81 const Long_option_init *parseshort (); 82 void OK () const; 83 bool ok () const; 84 85 /// report an error and abort 86 void report (Errorcod c); 87 88 /// return an integer (with err. detect) 89 long get_argument_index (); 90 91 /** 92 What to do with errors. 93 report messages on #*os#, and abort. 94 if #os# is null, then do not report nor abort, just set #error# 95 */ 96 97 void seterror (FILE *os); 98 99 /// construct: pass arguments and option info. 100 Getopt_long (int c, char **v, Long_option_init *lo); 101 102 /** get the next option. 103 @return pointer to next option found. 104 0 if error occurred, or next argument is no option. 105 */ 106 const Long_option_init *operator () (); 107 108 char const *current_arg (); 109 char const *get_next_arg (); 110 }; 111 112 #endif // GETOPT_LONG_HH 113