Blame src/argparse.h

Packit d7e8d0
/* argparse.h - Argument parser for option handling.
Packit d7e8d0
 *	Copyright (C) 1998,1999,2000,2001,2006 Free Software Foundation, Inc.
Packit d7e8d0
 *
Packit d7e8d0
 * This file is part of GnuPG.
Packit d7e8d0
 *
Packit d7e8d0
 * GnuPG is free software; you can redistribute it and/or modify it
Packit d7e8d0
 * under the terms of either
Packit d7e8d0
 *
Packit d7e8d0
 *   - the GNU Lesser General Public License as published by the Free
Packit d7e8d0
 *     Software Foundation; either version 3 of the License, or (at
Packit d7e8d0
 *     your option) any later version.
Packit d7e8d0
 *
Packit d7e8d0
 * or
Packit d7e8d0
 *
Packit d7e8d0
 *   - the GNU General Public License as published by the Free
Packit d7e8d0
 *     Software Foundation; either version 2 of the License, or (at
Packit d7e8d0
 *     your option) any later version.
Packit d7e8d0
 *
Packit d7e8d0
 * or both in parallel, as here.
Packit d7e8d0
 *
Packit d7e8d0
 * GnuPG is distributed in the hope that it will be useful, but
Packit d7e8d0
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit d7e8d0
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit d7e8d0
 * General Public License for more details.
Packit d7e8d0
 *
Packit d7e8d0
 * You should have received a copies of the GNU General Public License
Packit d7e8d0
 * and the GNU Lesser General Public License along with this program;
Packit d7e8d0
 * if not, see <https://www.gnu.org/licenses/>.
Packit d7e8d0
 */
Packit d7e8d0
Packit d7e8d0
#ifndef GNUPG_COMMON_ARGPARSE_H
Packit d7e8d0
#define GNUPG_COMMON_ARGPARSE_H
Packit d7e8d0
Packit d7e8d0
#include <stdio.h>
Packit d7e8d0
Packit d7e8d0
typedef struct
Packit d7e8d0
{
Packit d7e8d0
  int  *argc;	      /* Pointer to ARGC (value subject to change). */
Packit d7e8d0
  char ***argv;	      /* Pointer to ARGV (value subject to change). */
Packit d7e8d0
  unsigned int flags; /* Global flags.  May be set prior to calling the
Packit d7e8d0
                         parser.  The parser may change the value.  */
Packit d7e8d0
  int err;            /* Print error description for last option.
Packit d7e8d0
                         Either 0,  ARGPARSE_PRINT_WARNING or
Packit d7e8d0
                         ARGPARSE_PRINT_ERROR.  */
Packit d7e8d0
Packit d7e8d0
  int r_opt; 	      /* Returns option code. */
Packit d7e8d0
  int r_type;	      /* Returns type of option value.  */
Packit d7e8d0
  union {
Packit d7e8d0
    int   ret_int;
Packit d7e8d0
    long  ret_long;
Packit d7e8d0
    unsigned long ret_ulong;
Packit d7e8d0
    char *ret_str;
Packit d7e8d0
  } r;		      /* Return values */
Packit d7e8d0
Packit d7e8d0
  struct {
Packit d7e8d0
    int idx;
Packit d7e8d0
    int inarg;
Packit d7e8d0
    int stopped;
Packit d7e8d0
    const char *last;
Packit d7e8d0
    void *aliases;
Packit d7e8d0
    const void *cur_alias;
Packit d7e8d0
    void *iio_list;
Packit d7e8d0
  } internal;	    /* Private - do not change. */
Packit d7e8d0
} ARGPARSE_ARGS;
Packit d7e8d0
Packit d7e8d0
typedef struct
Packit d7e8d0
{
Packit d7e8d0
  int          short_opt;
Packit d7e8d0
  const char  *long_opt;
Packit d7e8d0
  unsigned int flags;
Packit d7e8d0
  const char  *description; /* Optional option description. */
Packit d7e8d0
} ARGPARSE_OPTS;
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
/* Global flags (ARGPARSE_ARGS).  */
Packit d7e8d0
#define ARGPARSE_FLAG_KEEP       1   /* Do not remove options form argv.     */
Packit d7e8d0
#define ARGPARSE_FLAG_ALL        2   /* Do not stop at last option but return
Packit d7e8d0
                                        remaining args with R_OPT set to -1. */
