git: 425e57e7a2f7 - main - loader: support numeric and named bright colors (8-15)

From: Ed Maste <emaste_at_FreeBSD.org>
Date: Fri, 11 Mar 2022 19:26:15 UTC
The branch main has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=425e57e7a2f754f7be8425bf3b00ce1469aba5b0

commit 425e57e7a2f754f7be8425bf3b00ce1469aba5b0
Author:     Ed Maste <emaste@FreeBSD.org>
AuthorDate: 2022-03-09 21:08:04 +0000
Commit:     Ed Maste <emaste@FreeBSD.org>
CommitDate: 2022-03-11 19:20:34 +0000

    loader: support numeric and named bright colors (8-15)
    
    Accept "bright" or "light" prefix for named colors.
    
    For numeric colors, update error message to specify that values 0 to 15
    are allowed, and verify that values are in that range.
    
    Reviewed by:    imp, tsoome (both earlier version)
    MFC after:      1 week
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D34512
---
 stand/efi/libefi/efi_console.c  | 34 ++++++++++++++++++++++------------
 stand/i386/libi386/vidconsole.c | 34 ++++++++++++++++++++++------------
 2 files changed, 44 insertions(+), 24 deletions(-)

diff --git a/stand/efi/libefi/efi_console.c b/stand/efi/libefi/efi_console.c
index a63cba5e3f34..8cfb1a748a73 100644
--- a/stand/efi/libefi/efi_console.c
+++ b/stand/efi/libefi/efi_console.c
@@ -437,36 +437,44 @@ efi_cons_probe(struct console *cp)
 static bool
 color_name_to_teken(const char *name, int *val)
 {
+	int light = 0;
+	if (strncasecmp(name, "light", 5) == 0) {
+		name += 5;
+		light = TC_LIGHT;
+	} else if (strncasecmp(name, "bright", 6) == 0) {
+		name += 6;
+		light = TC_LIGHT;
+	}
 	if (strcasecmp(name, "black") == 0) {
-		*val = TC_BLACK;
+		*val = TC_BLACK | light;
 		return (true);
 	}
 	if (strcasecmp(name, "red") == 0) {
-		*val = TC_RED;
+		*val = TC_RED | light;
 		return (true);
 	}
 	if (strcasecmp(name, "green") == 0) {
-		*val = TC_GREEN;
+		*val = TC_GREEN | light;
 		return (true);
 	}
 	if (strcasecmp(name, "brown") == 0) {
-		*val = TC_BROWN;
+		*val = TC_BROWN | light;
 		return (true);
 	}
 	if (strcasecmp(name, "blue") == 0) {
-		*val = TC_BLUE;
+		*val = TC_BLUE | light;
 		return (true);
 	}
 	if (strcasecmp(name, "magenta") == 0) {
-		*val = TC_MAGENTA;
+		*val = TC_MAGENTA | light;
 		return (true);
 	}
 	if (strcasecmp(name, "cyan") == 0) {
-		*val = TC_CYAN;
+		*val = TC_CYAN | light;
 		return (true);
 	}
 	if (strcasecmp(name, "white") == 0) {
-		*val = TC_WHITE;
+		*val = TC_WHITE | light;
 		return (true);
 	}
 	return (false);
@@ -476,7 +484,7 @@ static int
 efi_set_colors(struct env_var *ev, int flags, const void *value)
 {
 	int val = 0;
-	char buf[2];
+	char buf[3];
 	const void *evalue;
 	const teken_attr_t *ap;
 	teken_attr_t a;
@@ -489,14 +497,16 @@ efi_set_colors(struct env_var *ev, int flags, const void *value)
 		evalue = buf;
 	} else {
 		char *end;
+		long lval;
 
 		errno = 0;
-		val = (int)strtol(value, &end, 0);
-		if (errno != 0 || *end != '\0') {
+		lval = strtol(value, &end, 0);
+		if (errno != 0 || *end != '\0' || lval < 0 || lval > 15) {
 			printf("Allowed values are either ansi color name or "
-			    "number from range [0-7].\n");
+			    "number from range [0-15].\n");
 			return (CMD_OK);
 		}
+		val = (int)lval;
 		evalue = value;
 	}
 
diff --git a/stand/i386/libi386/vidconsole.c b/stand/i386/libi386/vidconsole.c
index b933a7807687..3a6cba8f1561 100644
--- a/stand/i386/libi386/vidconsole.c
+++ b/stand/i386/libi386/vidconsole.c
@@ -524,36 +524,44 @@ vidc_probe(struct console *cp)
 static bool
 color_name_to_teken(const char *name, int *val)
 {
+	int light = 0;
+	if (strncasecmp(name, "light", 5) == 0) {
+		name += 5;
+		light = TC_LIGHT;
+	} else if (strncasecmp(name, "bright", 6) == 0) {
+		name += 6;
+		light = TC_LIGHT;
+	}
 	if (strcasecmp(name, "black") == 0) {
-		*val = TC_BLACK;
+		*val = TC_BLACK | light;
 		return (true);
 	}
 	if (strcasecmp(name, "red") == 0) {
-		*val = TC_RED;
+		*val = TC_RED | light;
 		return (true);
 	}
 	if (strcasecmp(name, "green") == 0) {
-		*val = TC_GREEN;
+		*val = TC_GREEN | light;
 		return (true);
 	}
 	if (strcasecmp(name, "brown") == 0) {
-		*val = TC_BROWN;
+		*val = TC_BROWN | light;
 		return (true);
 	}
 	if (strcasecmp(name, "blue") == 0) {
-		*val = TC_BLUE;
+		*val = TC_BLUE | light;
 		return (true);
 	}
 	if (strcasecmp(name, "magenta") == 0) {
-		*val = TC_MAGENTA;
+		*val = TC_MAGENTA | light;
 		return (true);
 	}
 	if (strcasecmp(name, "cyan") == 0) {
-		*val = TC_CYAN;
+		*val = TC_CYAN | light;
 		return (true);
 	}
 	if (strcasecmp(name, "white") == 0) {
-		*val = TC_WHITE;
+		*val = TC_WHITE | light;
 		return (true);
 	}
 	return (false);
@@ -563,7 +571,7 @@ static int
 vidc_set_colors(struct env_var *ev, int flags, const void *value)
 {
 	int val = 0;
-	char buf[2];
+	char buf[3];
 	const void *evalue;
 	const teken_attr_t *ap;
 	teken_attr_t a;
@@ -576,14 +584,16 @@ vidc_set_colors(struct env_var *ev, int flags, const void *value)
 		evalue = buf;
 	} else {
 		char *end;
+		long lval;
 
 		errno = 0;
-		val = (int)strtol(value, &end, 0);
-		if (errno != 0 || *end != '\0') {
+		lval = strtol(value, &end, 0);
+		if (errno != 0 || *end != '\0' || lval < 0 || lval > 15) {
 			printf("Allowed values are either ansi color name or "
-			    "number from range [0-7].\n");
+			    "number from range [0-15].\n");
 			return (CMD_OK);
 		}
+		val = (int)lval;
 		evalue = value;
 	}