1*53ee8cc1Swenshuai.xi /*
2*53ee8cc1Swenshuai.xi * textbox.c -- implements the text box
3*53ee8cc1Swenshuai.xi *
4*53ee8cc1Swenshuai.xi * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5*53ee8cc1Swenshuai.xi * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
6*53ee8cc1Swenshuai.xi *
7*53ee8cc1Swenshuai.xi * This program is free software; you can redistribute it and/or
8*53ee8cc1Swenshuai.xi * modify it under the terms of the GNU General Public License
9*53ee8cc1Swenshuai.xi * as published by the Free Software Foundation; either version 2
10*53ee8cc1Swenshuai.xi * of the License, or (at your option) any later version.
11*53ee8cc1Swenshuai.xi *
12*53ee8cc1Swenshuai.xi * This program is distributed in the hope that it will be useful,
13*53ee8cc1Swenshuai.xi * but WITHOUT ANY WARRANTY; without even the implied warranty of
14*53ee8cc1Swenshuai.xi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15*53ee8cc1Swenshuai.xi * GNU General Public License for more details.
16*53ee8cc1Swenshuai.xi *
17*53ee8cc1Swenshuai.xi * You should have received a copy of the GNU General Public License
18*53ee8cc1Swenshuai.xi * along with this program; if not, write to the Free Software
19*53ee8cc1Swenshuai.xi * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20*53ee8cc1Swenshuai.xi */
21*53ee8cc1Swenshuai.xi
22*53ee8cc1Swenshuai.xi #include "dialog.h"
23*53ee8cc1Swenshuai.xi
24*53ee8cc1Swenshuai.xi static void back_lines(int n);
25*53ee8cc1Swenshuai.xi static void print_page(WINDOW * win, int height, int width);
26*53ee8cc1Swenshuai.xi static void print_line(WINDOW * win, int row, int width);
27*53ee8cc1Swenshuai.xi static char *get_line(void);
28*53ee8cc1Swenshuai.xi static void print_position(WINDOW * win);
29*53ee8cc1Swenshuai.xi
30*53ee8cc1Swenshuai.xi static int hscroll;
31*53ee8cc1Swenshuai.xi static int begin_reached, end_reached, page_length;
32*53ee8cc1Swenshuai.xi static const char *buf;
33*53ee8cc1Swenshuai.xi static const char *page;
34*53ee8cc1Swenshuai.xi
35*53ee8cc1Swenshuai.xi /*
36*53ee8cc1Swenshuai.xi * refresh window content
37*53ee8cc1Swenshuai.xi */
refresh_text_box(WINDOW * dialog,WINDOW * box,int boxh,int boxw,int cur_y,int cur_x)38*53ee8cc1Swenshuai.xi static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw,
39*53ee8cc1Swenshuai.xi int cur_y, int cur_x)
40*53ee8cc1Swenshuai.xi {
41*53ee8cc1Swenshuai.xi print_page(box, boxh, boxw);
42*53ee8cc1Swenshuai.xi print_position(dialog);
43*53ee8cc1Swenshuai.xi wmove(dialog, cur_y, cur_x); /* Restore cursor position */
44*53ee8cc1Swenshuai.xi wrefresh(dialog);
45*53ee8cc1Swenshuai.xi }
46*53ee8cc1Swenshuai.xi
47*53ee8cc1Swenshuai.xi
48*53ee8cc1Swenshuai.xi /*
49*53ee8cc1Swenshuai.xi * Display text from a file in a dialog box.
50*53ee8cc1Swenshuai.xi */
dialog_textbox(const char * title,const char * tbuf,int initial_height,int initial_width)51*53ee8cc1Swenshuai.xi int dialog_textbox(const char *title, const char *tbuf,
52*53ee8cc1Swenshuai.xi int initial_height, int initial_width)
53*53ee8cc1Swenshuai.xi {
54*53ee8cc1Swenshuai.xi int i, x, y, cur_x, cur_y, key = 0;
55*53ee8cc1Swenshuai.xi int height, width, boxh, boxw;
56*53ee8cc1Swenshuai.xi int passed_end;
57*53ee8cc1Swenshuai.xi WINDOW *dialog, *box;
58*53ee8cc1Swenshuai.xi
59*53ee8cc1Swenshuai.xi begin_reached = 1;
60*53ee8cc1Swenshuai.xi end_reached = 0;
61*53ee8cc1Swenshuai.xi page_length = 0;
62*53ee8cc1Swenshuai.xi hscroll = 0;
63*53ee8cc1Swenshuai.xi buf = tbuf;
64*53ee8cc1Swenshuai.xi page = buf; /* page is pointer to start of page to be displayed */
65*53ee8cc1Swenshuai.xi
66*53ee8cc1Swenshuai.xi do_resize:
67*53ee8cc1Swenshuai.xi getmaxyx(stdscr, height, width);
68*53ee8cc1Swenshuai.xi if (height < 8 || width < 8)
69*53ee8cc1Swenshuai.xi return -ERRDISPLAYTOOSMALL;
70*53ee8cc1Swenshuai.xi if (initial_height != 0)
71*53ee8cc1Swenshuai.xi height = initial_height;
72*53ee8cc1Swenshuai.xi else
73*53ee8cc1Swenshuai.xi if (height > 4)
74*53ee8cc1Swenshuai.xi height -= 4;
75*53ee8cc1Swenshuai.xi else
76*53ee8cc1Swenshuai.xi height = 0;
77*53ee8cc1Swenshuai.xi if (initial_width != 0)
78*53ee8cc1Swenshuai.xi width = initial_width;
79*53ee8cc1Swenshuai.xi else
80*53ee8cc1Swenshuai.xi if (width > 5)
81*53ee8cc1Swenshuai.xi width -= 5;
82*53ee8cc1Swenshuai.xi else
83*53ee8cc1Swenshuai.xi width = 0;
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xi /* center dialog box on screen */
86*53ee8cc1Swenshuai.xi x = (COLS - width) / 2;
87*53ee8cc1Swenshuai.xi y = (LINES - height) / 2;
88*53ee8cc1Swenshuai.xi
89*53ee8cc1Swenshuai.xi draw_shadow(stdscr, y, x, height, width);
90*53ee8cc1Swenshuai.xi
91*53ee8cc1Swenshuai.xi dialog = newwin(height, width, y, x);
92*53ee8cc1Swenshuai.xi keypad(dialog, TRUE);
93*53ee8cc1Swenshuai.xi
94*53ee8cc1Swenshuai.xi /* Create window for box region, used for scrolling text */
95*53ee8cc1Swenshuai.xi boxh = height - 4;
96*53ee8cc1Swenshuai.xi boxw = width - 2;
97*53ee8cc1Swenshuai.xi box = subwin(dialog, boxh, boxw, y + 1, x + 1);
98*53ee8cc1Swenshuai.xi wattrset(box, dlg.dialog.atr);
99*53ee8cc1Swenshuai.xi wbkgdset(box, dlg.dialog.atr & A_COLOR);
100*53ee8cc1Swenshuai.xi
101*53ee8cc1Swenshuai.xi keypad(box, TRUE);
102*53ee8cc1Swenshuai.xi
103*53ee8cc1Swenshuai.xi /* register the new window, along with its borders */
104*53ee8cc1Swenshuai.xi draw_box(dialog, 0, 0, height, width,
105*53ee8cc1Swenshuai.xi dlg.dialog.atr, dlg.border.atr);
106*53ee8cc1Swenshuai.xi
107*53ee8cc1Swenshuai.xi wattrset(dialog, dlg.border.atr);
108*53ee8cc1Swenshuai.xi mvwaddch(dialog, height - 3, 0, ACS_LTEE);
109*53ee8cc1Swenshuai.xi for (i = 0; i < width - 2; i++)
110*53ee8cc1Swenshuai.xi waddch(dialog, ACS_HLINE);
111*53ee8cc1Swenshuai.xi wattrset(dialog, dlg.dialog.atr);
112*53ee8cc1Swenshuai.xi wbkgdset(dialog, dlg.dialog.atr & A_COLOR);
113*53ee8cc1Swenshuai.xi waddch(dialog, ACS_RTEE);
114*53ee8cc1Swenshuai.xi
115*53ee8cc1Swenshuai.xi print_title(dialog, title, width);
116*53ee8cc1Swenshuai.xi
117*53ee8cc1Swenshuai.xi print_button(dialog, gettext(" Exit "), height - 2, width / 2 - 4, TRUE);
118*53ee8cc1Swenshuai.xi wnoutrefresh(dialog);
119*53ee8cc1Swenshuai.xi getyx(dialog, cur_y, cur_x); /* Save cursor position */
120*53ee8cc1Swenshuai.xi
121*53ee8cc1Swenshuai.xi /* Print first page of text */
122*53ee8cc1Swenshuai.xi attr_clear(box, boxh, boxw, dlg.dialog.atr);
123*53ee8cc1Swenshuai.xi refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x);
124*53ee8cc1Swenshuai.xi
125*53ee8cc1Swenshuai.xi while ((key != KEY_ESC) && (key != '\n')) {
126*53ee8cc1Swenshuai.xi key = wgetch(dialog);
127*53ee8cc1Swenshuai.xi switch (key) {
128*53ee8cc1Swenshuai.xi case 'E': /* Exit */
129*53ee8cc1Swenshuai.xi case 'e':
130*53ee8cc1Swenshuai.xi case 'X':
131*53ee8cc1Swenshuai.xi case 'x':
132*53ee8cc1Swenshuai.xi delwin(box);
133*53ee8cc1Swenshuai.xi delwin(dialog);
134*53ee8cc1Swenshuai.xi return 0;
135*53ee8cc1Swenshuai.xi case 'g': /* First page */
136*53ee8cc1Swenshuai.xi case KEY_HOME:
137*53ee8cc1Swenshuai.xi if (!begin_reached) {
138*53ee8cc1Swenshuai.xi begin_reached = 1;
139*53ee8cc1Swenshuai.xi page = buf;
140*53ee8cc1Swenshuai.xi refresh_text_box(dialog, box, boxh, boxw,
141*53ee8cc1Swenshuai.xi cur_y, cur_x);
142*53ee8cc1Swenshuai.xi }
143*53ee8cc1Swenshuai.xi break;
144*53ee8cc1Swenshuai.xi case 'G': /* Last page */
145*53ee8cc1Swenshuai.xi case KEY_END:
146*53ee8cc1Swenshuai.xi
147*53ee8cc1Swenshuai.xi end_reached = 1;
148*53ee8cc1Swenshuai.xi /* point to last char in buf */
149*53ee8cc1Swenshuai.xi page = buf + strlen(buf);
150*53ee8cc1Swenshuai.xi back_lines(boxh);
151*53ee8cc1Swenshuai.xi refresh_text_box(dialog, box, boxh, boxw,
152*53ee8cc1Swenshuai.xi cur_y, cur_x);
153*53ee8cc1Swenshuai.xi break;
154*53ee8cc1Swenshuai.xi case 'K': /* Previous line */
155*53ee8cc1Swenshuai.xi case 'k':
156*53ee8cc1Swenshuai.xi case KEY_UP:
157*53ee8cc1Swenshuai.xi if (!begin_reached) {
158*53ee8cc1Swenshuai.xi back_lines(page_length + 1);
159*53ee8cc1Swenshuai.xi
160*53ee8cc1Swenshuai.xi /* We don't call print_page() here but use
161*53ee8cc1Swenshuai.xi * scrolling to ensure faster screen update.
162*53ee8cc1Swenshuai.xi * However, 'end_reached' and 'page_length'
163*53ee8cc1Swenshuai.xi * should still be updated, and 'page' should
164*53ee8cc1Swenshuai.xi * point to start of next page. This is done
165*53ee8cc1Swenshuai.xi * by calling get_line() in the following
166*53ee8cc1Swenshuai.xi * 'for' loop. */
167*53ee8cc1Swenshuai.xi scrollok(box, TRUE);
168*53ee8cc1Swenshuai.xi wscrl(box, -1); /* Scroll box region down one line */
169*53ee8cc1Swenshuai.xi scrollok(box, FALSE);
170*53ee8cc1Swenshuai.xi page_length = 0;
171*53ee8cc1Swenshuai.xi passed_end = 0;
172*53ee8cc1Swenshuai.xi for (i = 0; i < boxh; i++) {
173*53ee8cc1Swenshuai.xi if (!i) {
174*53ee8cc1Swenshuai.xi /* print first line of page */
175*53ee8cc1Swenshuai.xi print_line(box, 0, boxw);
176*53ee8cc1Swenshuai.xi wnoutrefresh(box);
177*53ee8cc1Swenshuai.xi } else
178*53ee8cc1Swenshuai.xi /* Called to update 'end_reached' and 'page' */
179*53ee8cc1Swenshuai.xi get_line();
180*53ee8cc1Swenshuai.xi if (!passed_end)
181*53ee8cc1Swenshuai.xi page_length++;
182*53ee8cc1Swenshuai.xi if (end_reached && !passed_end)
183*53ee8cc1Swenshuai.xi passed_end = 1;
184*53ee8cc1Swenshuai.xi }
185*53ee8cc1Swenshuai.xi
186*53ee8cc1Swenshuai.xi print_position(dialog);
187*53ee8cc1Swenshuai.xi wmove(dialog, cur_y, cur_x); /* Restore cursor position */
188*53ee8cc1Swenshuai.xi wrefresh(dialog);
189*53ee8cc1Swenshuai.xi }
190*53ee8cc1Swenshuai.xi break;
191*53ee8cc1Swenshuai.xi case 'B': /* Previous page */
192*53ee8cc1Swenshuai.xi case 'b':
193*53ee8cc1Swenshuai.xi case KEY_PPAGE:
194*53ee8cc1Swenshuai.xi if (begin_reached)
195*53ee8cc1Swenshuai.xi break;
196*53ee8cc1Swenshuai.xi back_lines(page_length + boxh);
197*53ee8cc1Swenshuai.xi refresh_text_box(dialog, box, boxh, boxw,
198*53ee8cc1Swenshuai.xi cur_y, cur_x);
199*53ee8cc1Swenshuai.xi break;
200*53ee8cc1Swenshuai.xi case 'J': /* Next line */
201*53ee8cc1Swenshuai.xi case 'j':
202*53ee8cc1Swenshuai.xi case KEY_DOWN:
203*53ee8cc1Swenshuai.xi if (!end_reached) {
204*53ee8cc1Swenshuai.xi begin_reached = 0;
205*53ee8cc1Swenshuai.xi scrollok(box, TRUE);
206*53ee8cc1Swenshuai.xi scroll(box); /* Scroll box region up one line */
207*53ee8cc1Swenshuai.xi scrollok(box, FALSE);
208*53ee8cc1Swenshuai.xi print_line(box, boxh - 1, boxw);
209*53ee8cc1Swenshuai.xi wnoutrefresh(box);
210*53ee8cc1Swenshuai.xi print_position(dialog);
211*53ee8cc1Swenshuai.xi wmove(dialog, cur_y, cur_x); /* Restore cursor position */
212*53ee8cc1Swenshuai.xi wrefresh(dialog);
213*53ee8cc1Swenshuai.xi }
214*53ee8cc1Swenshuai.xi break;
215*53ee8cc1Swenshuai.xi case KEY_NPAGE: /* Next page */
216*53ee8cc1Swenshuai.xi case ' ':
217*53ee8cc1Swenshuai.xi if (end_reached)
218*53ee8cc1Swenshuai.xi break;
219*53ee8cc1Swenshuai.xi
220*53ee8cc1Swenshuai.xi begin_reached = 0;
221*53ee8cc1Swenshuai.xi refresh_text_box(dialog, box, boxh, boxw,
222*53ee8cc1Swenshuai.xi cur_y, cur_x);
223*53ee8cc1Swenshuai.xi break;
224*53ee8cc1Swenshuai.xi case '0': /* Beginning of line */
225*53ee8cc1Swenshuai.xi case 'H': /* Scroll left */
226*53ee8cc1Swenshuai.xi case 'h':
227*53ee8cc1Swenshuai.xi case KEY_LEFT:
228*53ee8cc1Swenshuai.xi if (hscroll <= 0)
229*53ee8cc1Swenshuai.xi break;
230*53ee8cc1Swenshuai.xi
231*53ee8cc1Swenshuai.xi if (key == '0')
232*53ee8cc1Swenshuai.xi hscroll = 0;
233*53ee8cc1Swenshuai.xi else
234*53ee8cc1Swenshuai.xi hscroll--;
235*53ee8cc1Swenshuai.xi /* Reprint current page to scroll horizontally */
236*53ee8cc1Swenshuai.xi back_lines(page_length);
237*53ee8cc1Swenshuai.xi refresh_text_box(dialog, box, boxh, boxw,
238*53ee8cc1Swenshuai.xi cur_y, cur_x);
239*53ee8cc1Swenshuai.xi break;
240*53ee8cc1Swenshuai.xi case 'L': /* Scroll right */
241*53ee8cc1Swenshuai.xi case 'l':
242*53ee8cc1Swenshuai.xi case KEY_RIGHT:
243*53ee8cc1Swenshuai.xi if (hscroll >= MAX_LEN)
244*53ee8cc1Swenshuai.xi break;
245*53ee8cc1Swenshuai.xi hscroll++;
246*53ee8cc1Swenshuai.xi /* Reprint current page to scroll horizontally */
247*53ee8cc1Swenshuai.xi back_lines(page_length);
248*53ee8cc1Swenshuai.xi refresh_text_box(dialog, box, boxh, boxw,
249*53ee8cc1Swenshuai.xi cur_y, cur_x);
250*53ee8cc1Swenshuai.xi break;
251*53ee8cc1Swenshuai.xi case KEY_ESC:
252*53ee8cc1Swenshuai.xi key = on_key_esc(dialog);
253*53ee8cc1Swenshuai.xi break;
254*53ee8cc1Swenshuai.xi case KEY_RESIZE:
255*53ee8cc1Swenshuai.xi back_lines(height);
256*53ee8cc1Swenshuai.xi delwin(box);
257*53ee8cc1Swenshuai.xi delwin(dialog);
258*53ee8cc1Swenshuai.xi on_key_resize();
259*53ee8cc1Swenshuai.xi goto do_resize;
260*53ee8cc1Swenshuai.xi }
261*53ee8cc1Swenshuai.xi }
262*53ee8cc1Swenshuai.xi delwin(box);
263*53ee8cc1Swenshuai.xi delwin(dialog);
264*53ee8cc1Swenshuai.xi return key; /* ESC pressed */
265*53ee8cc1Swenshuai.xi }
266*53ee8cc1Swenshuai.xi
267*53ee8cc1Swenshuai.xi /*
268*53ee8cc1Swenshuai.xi * Go back 'n' lines in text. Called by dialog_textbox().
269*53ee8cc1Swenshuai.xi * 'page' will be updated to point to the desired line in 'buf'.
270*53ee8cc1Swenshuai.xi */
back_lines(int n)271*53ee8cc1Swenshuai.xi static void back_lines(int n)
272*53ee8cc1Swenshuai.xi {
273*53ee8cc1Swenshuai.xi int i;
274*53ee8cc1Swenshuai.xi
275*53ee8cc1Swenshuai.xi begin_reached = 0;
276*53ee8cc1Swenshuai.xi /* Go back 'n' lines */
277*53ee8cc1Swenshuai.xi for (i = 0; i < n; i++) {
278*53ee8cc1Swenshuai.xi if (*page == '\0') {
279*53ee8cc1Swenshuai.xi if (end_reached) {
280*53ee8cc1Swenshuai.xi end_reached = 0;
281*53ee8cc1Swenshuai.xi continue;
282*53ee8cc1Swenshuai.xi }
283*53ee8cc1Swenshuai.xi }
284*53ee8cc1Swenshuai.xi if (page == buf) {
285*53ee8cc1Swenshuai.xi begin_reached = 1;
286*53ee8cc1Swenshuai.xi return;
287*53ee8cc1Swenshuai.xi }
288*53ee8cc1Swenshuai.xi page--;
289*53ee8cc1Swenshuai.xi do {
290*53ee8cc1Swenshuai.xi if (page == buf) {
291*53ee8cc1Swenshuai.xi begin_reached = 1;
292*53ee8cc1Swenshuai.xi return;
293*53ee8cc1Swenshuai.xi }
294*53ee8cc1Swenshuai.xi page--;
295*53ee8cc1Swenshuai.xi } while (*page != '\n');
296*53ee8cc1Swenshuai.xi page++;
297*53ee8cc1Swenshuai.xi }
298*53ee8cc1Swenshuai.xi }
299*53ee8cc1Swenshuai.xi
300*53ee8cc1Swenshuai.xi /*
301*53ee8cc1Swenshuai.xi * Print a new page of text. Called by dialog_textbox().
302*53ee8cc1Swenshuai.xi */
print_page(WINDOW * win,int height,int width)303*53ee8cc1Swenshuai.xi static void print_page(WINDOW * win, int height, int width)
304*53ee8cc1Swenshuai.xi {
305*53ee8cc1Swenshuai.xi int i, passed_end = 0;
306*53ee8cc1Swenshuai.xi
307*53ee8cc1Swenshuai.xi page_length = 0;
308*53ee8cc1Swenshuai.xi for (i = 0; i < height; i++) {
309*53ee8cc1Swenshuai.xi print_line(win, i, width);
310*53ee8cc1Swenshuai.xi if (!passed_end)
311*53ee8cc1Swenshuai.xi page_length++;
312*53ee8cc1Swenshuai.xi if (end_reached && !passed_end)
313*53ee8cc1Swenshuai.xi passed_end = 1;
314*53ee8cc1Swenshuai.xi }
315*53ee8cc1Swenshuai.xi wnoutrefresh(win);
316*53ee8cc1Swenshuai.xi }
317*53ee8cc1Swenshuai.xi
318*53ee8cc1Swenshuai.xi /*
319*53ee8cc1Swenshuai.xi * Print a new line of text. Called by dialog_textbox() and print_page().
320*53ee8cc1Swenshuai.xi */
print_line(WINDOW * win,int row,int width)321*53ee8cc1Swenshuai.xi static void print_line(WINDOW * win, int row, int width)
322*53ee8cc1Swenshuai.xi {
323*53ee8cc1Swenshuai.xi int y, x;
324*53ee8cc1Swenshuai.xi char *line;
325*53ee8cc1Swenshuai.xi
326*53ee8cc1Swenshuai.xi line = get_line();
327*53ee8cc1Swenshuai.xi line += MIN(strlen(line), hscroll); /* Scroll horizontally */
328*53ee8cc1Swenshuai.xi wmove(win, row, 0); /* move cursor to correct line */
329*53ee8cc1Swenshuai.xi waddch(win, ' ');
330*53ee8cc1Swenshuai.xi waddnstr(win, line, MIN(strlen(line), width - 2));
331*53ee8cc1Swenshuai.xi
332*53ee8cc1Swenshuai.xi getyx(win, y, x);
333*53ee8cc1Swenshuai.xi /* Clear 'residue' of previous line */
334*53ee8cc1Swenshuai.xi #if OLD_NCURSES
335*53ee8cc1Swenshuai.xi {
336*53ee8cc1Swenshuai.xi int i;
337*53ee8cc1Swenshuai.xi for (i = 0; i < width - x; i++)
338*53ee8cc1Swenshuai.xi waddch(win, ' ');
339*53ee8cc1Swenshuai.xi }
340*53ee8cc1Swenshuai.xi #else
341*53ee8cc1Swenshuai.xi wclrtoeol(win);
342*53ee8cc1Swenshuai.xi #endif
343*53ee8cc1Swenshuai.xi }
344*53ee8cc1Swenshuai.xi
345*53ee8cc1Swenshuai.xi /*
346*53ee8cc1Swenshuai.xi * Return current line of text. Called by dialog_textbox() and print_line().
347*53ee8cc1Swenshuai.xi * 'page' should point to start of current line before calling, and will be
348*53ee8cc1Swenshuai.xi * updated to point to start of next line.
349*53ee8cc1Swenshuai.xi */
get_line(void)350*53ee8cc1Swenshuai.xi static char *get_line(void)
351*53ee8cc1Swenshuai.xi {
352*53ee8cc1Swenshuai.xi int i = 0;
353*53ee8cc1Swenshuai.xi static char line[MAX_LEN + 1];
354*53ee8cc1Swenshuai.xi
355*53ee8cc1Swenshuai.xi end_reached = 0;
356*53ee8cc1Swenshuai.xi while (*page != '\n') {
357*53ee8cc1Swenshuai.xi if (*page == '\0') {
358*53ee8cc1Swenshuai.xi if (!end_reached) {
359*53ee8cc1Swenshuai.xi end_reached = 1;
360*53ee8cc1Swenshuai.xi break;
361*53ee8cc1Swenshuai.xi }
362*53ee8cc1Swenshuai.xi } else if (i < MAX_LEN)
363*53ee8cc1Swenshuai.xi line[i++] = *(page++);
364*53ee8cc1Swenshuai.xi else {
365*53ee8cc1Swenshuai.xi /* Truncate lines longer than MAX_LEN characters */
366*53ee8cc1Swenshuai.xi if (i == MAX_LEN)
367*53ee8cc1Swenshuai.xi line[i++] = '\0';
368*53ee8cc1Swenshuai.xi page++;
369*53ee8cc1Swenshuai.xi }
370*53ee8cc1Swenshuai.xi }
371*53ee8cc1Swenshuai.xi if (i <= MAX_LEN)
372*53ee8cc1Swenshuai.xi line[i] = '\0';
373*53ee8cc1Swenshuai.xi if (!end_reached)
374*53ee8cc1Swenshuai.xi page++; /* move pass '\n' */
375*53ee8cc1Swenshuai.xi
376*53ee8cc1Swenshuai.xi return line;
377*53ee8cc1Swenshuai.xi }
378*53ee8cc1Swenshuai.xi
379*53ee8cc1Swenshuai.xi /*
380*53ee8cc1Swenshuai.xi * Print current position
381*53ee8cc1Swenshuai.xi */
print_position(WINDOW * win)382*53ee8cc1Swenshuai.xi static void print_position(WINDOW * win)
383*53ee8cc1Swenshuai.xi {
384*53ee8cc1Swenshuai.xi int percent;
385*53ee8cc1Swenshuai.xi
386*53ee8cc1Swenshuai.xi wattrset(win, dlg.position_indicator.atr);
387*53ee8cc1Swenshuai.xi wbkgdset(win, dlg.position_indicator.atr & A_COLOR);
388*53ee8cc1Swenshuai.xi percent = (page - buf) * 100 / strlen(buf);
389*53ee8cc1Swenshuai.xi wmove(win, getmaxy(win) - 3, getmaxx(win) - 9);
390*53ee8cc1Swenshuai.xi wprintw(win, "(%3d%%)", percent);
391*53ee8cc1Swenshuai.xi }
392