SCP: Produce detailed message when REG names are ambiguous.

As discussed in #402 and #398
This commit is contained in:
Mark Pizzolato 2017-02-14 14:20:09 -08:00
parent 7f2c7480ef
commit 8882cebe27
2 changed files with 35 additions and 7 deletions

37
scp.c
View file

@ -477,6 +477,7 @@ void fprint_sep (FILE *st, int32 *tokens);
char *read_line (char *ptr, int32 size, FILE *stream);
char *read_line_p (const char *prompt, char *ptr, int32 size, FILE *stream);
REG *find_reg_glob (CONST char *ptr, CONST char **optr, DEVICE **gdptr);
REG *find_reg_glob_reason (CONST char *cptr, CONST char **optr, DEVICE **gdptr, t_stat *stat);
char *sim_trim_endspc (char *cptr);
/* Forward references */
@ -651,6 +652,7 @@ const struct scp_error {
{"INVREM", "Invalid remote console command"},
{"NOTATT", "Not attached"},
{"EXPECT", "Expect matched"},
{"AMBREG", "Ambiguous register name"},
{"REMOTE", "remote console command"},
};
@ -6742,6 +6744,7 @@ int32 opt;
t_addr low, high;
t_stat reason;
DEVICE *tdptr;
t_stat tstat = SCPE_OK;
REG *lowr, *highr;
FILE *ofile;
@ -6781,7 +6784,7 @@ for (gptr = gbuf, reason = SCPE_OK;
if ((lowr = find_reg (gptr, &tptr, tdptr)) || /* local reg or */
(!(sim_opt_out & CMD_OPT_DFT) && /* no dflt, global? */
(lowr = find_reg_glob (gptr, &tptr, &tdptr)))) {
(lowr = find_reg_glob_reason (gptr, &tptr, &tdptr, &tstat)))) {
low = high = 0;
if ((*tptr == '-') || (*tptr == ':')) {
highr = find_reg (tptr + 1, &tptr, tdptr);
@ -6813,7 +6816,7 @@ for (gptr = gbuf, reason = SCPE_OK;
(((sim_dfunit->capac == 0) || (flag == EX_E))? 0:
sim_dfunit->capac - sim_dfdev->aincr), 0);
if (tptr == NULL)
return SCPE_ARG;
return (tstat ? tstat : SCPE_ARG);
if (*tptr && (*tptr++ != ','))
return SCPE_ARG;
reason = exdep_addr_loop (ofile, sim_schaptr, flag, cptr, low, high,
@ -8203,28 +8206,52 @@ return (dptr->flags & DEV_DIS? TRUE: FALSE);
result = pointer to register, NULL if error
*optr = pointer to next character in input string
*gdptr = pointer to device where found
*stat = pointer to stat for reason
*/
REG *find_reg_glob (CONST char *cptr, CONST char **optr, DEVICE **gdptr)
REG *find_reg_glob_reason (CONST char *cptr, CONST char **optr, DEVICE **gdptr, t_stat *stat)
{
int32 i;
DEVICE *dptr;
REG *rptr, *srptr = NULL;
if (stat)
*stat = SCPE_OK;
*gdptr = NULL;
for (i = 0; (dptr = sim_devices[i]) != 0; i++) { /* all dev */
if (dptr->flags & DEV_DIS) /* skip disabled */
continue;
if ((rptr = find_reg (cptr, optr, dptr))) { /* found? */
if (srptr) /* ambig? err */
return NULL;
if (srptr) { /* ambig? err */
if (stat) {
if (sim_show_message) {
if (*stat == SCPE_OK)
sim_printf ("Ambiguous register. %s appears in devices %s and %s", cptr, (*gdptr)->name, dptr->name);
else
sim_printf (" and %s", dptr->name);
}
*stat = SCPE_AMBREG|SCPE_NOMESSAGE;
}
else
return NULL;
}
srptr = rptr; /* save reg */
*gdptr = dptr; /* save unit */
}
}
if (stat && (*stat != SCPE_OK)) {
if (sim_show_message)
sim_printf ("\n");
srptr = NULL;
}
return srptr;
}
REG *find_reg_glob (CONST char *cptr, CONST char **optr, DEVICE **gdptr)
{
return find_reg_glob_reason (cptr, optr, gdptr, NULL);
}
/* find_reg find register matching input string
Inputs:

View file

@ -377,9 +377,10 @@ typedef uint32 t_addr;
#define SCPE_INVREM (SCPE_BASE + 43) /* invalid remote console command */
#define SCPE_NOTATT (SCPE_BASE + 44) /* not attached */
#define SCPE_EXPECT (SCPE_BASE + 45) /* expect matched */
#define SCPE_REMOTE (SCPE_BASE + 46) /* remote console command */
#define SCPE_AMBREG (SCPE_BASE + 46) /* ambiguous register */
#define SCPE_REMOTE (SCPE_BASE + 47) /* remote console command */
#define SCPE_MAX_ERR (SCPE_BASE + 47) /* Maximum SCPE Error Value */
#define SCPE_MAX_ERR (SCPE_BASE + 48) /* Maximum SCPE Error Value */
#define SCPE_KFLAG 0x1000 /* tti data flag */
#define SCPE_BREAK 0x2000 /* tti break flag */
#define SCPE_NOMESSAGE 0x10000000 /* message display supression flag */