diff --git a/src/vty/command.c b/src/vty/command.c
index e9690bb..104053f 100644
--- a/src/vty/command.c
+++ b/src/vty/command.c
@@ -869,17 +869,17 @@
 
 /* Completion match types. */
 enum match_type {
-	no_match = 0,
-	any_match,
-	extend_match,
-	ipv4_prefix_match,
-	ipv4_match,
-	ipv6_prefix_match,
-	ipv6_match,
-	range_match,
-	vararg_match,
-	partly_match,
-	exact_match,
+	NO_MATCH = 0,
+	ANY_MATCH,
+	EXTEND_MATCH,
+	IPV4_PREFIX_MATCH,
+	IPV4_MATCH,
+	IPV6_PREFIX_MATCH,
+	IPV6_MATCH,
+	RANGE_MATCH,
+	VARARG_MATCH,
+	PARTLY_MATCH,
+	EXACT_MATCH,
 };
 
 static enum match_type cmd_ipv4_match(const char *str)
@@ -889,7 +889,7 @@
 	char buf[4];
 
 	if (str == NULL)
-		return partly_match;
+		return PARTLY_MATCH;
 
 	for (;;) {
 		memset(buf, 0, sizeof(buf));
@@ -897,29 +897,29 @@
 		while (*str != '\0') {
 			if (*str == '.') {
 				if (dots >= 3)
-					return no_match;
+					return NO_MATCH;
 
 				if (*(str + 1) == '.')
-					return no_match;
+					return NO_MATCH;
 
 				if (*(str + 1) == '\0')
-					return partly_match;
+					return PARTLY_MATCH;
 
 				dots++;
 				break;
 			}
 			if (!isdigit((int)*str))
-				return no_match;
+				return NO_MATCH;
 
 			str++;
 		}
 
 		if (str - sp > 3)
-			return no_match;
+			return NO_MATCH;
 
 		strncpy(buf, sp, str - sp);
 		if (atoi(buf) > 255)
-			return no_match;
+			return NO_MATCH;
 
 		nums++;
 
@@ -930,9 +930,9 @@
 	}
 
 	if (nums < 4)
-		return partly_match;
+		return PARTLY_MATCH;
 
-	return exact_match;
+	return EXACT_MATCH;
 }
 
 static enum match_type cmd_ipv4_prefix_match(const char *str)
@@ -942,7 +942,7 @@
 	char buf[4];
 
 	if (str == NULL)
-		return partly_match;
+		return PARTLY_MATCH;
 
 	for (;;) {
 		memset(buf, 0, sizeof(buf));
@@ -950,44 +950,44 @@
 		while (*str != '\0' && *str != '/') {
 			if (*str == '.') {
 				if (dots == 3)
-					return no_match;
+					return NO_MATCH;
 
 				if (*(str + 1) == '.' || *(str + 1) == '/')
-					return no_match;
+					return NO_MATCH;
 
 				if (*(str + 1) == '\0')
-					return partly_match;
+					return PARTLY_MATCH;
 
 				dots++;
 				break;
 			}
 
 			if (!isdigit((int)*str))
-				return no_match;
+				return NO_MATCH;
 
 			str++;
 		}
 
 		if (str - sp > 3)
-			return no_match;
+			return NO_MATCH;
 
 		strncpy(buf, sp, str - sp);
 		if (atoi(buf) > 255)
-			return no_match;
+			return NO_MATCH;
 
 		if (dots == 3) {
 			if (*str == '/') {
 				if (*(str + 1) == '\0')
-					return partly_match;
+					return PARTLY_MATCH;
 
 				str++;
 				break;
 			} else if (*str == '\0')
-				return partly_match;
+				return PARTLY_MATCH;
 		}
 
 		if (*str == '\0')
-			return partly_match;
+			return PARTLY_MATCH;
 
 		str++;
 	}
@@ -995,15 +995,15 @@
 	sp = str;
 	while (*str != '\0') {
 		if (!isdigit((int)*str))
-			return no_match;
+			return NO_MATCH;
 
 		str++;
 	}
 
 	if (atoi(sp) > 32)
-		return no_match;
+		return NO_MATCH;
 
-	return exact_match;
+	return EXACT_MATCH;
 }
 
 #define IPV6_ADDR_STR		"0123456789abcdefABCDEF:.%"
@@ -1027,10 +1027,10 @@
 	int ret;
 
 	if (str == NULL)
-		return partly_match;
+		return PARTLY_MATCH;
 
 	if (strspn(str, IPV6_ADDR_STR) != strlen(str))
