xref: /original-bsd/contrib/sc/help.c (revision d11ff5ba)
1 /*
2  * Help functions for sc
3  * R. Bond, 1988
4  * $Revision: 6.8 $
5  */
6 
7 #include <curses.h>
8 #include "sc.h"
9 
10 char *intro[] = {
11 " ",
12 " Overview:",
13 " ",
14 " A:   This overview",
15 " B:   Options",
16 " C:   Cursor movement commands",
17 " D:   Cell entry and editing commands",
18 " E:   Line Editing",
19 " F:   File commands",
20 " G:   Row and column commands",
21 " H:   Range commands",
22 " I:   Miscellaneous commands",
23 " J:   Variable names/Expressions",
24 " K:   Range functions",
25 " L:   Numeric functions",
26 " M:   String functions",
27 " N:   Financial functions",
28 " O:   Time and date functions",
29 " ",
30 " Q:   Return to main spreadsheet",
31 (char *)0
32 };
33 
34 char *options[] = {
35 " ",
36 " B: Options",
37 " ",
38 "     ^To  Toggle options. Toggle one option selected by o:",
39 " ",
40 "          a    Recalculate automatically or on ``@'' commands.",
41 "          c    Current cell highlighting enable/disable.",
42 "          e    External function execution enable/disable.",
43 "          n    If enabled, a digit starts a numeric value.",
44 "          t    Top line display enable/disable.",
45 "          x    Encrypt/decrypt database and listing files.",
46 "          $    Dollar prescale.  If enabled, all numeric constants.",
47 "               (not expressions) entered are multipled by 0.01.",
48 " ",
49 "     S    Set options.  Options include:",
50 " ",
51 "          byrows        Recalculate in row order. (default)",
52 "          bycols        Recalculate in column order.",
53 "          iterations=n  Set the number of iterations allowed. (10)",
54 "          tblstyle=xx   Set ``T'' output style to:",
55 "                        0 (none), tex, latex, or tbl.",
56 (char *)0
57 };
58 
59 char *cursor[] = {
60 " ",
61 " C: Cell cursor movement (always OK):",
62 " ",
63 "     ^N ^P ^B ^F Down, up, back, forward",
64 "     ^Ed         Go to end of range.  Follow ^E by a direction indicator",
65 "                 such as ^P or j.",
66 "     Arrow keys (if the terminal and termcap support them.)",
67 " ",
68 " Cell cursor movement if no prompt active:",
69 "     j,k,l,h    Down, up, right, left",
70 "     SPACE      Forward",
71 "     ^H         Back",
72 "     TAB        Forward, otherwise starts/ends a range",
73 "     ^          Up to row 0 of the current column.",
74 "     #          Down to the last valid row of the current column.",
75 "     0          Back to column A.  Preface with ^U if numeric mode.",
76 "     $          Forward to the last valid column of the current row.",
77 "     b          Back then up to the previous valid cell.",
78 "     w          Forward then down to the next valid cell.",
79 "     g          Go to a cell.  Cell name, range name, quoted string,",
80 "                or a number specify which cell.",
81 (char *)0
82 };
83 
84 
85 char *cell[] = {
86 " ",
87 " D: Cell entry and editing commands:",
88 " ",
89 "     =    Enter a numeric constant or expression.",
90 "     <    Enter a left justified string or string expression.",
91 "     \",>  Enter a right justified string or string expression.",
92 "     e    Edit the current cell's numeric value.",
93 "     E    Edit the current cell's string part.",
94 "     x    Clear the current cell.",
95 "     c    Copy the last marked cell to the current cell.",
96 "     m    Mark a cell to be used as the source for ``c''",
97 "     +    Increment numeric part",
98 "     -    Decrement numeric part",
99 " ",
100 "     In numeric mode, a decimal digit, ``+'', ``-'', and ``.'' all start",
101 "     a new numeric constant or expression.",
102 (char *)0
103 };
104 
105 
106 char *vi[] = {
107 " ",
108 " E: Line Editor",
109 " ",
110 "     Hitting the ESC key while entering any command on the top line",
111 "     will start a one-line vi-style editor.  Supported commands:",
112 " ",
113 "     ESC q        Abort command entry.",
114 "     h l          Move cursor forward, backward.",
115 "     0 $          Move cursor to the beginning, end of the line.",
116 "     b w          Move cursor forward/back one word.",
117 "     fc           Move cursor to character c.",
118 "     tc           Move the cursor the the character before c.",
119 "     i a          Enter insert mode before/after the cursor.",
120 "     I            Move to cursor column 0 and enter insert mode.",
121 "     x X          Delete the character under/before the cursor.",
122 "     rc           Replace the character under the cursor with c.",
123 "     cm           Change - m = b,f,h,l,t or w.",
124 "     dm           Delete - m = b,f,h,l,t or w.",
125 "     R            Enter replace (overstrike) mode.",
126 "     + j - k /    Forward/backward/search the command history.",
127 "     n            Repeat last history search.",
128 "     . u          Repeat/undo the last command.",
129 (char *)0
130 };
131 
132 char *file[] = {
133 " ",
134 " F: File commands:",
135 " ",
136 "     G    Get a new database from a file. ",
137 "     M    Merge a new file into the current database.",
138 "     P    Put the current database into a file.",
139 "     W    Write a listing of the current database into a file in",
140 "          a form that matches its appearance on the screen.",
141 "     T    Write a listing of the current database to a file, but",
142 "          put delimiters between each pair of fields.",
143 "          Optionally brackets output with control lines for ``tbl'',",
144 "          ``LaTeX'', or ``TeX''.",
145 " ",
146 "     If encryption mode is set, file I/O will be encrypted/decrypted.",
147 "     ``\"| program\"'' for a file name will pipe (unencrypted) output to",
148 "     a program for Put, Write and Table.  If a cell name is used",
149 "     as the file name, the cell's string part will be used as the",
150 "     file name.",
151 (char *)0
152 };
153 
154 
155 char *row[] = {
156 " ",
157 " G: Row and column commands:",
158 " ",
159 "     ir, ic      Insert a new, empty row (column)",
160 "     ar, ac      Append a new copy of the current row (column)",
161 "     dr, dc      Delete the current row (column)",
162 "     pr, pc, pm  Pull deleted cells back into the spreadsheet",
163 "                 Insert rows, columns or merge the cells.",
164 "     vr, vc      Remove expressions from the affected rows (columns),",
165 "                 leaving only the values.",
166 "     zr, zc      Hide (``zap'') the current row (column)",
167 "     sr, sc      Show hidden rows (columns)",
168 "     f           Set the output format to be used with the values of",
169 "                 each cell in this column.  Enter field width and",
170 "                 number of fractional digits.  A preceding count can be",
171 "                 used to change more than one column.",
172 " ",
173 "     Commands which move or copy cells also modify the row and column ",
174 "     references in the new cell expressions.  Use ``fixed'' or the",
175 "     ``$'' style cell reference to supress the change.",
176 (char *)0
177 };
178 
179 
180 char *range[] = {
181 " ",
182 " H: Range commands:",
183 " ",
184 "     /x   Clear a range. ",
185 "     /v   Remove the expressions from a range of cells, leaving ",
186 "          just the values.",
187 "     /c   Copy a source range to a destination range.",
188 "     /f   Fill a range with constant values starting with a given",
189 "          value and increasing by a given increment.",
190 "     /d   Assign a name to a cell or a range of cells.  Give the",
191 "          the name, surrounded by quotes, and either a cell name such",
192 "          as ``A10'' or a range such as ``a1:b20''.",
193 "     /s   Shows the currently defined range names.  Pipe output to",
194 "          sort, then to less.",
195 "     /u   Use this command to undefine a previously defined range",
196 "          name.",
197 " ",
198 "     Range operations affect a rectangular region on the screen",
199 "     defined by the upper left and lower right cells in the region.",
200 "     A range is specified by giving the cell names separated by ``:'',",
201 "     such as ``a20:k52''.  Another way to refer to a range is to use",
202 "     a name previously defined using ``/d''.",
203 (char *)0
204 };
205 
206 
207 char *misc[] = {
208 " ",
209 " I: Miscellaneous commands:",
210 " ",
211 "     Q q ^C   Exit from the program.",
212 "     ^G ESC   Abort entry of the current command.",
213 "     ?        Help",
214 "     !        Shell escape.  Enter a command to run.  ``!!'' repeats",
215 "              the last command.  Just ``!'' starts an interactive shell.",
216 "     ^L       Redraw the screen.",
217 "     ^R       Redraw the screen.  Highlight cells with values but no",
218 "              expressions.",
219 "     ^X       Redraw the screen.  Show formulas, not values.",
220 "     @        Recalculate the spreadsheet.",
221 "     ^V       Type, in the command line, the name of the current cell.",
222 "     ^W       Type, in the command line, the current cell's expression.",
223 "     ^A       Type, in the command line, the current cell's numeric value.",
224 "     TAB      When the character cursor is on the top line TAB can be used",
225 "              to start or stop the display of the default range.",
226 (char *)0
227 };
228 
229 char *var[] = {
230 " ",
231 " J: Variable names:",
232 " ",
233 "     K20    Row and column can vary on copies.",
234 "     $K$20  Row and column stay fixed on copies.",
235 "     $K20   Row can vary; column stays fixed on copies.",
236 "     K$20   Row stays fixed; column can vary on copies.",
237 "     fixed  holds following expession fixed on copies.",
238 "     Cells and ranges can be given a symbolic name via ``/d''.",
239 " ",
240 " Expressions:",
241 "     -e      Negation                e<=e  Less than or equal",
242 "     e+e     Addition                e=e   Equal",
243 "     e-e     Subtraction             e!=e  Not Equal",
244 "     e*e     Multiplication          e>=e  Greater than or equal",
245 "     e/e     Division                e>e  Greater than",
246 "     e%e     Modulo                  e<e  Less than",
247 "     e^e     Exponentiation          e&e  Boolean operator AND.",
248 "     ~e      Boolean operator NOT    e|e  Boolean operator OR",
249 "     e?e1:e2  or @if(e,e1,e2)",
250 "             Conditional: If e is non zero then then e1, else e2.",
251 "     Terms may be constants, variables, and parenthesized expressions.",
252 (char *)0
253 };
254 
255 char *rangef[] = {
256 " ",
257 " K: Range functions:",
258 " ",
259 "     @sum(r)           Sum all valid cells in the range.",
260 "     @prod(r)          Multiply together all valid cells in the range.",
261 "     @avg(r)           Average all valid cells in the range.",
262 "     @count(r)         Count all valid cells in the range.",
263 "     @max(r)           Return the maximum value in the range.",
264 "     @min(r)           Return the minimum value in the range.",
265 "     @stddev(r)        Return the sample standard deviation of ",
266 "                       the cells in the range.",
267 "     @index(e,r) @stindex(e,r)",
268 "                       Return the numeric (string) value of the cell at",
269 "                       index e into range r.",
270 "     @lookup(e,r) @hlookup(e,r,n) @vlookup(e,r,n)",
271 "                       Search through the range r for a value that",
272 "                       matches e.  If e is numeric, the last value <= e",
273 "                       matches; if string, an exact match is required.",
274 "                       @lookup searches a single row (column) and returns",
275 "                       the value from the next column (row); @hlookup",
276 "                       (@vlookup) searches the first row (column) in r and",
277 "                       returns the value n columns (rows) from the match.",
278 (char *)0
279 };
280 
281 char *numericf[] = {
282 " ",
283 " L: Numeric functions:",
284 " ",
285 "     @atan2(e1,e2)     Arc tangent of e1/e2.",
286 "     @ceil(e)          Smallest integer not less than e.",
287 "     @eqs(se1,se2)     1 if string expr se1 has the same value as se2.",
288 "     @exp(e)           Exponential function of e.",
289 "     @abs(e) @fabs(e)  Absolute value of e.",
290 "     @floor(e)         The largest integer not greater than e.",
291 "     @hypot(x,y)       Sqrt(x*x+y*y).",
292 "     @max(e1,e2,...)   The maximum of the values of the e's.",
293 "     @min(e1,e2,...)   The minimum of the values of the e's",
294 "     @nval(se,e)       The numeric value of a named cell.",
295 "     pi                A constant quite close to pi.",
296 "     @pow(e1,e2)       e1 raised to the power of e2.",
297 "     @rnd(e)           Round e to the nearest integer.",
298 "     @round(e,n)       Round e to n decimal places.",
299 "     @sqrt(e)          Square root of e.",
300 "     @ston(se)         Convert string expr se to a numeric",
301 "     @ln(e)   @log(e)           Natural/base 10 logarithm of e.",
302 "     @dtr(e)  @rtd(e)           Convert degrees to/from radians.",
303 "     @cos(e)  @sin(e)  @tan(e)  Trig functions of radian arguments.",
304 "     @asin(e) @acos(e) @atan(e) Inverse trig function.",
305 (char *)0
306 };
307 
308 char *stringf[] = {
309 " ",
310 " M: String functions:",
311 " ",
312 "     #                 Concatenate strings.  For example, the",
313 "                       string expression ``A0 # \"zy dog\"'' yields",
314 "                       ``the lazy dog'' if A0 is ``the la''.",
315 "     @substr(se,e1,e2) Extract characters e1 through e2 from the",
316 "                       string expression se.  For example,",
317 "                       ``@substr(\"Nice jacket\" 4, 7)'' yields ",
318 "                       ``e jac''.",
319 "     @fmt(se,e)        Convert a number to a string using sprintf(3).",
320 "                       For example,  ``@fmt(\"*%6.3f*\",10.5)'' yields",
321 "                       ``*10.500*''.  Use formats are e, E, f, g, and G.",
322 "     @sval(se,e)       Return the string value of a cell selected by name.",
323 "     @ext(se,e)        Call an external function (program or",
324 "                       script).  Convert e to a string and append it",
325 "                       to the command line as an argument.  @ext yields",
326 "                       a string: the first line printed to standard",
327 "                       output by the command.",
328 "     String expressions are made up of constant strings (characters",
329 "     surrounded by quotes), variables, and string functions.",
330 (char *)0
331 };
332 
333 
334 char *finf[] = {
335 " ",
336 " N: Financial functions:",
337 " ",
338 "     @pmt(e1,e2,e3)    @pmt(60000,.01,360) computes the monthly",
339 "                       payments for a $60000 mortgage at 12%",
340 "                       annual interest (.01 per month) for 30",
341 "                       years (360 months).",
342 " ",
343 "     @fv(e1,e2,e3)     @fv(100,.005,36) computes the future value",
344 "                       of 36 monthly payments of $100 at 6%",
345 "                       interest (.005 per month).  It answers the",
346 "                       question:  ``How much will I have in 36",
347 "                       months if I deposit $100 per month in a",
348 "                       savings account paying 6% interest com-",
349 "                       pounded monthly?''",
350 " ",
351 "     @pv(e1,e2,e3)     @pv(1000,.015,36) computes the present",
352 "                       value of an ordinary annuity of 36",
353 "                       monthly payments of $1000 at 18% annual",
354 "                       interest.  It answers the question: ``How",
355 "                       much can I borrow at 18% for 30 years if I",
356 "                       pay $1000 per month?''",
357 (char *)0
358 };
359 
360 
361 char *timef[] = {
362 " ",
363 " O: Time and date functions:",
364 " ",
365 "     @now              Return the time encoded in seconds since 1970.",
366 "     @dts(m,d,y)       Return m/d/y encoded in seconds since 1970.",
367 "     @tts(h,m,s)       Return h:m:s encoded in seconds since midnight.",
368 " ",
369 "     All of the following take an argument expressed in seconds:",
370 " ",
371 "     @date(e)          Convert the time in seconds to a date",
372 "                       string 24 characters long in the following",
373 "                       form: ``Sun Sep 16 01:03:52 1973''.  Note",
374 "                       that you can extract pieces of this fixed format",
375 "                       string with @substr.",
376 "     @year(e)          Return the year.  Valid years begin with 1970.",
377 "     @month(e)         Return the month: 1 (Jan) to 12 (Dec).",
378 "     @day(e)           Return the day of the month: 1 to 31.",
379 "     @hour(e)          Return the number of hours since midnight: 0 to 23.",
380 "     @minute(e)        Return the number of minutes since the",
381 "                       last full hour: 0 to 59.",
382 "     @second(e)        Return the number of seconds since the",
383 "                       last full minute: 0 to 59.",
384 (char *)0
385 };
386 void
387 help()
388 {
389     int option;
390     char **ns = intro;
391 
392     while((option = pscreen(ns)) != 'q' && option != 'Q') {
393     	switch (option) {
394 	case 'a': case 'A': ns = intro; break;
395 	case 'b': case 'B': ns = options; break;
396 	case 'c': case 'C': ns = cursor; break;
397 	case 'd': case 'D': ns = cell; break;
398 	case 'e': case 'E': ns = vi; break;
399 	case 'f': case 'F': ns = file; break;
400 	case 'g': case 'G': ns = row; break;
401 	case 'h': case 'H': ns = range; break;
402 	case 'i': case 'I': ns = misc; break;
403 	case 'j': case 'J': ns = var; break;
404 	case 'k': case 'K': ns = rangef; break;
405 	case 'l': case 'L': ns = numericf; break;
406 	case 'm': case 'M': ns = stringf; break;
407 	case 'n': case 'N': ns = finf; break;
408 	case 'o': case 'O': ns = timef; break;
409 	default: ns = intro; break;
410 	}
411     }
412     FullUpdate++;
413     (void) move(1,0);
414     (void) clrtobot();
415 }
416 
417 pscreen(screen)
418 char *screen[];
419 {
420     int line;
421     int dbline;
422 
423     (void) move(1,0);
424     (void) clrtobot();
425     dbline = 1;
426     for (line = 0; screen[line]; line++) {
427 	(void) move(dbline++, 4);
428 	(void) addstr (screen[line]);
429 	(void) clrtoeol();
430     }
431     (void) move(0,0);
432     (void) printw("Which Screen? [a-n, q]");
433     (void) clrtoeol();
434     (void) refresh();
435     return(nmgetch());
436 }
437