Packit d7e8d0
#define ARGPARSE_FLAG_MIXED      4   /* Assume options and args are mixed.   */
Packit d7e8d0
#define ARGPARSE_FLAG_NOSTOP     8   /* Do not stop processing at "--".      */
Packit d7e8d0
#define ARGPARSE_FLAG_ARG0      16   /* Do not skip the first arg.           */
Packit d7e8d0
#define ARGPARSE_FLAG_ONEDASH   32   /* Allow long options with one dash.    */
Packit d7e8d0
#define ARGPARSE_FLAG_NOVERSION 64   /* No output for "--version".           */
Packit d7e8d0
Packit d7e8d0
#define ARGPARSE_FLAG_STOP_SEEN 256  /* Set to true if a "--" has been seen. */
Packit d7e8d0
Packit d7e8d0
/* Flags for each option (ARGPARSE_OPTS).  The type code may be
Packit d7e8d0
   ORed with the OPT flags.  */
Packit d7e8d0
#define ARGPARSE_TYPE_NONE        0  /* Does not take an argument.        */
Packit d7e8d0
#define ARGPARSE_TYPE_INT         1  /* Takes an int argument.            */
Packit d7e8d0
#define ARGPARSE_TYPE_STRING      2  /* Takes a string argument.          */
Packit d7e8d0
#define ARGPARSE_TYPE_LONG        3  /* Takes a long argument.            */
Packit d7e8d0
#define ARGPARSE_TYPE_ULONG       4  /* Takes an unsigned long argument.  */
Packit d7e8d0
#define ARGPARSE_OPT_OPTIONAL (1<<3) /* Argument is optional.             */
Packit d7e8d0
#define ARGPARSE_OPT_PREFIX   (1<<4) /* Allow 0x etc. prefixed values.    */
Packit d7e8d0
#define ARGPARSE_OPT_IGNORE   (1<<6) /* Ignore command or option.         */
Packit d7e8d0
#define ARGPARSE_OPT_COMMAND  (1<<7) /* The argument is a command.        */
Packit d7e8d0
Packit d7e8d0
#define ARGPARSE_TYPE_MASK  7  /* Mask for the type values (internal).  */
Packit d7e8d0
Packit d7e8d0
/* A set of macros to make option definitions easier to read.  */
Packit d7e8d0
#define ARGPARSE_x(s,l,t,f,d) \
Packit d7e8d0
     { (s), (l), ARGPARSE_TYPE_ ## t | (f), (d) }
Packit d7e8d0
Packit d7e8d0
#define ARGPARSE_s(s,l,t,d) \
Packit d7e8d0
     { (s), (l), ARGPARSE_TYPE_ ## t, (d) }
Packit d7e8d0
#define ARGPARSE_s_n(s,l,d) \
Packit d7e8d0
     { (s), (l), ARGPARSE_TYPE_NONE, (d) }
Packit d7e8d0
#define ARGPARSE_s_i(s,l,d) \
Packit d7e8d0
     { (s), (l), ARGPARSE_TYPE_INT, (d) }
Packit d7e8d0
#define ARGPARSE_s_s(s,l,d) \
Packit d7e8d0
     { (s), (l), ARGPARSE_TYPE_STRING, (d) }
Packit d7e8d0
#define ARGPARSE_s_l(s,l,d) \
Packit d7e8d0
     { (s), (l), ARGPARSE_TYPE_LONG, (d) }
Packit d7e8d0
#define ARGPARSE_s_u(s,l,d) \
Packit d7e8d0
     { (s), (l), ARGPARSE_TYPE_ULONG, (d) }
Packit d7e8d0
Packit d7e8d0
#define ARGPARSE_o(s,l,t,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_ ## t  | ARGPARSE_OPT_OPTIONAL), (d) }
Packit d7e8d0
#define ARGPARSE_o_n(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_NONE   | ARGPARSE_OPT_OPTIONAL), (d) }
Packit d7e8d0
#define ARGPARSE_o_i(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_INT    | ARGPARSE_OPT_OPTIONAL), (d) }
Packit d7e8d0
#define ARGPARSE_o_s(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_STRING | ARGPARSE_OPT_OPTIONAL), (d) }
Packit d7e8d0
#define ARGPARSE_o_l(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_LONG   | ARGPARSE_OPT_OPTIONAL), (d) }
Packit d7e8d0
#define ARGPARSE_o_u(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_ULONG  | ARGPARSE_OPT_OPTIONAL), (d) }
Packit d7e8d0
Packit d7e8d0
#define ARGPARSE_p(s,l,t,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_ ## t  | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
#define ARGPARSE_p_n(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_NONE   | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
#define ARGPARSE_p_i(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_INT    | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
#define ARGPARSE_p_s(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_STRING | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
#define ARGPARSE_p_l(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_LONG   | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
#define ARGPARSE_p_u(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_ULONG  | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
Packit d7e8d0
#define ARGPARSE_op(s,l,t,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_ ## t \
Packit d7e8d0
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
#define ARGPARSE_op_n(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_NONE \
Packit d7e8d0
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
#define ARGPARSE_op_i(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_INT \
Packit d7e8d0
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
#define ARGPARSE_op_s(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_STRING \
Packit d7e8d0
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
#define ARGPARSE_op_l(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_LONG \
Packit d7e8d0
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
#define ARGPARSE_op_u(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_ULONG \
Packit d7e8d0
                  | ARGPARSE_OPT_OPTIONAL | ARGPARSE_OPT_PREFIX), (d) }
