zephyr/lib/posix/getopt/getopt_common.c

69 lines
1.8 KiB
C

/*
* Copyright (c) 2021 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/shell/shell.h>
#if CONFIG_SHELL_GETOPT
#include <zephyr/sys/iterable_sections.h>
#endif
#include "getopt.h"
/* Referring below variables is not thread safe. They reflects getopt state
* only when 1 thread is using getopt.
* When more threads are using getopt please call getopt_state_get to know
* getopt state for the current thread.
*/
int opterr = 1; /* if error message should be printed */
int optind = 1; /* index into parent argv vector */
int optopt; /* character checked for validity */
int optreset; /* reset getopt */
char *optarg; /* argument associated with option */
/* Common state for all threads that did not have own getopt state. */
static struct getopt_state m_getopt_common_state = {
.opterr = 1,
.optind = 1,
.optopt = 0,
.optreset = 0,
.optarg = NULL,
.place = "", /* EMSG */
#if CONFIG_GETOPT_LONG
.nonopt_start = -1, /* first non option argument (for permute) */
.nonopt_end = -1, /* first option after non options (for permute) */
#endif
};
/* This function is not thread safe. All threads using getopt are calling
* this function.
*/
void z_getopt_global_state_update(struct getopt_state *state)
{
opterr = state->opterr;
optind = state->optind;
optopt = state->optopt;
optreset = state->optreset;
optarg = state->optarg;
}
/* It is internal getopt API function, it shall not be called by the user. */
struct getopt_state *getopt_state_get(void)
{
#if CONFIG_SHELL_GETOPT
k_tid_t tid;
tid = k_current_get();
STRUCT_SECTION_FOREACH(shell, sh) {
if (tid == sh->ctx->tid) {
return &sh->ctx->getopt;
}
}
#endif
/* If not a shell thread return a common pointer */
return &m_getopt_common_state;
}