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:
parent
76009709b1
commit
de9fc84fd4
1 changed files with 13 additions and 6 deletions
19
scp.c
19
scp.c
|
@ -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 {
|
||||||
|
|
Loading…
Add table
Reference in a new issue