-		return no_match;
+		return NO_MATCH;
 
 	/* use inet_pton that has a better support,
 	 * for example inet_pton can support the automatic addresses:
@@ -1039,14 +1039,14 @@
 	ret = inet_pton(AF_INET6, str, &sin6_dummy.sin6_addr);
 
 	if (ret == 1)
-		return exact_match;
+		return EXACT_MATCH;
 
 	while (*str != '\0') {
 		switch (state) {
 		case STATE_START:
 			if (*str == ':') {
 				if (*(str + 1) != ':' && *(str + 1) != '\0')
-					return no_match;
+					return NO_MATCH;
 				colons--;
 				state = STATE_COLON;
 			} else {
@@ -1066,10 +1066,10 @@
 			break;
 		case STATE_DOUBLE:
 			if (double_colon)
-				return no_match;
+				return NO_MATCH;
 
 			if (*(str + 1) == ':')
-				return no_match;
+				return NO_MATCH;
 			else {
 				if (*(str + 1) != '\0')
 					colons++;
@@ -1083,7 +1083,7 @@
 		case STATE_ADDR:
 			if (*(str + 1) == ':' || *(str + 1) == '\0') {
 				if (str - sp > 3)
-					return no_match;
+					return NO_MATCH;
 
 				nums++;
 				state = STATE_COLON;
@@ -1099,20 +1099,20 @@
 		}
 
 		if (nums > 8)
-			return no_match;
+			return NO_MATCH;
 
 		if (colons > 7)
-			return no_match;
+			return NO_MATCH;
 
 		str++;
 	}
 
 #if 0
 	if (nums < 11)
-		return partly_match;
+		return PARTLY_MATCH;
 #endif				/* 0 */
 
-	return exact_match;
+	return EXACT_MATCH;
 }
 
 static enum match_type cmd_ipv6_prefix_match(const char *str)
@@ -1124,17 +1124,17 @@
 	char *endptr = NULL;
 
 	if (str == NULL)
-		return partly_match;
+		return PARTLY_MATCH;
 
 	if (strspn(str, IPV6_PREFIX_STR) != strlen(str))
