You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.8 KiB
68 lines
1.8 KiB
/* |
|
* 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; |
|
}
|
|
|