]> git.donarmstrong.com Git - lilypond.git/blob - flower/include/getopt-long.hh
*** empty log message ***
[lilypond.git] / flower / include / getopt-long.hh
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   /// argument. Set to 0 if not present
60   char const *optional_argument_str0_;
61
62   /// current error status
63   Errorcod error_;
64
65   /// arg_value_char_a_a_[array_index_] will be processed next.
66   int array_index_;
67
68   /// the arguments
69   char **arg_value_char_a_a_;
70
71   /// the arg. count
72   int argument_count_;
73
74   FILE *error_out_;
75
76 public:
77   /// get ready for processing next error.
78   void next ();
79   const Long_option_init *parselong ();
80   const Long_option_init *parseshort ();
81   void OK () const;
82   bool ok () const;
83
84   /// report an error and abort
85   void report (Errorcod c);
86
87   /// return an integer (with err. detect)
88   long get_argument_index ();
89
90   /**
91      What to do with  errors.
92      report messages on  #*os#, and abort.
93      if #os# is null, then do not report nor abort, just set #error#
94   */
95
96   void seterror (FILE *os);
97
98   /// construct: pass arguments and option info.
99   Getopt_long (int c, char **v, Long_option_init *lo);
100
101   /**  get the next option.
102        @return pointer to next option found.
103        0 if error occurred, or next argument is no option.
104   */
105   const Long_option_init *operator () ();
106
107   char const *current_arg ();
108   char const *get_next_arg ();
109 };
110
111 #endif // GETOPT_LONG_HH