213 lines
4.6 KiB
C
213 lines
4.6 KiB
C
/**********
|
|
Copyright 1990 Regents of the University of California. All rights reserved.
|
|
Author: 1986 Wayne A. Christopher, U. C. Berkeley CAD Group
|
|
**********/
|
|
|
|
|
|
/*
|
|
* faustus@cad.berkeley.edu, ucbvax!faustus
|
|
* Permission is granted to modify and re-distribute this code in any manner
|
|
* as long as this notice is preserved. All standard disclaimers apply.
|
|
*
|
|
*/
|
|
|
|
#include "ngspice/ngspice.h"
|
|
#include "ngspice/cpdefs.h"
|
|
#include "ngspice/hlpdefs.h"
|
|
#include "ngspice/suffix.h"
|
|
#include "ngspice/stringskip.h"
|
|
|
|
static topic *curtop;
|
|
static bool quitflag;
|
|
|
|
static void putline(char *s);
|
|
static int putstuff(toplink *tl, int base);
|
|
|
|
int hlp_width = 72;
|
|
|
|
|
|
bool
|
|
hlp_tdisplay(topic *top)
|
|
{
|
|
wordlist *wl;
|
|
int i = 0;
|
|
|
|
curtop = top;
|
|
|
|
out_init();
|
|
out_printf("\n\t%s\n", top->title);
|
|
for (wl = top->text; wl; wl = wl->wl_next)
|
|
putline(wl->wl_word);
|
|
if (top->subtopics) {
|
|
out_printf("\tSub-Topics:\n\n");
|
|
i = putstuff(top->subtopics, 0);
|
|
}
|
|
if (top->seealso) {
|
|
out_printf("\n\tSee Also:\n\n");
|
|
(void) putstuff(top->seealso, i);
|
|
}
|
|
out_printf("\n");
|
|
return (TRUE);
|
|
}
|
|
|
|
|
|
toplink *
|
|
hlp_thandle(topic **parent)
|
|
{
|
|
char buf[BSIZE_SP], *s;
|
|
toplink *tl;
|
|
int num;
|
|
|
|
quitflag = FALSE;
|
|
if (!curtop) {
|
|
*parent = NULL;
|
|
return (NULL);
|
|
}
|
|
for (;;) {
|
|
fprintf(cp_out, "Selection (`?' for help): ");
|
|
(void) fflush(cp_out);
|
|
if (!fgets(buf, BSIZE_SP, cp_in)) {
|
|
clearerr(stdin);
|
|
quitflag = TRUE;
|
|
*parent = NULL;
|
|
return (NULL);
|
|
}
|
|
|
|
s = skip_ws(buf);
|
|
switch (*s) {
|
|
case '?':
|
|
fprintf(cp_out,
|
|
"\n"
|
|
"Type the number of a sub-topic or see also, or one of:\n"
|
|
"\tr\tReprint the current topic\n"
|
|
"\tp or CR\tReturn to the previous topic\n"
|
|
"\tq\tQuit help\n"
|
|
"\t?\tPrint this message\n"
|
|
"\n");
|
|
continue;
|
|
|
|
case 'r':
|
|
(void) hlp_tdisplay(curtop);
|
|
continue;
|
|
|
|
case 'q':
|
|
quitflag = TRUE;
|
|
*parent = NULL;
|
|
return (NULL);
|
|
|
|
case 'p':
|
|
case '\n':
|
|
case '\r':
|
|
case '\0':
|
|
*parent = curtop;
|
|
return (NULL);
|
|
}
|
|
if (!isdigit_c(*s)) {
|
|
fprintf(cp_err, "Invalid command\n");
|
|
continue;
|
|
}
|
|
num = atoi(s);
|
|
if (num <= 0) {
|
|
fprintf(cp_err, "Bad choice.\n");
|
|
continue;
|
|
}
|
|
for (tl = curtop->subtopics; tl; tl = tl->next)
|
|
if (--num == 0)
|
|
break;
|
|
if (num) {
|
|
for (tl = curtop->seealso; tl; tl = tl->next)
|
|
if (--num == 0)
|
|
break;
|
|
}
|
|
if (num) {
|
|
fprintf(cp_err, "Bad choice.\n");
|
|
continue;
|
|
}
|
|
*parent = curtop;
|
|
return (tl);
|
|
}
|
|
}
|
|
|
|
|
|
/* ARGSUSED */
|
|
void
|
|
hlp_tkillwin(topic *top)
|
|
{
|
|
NG_IGNORE(top);
|
|
|
|
if (curtop)
|
|
curtop = curtop->parent;
|
|
if (curtop && !quitflag)
|
|
(void) hlp_tdisplay(curtop);
|
|
}
|
|
|
|
|
|
/* This has to rip out the font changes from the lines... */
|
|
|
|
static void
|
|
putline(char *s)
|
|
{
|
|
char buf[BSIZE_SP];
|
|
int i = 0;
|
|
|
|
while (*s) {
|
|
if (((*s == '\033') && s[1]) ||
|
|
((*s == '_') && (s[1] == '\b')))
|
|
s += 2;
|
|
else
|
|
buf[i++] = *s++;
|
|
}
|
|
buf[i] = '\0';
|
|
out_printf("%s\n", buf);
|
|
}
|
|
|
|
|
|
/* Figure out the number of columns we can use. Assume an entry like
|
|
* nn) word -- add 5 characters to the width...
|
|
*/
|
|
|
|
static int
|
|
putstuff(toplink *tl, int base)
|
|
{
|
|
int maxwidth = 0;
|
|
int ncols, nrows, nbuts = 0, i, j, k;
|
|
toplink *tt;
|
|
|
|
for (tt = tl; tt; tt = tt->next) {
|
|
if (maxwidth < (int) strlen(tt->description))
|
|
maxwidth = (int) strlen(tt->description);
|
|
nbuts++;
|
|
}
|
|
|
|
ncols = hlp_width / (maxwidth + 5);
|
|
|
|
if (ncols < 1) {
|
|
fprintf(stderr, "Help, button too big!!\n");
|
|
return (0);
|
|
}
|
|
|
|
if (ncols > nbuts)
|
|
ncols = nbuts;
|
|
|
|
maxwidth = hlp_width / ncols;
|
|
|
|
/* round up */
|
|
nrows = (nbuts + ncols - 1) / ncols;
|
|
|
|
for (i = 0; i < nrows; i++) {
|
|
for (tt = tl, j = 0; j < i; j++, tt = tt->next)
|
|
;
|
|
for (j = 0; j < ncols; j++) {
|
|
if (tt)
|
|
out_printf("%2d) %-*s ", base + j * nrows + i + 1,
|
|
maxwidth - 5, tt->description);
|
|
for (k = 0; k < nrows; k++)
|
|
if (tt)
|
|
tt = tt->next;
|
|
}
|
|
out_printf("\n");
|
|
}
|
|
|
|
return (nbuts);
|
|
}
|