Packit d7e8d0
Packit d7e8d0
#define ARGPARSE_c(s,l,d) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_TYPE_NONE | ARGPARSE_OPT_COMMAND), (d) }
Packit d7e8d0
Packit d7e8d0
#define ARGPARSE_ignore(s,l) \
Packit d7e8d0
     { (s), (l), (ARGPARSE_OPT_IGNORE), "@" }
Packit d7e8d0
Packit d7e8d0
#define ARGPARSE_group(s,d) \
Packit d7e8d0
     { (s), NULL, 0, (d) }
Packit d7e8d0
Packit d7e8d0
#define ARGPARSE_end()  { 0, NULL, 0, NULL }
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
/* Other constants.  */
Packit d7e8d0
#define ARGPARSE_PRINT_WARNING  1
Packit d7e8d0
#define ARGPARSE_PRINT_ERROR    2
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
/* Error values.  */
Packit d7e8d0
#define ARGPARSE_IS_ARG            (-1)
Packit d7e8d0
#define ARGPARSE_INVALID_OPTION    (-2)
Packit d7e8d0
#define ARGPARSE_MISSING_ARG       (-3)
Packit d7e8d0
#define ARGPARSE_KEYWORD_TOO_LONG  (-4)
Packit d7e8d0
#define ARGPARSE_READ_ERROR        (-5)
Packit d7e8d0
#define ARGPARSE_UNEXPECTED_ARG    (-6)
Packit d7e8d0
#define ARGPARSE_INVALID_COMMAND   (-7)
Packit d7e8d0
#define ARGPARSE_AMBIGUOUS_OPTION  (-8)
Packit d7e8d0
#define ARGPARSE_AMBIGUOUS_COMMAND (-9)
Packit d7e8d0
#define ARGPARSE_INVALID_ALIAS     (-10)
Packit d7e8d0
#define ARGPARSE_OUT_OF_CORE       (-11)
Packit d7e8d0
#define ARGPARSE_INVALID_ARG       (-12)
Packit d7e8d0
Packit d7e8d0
Packit d7e8d0
int arg_parse (ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts);
Packit d7e8d0
int optfile_parse (FILE *fp, const char *filename, unsigned *lineno,
Packit d7e8d0
		   ARGPARSE_ARGS *arg, ARGPARSE_OPTS *opts);
Packit d7e8d0
void usage (int level);
Packit d7e8d0
const char *strusage (int level);
Packit d7e8d0
void set_strusage (const char *(*f)( int ));
Packit d7e8d0
void argparse_register_outfnc (int (*fnc)(int, const char *));
Packit d7e8d0
Packit d7e8d0
#endif /*GNUPG_COMMON_ARGPARSE_H*/