git: 425e57e7a2f7 - main - loader: support numeric and named bright colors (8-15)
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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;
}