-		return no_match;
+		return NO_MATCH;
 
 	while (*str != '\0' && state != STATE_MASK) {
 		switch (state) {
 		case STATE_START:
 			if (*str == ':') {
 				if (*(str + 1) != ':' && *(str + 1) != '\0')
-					return no_match;
+					return NO_MATCH;
 				colons--;
 				state = STATE_COLON;
 			} else {
@@ -1146,7 +1146,7 @@
 		case STATE_COLON:
 			colons++;
 			if (*(str + 1) == '/')
-				return no_match;
+				return NO_MATCH;
 			else if (*(str + 1) == ':')
 				state = STATE_DOUBLE;
 			else {
@@ -1156,10 +1156,10 @@
 			break;
 		case STATE_DOUBLE:
 			if (double_colon)
-				return no_match;
+				return NO_MATCH;
 
 			if (*(str + 1) == ':')
-				return no_match;
+				return NO_MATCH;
 			else {
 				if (*(str + 1) != '\0' && *(str + 1) != '/')
 					colons++;
@@ -1178,11 +1178,11 @@
 			if (*(str + 1) == ':' || *(str + 1) == '.'
 			    || *(str + 1) == '\0' || *(str + 1) == '/') {
 				if (str - sp > 3)
-					return no_match;
+					return NO_MATCH;
 
 				for (; sp <= str; sp++)
 					if (*sp == '/')
-						return no_match;
+						return NO_MATCH;
 
 				nums++;
 
@@ -1199,7 +1199,7 @@
 			break;
 		case STATE_SLASH:
 			if (*(str + 1) == '\0')
-				return partly_match;
+				return PARTLY_MATCH;
 
 			state = STATE_MASK;
 			break;
@@ -1208,33 +1208,33 @@
 		}
 
 		if (nums > 11)
-			return no_match;
+			return NO_MATCH;
 
 		if (colons > 7)
-			return no_match;
+			return NO_MATCH;
 
 		str++;
 	}
 
 	if (state < STATE_MASK)
-		return partly_match;
+		return PARTLY_MATCH;
 
 	mask = strtol(str, &endptr, 10);
 	if (*endptr != '\0')
-		return no_match;
+		return NO_MATCH;
 
 	if (mask < 0 || mask > 128)
-		return no_match;
+		return NO_MATCH;
 
 /* I don't know why mask < 13 makes command match partly.
    Forgive me to make this comments. I Want to set static default route
    because of lack of function to originate default in ospf6d; sorry
        yasu
   if (mask < 13)
-    return partly_match;
+    return PARTLY_MATCH;
 */
 
-	return exact_match;
+	return EXACT_MATCH;
 }
 
 #endif				/* HAVE_IPV6  */
@@ -1349,7 +1349,7 @@
 		 * as it we only discover it if a user tries to run it
 		 */
 		if (tmp == NULL)
-			return no_match;
+			return NO_MATCH;
 
 		ret = cmd_match(tmp, command, min, false);
 
@@ -1358,45 +1358,45 @@
 		return ret;
 	}
 	else if (CMD_VARARG(str))
-		return vararg_match;
+		return VARARG_MATCH;
 	else if (CMD_RANGE(str))
 	{
 		if (cmd_range_match(str, command))
-			return range_match;
+			return RANGE_MATCH;
 	}
 #ifdef HAVE_IPV6
 	else if (CMD_IPV6(str))
 	{
 		if (cmd_ipv6_match(command) >= min)
-			return ipv6_match;
+			return IPV6_MATCH;
 	}
 	else if (CMD_IPV6_PREFIX(str))
 	{
 		if (cmd_ipv6_prefix_match(command) >= min)
-			return ipv6_prefix_match;
+			return IPV6_PREFIX_MATCH;
 	}
 #endif /* HAVE_IPV6  */
 	else if (CMD_IPV4(str))
 	{
 		if (cmd_ipv4_match(command) >= min)
-			return ipv4_match;
+			return IPV4_MATCH;
 	}
 	else if (CMD_IPV4_PREFIX(str))
 	{
 		if (cmd_ipv4_prefix_match(command) >= min)
-			return ipv4_prefix_match;
+			return IPV4_PREFIX_MATCH;
 	}
 	else if (CMD_VARIABLE(str))
-		return extend_match;
+		return EXTEND_MATCH;
 	else if (strncmp(command, str, strlen(command)) == 0)
 	{
 		if (strcmp(command, str) == 0)
-			return  exact_match;
-		else if (partly_match >= min)
-			return partly_match;
+			return  EXACT_MATCH;
+		else if (PARTLY_MATCH >= min)
+			return PARTLY_MATCH;
 	}
 
-	return no_match;
+	return NO_MATCH;
 }
 
 /* Filter vector at the specified index and by the given command string, to
@@ -1412,7 +1412,7 @@
 	vector descvec;
 	struct desc *desc;
 
-	match_type = no_match;
+	match_type = NO_MATCH;
 
 	/* If command and cmd_element string does not match set NULL to vector */
 	for (i = 0; i < vector_active(v); i++)
@@ -1432,7 +1432,7 @@
 
 						ret = cmd_match (desc->cmd, command, level, true);
 
-						if (ret != no_match)
+						if (ret != NO_MATCH)
 							matched++;
 
 						if (match_type < ret)
@@ -1443,8 +1443,8 @@
 			}
 		}
 
-	if (match_type == no_match)
-		return no_match;
+	if (match_type == NO_MATCH)
+		return NO_MATCH;
 
 	/* 2nd pass: We now know the 'strongest' match type for the index, so we
 	 * go again and filter out commands whose argument (at this index) is
@@ -1454,7 +1454,7 @@
 	 *   foo bar BLAH
 	 *
 	 * and the command string is 'foo bar 10', then we will get here with with
-	 * 'range_match' being the strongest match.  However, if 'BLAH' came
+	 * 'RANGE_MATCH' being the strongest match.  However, if 'BLAH' came
 	 * earlier, it won't have been filtered out (as a CMD_VARIABLE allows "10").
 	 *
 	 * If we don't do a 2nd pass and filter it out, the higher-layers will
@@ -1475,7 +1475,7 @@
 					if ((desc = vector_slot(descvec, j))) {
 						enum match_type ret;
 
-						ret = cmd_match(desc->cmd, command, any_match, true);
+						ret = cmd_match(desc->cmd, command, ANY_MATCH, true);
 
 						if (ret >= match_type)
 							matched++;
@@ -1535,12 +1535,12 @@
 				}
 
 				switch (type) {
-				case exact_match:
+				case EXACT_MATCH:
 					if (!(CMD_VARIABLE (str))
 					   && strcmp(command, str) == 0)
 						match++;
 					break;
-				case partly_match:
+				case PARTLY_MATCH:
 					if (!(CMD_VARIABLE (str))
 					   && strncmp(command, str, strlen (command)) == 0)
 					{
@@ -1554,7 +1554,7 @@
 						match++;
 					}
 					break;
-				case range_match:
+				case RANGE_MATCH:
 					if (cmd_range_match
 					    (str, command)) {
 						if (matched
@@ -1568,15 +1568,15 @@
 					}
 					break;
 #ifdef HAVE_IPV6
-				case ipv6_match:
+				case IPV6_MATCH:
 					if (CMD_IPV6(str))
 						match++;
 					break;
-				case ipv6_prefix_match:
+				case IPV6_PREFIX_MATCH:
 					if ((mtype =
 					     cmd_ipv6_prefix_match
-					     (command)) != no_match) {
-						if (mtype == partly_match) {
+					     (command)) != NO_MATCH) {
+						if (mtype == PARTLY_MATCH) {
 							ret = 2;	/* There is incomplete match. */
 							goto free_and_return;
 						}
