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