]> git.donarmstrong.com Git - lilypond.git/blob - flower/include/getopt-long.hh
Release: bump Welcome versions.
[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   string to_string () const;
24   string str_for_help () const;
25   //   NO constructor!
26
27   static int compare (Long_option_init const &, Long_option_init const &);
28   static 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