108 lines
2.2 KiB
C
108 lines
2.2 KiB
C
|
/* Copyright (c) 1985 Ceriel J.H. Jacobs */
|
||
|
|
||
|
#ifndef lint
|
||
|
static char rcsid[] = "$Header$";
|
||
|
#endif
|
||
|
|
||
|
#define _HELP_
|
||
|
#include "in_all.h"
|
||
|
#include "help.h"
|
||
|
#include "machine.h"
|
||
|
#include "commands.h"
|
||
|
#include "keys.h"
|
||
|
#include "output.h"
|
||
|
#include "prompt.h"
|
||
|
#include "main.h"
|
||
|
#include "display.h"
|
||
|
#include "term.h"
|
||
|
#include "options.h"
|
||
|
|
||
|
static int h_cnt; /* Count # of lines */
|
||
|
static struct state *origin; /* Keep track of startstate */
|
||
|
|
||
|
/*
|
||
|
* Print a key sequence.
|
||
|
* We arrived at an endstate. The s_next link in the state structure now
|
||
|
* leads us from "origin" to the current state, so that we can print the key
|
||
|
* sequence easily.
|
||
|
*/
|
||
|
|
||
|
STATIC VOID
|
||
|
pr_comm() {
|
||
|
register struct state *p = origin;
|
||
|
register char *pb;
|
||
|
register int c;
|
||
|
char buf[30];
|
||
|
register int i = 0; /* How many characters printed? */
|
||
|
|
||
|
pb = buf;
|
||
|
for (;;) {
|
||
|
c = p->s_char & 0177;
|
||
|
if (c < ' ' || c == 0177) {
|
||
|
/*
|
||
|
* Will take an extra position
|
||
|
*/
|
||
|
i++;
|
||
|
}
|
||
|
*pb++ = c;
|
||
|
i++;
|
||
|
if (!p->s_match) break;
|
||
|
p = p->s_next;
|
||
|
}
|
||
|
do {
|
||
|
*pb++ = ' ';
|
||
|
} while (++i < 12);
|
||
|
*pb = 0;
|
||
|
cputline(buf);
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Print out a description of the keymap. This is done, by temporarily using
|
||
|
* the s_next field in the state structure indicate the state matching the
|
||
|
* next character, so that we can walk from "origin" to an endstate.
|
||
|
*/
|
||
|
|
||
|
STATIC VOID
|
||
|
pr_mach(currstate, back) register struct state *currstate, *back; {
|
||
|
struct state *save;
|
||
|
|
||
|
while (currstate) {
|
||
|
if (interrupt) break;
|
||
|
if (back) {
|
||
|
save = back->s_next; /* Save original link */
|
||
|
back->s_next = currstate;
|
||
|
}
|
||
|
if (!currstate->s_match) {
|
||
|
/*
|
||
|
* End state, print command
|
||
|
*/
|
||
|
pr_comm();
|
||
|
putline(commands[currstate->s_cnt].c_descr);
|
||
|
putline("\r\n");
|
||
|
if (++h_cnt >= maxpagesize) {
|
||
|
ret_to_continue();
|
||
|
h_cnt = 0;
|
||
|
}
|
||
|
}
|
||
|
else pr_mach(currstate->s_match, currstate);
|
||
|
currstate = currstate->s_next;
|
||
|
if (back) back->s_next = save; /* restore */
|
||
|
else origin = currstate;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*ARGSUSED*/
|
||
|
int
|
||
|
do_help(i) long i; { /* The help command */
|
||
|
|
||
|
startcomm = 0;
|
||
|
h_cnt = 2;
|
||
|
putline("\r\nSummary of yap commands:\r\n");
|
||
|
origin = currmap->k_mach;
|
||
|
pr_mach(currmap->k_mach, (struct state *) 0);
|
||
|
if (h_cnt) {
|
||
|
ret_to_continue();
|
||
|
}
|
||
|
if (!hardcopy && scr_info.currentpos) redraw(1);
|
||
|
}
|