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