SCP: Generalized numeric switch processing
This commit is contained in:
parent
81425a5829
commit
23f4c90a6d
3 changed files with 74 additions and 36 deletions
96
scp.c
96
scp.c
|
@ -314,7 +314,7 @@
|
||||||
if (sim_switches & SWMASK ('O')) val = 8; \
|
if (sim_switches & SWMASK ('O')) val = 8; \
|
||||||
else if (sim_switches & SWMASK ('D')) val = 10; \
|
else if (sim_switches & SWMASK ('D')) val = 10; \
|
||||||
else if (sim_switches & SWMASK ('H')) val = 16; \
|
else if (sim_switches & SWMASK ('H')) val = 16; \
|
||||||
else if (sim_sw_radix) val = sim_sw_radix; \
|
else if ((sim_switch_number >= 2) && (sim_switch_number <= 36)) val = sim_switch_number; \
|
||||||
else val = dft;
|
else val = dft;
|
||||||
|
|
||||||
/* Asynch I/O support */
|
/* Asynch I/O support */
|
||||||
|
@ -466,7 +466,12 @@ SCHTAB *get_rsearch (CONST char *cptr, int32 radix, SCHTAB *schptr);
|
||||||
SCHTAB *get_asearch (CONST char *cptr, int32 radix, SCHTAB *schptr);
|
SCHTAB *get_asearch (CONST char *cptr, int32 radix, SCHTAB *schptr);
|
||||||
int32 test_search (t_value *val, SCHTAB *schptr);
|
int32 test_search (t_value *val, SCHTAB *schptr);
|
||||||
static const char *get_glyph_gen (const char *iptr, char *optr, char mchar, t_bool uc, t_bool quote, char escape_char);
|
static const char *get_glyph_gen (const char *iptr, char *optr, char mchar, t_bool uc, t_bool quote, char escape_char);
|
||||||
int32 get_switches (const char *cptr);
|
typedef enum {
|
||||||
|
SW_ERROR, /* Parse Error */
|
||||||
|
SW_BITMASK, /* Bitmask Value or Not a switch */
|
||||||
|
SW_NUMBER /* Numeric Value */
|
||||||
|
} SWITCH_PARSE;
|
||||||
|
SWITCH_PARSE get_switches (const char *cptr, int32 *sw_val, int32 *sw_number);
|
||||||
CONST char *get_sim_sw (CONST char *cptr);
|
CONST char *get_sim_sw (CONST char *cptr);
|
||||||
t_stat get_aval (t_addr addr, DEVICE *dptr, UNIT *uptr);
|
t_stat get_aval (t_addr addr, DEVICE *dptr, UNIT *uptr);
|
||||||
t_value get_rval (REG *rptr, uint32 idx);
|
t_value get_rval (REG *rptr, uint32 idx);
|
||||||
|
@ -523,7 +528,7 @@ DEVICE *sim_dflt_dev = NULL;
|
||||||
UNIT *sim_clock_queue = QUEUE_LIST_END;
|
UNIT *sim_clock_queue = QUEUE_LIST_END;
|
||||||
int32 sim_interval = 0;
|
int32 sim_interval = 0;
|
||||||
int32 sim_switches = 0;
|
int32 sim_switches = 0;
|
||||||
int32 sim_sw_radix = 0;
|
int32 sim_switch_number = 0;
|
||||||
FILE *sim_ofile = NULL;
|
FILE *sim_ofile = NULL;
|
||||||
TMLN *sim_oline = NULL;
|
TMLN *sim_oline = NULL;
|
||||||
MEMFILE *sim_mfile = NULL;
|
MEMFILE *sim_mfile = NULL;
|
||||||
|
@ -2108,7 +2113,7 @@ for (i = 1; i < argc; i++) { /* loop thru args */
|
||||||
if (argv[i] == NULL) /* paranoia */
|
if (argv[i] == NULL) /* paranoia */
|
||||||
continue;
|
continue;
|
||||||
if ((*argv[i] == '-') && lookswitch) { /* switch? */
|
if ((*argv[i] == '-') && lookswitch) { /* switch? */
|
||||||
if ((sw = get_switches (argv[i])) < 0) {
|
if (get_switches (argv[i], &sw, NULL) == SW_ERROR) {
|
||||||
fprintf (stderr, "Invalid switch %s\n", argv[i]);
|
fprintf (stderr, "Invalid switch %s\n", argv[i]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -7996,6 +8001,21 @@ int sim_islower (char c)
|
||||||
return (c & 0x80) ? 0 : islower (c);
|
return (c & 0x80) ? 0 : islower (c);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sim_isupper (char c)
|
||||||
|
{
|
||||||
|
return (c & 0x80) ? 0 : isupper (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sim_toupper (char c)
|
||||||
|
{
|
||||||
|
return ((c >= 'a') && (c <= 'z')) ? ((c - 'a') + 'A') : c;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sim_tolower (char c)
|
||||||
|
{
|
||||||
|
return ((c >= 'A') && (c <= 'Z')) ? ((c - 'A') + 'a') : c;
|
||||||
|
}
|
||||||
|
|
||||||
int sim_isalpha (char c)
|
int sim_isalpha (char c)
|
||||||
{
|
{
|
||||||
return (c & 0x80) ? 0 : isalpha (c);
|
return (c & 0x80) ? 0 : isalpha (c);
|
||||||
|
@ -8732,31 +8752,35 @@ return NULL;
|
||||||
Inputs:
|
Inputs:
|
||||||
cptr = pointer to input string
|
cptr = pointer to input string
|
||||||
Outputs:
|
Outputs:
|
||||||
sw = switch bit mask
|
*sw = switch bit mask
|
||||||
0 if no switches, -1 if error
|
*mumber = numeric value
|
||||||
|
Return value: SW_ERROR if error
|
||||||
|
SW_BITMASK if switch bitmask or not a switch
|
||||||
|
SW_NUMBER if numeric
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int32 get_switches (const char *cptr)
|
SWITCH_PARSE get_switches (const char *cptr, int32 *sw, int32 *number)
|
||||||
{
|
{
|
||||||
int32 sw;
|
*sw = 0;
|
||||||
|
|
||||||
if (*cptr != '-')
|
if (*cptr != '-')
|
||||||
return 0;
|
return SW_BITMASK;
|
||||||
sw = 0;
|
if (number)
|
||||||
|
*number = 0;
|
||||||
if (sim_isdigit(cptr[1])) {
|
if (sim_isdigit(cptr[1])) {
|
||||||
char *end;
|
char *end;
|
||||||
long val = strtol (1+cptr, &end, 10);
|
long val = strtol (1+cptr, &end, 10);
|
||||||
|
|
||||||
if (*end != 0)
|
if ((*end != 0) || (number == NULL))
|
||||||
return -1;
|
return SW_ERROR;
|
||||||
return (int32)(SIM_SW_NUM | (val));
|
*number = (int32)val;
|
||||||
|
return SW_NUMBER;
|
||||||
}
|
}
|
||||||
for (cptr++; (sim_isspace (*cptr) == 0) && (*cptr != 0); cptr++) {
|
for (cptr++; (sim_isspace (*cptr) == 0) && (*cptr != 0); cptr++) {
|
||||||
if (sim_isalpha (*cptr) == 0)
|
if (sim_isalpha (*cptr) == 0)
|
||||||
return -1;
|
return SW_ERROR;
|
||||||
sw = sw | SWMASK (toupper (*cptr));
|
*sw = *sw | SWMASK (toupper (*cptr));
|
||||||
}
|
}
|
||||||
return sw;
|
return SW_BITMASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get_sim_sw accumulate sim_switches
|
/* get_sim_sw accumulate sim_switches
|
||||||
|
@ -8770,18 +8794,21 @@ return sw;
|
||||||
|
|
||||||
CONST char *get_sim_sw (CONST char *cptr)
|
CONST char *get_sim_sw (CONST char *cptr)
|
||||||
{
|
{
|
||||||
int32 lsw;
|
int32 lsw, lnum;
|
||||||
char gbuf[CBUFSIZE];
|
char gbuf[CBUFSIZE];
|
||||||
|
|
||||||
while (*cptr == '-') { /* while switches */
|
while (*cptr == '-') { /* while switches */
|
||||||
cptr = get_glyph (cptr, gbuf, 0); /* get switch glyph */
|
cptr = get_glyph (cptr, gbuf, 0); /* get switch glyph */
|
||||||
lsw = get_switches (gbuf); /* parse */
|
switch (get_switches (gbuf, &lsw, &lnum)) { /* parse */
|
||||||
if (lsw <= 0) { /* invalid or numeric? */
|
case SW_ERROR:
|
||||||
if ((lsw == -1) || (lsw == 0))
|
|
||||||
return NULL;
|
return NULL;
|
||||||
sim_sw_radix = lsw & ~SIM_SW_NUM; /* set radix */
|
case SW_BITMASK:
|
||||||
}
|
|
||||||
sim_switches = sim_switches | lsw; /* accumulate */
|
sim_switches = sim_switches | lsw; /* accumulate */
|
||||||
|
break;
|
||||||
|
case SW_NUMBER:
|
||||||
|
sim_switch_number = lnum; /* set number */
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return cptr;
|
return cptr;
|
||||||
}
|
}
|
||||||
|
@ -8798,14 +8825,14 @@ return cptr;
|
||||||
|
|
||||||
CONST char *get_sim_opt (int32 opt, CONST char *cptr, t_stat *st)
|
CONST char *get_sim_opt (int32 opt, CONST char *cptr, t_stat *st)
|
||||||
{
|
{
|
||||||
int32 t;
|
int32 t, n;
|
||||||
char gbuf[CBUFSIZE];
|
char gbuf[CBUFSIZE];
|
||||||
CONST char *svptr;
|
CONST char *svptr;
|
||||||
DEVICE *tdptr;
|
DEVICE *tdptr;
|
||||||
UNIT *tuptr;
|
UNIT *tuptr;
|
||||||
|
|
||||||
sim_switches = 0; /* no switches */
|
sim_switches = 0; /* no switches */
|
||||||
sim_sw_radix = 0; /* no radix override */
|
sim_switch_number = 0; /* no numberuc switch */
|
||||||
sim_ofile = NULL; /* no output file */
|
sim_ofile = NULL; /* no output file */
|
||||||
sim_schrptr = NULL; /* no search */
|
sim_schrptr = NULL; /* no search */
|
||||||
sim_schaptr = NULL; /* no search */
|
sim_schaptr = NULL; /* no search */
|
||||||
|
@ -8843,18 +8870,21 @@ while (*cptr) { /* loop through modifier
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
cptr = get_glyph (cptr, gbuf, 0);
|
cptr = get_glyph (cptr, gbuf, 0);
|
||||||
if ((t = get_switches (gbuf)) != 0) { /* try for switches */
|
switch (get_switches (gbuf, &t, &n)) { /* try for switches */
|
||||||
if (t < 0) { /* if bad switch or numeric */
|
case SW_ERROR: /* err if bad switch */
|
||||||
if (t == -1) { /* err if bad switch */
|
|
||||||
*st = SCPE_INVSW;
|
*st = SCPE_INVSW;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
case SW_NUMBER:
|
||||||
sim_sw_radix = t & ~SIM_SW_NUM; /* set radix */
|
sim_switch_number = n; /* set number */
|
||||||
}
|
continue;
|
||||||
else
|
case SW_BITMASK:
|
||||||
|
if (t != 0) {
|
||||||
sim_switches = sim_switches | t;/* or in new switches */
|
sim_switches = sim_switches | t;/* or in new switches */
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
else if ((opt & CMD_OPT_SCH) && /* if allowed, */
|
break;
|
||||||
|
}
|
||||||
|
if ((opt & CMD_OPT_SCH) && /* if allowed, */
|
||||||
get_rsearch (gbuf, sim_dfdev->dradix, &sim_stabr)) { /* try for search */
|
get_rsearch (gbuf, sim_dfdev->dradix, &sim_stabr)) { /* try for search */
|
||||||
sim_schrptr = &sim_stabr; /* set search */
|
sim_schrptr = &sim_stabr; /* set search */
|
||||||
sim_schaptr = get_asearch (gbuf, sim_dfdev->dradix, &sim_staba);/* populate memory version of the same expression */
|
sim_schaptr = get_asearch (gbuf, sim_dfdev->dradix, &sim_staba);/* populate memory version of the same expression */
|
||||||
|
|
9
scp.h
9
scp.h
|
@ -156,6 +156,14 @@ int sim_isprint (char c);
|
||||||
int sim_isdigit (char c);
|
int sim_isdigit (char c);
|
||||||
int sim_isgraph (char c);
|
int sim_isgraph (char c);
|
||||||
int sim_isalnum (char c);
|
int sim_isalnum (char c);
|
||||||
|
int sim_toupper (char c);
|
||||||
|
int sim_tolower (char c);
|
||||||
|
#ifndef toupper
|
||||||
|
#define toupper(chr) sim_toupper(chr)
|
||||||
|
#endif
|
||||||
|
#ifndef tolower
|
||||||
|
#define tolower(chr) sim_tolower(chr)
|
||||||
|
#endif
|
||||||
int sim_strncasecmp (const char *string1, const char *string2, size_t len);
|
int sim_strncasecmp (const char *string1, const char *string2, size_t len);
|
||||||
int sim_strcasecmp (const char *string1, const char *string2);
|
int sim_strcasecmp (const char *string1, const char *string2);
|
||||||
size_t sim_strlcat (char *dst, const char *src, size_t size);
|
size_t sim_strlcat (char *dst, const char *src, size_t size);
|
||||||
|
@ -277,6 +285,7 @@ extern DEVICE *sim_dfdev;
|
||||||
extern UNIT *sim_dfunit;
|
extern UNIT *sim_dfunit;
|
||||||
extern int32 sim_interval;
|
extern int32 sim_interval;
|
||||||
extern int32 sim_switches;
|
extern int32 sim_switches;
|
||||||
|
extern int32 sim_switch_number;
|
||||||
extern int32 sim_quiet;
|
extern int32 sim_quiet;
|
||||||
extern int32 sim_step;
|
extern int32 sim_step;
|
||||||
extern t_stat sim_last_cmd_stat; /* Command Status */
|
extern t_stat sim_last_cmd_stat; /* Command Status */
|
||||||
|
|
|
@ -325,7 +325,6 @@ typedef uint32 t_addr;
|
||||||
#define SIM_SW_REG (1u << 28) /* register value */
|
#define SIM_SW_REG (1u << 28) /* register value */
|
||||||
#define SIM_SW_STOP (1u << 29) /* stop message */
|
#define SIM_SW_STOP (1u << 29) /* stop message */
|
||||||
#define SIM_SW_SHUT (1u << 30) /* shutdown */
|
#define SIM_SW_SHUT (1u << 30) /* shutdown */
|
||||||
#define SIM_SW_NUM (1u << 31) /* Numeric Switch */
|
|
||||||
|
|
||||||
/* Simulator status codes
|
/* Simulator status codes
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue