minix/commands/yap/help.c
2005-04-21 14:53:53 +00:00

108 lines
2.2 KiB
C
Executable file

/* 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);
}