1
0
mirror of https://github.com/postgres/postgres.git synced 2025-08-28 18:48:04 +03:00
Files
postgres/src/fe_utils/option_utils.c
Michael Paquier f7a9a3d4b2 Skip trailing whitespaces when parsing integer options
strtoint(), via strtol(), would skip leading whitespaces but the same
rule was not applied for trailing whitespaces, leading to an
inconsistent behavior.  Some tests are changed to cover more this area.

Author: Michael Paquier
Reviewed-by: Kyotaro Horiguchi
Discussion: https://postgr.es/m/YP5Pv0d13Ct+03ve@paquier.xyz
2021-07-27 10:39:05 +09:00

85 lines
1.9 KiB
C

/*-------------------------------------------------------------------------
*
* Command line option processing facilities for frontend code
*
* Portions Copyright (c) 1996-2021, 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;
}