1 /********************************************************************* 2 This file is part of the argtable2 library. 3 Copyright (C) 1998-2001,2003-2011 Stewart Heitmann 4 sheitmann@users.sourceforge.net 5 6 The argtable2 library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Library General Public License as 8 published by the Free Software Foundation; either version 2 of the 9 License, or (at your option) any later version. 10 11 This software is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Library General Public License for more details. 15 16 You should have received a copy of the GNU Library General Public 17 License along with this library; if not, write to the Free Software 18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 19 USA. 20 **********************************************************************/ 21 #ifndef ARGTABLE2 22 #define ARGTABLE2 23 24 #include <stdio.h> /* FILE */ 25 #include <time.h> /* struct tm */ 26 #include <sys/types.h> 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 33 /* bit masks for arg_hdr.flag */ 34 enum 35 { 36 ARG_TERMINATOR=0x1, 37 ARG_HASVALUE=0x2, 38 ARG_HASOPTVALUE=0x4 39 }; 40 41 typedef void (arg_resetfn)(void *parent); 42 typedef int (arg_scanfn)(void *parent, const char *argval); 43 typedef int (arg_checkfn)(void *parent); 44 typedef void (arg_errorfn)(void *parent, FILE *fp, int error, const char *argval, const char *progname); 45 46 47 /* 48 * The arg_hdr struct defines properties that are common to all arg_xxx structs. 49 * The argtable library requires each arg_xxx struct to have an arg_hdr 50 * struct as its first data member. 51 * The argtable library functions then use this data to identify the 52 * properties of the command line option, such as its option tags, 53 * datatype string, and glossary strings, and so on. 54 * Moreover, the arg_hdr struct contains pointers to custom functions that 55 * are provided by each arg_xxx struct which perform the tasks of parsing 56 * that particular arg_xxx arguments, performing post-parse checks, and 57 * reporting errors. 58 * These functions are private to the individual arg_xxx source code 59 * and are the pointer to them are initiliased by that arg_xxx struct's 60 * constructor function. The user could alter them after construction 61 * if desired, but the original intention is for them to be set by the 62 * constructor and left unaltered. 63 */ 64 struct arg_hdr 65 { 66 char flag; /* Modifier flags: ARG_TERMINATOR, ARG_HASVALUE. */ 67 const char *shortopts; /* String defining the short options */ 68 const char *longopts; /* String defiing the long options */ 69 const char *datatype; /* Description of the argument data type */ 70 const char *glossary; /* Description of the option as shown by arg_print_glossary function */ 71 int mincount; /* Minimum number of occurences of this option accepted */ 72 int maxcount; /* Maximum number of occurences if this option accepted */ 73 void *parent; /* Pointer to parent arg_xxx struct */ 74 arg_resetfn *resetfn; /* Pointer to parent arg_xxx reset function */ 75 arg_scanfn *scanfn; /* Pointer to parent arg_xxx scan function */ 76 arg_checkfn *checkfn; /* Pointer to parent arg_xxx check function */ 77 arg_errorfn *errorfn; /* Pointer to parent arg_xxx error function */ 78 void *priv; /* Pointer to private header data for use by arg_xxx functions */ 79 }; 80 81 struct arg_rem 82 { 83 struct arg_hdr hdr; /* The mandatory argtable header struct */ 84 }; 85 86 struct arg_lit 87 { 88 struct arg_hdr hdr; /* The mandatory argtable header struct */ 89 int count; /* Number of matching command line args */ 90 }; 91 92 struct arg_int 93 { 94 struct arg_hdr hdr; /* The mandatory argtable header struct */ 95 int count; /* Number of matching command line args */ 96 int *ival; /* Array of parsed argument values */ 97 }; 98 99 struct arg_dbl 100 { 101 struct arg_hdr hdr; /* The mandatory argtable header struct */ 102 int count; /* Number of matching command line args */ 103 double *dval; /* Array of parsed argument values */ 104 }; 105 106 struct arg_str 107 { 108 struct arg_hdr hdr; /* The mandatory argtable header struct */ 109 int count; /* Number of matching command line args */ 110 const char **sval; /* Array of parsed argument values */ 111 }; 112 113 struct arg_rex 114 { 115 struct arg_hdr hdr; /* The mandatory argtable header struct */ 116 int count; /* Number of matching command line args */ 117 const char **sval; /* Array of parsed argument values */ 118 }; 119 120 struct arg_file 121 { 122 struct arg_hdr hdr; /* The mandatory argtable header struct */ 123 int count; /* Number of matching command line args*/ 124 const char **filename; /* Array of parsed filenames (eg: /home/foo.bar) */ 125 const char **basename; /* Array of parsed basenames (eg: foo.bar) */ 126 const char **extension; /* Array of parsed extensions (eg: .bar) */ 127 }; 128 129 struct arg_date 130 { 131 struct arg_hdr hdr; /* The mandatory argtable header struct */ 132 const char *format; /* strptime format string used to parse the date */ 133 int count; /* Number of matching command line args */ 134 struct tm *tmval; /* Array of parsed time values */ 135 }; 136 137 enum {ARG_ELIMIT=1, ARG_EMALLOC, ARG_ENOMATCH, ARG_ELONGOPT, ARG_EMISSARG}; 138 struct arg_end 139 { 140 struct arg_hdr hdr; /* The mandatory argtable header struct */ 141 int count; /* Number of errors encountered */ 142 int *error; /* Array of error codes */ 143 void **parent; /* Array of pointers to offending arg_xxx struct */ 144 const char **argval; /* Array of pointers to offending argv[] string */ 145 }; 146 147 148 /**** arg_xxx constructor functions *********************************/ 149 150 struct arg_rem* arg_rem(const char* datatype, const char* glossary); 151 152 struct arg_lit* arg_lit0(const char* shortopts, 153 const char* longopts, 154 const char* glossary); 155 struct arg_lit* arg_lit1(const char* shortopts, 156 const char* longopts, 157 const char *glossary); 158 struct arg_lit* arg_litn(const char* shortopts, 159 const char* longopts, 160 int mincount, 161 int maxcount, 162 const char *glossary); 163 164 struct arg_key* arg_key0(const char* keyword, 165 int flags, 166 const char* glossary); 167 struct arg_key* arg_key1(const char* keyword, 168 int flags, 169 const char* glossary); 170 struct arg_key* arg_keyn(const char* keyword, 171 int flags, 172 int mincount, 173 int maxcount, 174 const char* glossary); 175 176 struct arg_int* arg_int0(const char* shortopts, 177 const char* longopts, 178 const char* datatype, 179 const char* glossary); 180 struct arg_int* arg_int1(const char* shortopts, 181 const char* longopts, 182 const char* datatype, 183 const char *glossary); 184 struct arg_int* arg_intn(const char* shortopts, 185 const char* longopts, 186 const char *datatype, 187 int mincount, 188 int maxcount, 189 const char *glossary); 190 191 struct arg_dbl* arg_dbl0(const char* shortopts, 192 const char* longopts, 193 const char* datatype, 194 const char* glossary); 195 struct arg_dbl* arg_dbl1(const char* shortopts, 196 const char* longopts, 197 const char* datatype, 198 const char *glossary); 199 struct arg_dbl* arg_dbln(const char* shortopts, 200 const char* longopts, 201 const char *datatype, 202 int mincount, 203 int maxcount, 204 const char *glossary); 205 206 struct arg_str* arg_str0(const char* shortopts, 207 const char* longopts, 208 const char* datatype, 209 const char* glossary); 210 struct arg_str* arg_str1(const char* shortopts, 211 const char* longopts, 212 const char* datatype, 213 const char *glossary); 214 struct arg_str* arg_strn(const char* shortopts, 215 const char* longopts, 216 const char* datatype, 217 int mincount, 218 int maxcount, 219 const char *glossary); 220 221 struct arg_rex* arg_rex0(const char* shortopts, 222 const char* longopts, 223 const char* pattern, 224 const char* datatype, 225 int flags, 226 const char* glossary); 227 struct arg_rex* arg_rex1(const char* shortopts, 228 const char* longopts, 229 const char* pattern, 230 const char* datatype, 231 int flags, 232 const char *glossary); 233 struct arg_rex* arg_rexn(const char* shortopts, 234 const char* longopts, 235 const char* pattern, 236 const char* datatype, 237 int mincount, 238 int maxcount, 239 int flags, 240 const char *glossary); 241 242 struct arg_file* arg_file0(const char* shortopts, 243 const char* longopts, 244 const char* datatype, 245 const char* glossary); 246 struct arg_file* arg_file1(const char* shortopts, 247 const char* longopts, 248 const char* datatype, 249 const char *glossary); 250 struct arg_file* arg_filen(const char* shortopts, 251 const char* longopts, 252 const char* datatype, 253 int mincount, 254 int maxcount, 255 const char *glossary); 256 257 struct arg_date* arg_date0(const char* shortopts, 258 const char* longopts, 259 const char* format, 260 const char* datatype, 261 const char* glossary); 262 struct arg_date* arg_date1(const char* shortopts, 263 const char* longopts, 264 const char* format, 265 const char* datatype, 266 const char *glossary); 267 struct arg_date* arg_daten(const char* shortopts, 268 const char* longopts, 269 const char* format, 270 const char* datatype, 271 int mincount, 272 int maxcount, 273 const char *glossary); 274 275 struct arg_end* arg_end(int maxerrors); 276 277 278 /**** other functions *******************************************/ 279 int arg_nullcheck(void **argtable); 280 int arg_parse(int argc, char **argv, void **argtable); 281 void arg_print_option(FILE *fp, const char *shortopts, const char *longopts, const char *datatype, const char *suffix); 282 void arg_print_syntax(FILE *fp, void **argtable, const char *suffix); 283 void arg_print_syntaxv(FILE *fp, void **argtable, const char *suffix); 284 void arg_print_glossary(FILE *fp, void **argtable, const char *format); 285 void arg_print_glossary_gnu(FILE *fp, void **argtable); 286 void arg_print_errors(FILE* fp, struct arg_end* end, const char* progname); 287 void arg_freetable(void **argtable, size_t n); 288 289 /**** deprecated functions, for back-compatibility only ********/ 290 void arg_free(void **argtable); 291 292 #ifdef __cplusplus 293 } 294 #endif 295 #endif 296 297 298 299 300 301 302 303 304 305