85 lines
1.9 KiB
C
85 lines
1.9 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* Command line option processing facilities for frontend code
|
|
*
|
|
* Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/fe_utils/option_utils.c
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres_fe.h"
|
|
|
|
#include "common/logging.h"
|
|
#include "common/string.h"
|
|
#include "fe_utils/option_utils.h"
|
|
|
|
/*
|
|
* Provide strictly harmonized handling of --help and --version
|
|
* options.
|
|
*/
|
|
void
|
|
handle_help_version_opts(int argc, char *argv[],
|
|
const char *fixed_progname, help_handler hlp)
|
|
{
|
|
if (argc > 1)
|
|
{
|
|
if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
|
|
{
|
|
hlp(get_progname(argv[0]));
|
|
exit(0);
|
|
}
|
|
if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
|
|
{
|
|
printf("%s (PostgreSQL) " PG_VERSION "\n", fixed_progname);
|
|
exit(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
* option_parse_int
|
|
*
|
|
* Parse integer value for an option. If the parsing is successful, returns
|
|
* true and stores the result in *result if that's given; if parsing fails,
|
|
* returns false.
|
|
*/
|
|
bool
|
|
option_parse_int(const char *optarg, const char *optname,
|
|
int min_range, int max_range,
|
|
int *result)
|
|
{
|
|
char *endptr;
|
|
int val;
|
|
|
|
errno = 0;
|
|
val = strtoint(optarg, &endptr, 10);
|
|
|
|
/*
|
|
* Skip any trailing whitespace; if anything but whitespace remains before
|
|
* the terminating character, fail.
|
|
*/
|
|
while (*endptr != '\0' && isspace((unsigned char) *endptr))
|
|
endptr++;
|
|
|
|
if (*endptr != '\0')
|
|
{
|
|
pg_log_error("invalid value \"%s\" for option %s",
|
|
optarg, optname);
|
|
return false;
|
|
}
|
|
|
|
if (errno == ERANGE || val < min_range || val > max_range)
|
|
{
|
|
pg_log_error("%s must be in range %d..%d",
|
|
optname, min_range, max_range);
|
|
return false;
|
|
}
|
|
|
|
if (result)
|
|
*result = val;
|
|
return true;
|
|
}
|