diff options
Diffstat (limited to 'contrib/syslinux-4.02/com32/menu/printmsg.c')
-rw-r--r-- | contrib/syslinux-4.02/com32/menu/printmsg.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/com32/menu/printmsg.c b/contrib/syslinux-4.02/com32/menu/printmsg.c new file mode 100644 index 0000000..cfceac3 --- /dev/null +++ b/contrib/syslinux-4.02/com32/menu/printmsg.c @@ -0,0 +1,119 @@ +/* ----------------------------------------------------------------------- * + * + * Copyright 2004-2008 H. Peter Anvin - All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston MA 02110-1301, USA; either version 2 of the License, or + * (at your option) any later version; incorporated herein by reference. + * + * ----------------------------------------------------------------------- */ + +#include <ctype.h> +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <consoles.h> +#include <getkey.h> +#include <minmax.h> +#include <setjmp.h> +#include <limits.h> +#include <sha1.h> +#include <base64.h> +#include <colortbl.h> +#ifdef __COM32__ +#include <com32.h> +#endif + +#include "menu.h" + +static int draw_message_file(const char *filename) +{ + FILE *f; + int ch; + enum msgname_state { + st_init, /* Base state */ + st_si_1, /* <SI> digit 1 */ + st_si_2, /* <SI> digit 2 */ + st_skipline, /* Skip until NL */ + } state = st_init; + int eof = 0; + int attr = 0; + + f = fopen(filename, "r"); + if (!f) + return -1; + + /* Clear screen, hide cursor, default attribute */ + printf("\033e\033%%@\033)0\033(B\3#%03d\033[?25l\033[2J\033[H", + message_base_color + 0x07); + + while (!eof && (ch = getc(f)) != EOF) { + switch (state) { + case st_init: + switch (ch) { + case '\f': + fputs("\033[2J\033[H", stdout); + break; + case 15: /* SI */ + state = st_si_1; + break; + case 24: + state = st_skipline; + break; + case 26: + eof = 1; + break; + case '\a': + case '\n': + case '\r': + putchar(ch); + break; + default: + if (ch >= 32) + putchar(ch); + break; + } + break; + + case st_si_1: + attr = hexval(ch) << 4; + state = st_si_2; + break; + + case st_si_2: + attr |= hexval(ch); + printf("\3#%03d", attr + message_base_color); + state = st_init; + break; + + case st_skipline: + if (ch == '\n') + state = st_init; + break; + } + } + + fclose(f); + return 0; +} + +int show_message_file(const char *filename, const char *background) +{ + int rv = KEY_NONE; + const char *old_background = NULL; + + if (background) { + old_background = current_background; + set_background(background); + } + + if (!(rv = draw_message_file(filename))) + rv = mygetkey(0); /* Wait for keypress */ + + if (old_background) + set_background(old_background); + + return rv; +} |