* Copyright (c) 2020 Huawei Technologies Co.,Ltd.
*
* openGauss is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*
* http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
* -------------------------------------------------------------------------
*
* gs_getopt_r.cpp
*
* IDENTIFICATION
* src/common/port/gs_getopt_r.cpp
*
* -------------------------------------------------------------------------
*/
#include "c.h"
#define BADCH (int)'?'
#define BADARG (int)':'
#define EMSG ""
void initOptParseContext(OptParseContext* pOptCtxt)
{
pOptCtxt->place = "";
pOptCtxt->opterr = 1;
pOptCtxt->optind = 1;
pOptCtxt->optopt = 0;
pOptCtxt->optarg = NULL;
}
* Parse argc/argv argument vector reentrant safe.
*
* This implementation is revised from current getopt.cpp in exiting code
* base for Win32 port.
*
* This implementation does not use optreset. Instead, we guarantee that
* it can be restarted on a new argv array after a previous call returned -1,
* if the caller resets optind to 1 before the first call of the new series.
* (Internally, this means we must be sure to reset "place" to EMSG before
* returning -1.)
*/
int getopt_r(int nargc,
char* const* nargv,
const char* ostr,
OptParseContext* pOptCtxt)
{
char* place = pOptCtxt->place;
char* oli = NULL;
if (!*place) {
if (pOptCtxt->optind >= nargc || *(place = nargv[pOptCtxt->optind]) != '-') {
place = EMSG;
return -1;
}
if (place[1] && *++place == '-' && place[1] == '\0') {
++pOptCtxt->optind;
place = EMSG;
return -1;
}
}
if ((pOptCtxt->optopt = (int)*place++) == (int)':' || ((oli = strchr((char*)ostr, pOptCtxt->optopt)) == NULL)) {
* if the user didn't specify '-' as an option, assume it means -1.
*/
if (pOptCtxt->optopt == (int)'-') {
place = EMSG;
return -1;
}
if (!*place) {
++pOptCtxt->optind;
}
if (pOptCtxt->opterr && *ostr != ':') {
(void)fprintf(stderr, "illegal option -- %c\n", pOptCtxt->optopt);
}
return BADCH;
}
if (*++oli != ':') {
pOptCtxt->optarg = NULL;
if (!*place)
++pOptCtxt->optind;
} else {
if (*place)
pOptCtxt->optarg = place;
else if (nargc <= ++pOptCtxt->optind) {
place = EMSG;
if (*ostr == ':')
return BADARG;
if (pOptCtxt->opterr)
(void)fprintf(stderr, "option requires an argument -- %d\n", pOptCtxt->optopt);
return BADCH;
} else
pOptCtxt->optarg = nargv[pOptCtxt->optind];
place = EMSG;
++pOptCtxt->optind;
}
return pOptCtxt->optopt;
}