SCP: Fix NOEXPECT to actually delete a single indicated expect rule. Allow expect actions to be provided. Fix match buffer management when expect regular expressions are in use.
This commit is contained in:
parent
995ab8f1e2
commit
e8358703be
2 changed files with 24 additions and 10 deletions
33
scp.c
33
scp.c
|
@ -430,7 +430,6 @@ t_stat detach_all (int32 start_device, t_bool shutdown);
|
||||||
t_stat assign_device (DEVICE *dptr, char *cptr);
|
t_stat assign_device (DEVICE *dptr, char *cptr);
|
||||||
t_stat deassign_device (DEVICE *dptr);
|
t_stat deassign_device (DEVICE *dptr);
|
||||||
t_stat ssh_break_one (FILE *st, int32 flg, t_addr lo, int32 cnt, char *aptr);
|
t_stat ssh_break_one (FILE *st, int32 flg, t_addr lo, int32 cnt, char *aptr);
|
||||||
t_stat run_boot_prep (void);
|
|
||||||
t_stat exdep_reg_loop (FILE *ofile, SCHTAB *schptr, int32 flag, char *cptr,
|
t_stat exdep_reg_loop (FILE *ofile, SCHTAB *schptr, int32 flag, char *cptr,
|
||||||
REG *lowr, REG *highr, uint32 lows, uint32 highs);
|
REG *lowr, REG *highr, uint32 lows, uint32 highs);
|
||||||
t_stat ex_reg (FILE *ofile, t_value val, int32 flag, REG *rptr, uint32 idx);
|
t_stat ex_reg (FILE *ofile, t_value val, int32 flag, REG *rptr, uint32 idx);
|
||||||
|
@ -5706,6 +5705,9 @@ return r;
|
||||||
co[nt] start simulation
|
co[nt] start simulation
|
||||||
s[tep] [step limit] start simulation for 'limit' instructions
|
s[tep] [step limit] start simulation for 'limit' instructions
|
||||||
b[oot] device bootstrap from device and start simulation
|
b[oot] device bootstrap from device and start simulation
|
||||||
|
|
||||||
|
switches:
|
||||||
|
-Q quiet return status
|
||||||
*/
|
*/
|
||||||
|
|
||||||
t_stat run_cmd (int32 flag, char *cptr)
|
t_stat run_cmd (int32 flag, char *cptr)
|
||||||
|
@ -5735,7 +5737,7 @@ if ((flag == RU_RUN) || (flag == RU_GO)) { /* run or go */
|
||||||
put_rval (sim_PC, 0, pcv);
|
put_rval (sim_PC, 0, pcv);
|
||||||
}
|
}
|
||||||
if ((flag == RU_RUN) && /* run? */
|
if ((flag == RU_RUN) && /* run? */
|
||||||
((r = run_boot_prep ()) != SCPE_OK)) /* reset sim */
|
((r = sim_run_boot_prep ()) != SCPE_OK)) /* reset sim */
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5797,7 +5799,7 @@ else if (flag == RU_BOOT) { /* boot */
|
||||||
!(uptr->flags & UNIT_ATT))
|
!(uptr->flags & UNIT_ATT))
|
||||||
return SCPE_UNATT;
|
return SCPE_UNATT;
|
||||||
unitno = (int32) (uptr - dptr->units); /* recover unit# */
|
unitno = (int32) (uptr - dptr->units); /* recover unit# */
|
||||||
if ((r = run_boot_prep ()) != SCPE_OK) /* reset sim */
|
if ((r = sim_run_boot_prep ()) != SCPE_OK) /* reset sim */
|
||||||
return r;
|
return r;
|
||||||
if ((r = dptr->boot (unitno, dptr)) != SCPE_OK) /* boot device */
|
if ((r = dptr->boot (unitno, dptr)) != SCPE_OK) /* boot device */
|
||||||
return r;
|
return r;
|
||||||
|
@ -5806,6 +5808,9 @@ else if (flag == RU_BOOT) { /* boot */
|
||||||
else if (flag != RU_CONT) /* must be cont */
|
else if (flag != RU_CONT) /* must be cont */
|
||||||
return SCPE_IERR;
|
return SCPE_IERR;
|
||||||
|
|
||||||
|
if (sim_switches & SIM_SW_HIDE) /* Setup only for Remote Console Mode */
|
||||||
|
return SCPE_OK;
|
||||||
|
|
||||||
for (i = 1; (dptr = sim_devices[i]) != NULL; i++) { /* reposition all */
|
for (i = 1; (dptr = sim_devices[i]) != NULL; i++) { /* reposition all */
|
||||||
for (j = 0; j < dptr->numunits; j++) { /* seq devices */
|
for (j = 0; j < dptr->numunits; j++) { /* seq devices */
|
||||||
uptr = dptr->units + j;
|
uptr = dptr->units + j;
|
||||||
|
@ -5944,7 +5949,7 @@ if (sim_deb) /* log if enabled */
|
||||||
|
|
||||||
/* Common setup for RUN or BOOT */
|
/* Common setup for RUN or BOOT */
|
||||||
|
|
||||||
t_stat run_boot_prep (void)
|
t_stat sim_run_boot_prep (void)
|
||||||
{
|
{
|
||||||
UNIT *uptr;
|
UNIT *uptr;
|
||||||
|
|
||||||
|
@ -8561,8 +8566,7 @@ if ((*cptr != '"') && (*cptr != '\'')) {
|
||||||
return SCPE_ARG|SCPE_NOMESSAGE;
|
return SCPE_ARG|SCPE_NOMESSAGE;
|
||||||
}
|
}
|
||||||
cptr = get_glyph_quoted (cptr, gbuf, 0);
|
cptr = get_glyph_quoted (cptr, gbuf, 0);
|
||||||
if (*cptr != '\0')
|
|
||||||
return SCPE_2MARG; /* No more arguments */
|
|
||||||
return sim_exp_set (exp, gbuf, cnt, (after ? after : exp->after), sim_switches, cptr);
|
return sim_exp_set (exp, gbuf, cnt, (after ? after : exp->after), sim_switches, cptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8581,7 +8585,7 @@ if ((*cptr != '"') && (*cptr != '\'')) {
|
||||||
cptr = get_glyph_quoted (cptr, gbuf, 0);
|
cptr = get_glyph_quoted (cptr, gbuf, 0);
|
||||||
if (*cptr != '\0')
|
if (*cptr != '\0')
|
||||||
return SCPE_2MARG; /* No more arguments */
|
return SCPE_2MARG; /* No more arguments */
|
||||||
return sim_exp_clr (exp, cptr); /* clear one rule */
|
return sim_exp_clr (exp, gbuf); /* clear one rule */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Search for an expect rule in an expect context */
|
/* Search for an expect rule in an expect context */
|
||||||
|
@ -8754,7 +8758,7 @@ if ((act != NULL) && (*act != 0)) { /* new action? */
|
||||||
for (i=0; i<exp->size; i++) {
|
for (i=0; i<exp->size; i++) {
|
||||||
uint32 compare_size = (exp->rules[i].switches & EXP_TYP_REGEX) ? MAX(10 * strlen(ep->match_pattern), 1024) : exp->rules[i].size;
|
uint32 compare_size = (exp->rules[i].switches & EXP_TYP_REGEX) ? MAX(10 * strlen(ep->match_pattern), 1024) : exp->rules[i].size;
|
||||||
if (compare_size > exp->buf_size) {
|
if (compare_size > exp->buf_size) {
|
||||||
exp->buf = (uint8 *)realloc (exp->buf, compare_size*sizeof(*exp->buf));
|
exp->buf = (uint8 *)realloc (exp->buf, compare_size+1); /* Extra byte to null terminate regex compares */
|
||||||
exp->buf_size = compare_size;
|
exp->buf_size = compare_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8836,7 +8840,13 @@ for (i=0; i < exp->size; i++) {
|
||||||
++regex_checks;
|
++regex_checks;
|
||||||
matches = calloc ((ep->regex.re_nsub + 1), sizeof(*matches));
|
matches = calloc ((ep->regex.re_nsub + 1), sizeof(*matches));
|
||||||
exp->buf[exp->buf_ins] = '\0';
|
exp->buf[exp->buf_ins] = '\0';
|
||||||
if (!regexec (&ep->regex, (char *)exp->buf, ep->regex.re_nsub + 1, matches, REG_NOTBOL|REG_NOTEOL)) {
|
if (sim_deb && (exp->dptr->dctrl & exp->dbit)) {
|
||||||
|
char *estr = sim_encode_quoted_string (exp->buf, exp->buf_ins);
|
||||||
|
sim_debug (exp->dbit, exp->dptr, "Checking String: %s\n", estr);
|
||||||
|
sim_debug (exp->dbit, exp->dptr, "Against Match Rule: %s\n", ep->match_pattern);
|
||||||
|
free (estr);
|
||||||
|
}
|
||||||
|
if (!regexec (&ep->regex, (char *)exp->buf, ep->regex.re_nsub + 1, matches, REG_NOTBOL)) {
|
||||||
size_t j;
|
size_t j;
|
||||||
char *buf = malloc (1 + exp->buf_ins);
|
char *buf = malloc (1 + exp->buf_ins);
|
||||||
|
|
||||||
|
@ -8888,9 +8898,12 @@ if (exp->buf_ins == exp->buf_size) { /* At end of match buffe
|
||||||
used when no regular expression rules are in effect */
|
used when no regular expression rules are in effect */
|
||||||
memmove (exp->buf, &exp->buf[exp->buf_size/2], exp->buf_size-(exp->buf_size/2));
|
memmove (exp->buf, &exp->buf[exp->buf_size/2], exp->buf_size-(exp->buf_size/2));
|
||||||
exp->buf_ins -= exp->buf_size/2;
|
exp->buf_ins -= exp->buf_size/2;
|
||||||
|
sim_debug (exp->dbit, exp->dptr, "Buffer Full - sliding the last %d bytes to start of buffer new insert at: %d\n", (exp->buf_size/2), exp->buf_ins);
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
exp->buf_ins = 0; /* wrap around to beginning */
|
exp->buf_ins = 0; /* wrap around to beginning */
|
||||||
|
sim_debug (exp->dbit, exp->dptr, "Buffer wrapping\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (i != exp->size) { /* Found? */
|
if (i != exp->size) { /* Found? */
|
||||||
sim_debug (exp->dbit, exp->dptr, "Matched expect pattern: %s\n", ep->match_pattern);
|
sim_debug (exp->dbit, exp->dptr, "Matched expect pattern: %s\n", ep->match_pattern);
|
||||||
|
|
1
scp.h
1
scp.h
|
@ -100,6 +100,7 @@ t_stat _sim_activate_after (UNIT *uptr, int32 usecs_walltime);
|
||||||
t_stat sim_cancel (UNIT *uptr);
|
t_stat sim_cancel (UNIT *uptr);
|
||||||
t_bool sim_is_active (UNIT *uptr);
|
t_bool sim_is_active (UNIT *uptr);
|
||||||
int32 sim_activate_time (UNIT *uptr);
|
int32 sim_activate_time (UNIT *uptr);
|
||||||
|
t_stat sim_run_boot_prep (void);
|
||||||
double sim_gtime (void);
|
double sim_gtime (void);
|
||||||
uint32 sim_grtime (void);
|
uint32 sim_grtime (void);
|
||||||
int32 sim_qcount (void);
|
int32 sim_qcount (void);
|
||||||
|
|
Loading…
Add table
Reference in a new issue