From de7d29250104fccf62745b4bcb5dc4b83c58da70 Mon Sep 17 00:00:00 2001 From: Jim Monte Date: Mon, 16 Dec 2019 01:40:25 -0500 Subject: [PATCH] Added basic help messages in addtion to reference to web pages --- src/frontend/com_ghelp.c | 23 ++++++------ src/frontend/com_help.c | 81 +++++++++++++++++++++++++++------------- 2 files changed, 68 insertions(+), 36 deletions(-) diff --git a/src/frontend/com_ghelp.c b/src/frontend/com_ghelp.c index fdb247ad6..ab0241694 100644 --- a/src/frontend/com_ghelp.c +++ b/src/frontend/com_ghelp.c @@ -17,19 +17,20 @@ * Internet Archive using the link below. * https://web.archive.org/web/20180221111839/http://newton.ex.ac.uk/teaching/CDHW/Electronics2/userguide/ */ -void -com_ghelp(wordlist *wl) +#define BASE_HELP_URL "http://ngspice.sourceforge.net/docs" +void com_ghelp(wordlist *wl) { -#if defined(HAS_WINGUI) || defined(_MSC_VER) || defined(__MINGW32__) || defined(X_DISPLAY_MISSING) || defined(NOINTHELP) +#if defined(HAS_WINGUI) || defined(_MSC_VER) || defined(__MINGW32__) ||\ + defined(X_DISPLAY_MISSING) || defined(NOINTHELP) + com_help(wl); - NG_IGNORE(wl); - - (void) printf("Internal help is no longer available!\n" - "For the latest official ngspice manual in PDF format, " - "please see\n" - " http://ngspice.sourceforge.net/docs/ngspice-manual.pdf\n" - "Or for HTML see\n" - " http://ngspice.sourceforge.net/docs/ngspice-html-manual/manual.html\n"); + /* After brief help from com_help, add info on the web links to the + * the PDF and HTML versions of the manual */ + (void) out_printf("For further details please see the latest official " + "ngspice manual in PDF format at\n" + " " BASE_HELP_URL "/ngspice-manual.pdf\n" + "or in HTML format at\n" + " " BASE_HELP_URL "/ngspice-html-manual/manual.html\n\n"); return; #else diff --git a/src/frontend/com_help.c b/src/frontend/com_help.c index 1bff50266..1039ec386 100644 --- a/src/frontend/com_help.c +++ b/src/frontend/com_help.c @@ -9,51 +9,78 @@ #include "com_help.h" #include "ngspice/fteext.h" - -void -com_help(wordlist *wl) +#define N_CMD_DFLT 512 +void com_help(wordlist *wl) { - struct comm *c; - struct comm *ccc[512]; /* Should be enough. */ - int numcoms, i; bool allflag = FALSE; + /* Make empty list and "all" behave the same except for the part + * related to "help all" */ if (wl && eq(wl->wl_word, "all")) { allflag = TRUE; - wl = NULL; /* XXX Probably right */ + wl = (wordlist *) NULL; } - /* We want to use more mode whether "moremode" is set or not. */ + /* We want to use more mode whether "moremode" is set or not. + * In that case the code below should be changed... */ out_moremode = TRUE; out_init(); out_moremode = FALSE; + + if (wl == NULL) { - out_printf("For a complete description " - "read the Spice3 User's Manual.\n"); + struct comm *ccc_dflt[N_CMD_DFLT]; /* Should be enough. */ + struct comm **ccc; /* dynamic alloc in case it is not */ + int numcoms; if (!allflag) { out_printf("For a list of all commands " "type \"help all\", for a short\n" "description of \"command\", " "type \"help command\".\n"); + return; + } + + /* Count the number of commands */ + for (numcoms = 0; cp_coms[numcoms].co_func != NULL; numcoms++) { + ; + } + if (numcoms > N_CMD_DFLT) { + ccc = TMALLOC(struct comm *, numcoms); + } + else { + ccc = ccc_dflt; } /* Sort the commands */ - for (numcoms = 0; cp_coms[numcoms].co_func != NULL; numcoms++) + for (numcoms = 0; cp_coms[numcoms].co_func != NULL; numcoms++) { ccc[numcoms] = &cp_coms[numcoms]; + } qsort(ccc, (size_t) numcoms, sizeof(struct comm *), hcomp); - for (i = 0; i < numcoms; i++) { - if ((ccc[i]->co_spiceonly && ft_nutmeg) || - (ccc[i]->co_help == NULL) || - (!allflag && !ccc[i]->co_major)) - continue; - out_printf("%s ", ccc[i]->co_comname); - out_printf(ccc[i]->co_help, cp_program); - out_send("\n"); + /* Print help for each of the "major" commands */ + { + int i; + for (i = 0; i < numcoms; i++) { + if ((ccc[i]->co_spiceonly && ft_nutmeg) || + (ccc[i]->co_help == NULL) || + (!allflag && !ccc[i]->co_major)) { + continue; + } + out_printf("%s ", ccc[i]->co_comname); + out_printf(ccc[i]->co_help, cp_program); + out_send("\n"); + } } - } else { + + /* Free allocation if it was required */ + if (ccc != ccc_dflt) { + txfree(ccc); + } + } + else { while (wl != NULL) { + struct comm *c; for (c = &cp_coms[0]; c->co_func != NULL; c++) if (eq(wl->wl_word, c->co_comname)) { out_printf("%s ", c->co_comname); @@ -73,16 +100,20 @@ com_help(wordlist *wl) if (al == NULL) { fprintf(cp_out, "Sorry, no help for %s.\n", wl->wl_word); - } else { + } + else { out_printf("%s is aliased to ", wl->wl_word); /* Minor badness here... */ wl_print(al->al_text, cp_out); out_send("\n"); } - } - wl = wl->wl_next; - } + } /* end of case that a function with the given name was found */ + wl = wl->wl_next; /* step to next word in list of help items */ + } /* end of loop over list of help items */ } out_send("\n"); -} +} /* end of function com_help */ + + +