Permalink
Cannot retrieve contributors at this time
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
bee/src/bee_getopt.h
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
181 lines (145 sloc)
5.48 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
** beegetopt - parse options | |
** | |
** Copyright (C) 2009-2016 | |
** Marius Tolzmann <m@rius.berlin> | |
** and other bee developers | |
** | |
** This file is part of bee. | |
** | |
** bee is free software; you can redistribute it and/or modify | |
** it under the terms of the GNU General Public License as published by | |
** the Free Software Foundation, either version 3 of the License, or | |
** (at your option) any later version. | |
** | |
** This program is distributed in the hope that it will be useful, | |
** but WITHOUT ANY WARRANTY; without even the implied warranty of | |
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
** GNU General Public License for more details. | |
** | |
** You should have received a copy of the GNU General Public License | |
** along with this program; if not, see <http://www.gnu.org/licenses/>. | |
*/ | |
#ifndef BEE_GETOPT_H | |
#define BEE_GETOPT_H 1 | |
#define BEE_TYPE_STRING 1 | |
#define BEE_TYPE_INTEGER 2 | |
#define BEE_TYPE_FLOAT 3 | |
#define BEE_TYPE_FLAG 4 | |
#define BEE_TYPE_NO 5 | |
#define BEE_TYPE_ENABLE 6 | |
#define BEE_TYPE_WITH 7 | |
#define BEE_TYPE_TOGGLE 8 | |
#define BEE_TYPE_COUNT 9 | |
#define BEE_FLAG_SKIPUNKNOWN (1<<0) | |
#define BEE_FLAG_STOPONNOOPT (1<<1) | |
#define BEE_FLAG_STOPONUNKNOWN (1<<2) | |
#define BEE_FLAG_KEEPOPTIONEND (1<<3) | |
#define BEE_OPT_LONG(name) .long_opt = (name) | |
#define BEE_OPT_SHORT(short) .short_opt = (short) | |
#define BEE_OPT_VALUE(v) .value = (v) | |
#define BEE_OPT_FLAG(f) .flag = (f) | |
#define BEE_OPT_TYPE(t) .type = (t) | |
#define BEE_OPT_OPTIONAL(args) .optional_args = (args) | |
#define BEE_OPT_REQUIRED(args) .required_args = (args) | |
#define _BEE_OPT_LEN(l) ._long_len = (l) | |
#define BEE_GETOPT_END -1 | |
#define BEE_GETOPT_ERROR -2 | |
#define BEE_GETOPT_NOVALUE -3 | |
#define BEE_GETOPT_NOOPT -4 | |
#define BEE_GETOPT_AMBIGUOUS -5 | |
#define BEE_GETOPT_OPTUNKNOWN -6 | |
#define BEE_GETOPT_NOARG -7 | |
#define BEE_GETOPT_NOARGS -8 | |
#define BEE_OPTION_DEFAULTS \ | |
BEE_OPT_LONG(NULL), \ | |
BEE_OPT_SHORT(0), \ | |
BEE_OPT_VALUE(BEE_GETOPT_NOVALUE), \ | |
BEE_OPT_FLAG(NULL), \ | |
BEE_OPT_TYPE(BEE_TYPE_FLAG), \ | |
BEE_OPT_OPTIONAL(0), \ | |
BEE_OPT_REQUIRED(0), \ | |
_BEE_OPT_LEN(0) | |
#define BEE_INIT_OPTION_DEFAULTS(opt) \ | |
(opt)->long_opt = NULL; \ | |
(opt)->short_opt = 0; \ | |
(opt)->value = BEE_GETOPT_NOVALUE; \ | |
(opt)->flag = NULL; \ | |
(opt)->type = BEE_TYPE_FLAG; \ | |
(opt)->optional_args = 0; \ | |
(opt)->required_args = 0; \ | |
(opt)->_long_len = 0 | |
#define BEE_INIT_OPTION_END(opt) BEE_INIT_OPTION_DEFAULTS((opt)) | |
#define BEE_OPTION_END { BEE_OPT_LONG(NULL), BEE_OPT_SHORT(0) } | |
#define BEE_OPTION(...) { BEE_OPTION_DEFAULTS, ## __VA_ARGS__ } | |
#define BEE_OPTION_NO_ARG(name, short, ...) \ | |
BEE_OPTION(BEE_OPT_LONG(name), \ | |
BEE_OPT_SHORT(short), \ | |
BEE_OPT_VALUE(short), \ | |
## __VA_ARGS__) | |
#define BEE_OPTION_REQUIRED_ARG(name, short, ...) \ | |
BEE_OPTION(BEE_OPT_LONG(name), \ | |
BEE_OPT_SHORT(short), \ | |
BEE_OPT_VALUE(short), \ | |
BEE_OPT_TYPE(BEE_TYPE_STRING), \ | |
BEE_OPT_REQUIRED(1), \ | |
## __VA_ARGS__ ) | |
#define BEE_OPTION_REQUIRED_ARGS(name, short, n, ...) \ | |
BEE_OPTION(BEE_OPT_LONG(name), \ | |
BEE_OPT_SHORT(short), \ | |
BEE_OPT_VALUE(short), \ | |
BEE_OPT_TYPE(BEE_TYPE_STRING), \ | |
BEE_OPT_REQUIRED(n), \ | |
## __VA_ARGS__ ) | |
#define BEE_OPTION_OPTIONAL_ARG(name, short, ...) \ | |
BEE_OPTION(BEE_OPT_LONG(name), \ | |
BEE_OPT_SHORT(short), \ | |
BEE_OPT_VALUE(short), \ | |
BEE_OPT_TYPE(BEE_TYPE_STRING), \ | |
BEE_OPT_OPTIONAL(1), \ | |
## __VA_ARGS__ ) | |
#define BEE_OPTION_OPTIONAL_ARGS(name, short, n, ...) \ | |
BEE_OPTION(BEE_OPT_LONG(name), \ | |
BEE_OPT_SHORT(short), \ | |
BEE_OPT_VALUE(short), \ | |
BEE_OPT_TYPE(BEE_TYPE_STRING), \ | |
BEE_OPT_OPTIONAL(n), \ | |
## __VA_ARGS__ ) | |
#define BEE_OPTION_ARGS(name, short, opt, req, ...) \ | |
BEE_OPTION(BEE_OPT_LONG(name), \ | |
BEE_OPT_SHORT(short), \ | |
BEE_OPT_VALUE(short), \ | |
BEE_OPT_TYPE(BEE_TYPE_STRING), \ | |
BEE_OPT_OPTIONAL(opt), \ | |
BEE_OPT_REQUIRED(req), \ | |
## __VA_ARGS__ ) | |
struct bee_option { | |
char *long_opt; | |
char short_opt; | |
int value; | |
int *flag; | |
int type; | |
int optional_args; | |
int required_args; | |
int _long_len; | |
}; | |
struct bee_getopt_ctl { | |
int optind; | |
char *program; | |
char *optarg; | |
int optargc; | |
char **optargv; | |
int argc; | |
char **argv; | |
struct bee_option *options; | |
int _argc; | |
int _optcnt; | |
char *_unhandled_shortopts; | |
int flags; | |
}; | |
void bee_getopt_pop_current_argument(struct bee_getopt_ctl *optctl); | |
int bee_getopt_init(struct bee_getopt_ctl *ctl, int argc, char **argv, struct bee_option *optv); | |
int bee_getopt_long(struct bee_getopt_ctl *optctl, int *optindex); | |
int bee_getopt(struct bee_getopt_ctl *optctl, int *optindex); | |
void bee_getopt_print_quoted(char *s); | |
#endif |