[VTY] add support for numeric ranges with negative numbers

This enables us to do something like <-128-127> as a numeric range.
This commit is contained in:
Andreas Eversberg 2010-07-13 13:50:39 +02:00 committed by Harald Welte
parent 6eb7d6c887
commit 33f0fc3c95
1 changed files with 64 additions and 28 deletions

View File

@ -867,41 +867,77 @@ static int cmd_range_match(const char *range, const char *str)
char *p;
char buf[DECIMAL_STRLEN_MAX + 1];
char *endptr = NULL;
unsigned long min, max, val;
if (str == NULL)
return 1;
val = strtoul(str, &endptr, 10);
if (*endptr != '\0')
return 0;
if (range[1] == '-') {
signed long min = 0, max = 0, val;
range++;
p = strchr(range, '-');
if (p == NULL)
return 0;
if (p - range > DECIMAL_STRLEN_MAX)
return 0;
strncpy(buf, range, p - range);
buf[p - range] = '\0';
min = strtoul(buf, &endptr, 10);
if (*endptr != '\0')
return 0;
val = strtol(str, &endptr, 10);
if (*endptr != '\0')
return 0;
range = p + 1;
p = strchr(range, '>');
if (p == NULL)
return 0;
if (p - range > DECIMAL_STRLEN_MAX)
return 0;
strncpy(buf, range, p - range);
buf[p - range] = '\0';
max = strtoul(buf, &endptr, 10);
if (*endptr != '\0')
return 0;
range += 2;
p = strchr(range, '-');
if (p == NULL)
return 0;
if (p - range > DECIMAL_STRLEN_MAX)
return 0;
strncpy(buf, range, p - range);
buf[p - range] = '\0';
min = -strtol(buf, &endptr, 10);
if (*endptr != '\0')
return 0;
if (val < min || val > max)
return 0;
range = p + 1;
p = strchr(range, '>');
if (p == NULL)
return 0;
if (p - range > DECIMAL_STRLEN_MAX)
return 0;
strncpy(buf, range, p - range);
buf[p - range] = '\0';
max = strtol(buf, &endptr, 10);
if (*endptr != '\0')
return 0;
if (val < min || val > max)
return 0;
} else {
unsigned long min, max, val;
val = strtoul(str, &endptr, 10);
if (*endptr != '\0')
return 0;
range++;
p = strchr(range, '-');
if (p == NULL)
return 0;
if (p - range > DECIMAL_STRLEN_MAX)
return 0;
strncpy(buf, range, p - range);
buf[p - range] = '\0';
min = strtoul(buf, &endptr, 10);
if (*endptr != '\0')
return 0;
range = p + 1;
p = strchr(range, '>');
if (p == NULL)
return 0;
if (p - range > DECIMAL_STRLEN_MAX)
return 0;
strncpy(buf, range, p - range);
buf[p - range] = '\0';
max = strtoul(buf, &endptr, 10);
if (*endptr != '\0')
return 0;
if (val < min || val > max)
return 0;
}
return 1;
}