SCP: Cleaned up the hierarchical help APIs to follow the same indentation style used in the rest of scp.c. Fixed the help prompt to avoid adding an extra level to the prompt when the current level has no children.

This commit is contained in:
Mark Pizzolato 2014-02-10 17:25:07 -08:00
parent b1fb809210
commit 545aa85677

434
scp.c
View file

@ -7930,14 +7930,14 @@ typedef struct topic {
uint32 flags;
uint32 kidwid;
#define HLP_MAGIC_TOPIC 1
} TOPIC;
} TOPIC;
static volatile struct {
const char *error;
const char *prox;
size_t block;
size_t line;
} help_where = { "", NULL, 0, 0 };
} help_where = { "", NULL, 0, 0 };
jmp_buf (help_env);
#define FAIL(why,text,here) { help_where.error = #text; help_where.prox = here; longjmp (help_env, (why)); }
@ -7945,68 +7945,71 @@ jmp_buf (help_env);
* Expands text buffer as necessary.
*/
static void appendText (TOPIC *topic, const char *text, size_t len) {
char *newt;
if (!len) {
return;
}
static void appendText (TOPIC *topic, const char *text, size_t len)
{
char *newt;
newt = (char *)realloc (topic->text, topic->len + len +1);
if (!newt) {
if (!len)
return;
newt = (char *)realloc (topic->text, topic->len + len +1);
if (!newt) {
FAIL (SCPE_MEM, No memory, NULL);
}
topic->text = newt;
memcpy (newt + topic->len, text, len);
topic->len +=len;
newt[topic->len] = '\0';
return;
topic->text = newt;
memcpy (newt + topic->len, text, len);
topic->len +=len;
newt[topic->len] = '\0';
return;
}
/* Release memory held by a topic and its children.
*/
static void cleanHelp (TOPIC *topic) {
TOPIC *child;
size_t i;
static void cleanHelp (TOPIC *topic)
{
TOPIC *child;
size_t i;
free (topic->title);
free (topic->text);
free (topic->label);
for (i = 0; i < topic->kids; i++) {
free (topic->title);
free (topic->text);
free (topic->label);
for (i = 0; i < topic->kids; i++) {
child = topic->children[i];
cleanHelp (child);
free (child);
}
free (topic->children);
return;
free (topic->children);
return;
}
/* Build a help tree from a string.
* Handles substitutions, formatting.
*/
static TOPIC *buildHelp (TOPIC *topic, struct sim_device *dptr,
struct sim_unit *uptr, const char *htext, va_list ap) {
char *end;
size_t n, ilvl;
struct sim_unit *uptr, const char *htext, va_list ap)
{
char *end;
size_t n, ilvl;
#define VSMAX 100
char *vstrings[VSMAX];
size_t vsnum = 0;
char *astrings[VSMAX+1];
size_t asnum = 0;
char *const *hblock;
const char *ep;
t_bool excluded = FALSE;
char *vstrings[VSMAX];
size_t vsnum = 0;
char *astrings[VSMAX+1];
size_t asnum = 0;
char *const *hblock;
const char *ep;
t_bool excluded = FALSE;
/* variable arguments consumed table.
/* variable arguments consumed table.
* The scheme used allows arguments to be accessed in random
* order, but for portability, all arguments must be char *.
* If you try to violate this, there ARE machines that WILL break.
*/
memset (vstrings, 0, VSMAX * sizeof (char *));
memset (astrings, 0, VSMAX * sizeof (char *));
astrings[asnum++] = (char *) htext;
memset (vstrings, 0, VSMAX * sizeof (char *));
memset (astrings, 0, VSMAX * sizeof (char *));
astrings[asnum++] = (char *) htext;
for (hblock = astrings; (htext = *hblock) != NULL; hblock++) {
for (hblock = astrings; (htext = *hblock) != NULL; hblock++) {
help_where.block = hblock - astrings;
help_where.line = 0;
while (*htext) {
@ -8015,9 +8018,8 @@ static TOPIC *buildHelp (TOPIC *topic, struct sim_device *dptr,
help_where.line++;
if (isspace (*htext) || *htext == '+') {/* Topic text, indented topic text */
if (excluded) { /* Excluded topic text */
while (*htext && *htext != '\n') {
while (*htext && *htext != '\n')
htext++;
}
if (*htext)
++htext;
continue;
@ -8031,12 +8033,10 @@ static TOPIC *buildHelp (TOPIC *topic, struct sim_device *dptr,
htext++;
}
}
while (*htext && *htext != '\n' && isspace (*htext)) {
while (*htext && *htext != '\n' && isspace (*htext))
htext++;
}
if (!*htext) { /* Empty after removing leading spaces */
if (!*htext) /* Empty after removing leading spaces */
break;
}
start = htext;
while (*htext) { /* Process line for substitutions */
if (*htext == '%') {
@ -8067,15 +8067,13 @@ static TOPIC *buildHelp (TOPIC *topic, struct sim_device *dptr,
default: /* Check for vararg # */
if (isdigit (*htext)) {
n = 0;
while (isdigit (*htext)) {
while (isdigit (*htext))
n += (n * 10) + (*htext++ - '0');
}
if (( *htext != 'H' && *htext != 's') ||
n == 0 || n >= VSMAX)
FAIL (SCPE_ARG, Invalid escape, htext);
while (n > vsnum) { /* Get arg pointer if not cached */
while (n > vsnum) /* Get arg pointer if not cached */
vstrings[vsnum++] = va_arg (ap, char *);
}
start = vstrings[n-1]; /* Insert selected string */
if (*htext == 'H') { /* Append as more input */
if (asnum >= VSMAX) {
@ -8091,14 +8089,13 @@ static TOPIC *buildHelp (TOPIC *topic, struct sim_device *dptr,
appendText (topic, start, ep - start);
if (*ep) { /* More past \n, indent */
size_t i;
for (i = 0; i < ilvl; i++) {
for (i = 0; i < ilvl; i++)
appendText (topic, " ", 4);
}
}
start = ep;
} else {
ep++;
}
else
ep++;
}
appendText (topic, start, ep-start);
break;
@ -8124,31 +8121,28 @@ static TOPIC *buildHelp (TOPIC *topic, struct sim_device *dptr,
n = 0;
start = htext;
while (isdigit (*htext)) {
while (isdigit (*htext))
n += (n * 10) + (*htext++ - '0');
}
if ((htext == start) || !n) {
FAIL (SCPE_ARG, Invalid topic heading, htext);
}
if (n <= topic->level) { /* Find level for new topic */
while (n <= topic->level) {
while (n <= topic->level)
topic = topic->parent;
}
} else {
else {
if (n > topic->level +1) { /* Skipping down more than 1 */
FAIL (SCPE_ARG, Level not contiguous, htext); /* E.g. 1 3, not reasonable */
}
}
while (*htext && (*htext != '\n') && isspace (*htext)) {
while (*htext && (*htext != '\n') && isspace (*htext))
htext++;
}
if (!*htext || (*htext == '\n')) { /* Name missing */
FAIL (SCPE_ARG, Missing topic name, htext);
}
start = htext;
while (*htext && (*htext != '\n')) {
while (*htext && (*htext != '\n'))
htext++;
}
if (start == htext) { /* Name NULL */
FAIL (SCPE_ARG, Null topic name, htext);
}
@ -8156,14 +8150,12 @@ static TOPIC *buildHelp (TOPIC *topic, struct sim_device *dptr,
if (*start == '?') { /* Conditional topic? */
size_t n = 0;
start++;
while (isdigit (*start)) { /* Get param # */
while (isdigit (*start)) /* Get param # */
n += (n * 10) + (*start++ - '0');
}
if (!*start || *start == '\n'|| n == 0 || n >= VSMAX)
FAIL (SCPE_ARG, Invalid parameter number, start);
while (n > vsnum) { /* Get arg pointer if not cached */
while (n > vsnum) /* Get arg pointer if not cached */
vstrings[vsnum++] = va_arg (ap, char *);
}
end = vstrings[n-1]; /* Check for True */
if (!end || !(toupper (*end) == 'T' || *end == '1')) {
excluded = TRUE; /* False, skip topic this time */
@ -8186,9 +8178,8 @@ static TOPIC *buildHelp (TOPIC *topic, struct sim_device *dptr,
if (*htext)
htext++;
if (newt->title[0] == '$') {
if (newt->title[0] == '$')
newt->flags |= HLP_MAGIC_TOPIC;
}
children = (TOPIC **) realloc (topic->children,
(topic->kids +1) * sizeof (TOPIC *));
@ -8202,9 +8193,8 @@ static TOPIC *buildHelp (TOPIC *topic, struct sim_device *dptr,
newt->level = n;
newt->parent = topic;
n = strlen (newt->title);
if (n > topic->kidwid) {
if (n > topic->kidwid)
topic->kidwid = n;
}
sprintf (nbuf, ".%u", topic->kids);
n = strlen (topic->label) + strlen (nbuf) + 1;
newt->label = (char *) malloc (n);
@ -8229,33 +8219,35 @@ static TOPIC *buildHelp (TOPIC *topic, struct sim_device *dptr,
vsnum = 0;
} /* all strings */
return topic;
return topic;
}
/* Create prompt string - top thru current topic
* Add prompt at end.
*/
static char *helpPrompt ( TOPIC *topic, const char *pstring, t_bool oneword ) {
char *prefix;
char *newp, *newt;
static char *helpPrompt ( TOPIC *topic, const char *pstring, t_bool oneword )
{
char *prefix;
char *newp, *newt;
if (topic->level == 0) {
if (topic->level == 0) {
prefix = (char *) calloc (2,1);
if (!prefix) {
FAIL (SCPE_MEM, No memory, NULL);
}
prefix[0] = '\n';
} else {
prefix = helpPrompt (topic->parent, "", oneword);
}
else
prefix = helpPrompt (topic->parent, "", oneword);
newp = (char *) malloc (strlen (prefix) + 1 + strlen (topic->title) + 1 +
newp = (char *) malloc (strlen (prefix) + 1 + strlen (topic->title) + 1 +
strlen (pstring) +1);
if (!newp) {
if (!newp) {
free (prefix);
FAIL (SCPE_MEM, No memory, NULL);
}
strcpy (newp, prefix);
strcpy (newp, prefix);
if (topic->children) {
if (topic->level != 0)
strcat (newp, " ");
newt = (topic->flags & HLP_MAGIC_TOPIC)?
@ -8267,23 +8259,26 @@ static char *helpPrompt ( TOPIC *topic, const char *pstring, t_bool oneword ) {
newt++;
}
*np = '\0';
} else {
strcat (newp, newt);
}
else
strcat (newp, newt);
if (*pstring && *pstring != '?')
strcat (newp, " ");
strcat (newp, pstring);
free (prefix);
return newp;
}
strcat (newp, pstring);
free (prefix);
return newp;
}
static void displayMagicTopic (FILE *st, struct sim_device *dptr, TOPIC *topic) {
char tbuf[CBUFSIZE];
size_t i, skiplines;
static void displayMagicTopic (FILE *st, struct sim_device *dptr, TOPIC *topic)
{
char tbuf[CBUFSIZE];
size_t i, skiplines;
#ifdef _WIN32
FILE *tmp;
char *tmpnam;
do {
FILE *tmp;
char *tmpnam;
do {
int fd;
tmpnam = _tempnam (NULL, "simh");
fd = _open (tmpnam, _O_CREAT | _O_RDWR | _O_EXCL, _S_IREAD | _S_IWRITE);
@ -8293,109 +8288,112 @@ static void displayMagicTopic (FILE *st, struct sim_device *dptr, TOPIC *topic)
}
} while (1);
#else
FILE *tmp = tmpfile();
FILE *tmp = tmpfile();
#endif
if (!tmp) {
if (!tmp) {
fprintf (st, "Unable to create temporary file: %s\n", strerror (errno));
return;
}
if (topic->title)
if (topic->title)
fprintf (st, "%s\n", topic->title+1);
skiplines = 0;
if (!strcmp (topic->title+1, "Registers")) {
skiplines = 0;
if (!strcmp (topic->title+1, "Registers")) {
fprint_reg_help (tmp, dptr) ;
skiplines = 1;
} else if (!strcmp (topic->title+1, "Set commands")) {
}
else
if (!strcmp (topic->title+1, "Set commands")) {
fprint_set_help (tmp, dptr);
skiplines = 3;
} else if (!strcmp (topic->title+1, "Show commands")) {
}
else
if (!strcmp (topic->title+1, "Show commands")) {
fprint_show_help (tmp, dptr);
skiplines = 3;
}
rewind (tmp);
rewind (tmp);
/* Discard leading blank lines/redundant titles */
/* Discard leading blank lines/redundant titles */
for (i =0; i < skiplines; i++) {
for (i =0; i < skiplines; i++)
fgets (tbuf, sizeof (tbuf), tmp);
}
while (fgets (tbuf, sizeof (tbuf), tmp)) {
if (tbuf[0] != '\n') {
while (fgets (tbuf, sizeof (tbuf), tmp)) {
if (tbuf[0] != '\n')
fputs (" ", st);
}
fputs (tbuf, st);
}
fclose (tmp);
fclose (tmp);
#ifdef _WIN32
remove (tmpnam);
free (tmpnam);
remove (tmpnam);
free (tmpnam);
#endif
return;
return;
}
/* Flatten and display help for those who say they prefer it.
*/
static t_stat displayFlatHelp (FILE *st, struct sim_device *dptr,
struct sim_unit *uptr, int32 flag,
TOPIC *topic, va_list ap ) {
size_t i;
TOPIC *topic, va_list ap )
{
size_t i;
if (topic->flags & HLP_MAGIC_TOPIC) {
if (topic->flags & HLP_MAGIC_TOPIC) {
fprintf (st, "\n%s ", topic->label);
displayMagicTopic (st, dptr, topic);
} else {
fprintf (st, "\n%s %s\n", topic->label, topic->title);
}
else
fprintf (st, "\n%s %s\n", topic->label, topic->title);
/* Topic text (for magic topics, follows for explanations)
/* Topic text (for magic topics, follows for explanations)
* It's possible/reasonable for a magic topic to have no text.
*/
if (topic->text)
if (topic->text)
fputs (topic->text, st);
for (i = 0; i < topic->kids; i++) {
for (i = 0; i < topic->kids; i++)
displayFlatHelp (st, dptr, uptr, flag, topic->children[i], ap);
}
return SCPE_OK;
return SCPE_OK;
}
#define HLP_MATCH_AMBIGUOUS (~0u)
#define HLP_MATCH_WILDCARD (~1U)
#define HLP_MATCH_NONE 0
static int matchHelpTopicName (TOPIC *topic, const char *token) {
size_t i, match;
char cbuf[CBUFSIZE], *cptr;
static int matchHelpTopicName (TOPIC *topic, const char *token)
{
size_t i, match;
char cbuf[CBUFSIZE], *cptr;
if (!strcmp (token, "*")) {
if (!strcmp (token, "*"))
return HLP_MATCH_WILDCARD;
}
match = 0;
for (i = 0; i < topic->kids; i++) {
match = 0;
for (i = 0; i < topic->kids; i++) {
strcpy (cbuf,topic->children[i]->title +
((topic->children[i]->flags & HLP_MAGIC_TOPIC)? 1 : 0));
cptr = cbuf;
while (*cptr) {
if (blankch (*cptr)) {
*cptr++ = '_';
} else {
}
else {
*cptr = toupper (*cptr);
cptr++;
}
}
if (!strncmp (cbuf, token, strlen (token))) {
if (match) {
if (match)
return HLP_MATCH_AMBIGUOUS;
}
match = i+1;
}
}
return match;
return match;
}
/* Main help routine
@ -8404,21 +8402,23 @@ static int matchHelpTopicName (TOPIC *topic, const char *token) {
t_stat scp_vhelp (FILE *st, struct sim_device *dptr,
struct sim_unit *uptr, int32 flag,
const char *help, const char *cptr, va_list ap) {
const char *help, const char *cptr, va_list ap)
{
TOPIC top = { 0, NULL, NULL, &top, NULL, 0, NULL, 0, 0};
TOPIC *topic = &top;
int failed;
size_t match;
size_t i;
char *p;
t_bool flat_help = FALSE;
char cbuf [CBUFSIZE], gbuf[CBUFSIZE];
TOPIC top = { 0, NULL, NULL, &top, NULL, 0, NULL, 0, 0};
TOPIC *topic = &top;
int failed;
size_t match;
size_t i;
char *p;
t_bool flat_help = FALSE;
char cbuf [CBUFSIZE], gbuf[CBUFSIZE];
static const char attach_help[] = { " ATTACH" };
static const char brief_help[] = { "%s help. Type <CR> to exit, HELP for navigation help" };
static const char onecmd_help[] = { "%s help." };
static const char help_help[] = {
static const char attach_help[] = { " ATTACH" };
static const char brief_help[] = { "%s help. Type <CR> to exit, HELP for navigation help" };
static const char onecmd_help[] = { "%s help." };
static const char help_help[] = {
/****|***********************80 column width guide********************************/
" This help command provides hierarchical help. To see more information,\n"
" type an offered subtopic name. To move back a level, just type <CR>.\n"
@ -8427,7 +8427,7 @@ t_stat scp_vhelp (FILE *st, struct sim_device *dptr,
" To exit help at any time, type EXIT.\n"
};
if ((failed = setjmp (help_env)) != 0) {
if ((failed = setjmp (help_env)) != 0) {
fprintf (stderr, "\nHelp was unable to process the help for this device.\n"
"Error in block %u line %u: %s\n"
"%s%*.*s%s"
@ -8441,52 +8441,48 @@ t_stat scp_vhelp (FILE *st, struct sim_device *dptr,
return failed;
}
/* Compile string into navigation tree */
/* Compile string into navigation tree */
/* Root */
/* Root */
if (dptr) {
if (dptr) {
p = dptr->name;
flat_help = (dptr->flags & DEV_FLATHELP) != 0;
} else {
}
else
p = sim_name;
}
top.title = (char *) malloc (strlen (p) + ((flag & SCP_HELP_ATTACH)? sizeof (attach_help)-1: 0) +1);
for (i = 0; p[i]; i++ ) {
top.title = (char *) malloc (strlen (p) + ((flag & SCP_HELP_ATTACH)? sizeof (attach_help)-1: 0) +1);
for (i = 0; p[i]; i++ )
top.title[i] = toupper (p[i]);
}
top.title[i] = '\0';
if (flag & SCP_HELP_ATTACH) {
top.title[i] = '\0';
if (flag & SCP_HELP_ATTACH)
strcpy (top.title+i, attach_help);
}
top.label = (char *) malloc (sizeof ("1"));
strcpy (top.label, "1");
top.label = (char *) malloc (sizeof ("1"));
strcpy (top.label, "1");
flat_help = flat_help || !sim_ttisatty() || (flag & SCP_HELP_FLAT);
flat_help = flat_help || !sim_ttisatty() || (flag & SCP_HELP_FLAT);
if (flat_help) {
if (flat_help) {
flag |= SCP_HELP_FLAT;
if (sim_ttisatty()) {
if (sim_ttisatty())
fprintf (st, "%s help.\nThis help is also available in hierarchical form.\n", top.title);
} else {
else
fprintf (st, "%s help.\n", top.title);
}
} else {
else
fprintf (st, ((flag & SCP_HELP_ONECMD)? onecmd_help: brief_help), top.title);
}
/* Add text and subtopics */
/* Add text and subtopics */
(void) buildHelp (&top, dptr, uptr, help, ap);
(void) buildHelp (&top, dptr, uptr, help, ap);
/* Go to initial topic if provided */
/* Go to initial topic if provided */
while (cptr && *cptr) {
while (cptr && *cptr) {
cptr = get_glyph (cptr, gbuf, 0);
if (!gbuf[0]) {
if (!gbuf[0])
break;
}
if (!strcmp (gbuf, "HELP")) { /* HELP (about help) */
fprintf (st, "\n");
fputs (help_help, st);
@ -8508,17 +8504,17 @@ t_stat scp_vhelp (FILE *st, struct sim_device *dptr,
}
topic = topic->children[match-1];
}
cptr = NULL;
cptr = NULL;
if (flat_help) {
if (flat_help) {
displayFlatHelp (st, dptr, uptr, flag, topic, ap);
cleanHelp (&top);
return SCPE_OK;
}
/* Interactive loop displaying help */
/* Interactive loop displaying help */
while (TRUE) {
while (TRUE) {
char *pstring;
const char *prompt[2] = {"? ", "Subtopic? "};
@ -8527,9 +8523,9 @@ t_stat scp_vhelp (FILE *st, struct sim_device *dptr,
if (topic->flags & HLP_MAGIC_TOPIC) {
fputc ('\n', st);
displayMagicTopic (st, dptr, topic);
} else {
fprintf (st, "\n%s\n", topic->title);
}
else
fprintf (st, "\n%s\n", topic->title);
/* Topic text (for magic topics, follows for explanations)
* It's possible/reasonable for a magic topic to have no text.
@ -8592,16 +8588,14 @@ t_stat scp_vhelp (FILE *st, struct sim_device *dptr,
topic = topic->parent;
continue;
}
if (!strcmp (gbuf, "?")) { /* ?, repaint current topic */
if (!strcmp (gbuf, "?")) /* ?, repaint current topic */
continue;
}
if (!strcmp (gbuf, "HELP")) { /* HELP (about help) */
fputs (help_help, st);
goto reprompt;
}
if (!strcmp (gbuf, "EXIT") || !strcmp (gbuf, "QUIT")) { /* EXIT (help) */
if (!strcmp (gbuf, "EXIT") || !strcmp (gbuf, "QUIT")) /* EXIT (help) */
break;
}
/* String - look for that topic */
@ -8627,11 +8621,11 @@ t_stat scp_vhelp (FILE *st, struct sim_device *dptr,
topic = topic->children[match-1];
}
/* Free structures and return */
/* Free structures and return */
cleanHelp (&top);
cleanHelp (&top);
return SCPE_OK;
return SCPE_OK;
}
/* variable argument list shell - most commonly used
@ -8639,15 +8633,16 @@ t_stat scp_vhelp (FILE *st, struct sim_device *dptr,
t_stat scp_help (FILE *st, struct sim_device *dptr,
struct sim_unit *uptr, int32 flag,
const char *help, const char *cptr, ...) {
t_stat r;
va_list ap;
const char *help, const char *cptr, ...)
{
t_stat r;
va_list ap;
va_start (ap, cptr);
r = scp_vhelp (st, dptr, uptr, flag, help, cptr, ap);
va_end (ap);
va_start (ap, cptr);
r = scp_vhelp (st, dptr, uptr, flag, help, cptr, ap);
va_end (ap);
return r;
return r;
}
#if 01
@ -8661,15 +8656,16 @@ t_stat scp_help (FILE *st, struct sim_device *dptr,
t_stat scp_vhelpFromFile (FILE *st, struct sim_device *dptr,
struct sim_unit *uptr, int32 flag,
const char *helpfile,
const char *cptr, va_list ap) {
FILE *fp;
char *help, *p;
t_offset size, n;
int c;
t_stat r;
const char *cptr, va_list ap)
{
FILE *fp;
char *help, *p;
t_offset size, n;
int c;
t_stat r;
fp = sim_fopen (helpfile, "r");
if (fp == NULL) {
fp = sim_fopen (helpfile, "r");
if (fp == NULL) {
if (sim_argv && *sim_argv[0]) {
char fbuf[(4*PATH_MAX)+1]; /* PATH_MAX is ridiculously small on some platforms */
char *d = NULL;
@ -8682,18 +8678,19 @@ t_stat scp_vhelpFromFile (FILE *st, struct sim_device *dptr,
* of the executable. Failing that, we're out of luck.
*/
strncpy (fbuf, sim_argv[0], sizeof (fbuf));
if ((p = match_ext (fbuf, "EXE"))) {
if ((p = match_ext (fbuf, "EXE")))
*p = '\0';
}
if ((p = strrchr (fbuf, '\\'))) {
p[1] = '\0';
d = "%s\\";
} else {
}
else {
if ((p = strrchr (fbuf, '/'))) {
p[1] = '\0';
d = "%s/";
#ifdef VMS
} else {
}
else {
if ((p = strrchr (fbuf, ']'))) {
p[1] = '\0';
d = "[%s]";
@ -8713,22 +8710,22 @@ t_stat scp_vhelpFromFile (FILE *st, struct sim_device *dptr,
}
}
}
if (fp == NULL) {
if (fp == NULL) {
fprintf (stderr, "Unable to open %s\n", helpfile);
return SCPE_UNATT;
}
size = sim_fsize_ex (fp); /* Estimate; line endings will vary */
size = sim_fsize_ex (fp); /* Estimate; line endings will vary */
help = (char *) malloc ((size_t) size +1);
if (!help) {
help = (char *) malloc ((size_t) size +1);
if (!help) {
fclose (fp);
return SCPE_MEM;
}
p = help;
n = 0;
p = help;
n = 0;
while ((c = fgetc (fp)) != EOF) {
while ((c = fgetc (fp)) != EOF) {
if (++n > size) {
#define XPANDQ 512
p = (char *) realloc (help, ((size_t)size) + XPANDQ +1);
@ -8743,26 +8740,27 @@ t_stat scp_vhelpFromFile (FILE *st, struct sim_device *dptr,
}
*p++ = c;
}
*p++ = '\0';
*p++ = '\0';
fclose (fp);
fclose (fp);
r = scp_vhelp (st, dptr, uptr, flag, help, cptr, ap);
free (help);
r = scp_vhelp (st, dptr, uptr, flag, help, cptr, ap);
free (help);
return r;
return r;
}
t_stat scp_helpFromFile (FILE *st, struct sim_device *dptr,
struct sim_unit *uptr, int32 flag,
const char *helpfile, const char *cptr, ...) {
t_stat r;
va_list ap;
const char *helpfile, const char *cptr, ...)
{
t_stat r;
va_list ap;
va_start (ap, cptr);
r = scp_vhelpFromFile (st, dptr, uptr, flag, helpfile, cptr, ap);
va_end (ap);
va_start (ap, cptr);
r = scp_vhelpFromFile (st, dptr, uptr, flag, helpfile, cptr, ap);
va_end (ap);
return r;
return r;
}
#endif