source: bootcd/isolinux/syslinux-6.03/com32/menu/printmsg.c @ dd1be7c

Last change on this file since dd1be7c was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 2.5 KB
RevLine 
[e16e8f2]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
31static 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
102int 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}
Note: See TracBrowser for help on using the repository browser.