g10: Prefer to available card keys for decryption.
[gnupg.git] / common / argparse.h
1 /* argparse.h - Argument parser for option handling.
2  * Copyright (C) 1997-2001, 2006-2008, 2013-2017 Werner Koch
3  * Copyright (C) 1998-2001, 2006-2008, 2012 Free Software Foundation, Inc.
4  * Copyright (C) 2015-2017 g10 Code GmbH
5  *
6  * This file is part of GnuPG.
7  *
8  * This file is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as
10  * published by the Free Software Foundation; either version 2.1 of
11  * the License, or (at your option) any later version.
12  *
13  * This file is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program; if not, see <https://www.gnu.org/licenses/>.
20  * SPDX-License-Identifier: LGPL-2.1+
21  */
22
23 #ifndef GNUPG_COMMON_ARGPARSE_H
24 #define GNUPG_COMMON_ARGPARSE_H
25
26 #include <stdio.h>
27
28 typedef struct
29 {
30   int  *argc;         /* Pointer to ARGC (value subject to change). */
31   char ***argv;       /* Pointer to ARGV (value subject to change). */
32   unsigned int flags; /* Global flags.  May be set prior to calling the
33                          parser.  The parser may change the value.  */
34   int err;            /* Print error description for last option.
35                          Either 0,  ARGPARSE_PRINT_WARNING or
36                          ARGPARSE_PRINT_ERROR.  */
37
38   int r_opt;          /* Returns option code. */
39   int r_type;         /* Returns type of option value.  */
40   union {
41     int   ret_int;
42     long  ret_long;
43     unsigned long ret_ulong;
44     char *ret_str;
45   } r;                /* Return values */
46
47   struct {
48     int idx;
49     int inarg;
50     int stopped;
51     const char *last;
52     void *aliases;
53     const void *cur_alias;
54     void *iio_list;
55   } internal;       /* Private - do not change. */
56 } ARGPARSE_ARGS;
57
58 typedef struct
59 {
60   int          short_opt;
61   const char  *long_opt;
62   unsigned int flags;
63   const char  *description; /* Optional option description. */
64 } ARGPARSE_OPTS;
65
66 /* Short options.  */
67 #define ARGPARSE_SHORTOPT_HELP 32768
68 #define ARGPARSE_SHORTOPT_VERSION 32769
69 #define ARGPARSE_SHORTOPT_WARRANTY 32770
70 #define ARGPARSE_SHORTOPT_DUMP_OPTIONS 32771
71
72
73 /* Global flags (ARGPARSE_ARGS).  */
74 #define ARGPARSE_FLAG_KEEP       1   /* Do not remove options form argv.     */
75 #define ARGPARSE_FLAG_ALL        2   /* Do not stop at last option but return
76                                         remaining args with R_OPT set to -1. */
77 #define ARGPARSE_FLAG_MIXED      4   /* Assume options and args are mixed.   */
78 #define ARGPARSE_FLAG_NOSTOP     8   /* Do not stop processing at "--".      */
79 #define ARGPARSE_FLAG_ARG0      16   /* Do not skip the first arg.           */
80 #define ARGPARSE_FLAG_ONEDASH   32   /* Allow long options with one dash.    */
81 #define ARGPARSE_FLAG_NOVERSION 64   /* No output for "--version".           */
82
83 #define ARGPARSE_FLAG_STOP_SEEN 256  /* Set to true if a "--" has been seen. */
84
85 /* Flags for each option (ARGPARSE_OPTS).  The type code may be
86    ORed with the OPT flags.  */
87 #define ARGPARSE_TYPE_NONE        0  /* Does not take an argument.        */
88 #define ARGPARSE_TYPE_INT         1  /* Takes an int argument.            */
89 #define ARGPARSE_TYPE_STRING      2  /* Takes a string argument.          */
90 #define ARGPARSE_TYPE_LONG        3  /* Takes a long argument.            */
91 #define ARGPARSE_TYPE_ULONG       4  /* Takes an unsigned long argument.  */
92 #define ARGPARSE_OPT_OPTIONAL (1<<3) /* Argument is optional.             */
93 #define ARGPARSE_OPT_PREFIX   (1<<4) /* Allow 0x etc. prefixed values.    */
94 #define ARGPARSE_OPT_IGNORE   (1<<6) /* Ignore command or option.         */
95 #define ARGPARSE_OPT_COMMAND  (1<<7) /* The argument is a command.        */
96
97 #define ARGPARSE_TYPE_MASK  7  /* Mask for the type values (internal).  */
98
99 /* A set of macros to make option definitions easier to read.  */
100 #define ARGPARSE_x(s,l,t,f,d) \
101      { (s), (l), ARGPARSE_TYPE_ ## t | (f), (d) }
102
103 #define ARGPARSE_s(s,l,t,d) \
104      { (s), (l), ARGPARSE_TYPE_ ## t, (d) }
105 #define ARGPARSE_s_n(s,l,d) \
106      { (s), (l), ARGPARSE_TYPE_NONE, (d) }
107 #define ARGPARSE_s_i(s,l,d) \
108      { (s), (l), ARGPARSE_TYPE_INT, (d) }
109 #define ARGPARSE_s_s(s,l,d) \
110      { (s), (l), ARGPARSE_TYPE_STRING, (d) }
111 #define ARGPARSE_s_l(s,l,d) \
112      { (s), (l), ARGPARSE_TYPE_LONG, (d) }
113 #define ARGPARSE_s_u(s,l,d) \
114      { (s), (l), ARGPARSE_TYPE_ULONG, (d) }
115
116 #define ARGPARSE_o(s,l,t,d) \
117      { (s), (l), (ARGPARSE_TYPE_ ## t  | ARGPARSE_OPT_OPTIONAL), (d) }
118 #define ARGPARSE_o_n(s,l,d) \
119      { (s), (l), (ARGPARSE_TYPE_NONE   | ARGPARSE_OPT_OPTIONAL), (d) }
120 #define ARGPARSE_o_i(s,l,d) \
121      { (s), (l), (ARGPARSE_TYPE_INT    | ARGPARSE_OPT_OPTIONAL), (d) }
122 #define ARGPARSE_o_s(s,l,d) \
123      { (s), (l), (ARGPARSE_TYPE_STRING | ARGPARSE_OPT_OPTIONAL), (d) }
124 #define ARGPARSE_o_l(s,l,d) \
125      { (s), (l), (ARGPARSE_TYPE_LONG   | ARGPARSE_OPT_OPTIONAL), (d) }
126 #define ARGPARSE_o_u(s,l,d) \
127      { (s), (l), (ARGPARSE_TYPE_ULONG  | ARGPARSE_OPT_OPTIONAL), (d) }
128
129 #define ARGPARSE_p(s,l,t,d) \
130      { (s), (l), (ARGPARSE_TYPE_ ## t  | ARGPARSE_OPT_PREFIX), (d) }
131 #define ARGPARSE_p_n(s,l,d) \
132      { (s), (l), (ARGPARSE_TYPE_NONE   | ARGPARSE_OPT_PREFIX), (d) }
133 #define ARGPARSE_p_i(s,l,d) \
134      { (s), (l), (ARGPARSE_TYPE_INT    | ARGPARSE_OPT_PREFIX), (d) }
135 #define ARGPARSE_p_s(s,l,d) \
136      { (s), (l), (ARGPARSE_TYPE_STRING | ARGPARSE_OPT_PREFIX), (d) }
137 #define ARGPARSE_p_l(s,l,d) \
138      { (s), (l), (ARGPARSE_TYPE_LONG   | ARGPARSE_OPT_PREFIX), (d) }
139 #define ARGPARSE_p_u(s,l,d) \
140      { (s), (l), (ARGPARSE_TYPE_ULONG  | ARGPARSE_OPT_PREFIX), (d) }
141
142 #define ARGPARSE_op(s,l,t,d) \
143      { (s), (l), (ARGPARSE_TYPE_ ## t \
144                   | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
145 #define ARGPARSE_op_n(s,l,d) \
146      { (s), (l), (ARGPARSE_TYPE_NONE \
147                   | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
148 #define ARGPARSE_op_i(s,l,d) \
149      { (s), (l), (ARGPARSE_TYPE_INT \
150                   | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
151 #define ARGPARSE_op_s(s,l,d) \
152      { (s), (l), (ARGPARSE_TYPE_STRING \
153                   | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
154 #define ARGPARSE_op_l(s,l,d) \
155      { (s), (l), (ARGPARSE_TYPE_LONG \
156                   | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
157 #define ARGPARSE_op_u(s,l,d) \
158      { (s), (l), (ARGPARSE_TYPE_ULONG \
159                   | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
160
161 #define ARGPARSE_c(s,l,d) \
162      { (s), (l), (ARGPARSE_TYPE_NONE | ARGPARSE_OPT_COMMAND), (d) }
163
164 #define ARGPARSE_ignore(s,l) \
165      { (s), (l), (ARGPARSE_OPT_IGNORE), "@" }
166
167 #define ARGPARSE_group(s,d) \
168      { (s), NULL, 0, (d) }
169
170 /* Placeholder options for help, version, warranty and dump-options.  See arg_parse(). */
171 #define ARGPARSE_end() \
172      { 0, NULL, 0, NULL }, \
173      { 0, NULL, 0, NULL }, \
174      { 0, NULL, 0, NULL }, \
175      { 0, NULL, 0, NULL }, \
176      { 0, NULL, 0, NULL }
177
178
179 /* Other constants.  */
180 #define ARGPARSE_PRINT_WARNING  1
181 #define ARGPARSE_PRINT_ERROR    2
182
183
184 /* Error values.  */
185 #define ARGPARSE_IS_ARG            (-1)
186 #define ARGPARSE_INVALID_OPTION    (-2)
187 #define ARGPARSE_MISSING_ARG       (-3)
188 #define ARGPARSE_KEYWORD_TOO_LONG  (-4)
189 #define ARGPARSE_READ_ERROR        (-5)
190 #define ARGPARSE_UNEXPECTED_ARG    (-6)
191 #define ARGPARSE_INVALID_COMMAND   (-7)
192 #define ARGPARSE_AMBIGUOUS_OPTION  (-8)
193 #define ARGPARSE_AMBIGUOUS_COMMAND (-9)
194 #define ARGPARSE_INVALID_ALIAS     (-10)
195 #define ARGPARSE_OUT_OF_CORE       (-11)
196 #define ARGPARSE_INVALID_ARG       (-12)
197
198
199 int arg_parse (ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts);
200 int optfile_parse (FILE *fp, const char *filename, unsigned *lineno,
201                    ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts);
202 void usage (int level);
203 const char *strusage (int level);
204 void set_strusage (const char *(*f)( int ));
205 void argparse_register_outfnc (int (*fnc)(int, const char *));
206
207 #endif /*GNUPG_COMMON_ARGPARSE_H*/