diff options
Diffstat (limited to 'payloads/libpayload')
-rw-r--r-- | payloads/libpayload/drivers/video/video.c | 26 | ||||
-rw-r--r-- | payloads/libpayload/include/libpayload.h | 9 |
2 files changed, 33 insertions, 2 deletions
diff --git a/payloads/libpayload/drivers/video/video.c b/payloads/libpayload/drivers/video/video.c index f183517881..71140f06ba 100644 --- a/payloads/libpayload/drivers/video/video.c +++ b/payloads/libpayload/drivers/video/video.c @@ -162,7 +162,8 @@ void video_console_putchar(unsigned int ch) video_console_fixup_cursor(); } -void video_printf(int foreground, int background, const char *fmt, ...) +void video_printf(int foreground, int background, enum video_printf_align align, + const char *fmt, ...) { int i = 0, len; char str[200]; @@ -174,6 +175,29 @@ void video_printf(int foreground, int background, const char *fmt, ...) if (len <= 0) return; + /* vsnprintf can return len larger than size. when it happens, + * only size-1 characters have been actually written. */ + if (len >= ARRAY_SIZE(str)) + len = ARRAY_SIZE(str) - 1; + + if (len > console->columns) { + cursorx = 0; + } else { + switch (align) { + case VIDEO_PRINTF_ALIGN_LEFT: + cursorx = 0; + break; + case VIDEO_PRINTF_ALIGN_CENTER: + cursorx = (console->columns - len) / 2; + break; + case VIDEO_PRINTF_ALIGN_RIGHT: + cursorx = console->columns - len; + break; + default: + break; + } + } + foreground &= 0xf; foreground <<= 8; background &= 0xf; diff --git a/payloads/libpayload/include/libpayload.h b/payloads/libpayload/include/libpayload.h index 3ae3590558..470aafab5a 100644 --- a/payloads/libpayload/include/libpayload.h +++ b/payloads/libpayload/include/libpayload.h @@ -210,7 +210,14 @@ void video_console_set_cursor(unsigned int cursorx, unsigned int cursory); * print characters on video console with colors. note that there is a size * restriction for the internal buffer. so, output string can be truncated. */ -void video_printf(int foreground, int background, const char *fmt, ...); +enum video_printf_align { + VIDEO_PRINTF_ALIGN_KEEP = 0, + VIDEO_PRINTF_ALIGN_LEFT, + VIDEO_PRINTF_ALIGN_CENTER, + VIDEO_PRINTF_ALIGN_RIGHT, +}; +void video_printf(int foreground, int background, enum video_printf_align align, + const char *fmt, ...); /** @} */ /** |