@@ -1585,15 +1585,15 @@
 					}
 					break;
 #endif				/* HAVE_IPV6 */
-				case ipv4_match:
+				case IPV4_MATCH:
 					if (CMD_IPV4(str))
 						match++;
 					break;
-				case ipv4_prefix_match:
+				case IPV4_PREFIX_MATCH:
 					if ((mtype =
 					     cmd_ipv4_prefix_match
-					     (command)) != no_match) {
-						if (mtype == partly_match) {
+					     (command)) != NO_MATCH) {
+						if (mtype == PARTLY_MATCH) {
 							ret = 2;	/* There is incomplete match. */
 							goto free_and_return;
 						}
@@ -1601,11 +1601,11 @@
 						match++;
 					}
 					break;
-				case extend_match:
+				case EXTEND_MATCH:
 					if (CMD_VARIABLE (str))
 						match++;
 					break;
-				case no_match:
+				case NO_MATCH:
 				default:
 					break;
 				}
@@ -1771,9 +1771,9 @@
 		if (!command)
 			continue;
 
-		match = cmd_filter(command, cmd_vector, i, any_match);
+		match = cmd_filter(command, cmd_vector, i, ANY_MATCH);
 
-		if (match == vararg_match) {
+		if (match == VARARG_MATCH) {
 			struct cmd_element *cmd_element;
 			vector descvec;
 			unsigned int j, k;
@@ -1826,7 +1826,7 @@
 	/* Make sure that cmd_vector is filtered based on current word */
 	command = vector_slot(vline, index);
 	if (command)
-		cmd_filter(command, cmd_vector, index, any_match);
+		cmd_filter(command, cmd_vector, index, ANY_MATCH);
 
 	/* Make description vector. */
 	for (i = 0; i < vector_active(cmd_vector); i++) {
@@ -1974,7 +1974,7 @@
 
 			/* First try completion match, if there is exactly match return 1 */
 			match =
-			    cmd_filter(command, cmd_vector, i, any_match);
+			    cmd_filter(command, cmd_vector, i, ANY_MATCH);
 
 			/* If there is exact match then filter ambiguous match else check
 			   ambiguousness. */
@@ -2234,9 +2234,9 @@
 			int ret;
 
 			match = cmd_filter(command, cmd_vector, index,
-			                   any_match);
+			                   ANY_MATCH);
 
-			if (match == vararg_match)
+			if (match == VARARG_MATCH)
 				break;
 
 			ret =
@@ -2259,7 +2259,7 @@
 
 	for (i = 0; i < vector_active(cmd_vector); i++) {
 		if ((cmd_element = vector_slot(cmd_vector, i))) {
-			if (match == vararg_match
+			if (match == VARARG_MATCH
 			    || index >= cmd_element->cmdsize) {
 				matched_element = cmd_element;
 #if 0
@@ -2383,10 +2383,10 @@
 			int ret;
 
 			match = cmd_filter(vector_slot(vline, index),
-			                   cmd_vector, index, exact_match);
+			                   cmd_vector, index, EXACT_MATCH);
 
 			/* If command meets '.VARARG' then finish matching. */
-			if (match == vararg_match)
+			if (match == VARARG_MATCH)
 				break;
 
 			ret =
@@ -2409,7 +2409,7 @@
 		if (vector_slot(cmd_vector, i) != NULL) {
 			cmd_element = vector_slot(cmd_vector, i);
 
-			if (match == vararg_match
+			if (match == VARARG_MATCH
 			    || index >= cmd_element->cmdsize) {
 				matched_element = cmd_element;
 				matched_count++;
