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