-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathDDGetoptLongParser.h
205 lines (185 loc) · 6.36 KB
/
DDGetoptLongParser.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/*
* Copyright (c) 2007-2008 Dave Dribin
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#import <Cocoa/Cocoa.h>
#import <getopt.h>
#import <libgen.h>
/* Function pointer to getopt_long() or getopt_long_only() */
typedef int (*DDGetoptFunction)(int, char * const *, const char *,
const struct option *, int *);
/**
* Argument options.
* @ingroup constants
*/
typedef enum DDGetoptArgumentOptions
{
/** Option takes no argument */
DDGetoptNoArgument = no_argument,
/** Option takes an optional argument */
DDGetoptOptionalArgument = optional_argument,
/** Option takes a mandatory argument */
DDGetoptRequiredArgument = required_argument,
} DDGetoptArgumentOptions;
/**
* Structure to use for option tables.
*/
typedef struct
{
/**
* The long option without the double dash ("--"). This is required.
*/
NSString * longOption;
/** A single character for the short option. Maybe be null or 0. */
int shortOption;
/** Argument options for this option. */
DDGetoptArgumentOptions argumentOptions;
} DDGetoptOption;
/**
* A command line option parser implemented using <a
* href="http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/getopt_long.3.html">getopt_long(3)</a>.
* In order to simplify usage, this class drives the option parsing by
* running the while loop. When an option is found, <a
* href="http://developer.apple.com/documentation/Cocoa/Conceptual/KeyValueCoding/index.html">Key-Value
* Coding</a> (KVC) is used to set a key on the target class. Unless
* overridden, the key to use is the same as the long option. The
* long option is converted to camel case, if needed. For example the
* option "long-option" has a default key of "longOption".
*
* @sa DDGetoptOption
*/
@interface DDGetoptLongParser : NSObject
{
@private
id _target;
int _nextShortOption;
NSMutableString * _optionString;
NSMutableDictionary * _optionInfoMap;
NSMutableData * _optionsData;
int _currentOption;
NSMutableArray * _utf8Data;
DDGetoptFunction _getoptFunction;
}
/**
* Create an autoreleased option parser with the given target.
*
* @param target Object that receives target messages.
*/
+ (DDGetoptLongParser *)optionsWithTarget:(id)target;
/**
* Create an option parser with the given target.
*
* @param target Object that receives target messages.
*/
- (id)initWithTarget:(id)target;
/**
* Returns the target object.
*
* @return The target object
*/
- (id)target;
/**
* Sets the target object.
*
* @param target The target object
*/
- (void)setTarget:(id)target;
/**
* If set to YES, parses options with getopt_long_only() instead of
* getopt_long().
*
* @param getoptLongOnly YES means parse with getopt_long_only()
*/
- (void)setGetoptLongOnly:(BOOL)getoptLongOnly;
/**
* Add all options from a null terminated option table. The final
* entry in the table should contain a nil long option and a null
* short option.
*
* @param optionTable An array of DDGetoptOption.
*/
- (void)addOptionsFromTable:(DDGetoptOption *)optionTable;
/**
* Add an option with both long and short options. The long option
* should not contain the double dash ("--"). If you do not want a
* short option, set it to the zero or the null character.
*
* @param longOption The long option
* @param shortOption The short option
* @param key The key use when the option is parsed
* @param argumentOptions Options for this options argument
*/
- (void)addLongOption:(NSString *)longOption
shortOption:(char)shortOption
key:(NSString *)key
argumentOptions:(DDGetoptArgumentOptions)argumentOptions;
/**
* Add an option with no short option.
*
* @param longOption The long option
* @param key The key use when the option is parsed
* @param argumentOptions Options for this options argument
*/
- (void)addLongOption:(NSString *)longOption
key:(NSString *)key
argumentOptions:(DDGetoptArgumentOptions)argumentOptions;
/**
* Parse the options using the arguments and command name from
* NSProcessInfo.
*
* @return Arguments left over after option parsing or <code>nil</code>
*/
- (NSArray *)parseOptions;
/**
* Parse the options on an array of arguments.
*
* @param arguments Array of command line arguments
* @param command Command name to use for error messages.
* @return Arguments left over after option processing or <code>nil</code>
*/
- (NSArray *)parseOptionsWithArguments:(NSArray *)arguments
command:(NSString *)command;
@end
/**
* DDGetoptLong delegate methods.
*/
@interface NSObject (DDGetoptLong)
/**
* Called if an option that is not recognized is found. If this is
* not implemented, then a default error message is printed. For long
* options, the option includes the two dashes. For short options, the
* option is just a single character.
*
* @param option The option that was not recognized.
*/
- (void)optionIsNotRecognized:(NSString *)option;
/**
* Called if an argument was not supplied for option that is required
* to have an argument. If this is not implemented then a defeault
* error message is printed. For long options, the option includes
* the two dashes. For short options, the option is just a single
* character.
*
* @param option The option that had the missiong argument.
*/
- (void)optionIsMissingArgument:(NSString *)option;
@end