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; }