blob: 0cbdda651fa6c35edc4c0a7ae89636483087329c [file] [log] [blame]
/*
* Copyright (c) 2021 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef _GETOPT_H__
#define _GETOPT_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <zephyr/kernel.h>
struct getopt_state {
int opterr; /* if error message should be printed */
int optind; /* index into parent argv vector */
int optopt; /* character checked for validity */
int optreset; /* reset getopt */
char *optarg; /* argument associated with option */
char *place; /* option letter processing */
#if CONFIG_GETOPT_LONG
int nonopt_start;
int nonopt_end;
#endif
};
extern int opterr; /* if error message should be printed */
extern int optind; /* index into parent argv vector */
extern int optopt; /* character checked for validity */
extern int optreset; /* reset getopt */
extern char *optarg; /* argument associated with option */
#define no_argument 0
#define required_argument 1
#define optional_argument 2
struct option {
/* name of long option */
const char *name;
/*
* one of no_argument, required_argument, and optional_argument:
* whether option takes an argument
*/
int has_arg;
/* if not NULL, set *flag to val when option found */
int *flag;
/* if flag not NULL, value to set *flag to; else return value */
int val;
};
/* Function intializes getopt_state structure for current thread */
void getopt_init(void);
/* Function returns getopt_state structure for the current thread. */
struct getopt_state *getopt_state_get(void);
/**
* @brief Parses the command-line arguments.
*
* It is based on FreeBSD implementation.
*
* @param[in] argc Arguments count.
* @param[in] argv Arguments.
* @param[in] options String containing the legitimate option characters.
*
* @return If an option was successfully found, function returns
* the option character.
* @return If options have been detected that is not in @p options
* function will return '?'.
* If function encounters an option with a missing
* argument, then the return value depends on the first
* character in optstring: if it is ':', then ':' is
* returned; otherwise '?' is returned.
* @return -1 If all options have been parsed.
*/
int getopt(int nargc, char *const nargv[], const char *ostr);
/**
* @brief Parses the command-line arguments.
*
* The getopt_long() function works like @ref getopt() except
* it also accepts long options, started with two dashes.
*
* @note This function is based on FreeBSD implementation but it does not
* support environment variable: POSIXLY_CORRECT.
*
* @param[in] argc Arguments count.
* @param[in] argv Arguments.
* @param[in] options String containing the legitimate option characters.
* @param[in] long_options Pointer to the first element of an array of
* @a struct z_option.
* @param[in] long_idx If long_idx is not NULL, it points to a variable
* which is set to the index of the long option relative
* to @p long_options.
*
* @return If an option was successfully found, function returns
* the option character.
*/
int getopt_long(int nargc, char *const *nargv,
const char *options, const struct option *long_options,
int *idx);
/**
* @brief Parses the command-line arguments.
*
* The getopt_long_only() function works like @ref getopt_long(),
* but '-' as well as "--" can indicate a long option. If an option that starts
* with '-' (not "--") doesn't match a long option, but does match a short
* option, it is parsed as a short option instead.
*
* @note This function is based on FreeBSD implementation but it does not
* support environment variable: POSIXLY_CORRECT.
*
* @param[in] argc Arguments count.
* @param[in] argv Arguments.
* @param[in] options String containing the legitimate option characters.
* @param[in] long_options Pointer to the first element of an array of
* @a struct option.
* @param[in] long_idx If long_idx is not NULL, it points to a variable
* which is set to the index of the long option relative
* to @p long_options.
*
* @return If an option was successfully found, function returns
* the option character.
*/
int getopt_long_only(int nargc, char *const *nargv,
const char *options, const struct option *long_options,
int *idx);
#ifdef __cplusplus
}
#endif
#endif /* _GETOPT_H__ */