[VTY] add support for numeric ranges with negative numbers

This enables us to do something like <-128-127> as a numeric range.
diff --git a/src/vty/command.c b/src/vty/command.c
index 21afa5c..598e63c 100644
--- a/src/vty/command.c
+++ b/src/vty/command.c
@@ -867,41 +867,77 @@
 	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;
 }