Add parse_int_strict_range utility for command line input

This commit is contained in:
2015-12-31 21:49:00 +11:00
parent 8e1fae3e38
commit 3236f1ab54

View File

@@ -454,8 +454,11 @@ static bool parse_int_relative_clamp(
}
}
static bool parse_int(
const char *str,
/**
* No clamping, fails with any number outside the range.
*/
static bool parse_int_strict_range(
const char *str, const int min, const int max,
int *r_value, const char **r_err_msg)
{
char *str_end = NULL;
@@ -469,7 +472,7 @@ static bool parse_int(
*r_err_msg = msg;
return false;
}
else if ((errno == ERANGE) || ((value < INT_MIN || value > INT_MAX))) {
else if ((errno == ERANGE) || ((value < min || value > max))) {
static const char *msg = "exceeds range";
*r_err_msg = msg;
return false;
@@ -480,6 +483,13 @@ static bool parse_int(
}
}
static bool parse_int(
const char *str,
int *r_value, const char **r_err_msg)
{
return parse_int_strict_range(str, INT_MIN, INT_MAX, r_value, r_err_msg);
}
static bool parse_int_clamp(
const char *str, int min, int max,
int *r_value, const char **r_err_msg)
@@ -1028,24 +1038,20 @@ static int set_image_type(int argc, const char **argv, void *data)
static int set_threads(int argc, const char **argv, void *UNUSED(data))
{
const char *arg_id = "-t / --threads";
const int min = 0, max = BLENDER_MAX_THREADS;
if (argc > 1) {
const char *err_msg = NULL;
int threads;
if (!parse_int(argv[1], &threads, &err_msg)) {
printf("\nError: %s '%s %s'.\n", err_msg, arg_id, argv[1]);
if (!parse_int_strict_range(argv[1], min, max, &threads, &err_msg)) {
printf("\nError: %s '%s %s', expected number in [%d..%d].\n", err_msg, arg_id, argv[1], min, max);
return 1;
}
if (threads >= 0 && threads <= BLENDER_MAX_THREADS) {
BLI_system_num_threads_override_set(threads);
}
else {
printf("Error, threads has to be in range 0-%d\n", BLENDER_MAX_THREADS);
}
BLI_system_num_threads_override_set(threads);
return 1;
}
else {
printf("\nError: you must specify a number of threads between 0 and %d '%s'.\n", BLENDER_MAX_THREADS, arg_id);
printf("\nError: you must specify a number of threads in [%d..%d] '%s'.\n", min, max, arg_id);
return 0;
}
}