Home | History | Annotate | Download | only in menu
      1 /* ----------------------------------------------------------------------- *
      2  *
      3  *   Copyright 2004-2008 H. Peter Anvin - All Rights Reserved
      4  *
      5  *   This program is free software; you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
      8  *   Boston MA 02110-1301, USA; either version 2 of the License, or
      9  *   (at your option) any later version; incorporated herein by reference.
     10  *
     11  * ----------------------------------------------------------------------- */
     12 
     13 #include <ctype.h>
     14 #include <string.h>
     15 #include <stdlib.h>
     16 #include <stdio.h>
     17 #include <consoles.h>
     18 #include <getkey.h>
     19 #include <minmax.h>
     20 #include <setjmp.h>
     21 #include <limits.h>
     22 #include <sha1.h>
     23 #include <base64.h>
     24 #include <colortbl.h>
     25 #ifdef __COM32__
     26 #include <com32.h>
     27 #endif
     28 
     29 #include "menu.h"
     30 
     31 static int draw_message_file(const char *filename)
     32 {
     33     FILE *f;
     34     int ch;
     35     enum msgname_state {
     36 	st_init,		/* Base state */
     37 	st_si_1,		/* <SI> digit 1 */
     38 	st_si_2,		/* <SI> digit 2 */
     39 	st_skipline,		/* Skip until NL */
     40     } state = st_init;
     41     int eof = 0;
     42     int attr = 0;
     43 
     44     f = fopen(filename, "r");
     45     if (!f)
     46 	return -1;
     47 
     48     /* Clear screen, hide cursor, default attribute */
     49     printf("\033e\033%%@\033)0\033(B\3#%03d\033[?25l\033[2J\033[H",
     50 	   message_base_color + 0x07);
     51 
     52     while (!eof && (ch = getc(f)) != EOF) {
     53 	switch (state) {
     54 	case st_init:
     55 	    switch (ch) {
     56 	    case '\f':
     57 		fputs("\033[2J\033[H", stdout);
     58 		break;
     59 	    case 15:		/* SI */
     60 		state = st_si_1;
     61 		break;
     62 	    case 24:
     63 		state = st_skipline;
     64 		break;
     65 	    case 26:
     66 		eof = 1;
     67 		break;
     68 	    case '\a':
     69 	    case '\n':
     70 	    case '\r':
     71 		putchar(ch);
     72 		break;
     73 	    default:
     74 		if (ch >= 32)
     75 		    putchar(ch);
     76 		break;
     77 	    }
     78 	    break;
     79 
     80 	case st_si_1:
     81 	    attr = hexval(ch) << 4;
     82 	    state = st_si_2;
     83 	    break;
     84 
     85 	case st_si_2:
     86 	    attr |= hexval(ch);
     87 	    printf("\3#%03d", attr + message_base_color);
     88 	    state = st_init;
     89 	    break;
     90 
     91 	case st_skipline:
     92 	    if (ch == '\n')
     93 		state = st_init;
     94 	    break;
     95 	}
     96     }
     97 
     98     fclose(f);
     99     return 0;
    100 }
    101 
    102 int show_message_file(const char *filename, const char *background)
    103 {
    104     int rv = KEY_NONE;
    105     const char *old_background = NULL;
    106 
    107     if (background) {
    108 	old_background = current_background;
    109 	set_background(background);
    110     }
    111 
    112     if (!(rv = draw_message_file(filename)))
    113 	rv = mygetkey(0);	/* Wait for keypress */
    114 
    115     if (old_background)
    116 	set_background(old_background);
    117 
    118     return rv;
    119 }
    120