Doc fixes.
[gnupg.git] / jnlib / argparse.h
blobb211e5fdfcfb9c5273ced5825519f9ab3f32db51
1 /* argparse.h - Argument parser for option handling.
2 * Copyright (C) 1998,1999,2000,2001,2006 Free Software Foundation, Inc.
4 * This file is part of JNLIB.
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.
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.
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/>.
20 #ifndef LIBJNLIB_ARGPARSE_H
21 #define LIBJNLIB_ARGPARSE_H
23 #include <stdio.h>
24 #include "types.h"
26 typedef struct
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. */
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 */
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;
55 typedef struct
57 int short_opt;
58 const char *long_opt;
59 unsigned int flags;
60 const char *description; /* Optional option description. */
61 } ARGPARSE_OPTS;
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". */
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. */
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) }
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) }
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) }
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) }
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) }
147 #define ARGPARSE_c(s,l,d) \
148 { (s), (l), (ARGPARSE_TYPE_NONE | ARGPARSE_OPT_COMMAND), (d) }
151 #define ARGPARSE_group(s,d) \
152 { (s), NULL, 0, (d) }
154 #define ARGPARSE_end() { 0, NULL, 0, NULL }
157 /* Other constants. */
158 #define ARGPARSE_PRINT_WARNING 1
159 #define ARGPARSE_PRINT_ERROR 2
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)
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 ) );
183 #endif /*LIBJNLIB_ARGPARSE_H*/