zephyr/lib/posix/getopt/getopt.h
Jakub Rzeszutko d4559f53fa lib: getopt: rework and extend getopt library
Getopt has been rework in this way that calling it does not require
extra state parameter and its execution is thread safe.
Global parameters describing the state of the getopt function have been
made available to ensure full API compatibility in using this library.
However, referencing these global variables directly is not thread
safe. In order to get the state of the getopt function for the thread
that is currently using it, call: getopt_state_get();

Extended the library with getopt_long and getopt_long_only functions.

Moved getopt libary from utils to posix.

Signed-off-by: Jakub Rzeszutko <jakub.rzeszutko@nordicsemi.no>
2022-01-06 21:26:59 +01:00

139 lines
4.2 KiB
C

/*
* 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.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__ */