summaryrefslogtreecommitdiffstats
path: root/apps/opt.c
diff options
context:
space:
mode:
authorPaul Yang <paulyang.inf@gmail.com>2017-06-20 01:28:37 +0800
committerRichard Levitte <levitte@openssl.org>2017-06-20 11:33:01 +0200
commit7447c49f0db741f886a9a187e29deef2e2e394db (patch)
treee4293860796c08843481d85a618dc65534469a9d /apps/opt.c
parent4f58c6b9febddb5bb074dff44bdc4c013cdb9544 (diff)
Make clear error message if opt_<number> fails
for opt_long(opt_int)/opt_ulong/opt_imax/opt_umax Reviewed-by: Andy Polyakov <appro@openssl.org> Reviewed-by: Richard Levitte <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/3653)
Diffstat (limited to 'apps/opt.c')
-rw-r--r--apps/opt.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/apps/opt.c b/apps/opt.c
index a261bf55c7..72d0c535fa 100644
--- a/apps/opt.c
+++ b/apps/opt.c
@@ -326,6 +326,30 @@ int opt_int(const char *value, int *result)
return 1;
}
+static void opt_number_error(const char *v)
+{
+ size_t i = 0;
+ struct strstr_pair_st {
+ char *prefix;
+ char *name;
+ } b[] = {
+ {"0x", "a hexadecimal"},
+ {"0X", "a hexadecimal"},
+ {"0", "an octal"}
+ };
+
+ for (i = 0; i < OSSL_NELEM(b); i++) {
+ if (strncmp(v, b[i].prefix, strlen(b[i].prefix)) == 0) {
+ BIO_printf(bio_err,
+ "%s: Can't parse \"%s\" as %s number\n",
+ prog, v, b[i].name);
+ return;
+ }
+ }
+ BIO_printf(bio_err, "%s: Can't parse \"%s\" as a number\n", prog, v);
+ return;
+}
+
/* Parse a long, put it into *result; return 0 on failure, else 1. */
int opt_long(const char *value, long *result)
{
@@ -339,8 +363,7 @@ int opt_long(const char *value, long *result)
|| endp == value
|| ((l == LONG_MAX || l == LONG_MIN) && errno == ERANGE)
|| (l == 0 && errno != 0)) {
- BIO_printf(bio_err, "%s: Can't parse \"%s\" as a number\n",
- prog, value);
+ opt_number_error(value);
errno = oerrno;
return 0;
}
@@ -365,8 +388,7 @@ int opt_imax(const char *value, intmax_t *result)
|| endp == value
|| ((m == INTMAX_MAX || m == INTMAX_MIN) && errno == ERANGE)
|| (m == 0 && errno != 0)) {
- BIO_printf(bio_err, "%s: Can't parse \"%s\" as a number\n",
- prog, value);
+ opt_number_error(value);
errno = oerrno;
return 0;
}
@@ -388,8 +410,7 @@ int opt_umax(const char *value, uintmax_t *result)
|| endp == value
|| (m == UINTMAX_MAX && errno == ERANGE)
|| (m == 0 && errno != 0)) {
- BIO_printf(bio_err, "%s: Can't parse \"%s\" as a number\n",
- prog, value);
+ opt_number_error(value);
errno = oerrno;
return 0;
}
@@ -414,8 +435,7 @@ int opt_ulong(const char *value, unsigned long *result)
|| endptr == value
|| ((l == ULONG_MAX) && errno == ERANGE)
|| (l == 0 && errno != 0)) {
- BIO_printf(bio_err, "%s: Can't parse \"%s\" as an unsigned number\n",
- prog, value);
+ opt_number_error(value);
errno = oerrno;
return 0;
}