• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
draw_message_file(const char * filename)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 
show_message_file(const char * filename,const char * background)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