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
37
scp.c
37
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 (char *ptr, int32 size, FILE *stream);
|
||||||
char *read_line_p (const char *prompt, 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 (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);
|
char *sim_trim_endspc (char *cptr);
|
||||||
|
|
||||||
/* Forward references */
|
/* Forward references */
|
||||||
|
@ -651,6 +652,7 @@ const struct scp_error {
|
||||||
{"INVREM", "Invalid remote console command"},
|
{"INVREM", "Invalid remote console command"},
|
||||||
{"NOTATT", "Not attached"},
|
{"NOTATT", "Not attached"},
|
||||||
{"EXPECT", "Expect matched"},
|
{"EXPECT", "Expect matched"},
|
||||||
|
{"AMBREG", "Ambiguous register name"},
|
||||||
{"REMOTE", "remote console command"},
|
{"REMOTE", "remote console command"},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -6742,6 +6744,7 @@ int32 opt;
|
||||||
t_addr low, high;
|
t_addr low, high;
|
||||||
t_stat reason;
|
t_stat reason;
|
||||||
DEVICE *tdptr;
|
DEVICE *tdptr;
|
||||||
|
t_stat tstat = SCPE_OK;
|
||||||
REG *lowr, *highr;
|
REG *lowr, *highr;
|
||||||
FILE *ofile;
|
FILE *ofile;
|
||||||
|
|
||||||
|
@ -6781,7 +6784,7 @@ for (gptr = gbuf, reason = SCPE_OK;
|
||||||
|
|
||||||
if ((lowr = find_reg (gptr, &tptr, tdptr)) || /* local reg or */
|
if ((lowr = find_reg (gptr, &tptr, tdptr)) || /* local reg or */
|
||||||
(!(sim_opt_out & CMD_OPT_DFT) && /* no dflt, global? */
|
(!(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;
|
low = high = 0;
|
||||||
if ((*tptr == '-') || (*tptr == ':')) {
|
if ((*tptr == '-') || (*tptr == ':')) {
|
||||||
highr = find_reg (tptr + 1, &tptr, tdptr);
|
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 == 0) || (flag == EX_E))? 0:
|
||||||
sim_dfunit->capac - sim_dfdev->aincr), 0);
|
sim_dfunit->capac - sim_dfdev->aincr), 0);
|
||||||
if (tptr == NULL)
|
if (tptr == NULL)
|
||||||
return SCPE_ARG;
|
return (tstat ? tstat : SCPE_ARG);
|
||||||
if (*tptr && (*tptr++ != ','))
|
if (*tptr && (*tptr++ != ','))
|
||||||
return SCPE_ARG;
|
return SCPE_ARG;
|
||||||
reason = exdep_addr_loop (ofile, sim_schaptr, flag, cptr, low, high,
|
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
|
result = pointer to register, NULL if error
|
||||||
*optr = pointer to next character in input string
|
*optr = pointer to next character in input string
|
||||||
*gdptr = pointer to device where found
|
*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;
|
int32 i;
|
||||||
DEVICE *dptr;
|
DEVICE *dptr;
|
||||||
REG *rptr, *srptr = NULL;
|
REG *rptr, *srptr = NULL;
|
||||||
|
|
||||||
|
if (stat)
|
||||||
|
*stat = SCPE_OK;
|
||||||
*gdptr = NULL;
|
*gdptr = NULL;
|
||||||
for (i = 0; (dptr = sim_devices[i]) != 0; i++) { /* all dev */
|
for (i = 0; (dptr = sim_devices[i]) != 0; i++) { /* all dev */
|
||||||
if (dptr->flags & DEV_DIS) /* skip disabled */
|
if (dptr->flags & DEV_DIS) /* skip disabled */
|
||||||
continue;
|
continue;
|
||||||
if ((rptr = find_reg (cptr, optr, dptr))) { /* found? */
|
if ((rptr = find_reg (cptr, optr, dptr))) { /* found? */
|
||||||
if (srptr) /* ambig? err */
|
if (srptr) { /* ambig? err */
|
||||||
return NULL;
|
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 */
|
srptr = rptr; /* save reg */
|
||||||
*gdptr = dptr; /* save unit */
|
*gdptr = dptr; /* save unit */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (stat && (*stat != SCPE_OK)) {
|
||||||
|
if (sim_show_message)
|
||||||
|
sim_printf ("\n");
|
||||||
|
srptr = NULL;
|
||||||
|
}
|
||||||
return srptr;
|
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
|
/* find_reg find register matching input string
|
||||||
|
|
||||||
Inputs:
|
Inputs:
|
||||||
|
|
|
@ -377,9 +377,10 @@ typedef uint32 t_addr;
|
||||||
#define SCPE_INVREM (SCPE_BASE + 43) /* invalid remote console command */
|
#define SCPE_INVREM (SCPE_BASE + 43) /* invalid remote console command */
|
||||||
#define SCPE_NOTATT (SCPE_BASE + 44) /* not attached */
|
#define SCPE_NOTATT (SCPE_BASE + 44) /* not attached */
|
||||||
#define SCPE_EXPECT (SCPE_BASE + 45) /* expect matched */
|
#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_KFLAG 0x1000 /* tti data flag */
|
||||||
#define SCPE_BREAK 0x2000 /* tti break flag */
|
#define SCPE_BREAK 0x2000 /* tti break flag */
|
||||||
#define SCPE_NOMESSAGE 0x10000000 /* message display supression flag */
|
#define SCPE_NOMESSAGE 0x10000000 /* message display supression flag */
|
||||||
|
|
Loading…
Add table
Reference in a new issue