make range specification like -p
diff --git a/extensions/ebt_stp.c b/extensions/ebt_stp.c
index b458c40..8ed4c47 100644
--- a/extensions/ebt_stp.c
+++ b/extensions/ebt_stp.c
@@ -78,46 +78,72 @@
 	stpinfo->bitmask = 0;
 }
 
-#define determine_value(p,s)			 \
-{						 \
-	uint32_t _tmp2;				 \
-	char *_tmp;				 \
-	_tmp2 = strtoul(s, &_tmp, 0);		 \
-	if (*_tmp != '\0')			 \
-		return -1;			 \
-	if (size == 2) {			 \
-		if (_tmp2 >= (1 << 16))		 \
-			return -1;		 \
-		*(uint16_t *)p = (uint16_t)_tmp2;\
-	} else					 \
-		*(uint32_t *)p = _tmp2;		 \
-}
-
-static int parse_range(char *rangestring, void *lower, void *upper,
-	int size)
+static int parse_range(const char *portstring, void *lower, void *upper,
+   int bits, uint32_t min, uint32_t max)
 {
-	char *buffer, *cp;
+	char *buffer;
+	char *cp, *end;
+	uint32_t low_nr, upp_nr;
+	int ret = 0;
 
-	buffer = strdup(rangestring);
+	buffer = strdup(portstring);
 	if ((cp = strchr(buffer, ':')) == NULL) {
-		determine_value(lower, buffer);
-		determine_value(upper, buffer);
-		return 0;
+		low_nr = strtoul(buffer, &end, 10);
+		if (*end || low_nr < min || low_nr > max) {
+			ret = -1;
+			goto out;
+		}
+		if (bits == 2) {
+			*(uint16_t *)lower =  low_nr;
+			*(uint16_t *)upper =  low_nr;
+		} else {
+			*(uint32_t *)lower =  low_nr;
+			*(uint32_t *)upper =  low_nr;
+		}
+	} else {
+		*cp = '\0';
+		cp++;
+		if (!*buffer)
+			low_nr = min;
+		else {
+			low_nr = strtoul(buffer, &end, 10);
+			if (*end || low_nr < min) {
+				ret = -1;
+				goto out;
+			}
+		}
+		if (!*cp)
+			upp_nr = max;
+		else {
+			upp_nr = strtoul(cp, &end, 10);
+			if (*end || upp_nr > max) {
+				ret = -1;
+				goto out;
+			}
+		}
+		if (upp_nr < low_nr) {
+			ret = -1;
+			goto out;
+		}
+		if (bits == 2) {
+			*(uint16_t *)lower = low_nr;
+			*(uint16_t *)upper = upp_nr;
+		} else {
+			*(uint32_t *)lower = low_nr;
+			*(uint32_t *)upper = upp_nr;
+		}
 	}
-	*cp = '\0';
-	determine_value(lower, buffer);
-	determine_value(upper, cp + 1);
-	if (lower > upper)
-		return -1;
-	return 0;
+out:
+	free(buffer);
+	return ret;
 }
 
-static void print_range(uint32_t l, uint32_t u)
+static void print_range(unsigned int l, unsigned int u)
 {
 	if (l == u)
-		printf("%d ", l);
+		printf("%u ", l);
 	else
-		printf("%d:%d ", l, u);
+		printf("%u:%u ", l, u);
 }
 
 static int parse(int c, char **argv, int argc, const struct ebt_u_entry *entry,
@@ -148,7 +174,7 @@
 			           BPDU_TYPE_TCN_STRING))
 				stpinfo->type = BPDU_TYPE_TCN;
 			else
-				ebt_print_error("Bad STP type argument");
+				ebt_print_error("Bad --stp-type argument");
 		} else
 			stpinfo->type = i;
 		break;
@@ -162,60 +188,59 @@
 			           FLAG_TC_ACK_STRING))
 				stpinfo->config.flags = FLAG_TC_ACK;
 			else
