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