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