1/***************************************************************
2 *
3 * Program:	help.c
4 * Author:	Marc van Kempen
5 * Desc:	get help
6 *
7 *
8 * Copyright (c) 1995, Marc van Kempen
9 *
10 * All rights reserved.
11 *
12 * This software may be used, modified, copied, distributed, and
13 * sold, in both source and binary form provided that the above
14 * copyright and these terms are retained, verbatim, as the first
15 * lines of this file.  Under no circumstances is the author
16 * responsible for the proper functioning of this software, nor does
17 * the author assume any responsibility for damages incurred with
18 * its use.
19 *
20 ***************************************************************/
21
22#include <stdlib.h>
23#include <sys/param.h>
24#include <sys/types.h>
25#include <sys/stat.h>
26#include <string.h>
27#include <dialog.h>
28
29static char	_helpfilebuf[MAXPATHLEN];
30static char	_helplinebuf[77];	  /* limit the helpline to 76 characters */
31static char	*_helpfile = NULL;
32static char	*_helpline = NULL;
33
34/******************************************************************
35 *
36 * 	helpfile routines
37 *
38 ******************************************************************/
39
40void
41use_helpfile(char *hfile)
42/*
43 * desc: set the helpfile to be opened on pressing F1 to <helpfile>
44 */
45{
46    if (hfile != NULL) {
47	_helpfile = _helpfilebuf;
48	strcpy(_helpfile, hfile);
49    } else {
50	_helpfile = NULL;
51    }
52
53    return;
54} /* use_helpfile() */
55
56void
57display_helpfile(void)
58/*
59 * desc: display the current helpfile in a window
60 */
61{
62    WINDOW	*w;
63    FILE	*f;
64    struct stat sb;
65    char	msg[80], *buf;
66    static int	in_help = FALSE;
67    char        *savehline = NULL;
68
69    if (in_help) return;	/* dont call help when you're in help */
70
71    if (_helpfile != NULL) {
72	if ((w = dupwin(newscr)) == NULL) {
73	    dialog_notify("No memory to dup previous screen\n");
74	    return;
75	}
76	if ((f = fopen(_helpfile, "r")) == NULL) {
77	    sprintf(msg, "Can't open helpfile : %s\n", _helpfile);
78	    dialog_notify(msg);
79	    return;
80	}
81	if (fstat(fileno(f), &sb)) {
82	    sprintf(msg, "Can't stat helpfile : %s\n", _helpfile);
83	    dialog_notify(msg);
84	    return;
85	}
86	if ((buf = (char *) malloc( sb.st_size )) == NULL) {
87	    sprintf(msg, "Could not malloc space for helpfile : %s\n", _helpfile);
88	    dialog_notify(msg);
89	    return;
90	}
91	if (fread(buf, 1, sb.st_size, f) != sb.st_size) {
92	    sprintf(msg, "Could not read entire help file : %s", _helpfile);
93	    dialog_notify(msg);
94	    free(buf);
95	    return;
96	}
97	buf[sb.st_size] = 0;
98	in_help = TRUE;
99	savehline = get_helpline();
100	use_helpline("Use arrowkeys, PgUp, PgDn, Home and End to move through text");
101	dialog_mesgbox("Online help", buf, LINES-4, COLS-4);
102	restore_helpline(savehline);
103	in_help = FALSE;
104	touchwin(w);
105	wrefresh(w);
106	delwin(w);
107	free(buf);
108    } else {
109	/* do nothing */
110    }
111
112    return;
113} /* display_helpfile() */
114
115
116/******************************************************************
117 *
118 * 	helpline routines
119 *
120 ******************************************************************/
121
122void
123use_helpline(char *hline)
124/*
125 * desc: set the helpline to printed in dialogs
126 */
127{
128    if (hline) {
129	_helpline = _helplinebuf;
130	if (strlen(hline) > 76) {
131	    /* only display the first 76 characters in the helpline */
132	    strncpy(_helpline, hline, 76);
133	    _helpline[76] = 0;
134	} else {
135	    strcpy(_helpline, hline);
136	}
137    } else {
138	_helpline = NULL;
139    }
140
141    return;
142} /* use_helpline() */
143
144void
145display_helpline(WINDOW *w, int y, int width)
146/*
147 * desc: display the helpline at the given coordinates <y, x> in the window <w>
148 */
149{
150    if (_helpline != NULL) {
151	if (strlen(_helpline) > width - 6) {
152	    _helpline[width - 6] = 0;
153	}
154	wmove(w, y, (int) (width - strlen(_helpline)- 4) / 2);
155	wattrset(w, title_attr);
156	waddstr(w, "[ ");
157	waddstr(w, _helpline);
158	waddstr(w, " ]");
159    } else {
160	/* do nothing */
161    }
162
163    return;
164}
165
166char *
167get_helpline(void)
168/*
169 * desc: allocate new space, copy the helpline to it and return a pointer to it
170 */
171{
172    char *hlp;
173
174    if (_helpline) {
175        hlp = (char *) malloc( strlen(_helpline) + 1 );
176        strcpy(hlp, _helpline);
177    } else {
178        hlp = NULL;
179    }
180
181    return(hlp);
182} /* get_helpline() */
183
184void
185restore_helpline(char *helpline)
186/*
187 * Desc: set the helpline to <helpline> and free the space allocated to it
188 */
189{
190    use_helpline(helpline);
191    free(helpline);
192
193    return;
194} /* restore_helpline() */
195