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
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. */
41 unsigned long ret_ulong;
43 } r; /* Return values */
51 const void *cur_alias;
53 } internal; /* Private - do not change. */
61 const char *description; /* Optional option description. */
65 /* Global flags (ARGPARSE_ARGS). */
66 #define ARGPARSE_FLAG_KEEP 1 /* Do not remove options form argv. */
67 #define ARGPARSE_FLAG_ALL 2 /* Do not stop at last option but return
68 remaining args with R_OPT set to -1. */
69 #define ARGPARSE_FLAG_MIXED 4 /* Assume options and args are mixed. */
70 #define ARGPARSE_FLAG_NOSTOP 8 /* Do not stop processing at "--". */
71 #define ARGPARSE_FLAG_ARG0 16 /* Do not skip the first arg. */
72 #define ARGPARSE_FLAG_ONEDASH 32 /* Allow long options with one dash. */
73 #define ARGPARSE_FLAG_NOVERSION 64 /* No output for "--version". */
75 /* Flags for each option (ARGPARSE_OPTS). The type code may be
76 ORed with the OPT flags. */
77 #define ARGPARSE_TYPE_NONE 0 /* Does not take an argument. */
78 #define ARGPARSE_TYPE_INT 1 /* Takes an int argument. */
79 #define ARGPARSE_TYPE_STRING 2 /* Takes a string argument. */
80 #define ARGPARSE_TYPE_LONG 3 /* Takes a long argument. */
81 #define ARGPARSE_TYPE_ULONG 4 /* Takes an unsigned long argument. */
82 #define ARGPARSE_OPT_OPTIONAL (1<<3) /* Argument is optional. */
83 #define ARGPARSE_OPT_PREFIX (1<<4) /* Allow 0x etc. prefixed values. */
84 #define ARGPARSE_OPT_IGNORE (1<<6) /* Ignore command or option. */
85 #define ARGPARSE_OPT_COMMAND (1<<7) /* The argument is a command. */
87 #define ARGPARSE_TYPE_MASK 7 /* Mask for the type values (internal). */
89 /* A set of macros to make option definitions easier to read. */
90 #define ARGPARSE_x(s,l,t,f,d) \
91 { (s), (l), ARGPARSE_TYPE_ ## t | (f), (d) }
93 #define ARGPARSE_s(s,l,t,d) \
94 { (s), (l), ARGPARSE_TYPE_ ## t, (d) }
95 #define ARGPARSE_s_n(s,l,d) \
96 { (s), (l), ARGPARSE_TYPE_NONE, (d) }
97 #define ARGPARSE_s_i(s,l,d) \
98 { (s), (l), ARGPARSE_TYPE_INT, (d) }
99 #define ARGPARSE_s_s(s,l,d) \
100 { (s), (l), ARGPARSE_TYPE_STRING, (d) }
101 #define ARGPARSE_s_l(s,l,d) \
102 { (s), (l), ARGPARSE_TYPE_LONG, (d) }
103 #define ARGPARSE_s_u(s,l,d) \
104 { (s), (l), ARGPARSE_TYPE_ULONG, (d) }
106 #define ARGPARSE_o(s,l,t,d) \
107 { (s), (l), (ARGPARSE_TYPE_ ## t | ARGPARSE_OPT_OPTIONAL), (d) }
108 #define ARGPARSE_o_n(s,l,d) \
109 { (s), (l), (ARGPARSE_TYPE_NONE | ARGPARSE_OPT_OPTIONAL), (d) }
110 #define ARGPARSE_o_i(s,l,d) \
111 { (s), (l), (ARGPARSE_TYPE_INT | ARGPARSE_OPT_OPTIONAL), (d) }
112 #define ARGPARSE_o_s(s,l,d) \
113 { (s), (l), (ARGPARSE_TYPE_STRING | ARGPARSE_OPT_OPTIONAL), (d) }
114 #define ARGPARSE_o_l(s,l,d) \
115 { (s), (l), (ARGPARSE_TYPE_LONG | ARGPARSE_OPT_OPTIONAL), (d) }
116 #define ARGPARSE_o_u(s,l,d) \
117 { (s), (l), (ARGPARSE_TYPE_ULONG | ARGPARSE_OPT_OPTIONAL), (d) }
119 #define ARGPARSE_p(s,l,t,d) \
120 { (s), (l), (ARGPARSE_TYPE_ ## t | ARGPARSE_OPT_PREFIX), (d) }
121 #define ARGPARSE_p_n(s,l,d) \
122 { (s), (l), (ARGPARSE_TYPE_NONE | ARGPARSE_OPT_PREFIX), (d) }
123 #define ARGPARSE_p_i(s,l,d) \
124 { (s), (l), (ARGPARSE_TYPE_INT | ARGPARSE_OPT_PREFIX), (d) }
125 #define ARGPARSE_p_s(s,l,d) \
126 { (s), (l), (ARGPARSE_TYPE_STRING | ARGPARSE_OPT_PREFIX), (d) }
127 #define ARGPARSE_p_l(s,l,d) \
128 { (s), (l), (ARGPARSE_TYPE_LONG | ARGPARSE_OPT_PREFIX), (d) }
129 #define ARGPARSE_p_u(s,l,d) \
130 { (s), (l), (ARGPARSE_TYPE_ULONG | ARGPARSE_OPT_PREFIX), (d) }
132 #define ARGPARSE_op(s,l,t,d) \
133 { (s), (l), (ARGPARSE_TYPE_ ## t \
134 | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
135 #define ARGPARSE_op_n(s,l,d) \
136 { (s), (l), (ARGPARSE_TYPE_NONE \
137 | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
138 #define ARGPARSE_op_i(s,l,d) \
139 { (s), (l), (ARGPARSE_TYPE_INT \
140 | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
141 #define ARGPARSE_op_s(s,l,d) \
142 { (s), (l), (ARGPARSE_TYPE_STRING \
143 | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
144 #define ARGPARSE_op_l(s,l,d) \
145 { (s), (l), (ARGPARSE_TYPE_LONG \
146 | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
147 #define ARGPARSE_op_u(s,l,d) \
148 { (s), (l), (ARGPARSE_TYPE_ULONG \
149 | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
151 #define ARGPARSE_c(s,l,d) \
152 { (s), (l), (ARGPARSE_TYPE_NONE | ARGPARSE_OPT_COMMAND), (d) }
154 #define ARGPARSE_ignore(s,l) \
155 { (s), (l), (ARGPARSE_OPT_IGNORE), "@" }
157 #define ARGPARSE_group(s,d) \
158 { (s), NULL, 0, (d) }
160 #define ARGPARSE_end() { 0, NULL, 0, NULL }
163 /* Other constants. */
164 #define ARGPARSE_PRINT_WARNING 1
165 #define ARGPARSE_PRINT_ERROR 2
169 #define ARGPARSE_IS_ARG (-1)
170 #define ARGPARSE_INVALID_OPTION (-2)
171 #define ARGPARSE_MISSING_ARG (-3)
172 #define ARGPARSE_KEYWORD_TOO_LONG (-4)
173 #define ARGPARSE_READ_ERROR (-5)
174 #define ARGPARSE_UNEXPECTED_ARG (-6)
175 #define ARGPARSE_INVALID_COMMAND (-7)
176 #define ARGPARSE_AMBIGUOUS_OPTION (-8)
177 #define ARGPARSE_AMBIGUOUS_COMMAND (-9)
178 #define ARGPARSE_INVALID_ALIAS (-10)
179 #define ARGPARSE_OUT_OF_CORE (-11)
182 int arg_parse( ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts);
183 int optfile_parse( FILE *fp, const char *filename, unsigned *lineno,
184 ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts);
185 void usage( int level );
186 const char *strusage( int level );
187 void set_strusage( const char *(*f)( int ) );
189 #endif /*LIBJNLIB_ARGPARSE_H*/