home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / apps / 223 / emacssrc / help.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-02-17  |  18.2 KB  |  604 lines

  1. /*
  2.  * This file supplies the help facilities.
  3.  * By Moshe braner, 8606--.
  4.  * changes by John Stanley, 87-Feb-06
  5.  */
  6.  
  7. #include    <stdio.h>
  8. #include    "ed.h"
  9.  
  10. #if HELP
  11.  
  12. #if AtST
  13. /* overlay "me2"        dal: not available in Alcyon C */
  14. #endif
  15.  
  16. #if AtST
  17.  
  18. static char *help_menu[] = 
  19.     {
  20. "--{ Main Help Menu }--    ",
  21. " ",
  22. "    D. Disk Files                S. Searching",
  23. "    B. Buffers                C. Cursor Control",
  24. "    W. Window Control            I. Insert and Delete",
  25. "    M. Mouse Control            P. Paste Buffer",
  26. "    O. Other Stuff                F. Function Keys",
  27. " ",
  28. "    T. Transposition / Capital & Control Characters",
  29. "    Q. Quitting microEMACS / Text Formatting",
  30. "    A. Alternate character set",
  31. ""
  32.     };
  33.  
  34. static char *disk_cmds[] = 
  35.     {
  36. "-- [D] --<{ Disk Files }>--",
  37. " For the Visit and Read commands, if the typed filename contains wildcard",
  38. " characters ('?' or '*') EMACS will display a list of matching files.",
  39. " ",
  40. "[Alt-V]   Visit a file. (also [Alt-F3])  Reads a file into new buffer.",
  41. "        Flags buffer as view-only (press [Alt-E] to edit).",
  42. "[F4]      Read file into current buffer, optionaly erasing previous contents.",
  43. "        No new buffer will be created.  Flags current buffer as editable.",
  44. "[Alt-S]   Save current buffer to disk.  Overwrites previous version of file.",
  45. "[Alt-W]   Write current buffer to disk.  Type a filename or Return for default.",
  46. "[^X][^F]  Set a new default filename for the current buffer",
  47. ""
  48.     };
  49.  
  50. static char *buf_cmds[] = 
  51.     {
  52. "-- [B] --<{ Buffers }>--",
  53. "A BUFFER is a named area containing a document being edited.  Many buffers may",
  54. "be active at once.  Each buffer has a name, which is typically the lowercased",
  55. "disk filename of the document it contains.",
  56. " ",
  57. "    [Shift-Help]   Display a list of all current buffers",
  58. "    [^X][^B]  Enter a new name for current buffer",
  59. "    [Alt-J]   Jump to next buffer in buffer list",
  60. "    [Alt-B]   Switch to another buffer by name (default: previous one)",
  61. "    [Alt-K]   Kill a buffer (buffer can't be showing in any window)",
  62. "  (At the Switch or Kill prompt use [+] or [-] to step thru the buffer list.)",
  63. ""
  64.     };
  65.  
  66. static char *wind_cmds[] = 
  67.     {
  68. "-- [ W ] --<{ Window control }>--",
  69. "Many windows may be active at once on the screen.",
  70. "Windows can show different buffers, or different parts of the same buffer.",
  71. " ",
  72. " [Alt-2]  Split current window in two        [Alt-N]  Cursor to next window",
  73. " [Alt-1]  Remove all but current window     [Alt-P]  Cursor to previous window",
  74. #if EXTRA
  75. " [Alt-^]  Enlarge current window",
  76. #endif
  77. " ",
  78. #if EXTRA
  79. " [Shift-Up]   Scroll window up one line        [Alt-F9]  Page other window up",
  80. " [Shift-Down] Scroll window down one line   [Alt-F10] Page other window down",
  81. #else
  82. " [Alt-F9]  Page other window up",
  83. " [Alt-F10] Page other window down",
  84. #endif
  85. " [Home]       Scroll current line to top (or <argument> window position)",
  86. ""
  87.     };
  88.  
  89. static char *mouse1[] = 
  90.     {
  91. "-- [ M1 ] --<{ Mouse Control }>--",
  92. " ",
  93. "The mouse can be used in place of the cursor keys for cursor motion.",
  94. "    [ESC]##[ESC][X]  Set horizontal scale for mouse motion to ##",
  95. "    [ESC]##[ESC][Y]  Set vertical scale for mouse motion to ##",
  96. " ",
  97. "    [ESC][M]    Toggle mouse-button mode (mark-del-paste / do-bound-functions)",
  98. "        (see the next two screens for more on this)",
  99. " ",
  100. "<<Press [+] for more>>",
  101. ""
  102.     };
  103.  
  104. static char *mouse2[] = 
  105.     {
  106. "-- [ M2 ] --<{ More Mouse Info }>--",
  107. " ",
  108. "The mouse buttons have two very(!) distinctly different",
  109. "command sets depending on the mouse-button mode:",
  110. " ",
  111. "MARK-DELETE-PASTE MODE:  For rapid moving/editing of text. (default mode)",
  112. "    [Left-Button]   Set Mark",
  113. "    [RightButton]   (after setting a Mark) Delete region (copy if non-editable)",
  114. "            (after delete-region)  Paste (until another mark is set)",
  115. " ",
  116. "<<Press [+] for more>>",
  117. ""
  118.     };
  119.  
  120. static char *mouse3[] = 
  121.     {
  122. "-- [ M3 ] --<{ Last Mouse Info }>--",
  123. " ",
  124. "BOUND-FUNCTION MODE:  Only single commands can be bound to the mouse buttons,",
  125. " but you can bind [F1] to a button and then record/replay a series of keys",
  126. " using the macro functions.  See [O] or [F] for info on macros.",
  127. " ",
  128. "    [SHIFT-Left-Button]<command>   Bind <command> to left mouse button",
  129. "    [SHIFT-RightButton]<command>   Bind <command> to right mouse button",
  130. "    [Left-Button]   Execute left button command",
  131. "    [RightButton]   Execute right button command",
  132. ""
  133.     };
  134.  
  135. char *other_cmds[] = 
  136.     {
  137. "-- [ O ] --<{ Other Stuff }>--",
  138. "    [Undo]    Cancel current command and returns to top level of processing.",
  139. "                (Also will undo a kill, cut or paste.)",
  140. "    [Esc]<##>  Argument (numerical) prefix.  Some commands take a number as an",
  141. "            argument.  Most commands will repeat next command <##> times.",
  142. "    [Alt-F1]  Begin/End a macro definition: stores keystrokes (also [Alt-M])",
  143. "    [F1]      Execute the macro (keystrokes stored using Alt-F1)",
  144. "    [Alt-=]   Position report -- displays line number, column, ASCII code",
  145. "    [Alt-E]   Toggle between edit & view-only modes",
  146. "    [Alt-I]   Toggle between insert & overstrike modes",
  147. "    [Alt-Q]   Toggle visibility of tabs, spaces & newlines",
  148. ""
  149.     };
  150.  
  151. char *search_cmds[] = 
  152.     {
  153. "-- [ S ] --<{ Searching }>--",
  154. " ",
  155. "    [F8] or [^S]  Search forward.  Type in a string to be searched for.",
  156. "        End search string with [Esc] (or with [^C] to ignore case).",
  157. "        [?] matches any one character.",
  158. "        [^W] matches any amount of white space (including none).",
  159. "    [F7] or [^R]  Reverse search.  Like above, but backwards from cursor.",
  160. "  ",
  161. "    [Alt-F8] or [Alt-)]   Search forward for matching brace",
  162. "    [Alt-F7] or [Alt-(]   Same - backwards    ('brace' == (), [], or {})",
  163. ""
  164.     };
  165.  
  166. char *curs_ctrl[] = 
  167.     {
  168. "-- [ C ] --<{ Cursor Control Functions }>--",
  169. " ",
  170. "____________|_[Left]_or_[Right]_|__[Up]_or_[Down]___|_______[Home]_____________",
  171. "Normal        | Move one char    | Move one Line     | Place line at window top",
  172. #if EXTRA
  173. "[Shift]        | Move by words    | Scroll window     |  ...does nothing...",
  174. "[Control]   | Start/End of line | Page up/down      | Jump to end of file",
  175. "After [ESC] | Start/End of line | paragraph up/down | Jump to start of file",
  176. #else
  177. "[Shift]        | Move by words    | ..does nothing..  |  ...does nothing...",
  178. "[Control]   | Start/End of line | Page up/down      | Jump to end of file",
  179. "After [ESC] | Start/End of line | ..does nothing..  | Jump to start of file",
  180. #endif
  181. " ",
  182. "Other:    [Home]        Shift current line to top line of window",
  183. "    [Esc]##[Home]    Shift current line to window line ##",
  184. "    [Esc]##[Alt-G]    Goto line number ## of file",
  185. ""
  186.     };
  187.  
  188. static char *insdel[] = 
  189.     {
  190. "-- [ I ] --<{ Insert and Delete }>--",
  191. " ",
  192. "_______________|_____[Backspace]______|_______[Delete]______|_____[Insert]_____",
  193. "Normal         | Delete previous char | Delete current char | Insert blank line",
  194. #if EXTRA
  195. "[Shift]or[Ctrl]| Del.to start of line | Del. to end of line | Kill blank lines",
  196. "After [ESC]    | Delete previous word | Delete next word    | ..does nothing..",
  197. #else
  198. "[Shift]or[Ctrl]| Del.to start of line | Del. to end of line | ..does nothing..",
  199. "After [ESC]    | Delete previous word | ..does nothing..    | ..does nothing..",
  200. #endif
  201. "    (Note: The above delete functions place the deleted text in the paste",
  202. "     buffer.  See the next help-screen [P] for more paste buffer commands.)",
  203. " ",
  204. "    [Return]  Insert a newline.        [Control-Return]  Newline+Indent.",
  205. "    [Tab]     Insert a tab character (with numeric argument: sets tab size).",
  206. ""
  207.     };
  208.  
  209. static char *paste_cmds[] = 
  210.     {
  211. "-- [ P ] --<{ Paste Buffer }>--     (See alternative/additional paste buffer",
  212. "                     keys in the [F] and [I] helpscreens.)",
  213. " ",
  214. "    [^K]        Kill (delete) to end of line (saves in paste Buffer)",
  215. "    [^X][ ]        Mark start of region (other end is cursor)",
  216. "    [^X][^X]    Swaps mark and cursor",
  217. "    [^W]        Delete region (places region in paste buffer)",
  218. "    [Esc][W]    Copy region   (puts copy of region in paste buffer)",
  219. "    [^Y]        Paste ('yank') contents of Kill Buffer back, at cursor",
  220. "    [Undo]        Undo the Delete (or Paste) just done",
  221. "    [Alt-Undo]  Flush paste buffer into a buffer called '[]'",
  222. ""
  223.     };
  224.  
  225. static char *funckeys[] = 
  226.     {
  227. "-- [ F ] --<{ Function Keys }>--  |_____with_[Shift],_[Control],_or_[Alt]_____",
  228. " [F1]    | Execute macro.........  | Start/End macro definiton",
  229. " [F2]    | Set mark..............  | Swap cursor and mark",
  230. " [F3]    | Switch buffer.........  | Visit a file",
  231. " [F4]    | Read a file...........  | Write buffer to a file",
  232. " [F5]    | Delete to end of line.  | Delete ('wipe') region",
  233. " [F6]    | Paste ('yank')........  | Copy region",
  234. " [F7]    | Search backward.......  | Find matching left (, [, or {",
  235. " [F8]    | Search forward........  | Find matching right ), ], or }",
  236. " [F9]    | Page Up...............  | Page Up in other window",
  237. " [F10]    | Page Down.............  | Page Down in other window",
  238. ""
  239.     };
  240.  
  241. static char *transp_cap[] = 
  242.     {
  243. "-- [ T ] --<{ Transposition / Capital & control characters }>--",
  244. " ",
  245. "    [^T]  Transpose characters    [Alt-T]  Transpose lines",
  246. #ifdef EXTRA
  247. " ",
  248. "    [Esc][U]  Uppercase word    ^X^U   Convert region to uppercase",
  249. "    [Esc][L]  Lowercase word    ^X^L   Convert region to lowercase",
  250. "    [Esc][C]  Capitalize word     (Use [F2] to mark start of region)",
  251. #endif
  252. " ",
  253. "    [Esc][Q] or [^Q]  Quote.  Enter next char as-is (to insert ctrl chars)",
  254. "    [Alt-A]           Enter next char with high-bit set (graphics chars)",
  255. ""
  256.     };
  257.  
  258. char *fmt_prog[] = 
  259.     {
  260. "-- [ Q ] --<{ Quitting microEMACS and Text Formatting }>--",
  261. "    [^Z]       Save this buffer if changed, then Exit MicroEMACS",
  262. "    [^C]       Abort without saving any changes",
  263. "    [Alt-D]    Execute a single non-GEM program or internal shell command",
  264. "    [Alt-C]       Enter internal command shell",
  265. "    [Esc][^C]  \"Clone\" MicroEMACS with current configuration",
  266. " ",
  267. "    [Esc]##[Tab]    Sets tab spacing to <##> columns between tabs",
  268. "    [Esc]##[Alt-R]  Sets right margin to column <##>",
  269. "    [Esc]##[Alt-L]  Sets left margin to column <##>",
  270. "    [Alt-F]   Format text to fit margins (with argument = double spaced)",
  271. ""
  272.     };
  273.  
  274. char *alt_chars[] = 
  275.     {
  276. "\t ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_",
  277. "\t üéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥ßƒ    <--  [Alt-A][Control-...]",
  278. " ",
  279. "\t !\"#$%&'()*+,-./0123456789:;<=>?",
  280. "\táíóúñѪº¿⌐¬½¼¡«»ãõØøœŒÀÃÕ¨´†¶©®™    <--  [Alt-A][...]",
  281. " ",
  282. "\t@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_",
  283. "\tijIJאבגדהוזחטיכלמנסעפצקרשתןךםףץ§∧∞",
  284. " ",
  285. "\t`abcdefghijklmnopqrstuvwxyz{|}~",
  286. "\tαβΓπΣσµτΦΘΩδ∮ϕ∈∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²³",
  287. ""
  288.     };
  289.  
  290. #else
  291.  
  292. /* if not AtST: */
  293.  
  294. char *help_menu[] = 
  295.     {
  296. "--{ Main Help Menu }--    ",
  297. " ",
  298. "    D. Disk Files                S. Searching",
  299. "    B. Buffers                C. Cursor Control",
  300. "    W. Window Control            I. Insert and Delete",
  301. "    O. Other Stuff                M. Move Text",
  302. " ",
  303. "    T. Transposition / Capital & Control Characters",
  304. "    Q. Quitting microEMACS / Text Formatting",
  305. ""
  306.     };
  307.  
  308. char *curs_ctrl[] = 
  309.     {
  310. " ",
  311. "^F    Forward character    E-F   Forward word       Keypad arrows",
  312. "^B    Backward character   E-B   Backward word       are active!",
  313. "^A    Front of line        ^E    End of line",
  314. "^N    Next line            ^P    Previous line",
  315. #if EXTRA
  316. "E-N   Next paragraph       E-P   Previous paragraph",
  317. #endif
  318. "^V    Scroll down          E-V   Scroll up",
  319. "E-<   Begining of file     E->   End of file",
  320. "E-.   Set MARK at current cursor position",
  321. "^X^X  eXchange mark and cursor",
  322. ""
  323.     };
  324.  
  325. char *insdel[] = 
  326.     {
  327. " ",
  328. "^H (BS) Delete previous character   ^D (DEL) Delete current character",
  329. #if EXTRA
  330. "E-^H    Delete previous word        E-^D     Delete next word",
  331. #endif
  332. "^O     Open (insert) line",
  333. #if EXTRA
  334. "^X^O   Kill blank lines around cursor",
  335. #endif
  336. "^K     Kill (delete) to end of line (if at end: kill linebreak)",
  337. "^W     Kill (Wipe) region between mark (set using E-.) and cursor",
  338. "^J     Insert a newline and indent",
  339. "^I or <TAB>  Insert a tab character (with argument: set tab size)",
  340. ""
  341.     };
  342.  
  343. char *search_cmds[] = 
  344.     {
  345. " ",
  346. "E-S  Search forward. Type in a string to be searched for, end it with",
  347. "     ESC (or with ^C to ignore case differences). '?' matches any one",
  348. "     character, ^W matches any amount of white space (including none).",
  349. "E-R  As above, but Reverse search from cursor position back.",
  350. " ",
  351. "E-G   Goto line by number (precede with argument: E-#-E-G)",
  352. "E-)   (or E-}) Search forward for complementing brace",
  353. "E-(   (or E-{) Same - backwards",
  354. ""
  355.     };
  356.  
  357. char *transp_cap[] = 
  358.     {
  359. " ",
  360. "^T     Transpose characters    ^X T   Transpose lines",
  361. #if EXTRA
  362. " ",
  363. "E-U    UPPERCASE word          E-L    lowercase word",
  364. "E-C    Capitalize word",
  365. "^X^U   Convert region into Uppercase",
  366. "^X^L   Convert region into Lowercase",
  367. #endif
  368. " ",
  369. "E-Q    Quote next char (to enter ctrl chars into text)",
  370. ""
  371.     };
  372.  
  373. char *move_cmds[] = 
  374.     {
  375. " ",
  376. "E-W   Copy region to KILL buffer",
  377. "^Y    Yank contents of KILL buffer back, at cursor",
  378. "^X^Y  Undo the Yank just done",
  379. "E-Y   Flush kill buffer into a buffer called '[]'",
  380. " ",
  381. "Generally, the procedure for copying or moving text is:",
  382. "    1)  Mark a REGION using E-. at beginning and cursor at end.",
  383. "    2)  Delete it (with ^W) or copy it (with E-W) into KILL buffer.",
  384. "    3)  Move cursor to desired location and yank it back (with ^Y).",
  385. ""
  386.     };
  387.  
  388. char *wind_cmds[] = 
  389.     {
  390. " ",
  391. "Many WINDOWS may be active at once on the screen.  Windows may show",
  392. "different parts of one buffer, or different buffers.",
  393. " ",
  394. "^X 2   Split current window in two   ^X 1  Remove all but current window",
  395. "^X N   Cursor to next window         ^X P  Cursor to previous window",
  396. #if EXTRA
  397. "^X ^   Enlarge current window",
  398. "^X^N   Scroll window one line down   ^X^P  Scroll one line up",
  399. #endif
  400. "^X V   Scroll down, other window     ^X Z  Scroll up, other window",
  401. "E-!    Scroll current line to top (or <argument> window position)",
  402. ""
  403.     };
  404.  
  405. char *buf_cmds[] = 
  406.     {
  407. " ",
  408. "A BUFFER is a named area containing a document being edited.  Many buffers",
  409. "may be activated at once.  Each buffer has a name, which is typically the",
  410. "lowercased disk filename of the document it contains.",
  411. "^X B   Switch to another buffer, by name (default: previous one)",
  412. "^X ?   List current buffers",
  413. "^X K   Kill a non-displayed buffer.",
  414. "^X^B   Enter a new name for buffer",
  415. "^X^F   Enter a new default File name for buffer",
  416. ""
  417.     };
  418.  
  419. char *disk_cmds[] = 
  420.     {
  421. " ",
  422. "^X^R  Read file into current buffer, erasing its previous contents.",
  423. "      No new buffer will be created. Flag as editable.",
  424. "^X^V  Visit file: read into a new buffer created from filename.",
  425. "      Flag as view-only.",
  426. "^X S  Save current buffer to disk, using the buffer's filename",
  427. "      as the name of the disk file.  Any disk file of that name",
  428. "      will be overwritten.",
  429. "^X^W  Write current buffer to disk.  Type in a new filename at the",
  430. "      prompt to write to; it will become the current buffer's filename.",
  431. ""
  432.     };
  433.  
  434. char *fmt_prog[] = 
  435.     {
  436. " ",
  437. "^X R   Set right margin (fill column)",
  438. "^X L   Set left margin",
  439. "^X F   (Re)Format paragraph so that text lies between margins",
  440. "       (with argument: double spaced)",
  441. "E#-<tab> Set tab spacing to n characters between tabs stops",
  442. "^X!    Send one command to the operating system and return",
  443. "^X^C   Start a new command processer, suspending MicroEMACS",
  444. "^C     Exit MicroEMACS",
  445. "^Z     Write out this buffer if changed, then Exit MicroEMACS",
  446. ""
  447.     };
  448.  
  449. char *other_cmds[] = 
  450.     {
  451. "^G    Cancel command/macro in progress or undo kill/yank.",
  452. "Esc # (or ^U #, with default of 4) - Enter numerical argument.",
  453. "      ('-' = -1) (Repeats the next command that many times.)",
  454. "^X M  Begin or end a macro definition",
  455. "^X E  Execute the defined macro",
  456. "^X =  Position report -- displays line number, column, ASCII code",
  457. "^X^E  Toggle between edit & view-only modes",
  458. "E-I   Toggle between insert & overstrike modes",
  459. "^X Q  Toggle visibility of tabs, spaces & newlines",
  460. "^L    Redraw screen",
  461. ""
  462.     };
  463.  
  464. #endif AtST
  465.  
  466. typedef struct  
  467.     {
  468.     int    matchch;    /* character to match */
  469.     char    **hlpscn;    /* screen to display */
  470.     }
  471.     SCRNS;
  472.  
  473. static SCRNS scrns[] = 
  474.     {
  475.         {'Y', help_menu},
  476.         {'D', disk_cmds},
  477.         {'B', buf_cmds},
  478.         {'W', wind_cmds},
  479. #ifdef AtST
  480.         {'M', mouse1},
  481.         {'2', mouse2},
  482.         {'3', mouse3},
  483. #endif
  484.         {'O', other_cmds},
  485.  
  486.         {'S', search_cmds},
  487.         {'C', curs_ctrl},
  488.         {'I', insdel},
  489. #ifdef AtST
  490.         {'P', paste_cmds},
  491.         {'F', funckeys},
  492. #else
  493.         {'M', move_cmds},
  494. #endif
  495.  
  496.         {'T', transp_cap},
  497.         {'Q', fmt_prog},
  498.  
  499. #if AtST
  500.         {'A', alt_chars},
  501. #endif
  502.         {0x0, NULL}
  503.     }; /* end of scrns */
  504.  
  505. /*
  506.  * This routine builds a help screen's text
  507.  * in the special secret buffer. It is called
  508.  * by help() via make_popup(). Returns TRUE if
  509.  * everything works. Returns FALSE if there is
  510.  * an error (if there is no memory).
  511.  */
  512. make_help(buffer, data)
  513.     BUFFER    *buffer;
  514.     char    *data[];    /* array of strings */
  515.     {
  516.     register char    **dp;
  517.     register int    s;
  518.  
  519.     bbclear(buffer);        /* Blow old text away */
  520.     for(dp=data; **dp != '\0'; ++dp) 
  521.         {
  522.         if (addline(*dp, buffer) == FALSE)
  523.             return (FALSE);
  524.         }
  525.     return (TRUE);         /* All done */
  526.     }
  527.  
  528. /*
  529.  * Show help menu and then requested screens.
  530.  * Bound to "E-?". By mb:
  531.  */
  532. help(f, n)
  533.     {
  534.     register int  c = 'Y';
  535.     register int  indx = 0, maxindx;
  536.     register char **helpscrn;
  537.  
  538.     maxindx = 0;
  539.     while (scrns[maxindx].matchch != 0)
  540.         ++maxindx;
  541.  
  542.     while (c != 'N')
  543.         {
  544.         switch (c)
  545.             {
  546. #if AtST
  547.             case FUNC|0x4d:     /* right */
  548.             case FUNC|0x50:     /* down */
  549. #endif
  550.             case '+':
  551.                 if (++indx == maxindx)
  552.                     indx = 0;
  553.                 break;
  554.  
  555. #if AtST
  556.             case FUNC|0x4b:     /* left */
  557.             case FUNC|0x48:     /* up */
  558. #endif
  559.             case '-':
  560.                 if (indx == 0)
  561.                     indx = maxindx;
  562.                 --indx;
  563.                 break;
  564.  
  565.             default:
  566.                 for (indx=0; (scrns[indx].matchch != c); ++indx)
  567.                     if (indx == maxindx)
  568.                         break;
  569.             }
  570.  
  571.         helpscrn = scrns[indx].hlpscn;
  572.         if (helpscrn == NULL)
  573.             break;
  574.  
  575.         if (make_popup(bhelpp, make_help, helpscrn)==TRUE) 
  576.             {
  577.             update();
  578.             mlwrite((c == 'Y')
  579.                  ? ("Enter first letter of choice: ")
  580.                  : ("More help? [y/n/+/-] ")  );
  581.             c = (*term.t_getchar)();
  582.             if (c>='a' && c<='z')
  583.                 c -= 0x20;
  584.             }
  585.         else 
  586.             return (FALSE);
  587.  
  588.         } /* end of while() */
  589.  
  590.      if (helpscrn == NULL)
  591.         {
  592.         mlwrite("[aborted]");
  593.         return (onlywind(f,n));
  594.         }
  595. #if AtST
  596.     mlwrite("[Alt-1 returns to one window]");
  597. #else
  598.     mlwrite("[^X 1 returns to one window]");
  599. #endif
  600.     return (TRUE);
  601.     }
  602.  
  603. #endif HELP
  604.