SCP: added flexibility to search specifier parsing to fallback to register value format if the VM supplied parse_sym() doesn't handle the value provided.

This commit is contained in:
Mark Pizzolato 2014-12-29 14:03:43 -08:00
parent 76009709b1
commit de9fc84fd4

19
scp.c
View file

@ -401,8 +401,8 @@ FILE *stdnul;
/* Commands support routines */
SCHTAB *get_rsearch (char *cptr, int32 radix, SCHTAB *schptr);
SCHTAB *get_asearch (char *cptr, int32 radix, SCHTAB *schptr);
SCHTAB *get_rsearch (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);
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 (char *cptr);
@ -7644,7 +7644,7 @@ return pptr;
schptr if valid search specification
*/
SCHTAB *get_rsearch (char *cptr, int32 radix, SCHTAB *schptr)
SCHTAB *get_rsearch (const char *cptr, int32 radix, SCHTAB *schptr)
{
int32 c, logop, cmpop;
t_value logval, cmpval;
@ -7676,6 +7676,12 @@ for (logop = cmpop = -1; (c = *cptr++); ) { /* loop thru clauses */
}
else return NULL;
} /* end for */
if (schptr->count != 1) {
free (schptr->mask);
schptr->mask = calloc (sim_emax, sizeof(*schptr->mask));
free (schptr->comp);
schptr->comp = calloc (sim_emax, sizeof(*schptr->comp));
}
if (logop >= 0) {
schptr->logic = logop;
schptr->mask[0] = logval;
@ -7699,11 +7705,12 @@ return schptr;
schptr if valid search specification
*/
SCHTAB *get_asearch (char *cptr, int32 radix, SCHTAB *schptr)
SCHTAB *get_asearch (const char *cptr, int32 radix, SCHTAB *schptr)
{
int32 c, logop, cmpop;
t_value *logval, *cmpval;
t_stat reason;
const char *ocptr = cptr;
const char *sptr;
char gbuf[CBUFSIZE];
const char logstr[] = "|&^", cmpstr[] = "=!><";
@ -7720,7 +7727,7 @@ for (logop = cmpop = -1; (c = *cptr++); ) { /* loop thru clauses */
if (reason > 0) {
free (logval);
free (cmpval);
return NULL;
return get_rsearch (ocptr, radix, schptr);
}
}
else if ((sptr = strchr (cmpstr, c))) { /* check for boolop */
@ -7734,7 +7741,7 @@ for (logop = cmpop = -1; (c = *cptr++); ) { /* loop thru clauses */
if (reason > 0) {
free (logval);
free (cmpval);
return NULL;
return get_rsearch (ocptr, radix, schptr);
}
}
else {