From 19da58be2d9359a9641381feb559be0b918ef710 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 22:46:53 +0200 Subject: Adding upstream version 1:4.13+dfsg1. Signed-off-by: Daniel Baumann --- libmisc/getrange.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 libmisc/getrange.c (limited to 'libmisc/getrange.c') diff --git a/libmisc/getrange.c b/libmisc/getrange.c new file mode 100644 index 0000000..82f2edf --- /dev/null +++ b/libmisc/getrange.c @@ -0,0 +1,101 @@ +/* + * SPDX-FileCopyrightText: 2008 , Nicolas François + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include + +#ident "$Id: $" + +#include +#include + +#include "defines.h" +#include "prototypes.h" + +/* + * Parse a range and indicate if the range is valid. + * Valid ranges are in the form: + * -> min=max=long has_min has_max + * - -> max=long !has_min has_max + * - -> min=long has_min !has_max + * - -> min=long1 max=long2 has_min has_max + * + * If the range is valid, getrange returns 1. + * If the range is not valid, getrange returns 0. + */ +int getrange (const char *range, + unsigned long *min, bool *has_min, + unsigned long *max, bool *has_max) +{ + char *endptr; + unsigned long n; + + if (NULL == range) { + return 0; + } + + if ('-' == range[0]) { + if (!isdigit(range[1])) { + /* invalid */ + return 0; + } + errno = 0; + n = strtoul (&range[1], &endptr, 10); + if (('\0' != *endptr) || (ERANGE == errno)) { + /* invalid */ + return 0; + } + /* - */ + *has_min = false; + *has_max = true; + *max = n; + } else { + errno = 0; + n = strtoul (range, &endptr, 10); + if (ERANGE == errno) { + /* invalid */ + return 0; + } + switch (*endptr) { + case '\0': + /* */ + *has_min = true; + *has_max = true; + *min = n; + *max = n; + break; + case '-': + endptr++; + if ('\0' == *endptr) { + /* - */ + *has_min = true; + *has_max = false; + *min = n; + } else if (!isdigit (*endptr)) { + /* invalid */ + return 0; + } else { + *has_min = true; + *min = n; + errno = 0; + n = strtoul (endptr, &endptr, 10); + if ( ('\0' != *endptr) + || (ERANGE == errno)) { + /* invalid */ + return 0; + } + /* - */ + *has_max = true; + *max = n; + } + break; + default: + return 0; + } + } + + return 1; +} + -- cgit v1.2.3