From 8882cebe271a1a6b3c28404a511907cddf2981bd Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Tue, 14 Feb 2017 14:20:09 -0800 Subject: [PATCH] SCP: Produce detailed message when REG names are ambiguous. As discussed in #402 and #398 --- scp.c | 37 ++++++++++++++++++++++++++++++++----- sim_defs.h | 5 +++-- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/scp.c b/scp.c index cb7d12e9..924a08ef 100644 --- a/scp.c +++ b/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 */ - 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: diff --git a/sim_defs.h b/sim_defs.h index a21d3902..2892ca9d 100644 --- a/sim_defs.h +++ b/sim_defs.h @@ -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 */