-				ebt_print_error("Bad STP config flags "
-						"argument");
+				ebt_print_error("Bad --stp-flags argument");
 		} else
 			stpinfo->config.flags = i;
 		break;
 	case EBT_STP_ROOTPRIO:
 		if (parse_range(argv[optind-1], &(stpinfo->config.root_priol),
-		    &(stpinfo->config.root_priou), 2))
-			ebt_print_error("Bad STP config root priority range");
+		    &(stpinfo->config.root_priou), 2, 0, 0xffff))
+			ebt_print_error("Bad --stp-root-prio range");
 		break;
 	case EBT_STP_ROOTCOST:
 		if (parse_range(argv[optind-1], &(stpinfo->config.root_costl),
-		    &(stpinfo->config.root_costu), 4))
-			ebt_print_error("Bad STP config root cost range");
+		    &(stpinfo->config.root_costu), 4, 0, 0xffffffff))
+			ebt_print_error("Bad --stp-root-cost range");
 		break;
 	case EBT_STP_SENDERPRIO:
 		if (parse_range(argv[optind-1], &(stpinfo->config.sender_priol),
-		    &(stpinfo->config.sender_priou), 2))
-			ebt_print_error("Bad STP config sender priority range");
+		    &(stpinfo->config.sender_priou), 2, 0, 0xffff))
+			ebt_print_error("Bad --stp-sender-prio range");
 		break;
 	case EBT_STP_PORT:
 		if (parse_range(argv[optind-1], &(stpinfo->config.portl),
-		    &(stpinfo->config.portu), 2))
-			ebt_print_error("Bad STP config port range");
+		    &(stpinfo->config.portu), 2, 0, 0xffff))
+			ebt_print_error("Bad --stp-port range");
 		break;
 	case EBT_STP_MSGAGE:
 		if (parse_range(argv[optind-1], &(stpinfo->config.msg_agel),
-		    &(stpinfo->config.msg_ageu), 2))
-			ebt_print_error("Bad STP config message age range");
+		    &(stpinfo->config.msg_ageu), 2, 0, 0xffff))
+			ebt_print_error("Bad --stp-msg-age range");
 		break;
 	case EBT_STP_MAXAGE:
 		if (parse_range(argv[optind-1], &(stpinfo->config.max_agel),
-		    &(stpinfo->config.max_ageu), 2))
-			ebt_print_error("Bad STP config maximum age range");
+		    &(stpinfo->config.max_ageu), 2, 0, 0xffff))
+			ebt_print_error("Bad --stp-max-age range");
 		break;
 	case EBT_STP_HELLOTIME:
 		if (parse_range(argv[optind-1], &(stpinfo->config.hello_timel),
-		    &(stpinfo->config.hello_timeu), 2))
-			ebt_print_error("Bad STP config hello time range");
+		    &(stpinfo->config.hello_timeu), 2, 0, 0xffff))
+			ebt_print_error("Bad --stp-hello-time range");
 		break;
 	case EBT_STP_FWDD:
 		if (parse_range(argv[optind-1], &(stpinfo->config.forward_delayl),
-		    &(stpinfo->config.forward_delayu), 2))
-			ebt_print_error("Bad STP config forward delay range");
+		    &(stpinfo->config.forward_delayu), 2, 0, 0xffff))
+			ebt_print_error("Bad --stp-forward-delay range");
 		break;
 	case EBT_STP_ROOTADDR:
 		if (ebt_get_mac_and_mask(argv[optind-1],
 		    stpinfo->config.root_addr, stpinfo->config.root_addrmsk))
-			ebt_print_error("Bad STP config root address");
+			ebt_print_error("Bad --stp-root-addr address");
 		break;
 	case EBT_STP_SENDERADDR:
 		if (ebt_get_mac_and_mask(argv[optind-1], stpinfo->config.sender_addr,
 		    stpinfo->config.sender_addrmsk))
-			ebt_print_error("Bad STP config sender address");
+			ebt_print_error("Bad --stp-sender-addr address");
 		break;
 	default:
 		ebt_print_error("stp match: this shouldn't happen");