SCP: Allow Environment variable names in IF/ASSERT string comparisons

This commit is contained in:
Mark Pizzolato 2018-01-30 02:42:36 -08:00
parent 097ebbb8eb
commit cc6ff4fa51

41
scp.c
View file

@ -1940,6 +1940,7 @@ ASSERT failure have several different actions:
" The -i switch, if present, causes comparisons to be case insensitive.\n" " The -i switch, if present, causes comparisons to be case insensitive.\n"
" <string1> and <string2> are quoted string values which may have\n" " <string1> and <string2> are quoted string values which may have\n"
" environment variables substituted as desired.\n" " environment variables substituted as desired.\n"
" Either quoted string may alternatively be an environment variable name.\n"
" <compare-op> may be one of:\n\n" " <compare-op> may be one of:\n\n"
"++== - equal\n" "++== - equal\n"
"++EQU - equal\n" "++EQU - equal\n"
@ -3676,8 +3677,8 @@ return 1;
<logical-op> and <conditional-op> are the same as that <logical-op> and <conditional-op> are the same as that
allowed for examine and deposit search specifications. allowed for examine and deposit search specifications.
Syntax: ASSERT {-i} {NOT} "<string1>" <compare-op> "<string2>" Syntax: ASSERT {-i} {NOT} "<string1>"|EnvVarName1 <compare-op> "<string2>"|EnvVarName2
Syntax: IF {-i} {NOT} "<string1>" <compare-op> "<string2>" commandtoprocess{; additionalcommandtoprocess}... Syntax: IF {-i} {NOT} "<string1>"|EnvVarName1 <compare-op> "<string2>"|EnvVarName2 commandtoprocess{; additionalcommandtoprocess}...
If -i is specified, the comparisons are done in a case insensitive manner. If -i is specified, the comparisons are done in a case insensitive manner.
If NOT is specified, the resulting expression value is inverted. If NOT is specified, the resulting expression value is inverted.
@ -3697,6 +3698,28 @@ return 1;
>= - greater than or equal >= - greater than or equal
GEQ - greater than or equal GEQ - greater than or equal
*/ */
static CONST char *_get_string (CONST char *iptr, char *optr, char mchar)
{
const char *ap;
CONST char *tptr, *gptr;
REG *rptr;
tptr = (CONST char *)get_glyph_gen (iptr, optr, mchar, (sim_switches & SWMASK ('I')), TRUE, '\\');
if (*optr != '"') {
ap = getenv (optr);
if (!ap)
return tptr;
/* for legacy ASSERT/IF behavior give precidence to REGister names over Environment Variables */
get_glyph (optr, optr, 0);
rptr = find_reg (optr, &gptr, sim_dfdev);
if (rptr)
return tptr;
snprintf (optr, CBUFSIZE - 1, "\"%s\"", ap);
get_glyph_gen (optr, optr, 0, (sim_switches & SWMASK ('I')), TRUE, '\\');
}
return tptr;
}
t_stat assert_cmd (int32 flag, CONST char *cptr) t_stat assert_cmd (int32 flag, CONST char *cptr)
{ {
char gbuf[CBUFSIZE], gbuf2[CBUFSIZE]; char gbuf[CBUFSIZE], gbuf2[CBUFSIZE];
@ -3725,7 +3748,8 @@ if (!strcmp (gbuf, "EXIST")) { /* File Exist Test? */
Exist = TRUE; /* remember that, and */ Exist = TRUE; /* remember that, and */
cptr = (CONST char *)tptr; cptr = (CONST char *)tptr;
} }
if (Exist || (*cptr == '"')) { /* quoted string comparison? */ tptr = _get_string (cptr, gbuf, '='); /* get first string */
if (Exist || (*gbuf == '"')) { /* quoted string comparison? */
char op[CBUFSIZE]; char op[CBUFSIZE];
static struct { static struct {
const char *op; const char *op;
@ -3743,16 +3767,14 @@ if (Exist || (*cptr == '"')) { /* quoted string compari
{"<=", 0, -1, FALSE}, {"<=", 0, -1, FALSE},
{"LEQ", 0, -1, FALSE}, {"LEQ", 0, -1, FALSE},
{">", 1, 1, FALSE}, {">", 1, 1, FALSE},
{"GTR", 1, 1, FALSE}, {"GTR", 1, 1, FALSE},
{">=", 0, 1, FALSE}, {">=", 0, 1, FALSE},
{"GEQ", 0, 1, FALSE}, {"GEQ", 0, 1, FALSE},
{NULL}}; {NULL}};
tptr = (CONST char *)get_glyph_gen (cptr, gbuf, '=', (sim_switches & SWMASK ('I')), TRUE, '\\');
/* get first string */
if (!*tptr) if (!*tptr)
return SCPE_2FARG; return SCPE_2FARG;
cptr += strlen (gbuf); cptr = tptr;
while (sim_isspace (*cptr)) /* skip spaces */ while (sim_isspace (*cptr)) /* skip spaces */
++cptr; ++cptr;
if (!Exist) { if (!Exist) {
@ -3765,8 +3787,7 @@ if (Exist || (*cptr == '"')) { /* quoted string compari
cptr += strlen (op); cptr += strlen (op);
while (sim_isspace (*cptr)) /* skip spaces */ while (sim_isspace (*cptr)) /* skip spaces */
++cptr; ++cptr;
cptr = (CONST char *)get_glyph_gen (cptr, gbuf2, 0, (sim_switches & SWMASK ('I')), TRUE, '\\'); cptr = _get_string (cptr, gbuf2, 0); /* get second string */
/* get second string */
if (*cptr) { /* more? */ if (*cptr) { /* more? */
if (flag) /* ASSERT has no more args */ if (flag) /* ASSERT has no more args */
return SCPE_2MARG; return SCPE_2MARG;
@ -3808,7 +3829,7 @@ else {
addr = sim_vm_parse_addr (sim_dfdev, gbuf, &gptr); addr = sim_vm_parse_addr (sim_dfdev, gbuf, &gptr);
else else
addr = (t_addr) strtotv (gbuf, &gptr, sim_dfdev ? sim_dfdev->dradix : sim_dflt_dev->dradix); addr = (t_addr) strtotv (gbuf, &gptr, sim_dfdev ? sim_dfdev->dradix : sim_dflt_dev->dradix);
if (gbuf == gptr) /* error? */ if (gbuf == gptr) /* not register? */
return SCPE_NXREG; return SCPE_NXREG;
} }
if (*gptr != 0) /* more? must be search */ if (*gptr != 0) /* more? must be search */