perf probe: Remove xzalloc() from util/probe-{event, finder}.c
[safe/jmp/linux-2.6] / tools / perf / util / parse-options.h
1 #ifndef __PERF_PARSE_OPTIONS_H
2 #define __PERF_PARSE_OPTIONS_H
3
4 enum parse_opt_type {
5         /* special types */
6         OPTION_END,
7         OPTION_ARGUMENT,
8         OPTION_GROUP,
9         /* options with no arguments */
10         OPTION_BIT,
11         OPTION_BOOLEAN,
12         OPTION_INCR,
13         OPTION_SET_INT,
14         OPTION_SET_PTR,
15         /* options with arguments (usually) */
16         OPTION_STRING,
17         OPTION_INTEGER,
18         OPTION_LONG,
19         OPTION_CALLBACK,
20 };
21
22 enum parse_opt_flags {
23         PARSE_OPT_KEEP_DASHDASH = 1,
24         PARSE_OPT_STOP_AT_NON_OPTION = 2,
25         PARSE_OPT_KEEP_ARGV0 = 4,
26         PARSE_OPT_KEEP_UNKNOWN = 8,
27         PARSE_OPT_NO_INTERNAL_HELP = 16,
28 };
29
30 enum parse_opt_option_flags {
31         PARSE_OPT_OPTARG  = 1,
32         PARSE_OPT_NOARG   = 2,
33         PARSE_OPT_NONEG   = 4,
34         PARSE_OPT_HIDDEN  = 8,
35         PARSE_OPT_LASTARG_DEFAULT = 16,
36 };
37
38 struct option;
39 typedef int parse_opt_cb(const struct option *, const char *arg, int unset);
40
41 /*
42  * `type`::
43  *   holds the type of the option, you must have an OPTION_END last in your
44  *   array.
45  *
46  * `short_name`::
47  *   the character to use as a short option name, '\0' if none.
48  *
49  * `long_name`::
50  *   the long option name, without the leading dashes, NULL if none.
51  *
52  * `value`::
53  *   stores pointers to the values to be filled.
54  *
55  * `argh`::
56  *   token to explain the kind of argument this option wants. Keep it
57  *   homogenous across the repository.
58  *
59  * `help`::
60  *   the short help associated to what the option does.
61  *   Must never be NULL (except for OPTION_END).
62  *   OPTION_GROUP uses this pointer to store the group header.
63  *
64  * `flags`::
65  *   mask of parse_opt_option_flags.
66  *   PARSE_OPT_OPTARG: says that the argument is optionnal (not for BOOLEANs)
67  *   PARSE_OPT_NOARG: says that this option takes no argument, for CALLBACKs
68  *   PARSE_OPT_NONEG: says that this option cannot be negated
69  *   PARSE_OPT_HIDDEN this option is skipped in the default usage, showed in
70  *                    the long one.
71  *
72  * `callback`::
73  *   pointer to the callback to use for OPTION_CALLBACK.
74  *
75  * `defval`::
76  *   default value to fill (*->value) with for PARSE_OPT_OPTARG.
77  *   OPTION_{BIT,SET_INT,SET_PTR} store the {mask,integer,pointer} to put in
78  *   the value when met.
79  *   CALLBACKS can use it like they want.
80  */
81 struct option {
82         enum parse_opt_type type;
83         int short_name;
84         const char *long_name;
85         void *value;
86         const char *argh;
87         const char *help;
88
89         int flags;
90         parse_opt_cb *callback;
91         intptr_t defval;
92 };
93
94 #define OPT_END()                   { .type = OPTION_END }
95 #define OPT_ARGUMENT(l, h)          { .type = OPTION_ARGUMENT, .long_name = (l), .help = (h) }
96 #define OPT_GROUP(h)                { .type = OPTION_GROUP, .help = (h) }
97 #define OPT_BIT(s, l, v, h, b)      { .type = OPTION_BIT, .short_name = (s), .long_name = (l), .value = (v), .help = (h), .defval = (b) }
98 #define OPT_BOOLEAN(s, l, v, h)     { .type = OPTION_BOOLEAN, .short_name = (s), .long_name = (l), .value = (v), .help = (h) }
99 #define OPT_INCR(s, l, v, h)        { .type = OPTION_INCR, .short_name = (s), .long_name = (l), .value = (v), .help = (h) }
100 #define OPT_SET_INT(s, l, v, h, i)  { .type = OPTION_SET_INT, .short_name = (s), .long_name = (l), .value = (v), .help = (h), .defval = (i) }
101 #define OPT_SET_PTR(s, l, v, h, p)  { .type = OPTION_SET_PTR, .short_name = (s), .long_name = (l), .value = (v), .help = (h), .defval = (p) }
102 #define OPT_INTEGER(s, l, v, h)     { .type = OPTION_INTEGER, .short_name = (s), .long_name = (l), .value = (v), .help = (h) }
103 #define OPT_LONG(s, l, v, h)        { .type = OPTION_LONG, .short_name = (s), .long_name = (l), .value = (v), .help = (h) }
104 #define OPT_STRING(s, l, v, a, h)   { .type = OPTION_STRING,  .short_name = (s), .long_name = (l), .value = (v), (a), .help = (h) }
105 #define OPT_DATE(s, l, v, h) \
106         { .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), .argh = "time", .help = (h), .callback = parse_opt_approxidate_cb }
107 #define OPT_CALLBACK(s, l, v, a, h, f) \
108         { .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), (a), .help = (h), .callback = (f) }
109 #define OPT_CALLBACK_NOOPT(s, l, v, a, h, f) \
110         { .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), (a), .help = (h), .callback = (f), .flags = PARSE_OPT_NOARG }
111 #define OPT_CALLBACK_DEFAULT(s, l, v, a, h, f, d) \
112         { .type = OPTION_CALLBACK, .short_name = (s), .long_name = (l), .value = (v), (a), .help = (h), .callback = (f), .defval = (intptr_t)d, .flags = PARSE_OPT_LASTARG_DEFAULT }
113
114 /* parse_options() will filter out the processed options and leave the
115  * non-option argments in argv[].
116  * Returns the number of arguments left in argv[].
117  */
118 extern int parse_options(int argc, const char **argv,
119                          const struct option *options,
120                          const char * const usagestr[], int flags);
121
122 extern NORETURN void usage_with_options(const char * const *usagestr,
123                                         const struct option *options);
124
125 /*----- incremantal advanced APIs -----*/
126
127 enum {
128         PARSE_OPT_HELP = -1,
129         PARSE_OPT_DONE,
130         PARSE_OPT_UNKNOWN,
131 };
132
133 /*
134  * It's okay for the caller to consume argv/argc in the usual way.
135  * Other fields of that structure are private to parse-options and should not
136  * be modified in any way.
137  */
138 struct parse_opt_ctx_t {
139         const char **argv;
140         const char **out;
141         int argc, cpidx;
142         const char *opt;
143         int flags;
144 };
145
146 extern int parse_options_usage(const char * const *usagestr,
147                                const struct option *opts);
148
149 extern void parse_options_start(struct parse_opt_ctx_t *ctx,
150                                 int argc, const char **argv, int flags);
151
152 extern int parse_options_step(struct parse_opt_ctx_t *ctx,
153                               const struct option *options,
154                               const char * const usagestr[]);
155
156 extern int parse_options_end(struct parse_opt_ctx_t *ctx);
157
158
159 /*----- some often used options -----*/
160 extern int parse_opt_abbrev_cb(const struct option *, const char *, int);
161 extern int parse_opt_approxidate_cb(const struct option *, const char *, int);
162 extern int parse_opt_verbosity_cb(const struct option *, const char *, int);
163
164 #define OPT__VERBOSE(var)  OPT_BOOLEAN('v', "verbose", (var), "be verbose")
165 #define OPT__QUIET(var)    OPT_BOOLEAN('q', "quiet",   (var), "be quiet")
166 #define OPT__VERBOSITY(var) \
167         { OPTION_CALLBACK, 'v', "verbose", (var), NULL, "be more verbose", \
168           PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }, \
169         { OPTION_CALLBACK, 'q', "quiet", (var), NULL, "be more quiet", \
170           PARSE_OPT_NOARG, &parse_opt_verbosity_cb, 0 }
171 #define OPT__DRY_RUN(var)  OPT_BOOLEAN('n', "dry-run", (var), "dry run")
172 #define OPT__ABBREV(var)  \
173         { OPTION_CALLBACK, 0, "abbrev", (var), "n", \
174           "use <n> digits to display SHA-1s", \
175           PARSE_OPT_OPTARG, &parse_opt_abbrev_cb, 0 }
176
177 extern const char *parse_options_fix_filename(const char *prefix, const char *file);
178
179 #endif /* __PERF_PARSE_OPTIONS_H */