SCP: Produce detailed message when REG names are ambiguous.
As discussed in #402 and #398
This commit is contained in:
parent
7f2c7480ef
commit
8882cebe27
2 changed files with 35 additions and 7 deletions
35
scp.c
35
scp.c
|
@ -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 */
|
||||
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:
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Reference in a new issue