1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-01-01 05:16:05 +01:00

49783: Consistently use old job table in parameter module

This commit is contained in:
Peter Stephenson 2022-03-01 17:27:42 +00:00
parent 24474bd34a
commit 6a8aa2aa5a
3 changed files with 85 additions and 48 deletions

View file

@ -1,5 +1,8 @@
2022-03-01 Peter Stephenson <p.stephenson@samsung.com>
* 49783: Src/jobs.c, Src/Modules/parameter.c: Consistently use
old job table in parmaeter module.
* users/27536: Doc/Zsh/builtins.yo: Clarify interaction of
history matching and numeric indices.

View file

@ -1244,19 +1244,19 @@ histwgetfn(UNUSED(Param pm))
/**/
static char *
pmjobtext(int job)
pmjobtext(Job jtab, int job)
{
Process pn;
int len = 1;
char *ret;
for (pn = jobtab[job].procs; pn; pn = pn->next)
for (pn = jtab[job].procs; pn; pn = pn->next)
len += strlen(pn->text) + 3;
ret = (char *) zhalloc(len);
ret[0] = '\0';
for (pn = jobtab[job].procs; pn; pn = pn->next) {
for (pn = jtab[job].procs; pn; pn = pn->next) {
strcat(ret, pn->text);
if (pn->next)
strcat(ret, " | ");
@ -1269,22 +1269,25 @@ static HashNode
getpmjobtext(UNUSED(HashTable ht), const char *name)
{
Param pm = NULL;
int job;
int job, jmax;
char *pend;
Job jtab;
pm = (Param) hcalloc(sizeof(struct param));
pm->node.nam = dupstring(name);
pm->node.flags = PM_SCALAR | PM_READONLY;
pm->gsu.s = &nullsetscalar_gsu;
selectjobtab(&jtab, &jmax);
job = strtod(name, &pend);
/* Non-numeric keys are looked up by job name */
if (*pend)
job = getjob(name, NULL);
if (job >= 1 && job <= maxjob &&
jobtab[job].stat && jobtab[job].procs &&
!(jobtab[job].stat & STAT_NOPRINT))
pm->u.str = pmjobtext(job);
if (job >= 1 && job <= jmax &&
jtab[job].stat && jtab[job].procs &&
!(jtab[job].stat & STAT_NOPRINT))
pm->u.str = pmjobtext(jtab, job);
else {
pm->u.str = dupstring("");
pm->node.flags |= (PM_UNSET|PM_SPECIAL);
@ -1297,22 +1300,25 @@ static void
scanpmjobtexts(UNUSED(HashTable ht), ScanFunc func, int flags)
{
struct param pm;
int job;
int job, jmax;
char buf[40];
Job jtab;
memset((void *)&pm, 0, sizeof(struct param));
pm.node.flags = PM_SCALAR | PM_READONLY;
pm.gsu.s = &nullsetscalar_gsu;
for (job = 1; job <= maxjob; job++) {
if (jobtab[job].stat && jobtab[job].procs &&
!(jobtab[job].stat & STAT_NOPRINT)) {
selectjobtab(&jtab, &jmax);
for (job = 1; job <= jmax; job++) {
if (jtab[job].stat && jtab[job].procs &&
!(jtab[job].stat & STAT_NOPRINT)) {
if (func != scancountparams) {
sprintf(buf, "%d", job);
pm.node.nam = dupstring(buf);
if ((flags & (SCANPM_WANTVALS|SCANPM_MATCHVAL)) ||
!(flags & SCANPM_WANTKEYS))
pm.u.str = pmjobtext(job);
pm.u.str = pmjobtext(jtab, job);
}
func(&pm.node, flags);
}
@ -1323,7 +1329,7 @@ scanpmjobtexts(UNUSED(HashTable ht), ScanFunc func, int flags)
/**/
static char *
pmjobstate(int job)
pmjobstate(Job jtab, int job)
{
Process pn;
char buf[256], buf2[128], *ret, *state, *cp;
@ -1335,14 +1341,14 @@ pmjobstate(int job)
else
cp = ":";
if (jobtab[job].stat & STAT_DONE)
if (jtab[job].stat & STAT_DONE)
ret = dyncat("done", cp);
else if (jobtab[job].stat & STAT_STOPPED)
else if (jtab[job].stat & STAT_STOPPED)
ret = dyncat("suspended", cp);
else
ret = dyncat("running", cp);
for (pn = jobtab[job].procs; pn; pn = pn->next) {
for (pn = jtab[job].procs; pn; pn = pn->next) {
if (pn->status == SP_RUNNING)
state = "running";
@ -1371,21 +1377,24 @@ static HashNode
getpmjobstate(UNUSED(HashTable ht), const char *name)
{
Param pm = NULL;
int job;
int job, jmax;
char *pend;
Job jtab;
pm = (Param) hcalloc(sizeof(struct param));
pm->node.nam = dupstring(name);
pm->node.flags = PM_SCALAR | PM_READONLY;
pm->gsu.s = &nullsetscalar_gsu;
selectjobtab(&jtab, &jmax);
job = strtod(name, &pend);
if (*pend)
job = getjob(name, NULL);
if (job >= 1 && job <= maxjob &&
jobtab[job].stat && jobtab[job].procs &&
!(jobtab[job].stat & STAT_NOPRINT))
pm->u.str = pmjobstate(job);
if (job >= 1 && job <= jmax &&
jtab[job].stat && jtab[job].procs &&
!(jtab[job].stat & STAT_NOPRINT))
pm->u.str = pmjobstate(jtab, job);
else {
pm->u.str = dupstring("");
pm->node.flags |= (PM_UNSET|PM_SPECIAL);
@ -1398,22 +1407,25 @@ static void
scanpmjobstates(UNUSED(HashTable ht), ScanFunc func, int flags)
{
struct param pm;
int job;
int job, jmax;
Job jtab;
char buf[40];
selectjobtab(&jtab, &jmax);
memset((void *)&pm, 0, sizeof(struct param));
pm.node.flags = PM_SCALAR | PM_READONLY;
pm.gsu.s = &nullsetscalar_gsu;
for (job = 1; job <= maxjob; job++) {
if (jobtab[job].stat && jobtab[job].procs &&
!(jobtab[job].stat & STAT_NOPRINT)) {
for (job = 1; job <= jmax; job++) {
if (jtab[job].stat && jtab[job].procs &&
!(jtab[job].stat & STAT_NOPRINT)) {
if (func != scancountparams) {
sprintf(buf, "%d", job);
pm.node.nam = dupstring(buf);
if ((flags & (SCANPM_WANTVALS|SCANPM_MATCHVAL)) ||
!(flags & SCANPM_WANTKEYS))
pm.u.str = pmjobstate(job);
pm.u.str = pmjobstate(jtab, job);
}
func(&pm.node, flags);
}
@ -1424,11 +1436,11 @@ scanpmjobstates(UNUSED(HashTable ht), ScanFunc func, int flags)
/**/
static char *
pmjobdir(int job)
pmjobdir(Job jtab, int job)
{
char *ret;
ret = dupstring(jobtab[job].pwd ? jobtab[job].pwd : pwd);
ret = dupstring(jtab[job].pwd ? jtab[job].pwd : pwd);
return ret;
}
@ -1437,21 +1449,24 @@ static HashNode
getpmjobdir(UNUSED(HashTable ht), const char *name)
{
Param pm = NULL;
int job;
int job, jmax;
char *pend;
Job jtab;
pm = (Param) hcalloc(sizeof(struct param));
pm->node.nam = dupstring(name);
pm->node.flags = PM_SCALAR | PM_READONLY;
pm->gsu.s = &nullsetscalar_gsu;
selectjobtab(&jtab, &jmax);
job = strtod(name, &pend);
if (*pend)
job = getjob(name, NULL);
if (job >= 1 && job <= maxjob &&
jobtab[job].stat && jobtab[job].procs &&
!(jobtab[job].stat & STAT_NOPRINT))
pm->u.str = pmjobdir(job);
if (job >= 1 && job <= jmax &&
jtab[job].stat && jtab[job].procs &&
!(jtab[job].stat & STAT_NOPRINT))
pm->u.str = pmjobdir(jtab, job);
else {
pm->u.str = dupstring("");
pm->node.flags |= (PM_UNSET|PM_SPECIAL);
@ -1464,22 +1479,25 @@ static void
scanpmjobdirs(UNUSED(HashTable ht), ScanFunc func, int flags)
{
struct param pm;
int job;
int job, jmax;
char buf[40];
Job jtab;
memset((void *)&pm, 0, sizeof(struct param));
pm.node.flags = PM_SCALAR | PM_READONLY;
pm.gsu.s = &nullsetscalar_gsu;
for (job = 1; job <= maxjob; job++) {
if (jobtab[job].stat && jobtab[job].procs &&
!(jobtab[job].stat & STAT_NOPRINT)) {
selectjobtab(&jtab, &jmax);
for (job = 1; job <= jmax; job++) {
if (jtab[job].stat && jtab[job].procs &&
!(jtab[job].stat & STAT_NOPRINT)) {
if (func != scancountparams) {
sprintf(buf, "%d", job);
pm.node.nam = dupstring(buf);
if ((flags & (SCANPM_WANTVALS|SCANPM_MATCHVAL)) ||
!(flags & SCANPM_WANTKEYS))
pm.u.str = pmjobdir(job);
pm.u.str = pmjobdir(jtab, job);
}
func(&pm.node, flags);
}

View file

@ -98,10 +98,12 @@ mod_export int jobtabsize;
mod_export int maxjob;
/* If we have entered a subshell, the original shell's job table. */
static struct job *oldjobtab;
/**/
mod_export struct job *oldjobtab;
/* The size of that. */
static int oldmaxjob;
/**/
mod_export int oldmaxjob;
/* shell timings */
@ -1894,6 +1896,26 @@ setcurjob(void)
}
}
/* Find the job table for reporting jobs */
/**/
mod_export void
selectjobtab(Job *jtabp, int *jmaxp)
{
if (oldjobtab)
{
/* In subshell --- use saved job table to report */
*jtabp = oldjobtab;
*jmaxp = oldmaxjob;
}
else
{
/* Use main job table */
*jtabp = jobtab;
*jmaxp = maxjob;
}
}
/* Convert a job specifier ("%%", "%1", "%foo", "%?bar?", etc.) *
* to a job number. */
@ -1904,13 +1926,7 @@ getjob(const char *s, const char *prog)
int jobnum, returnval, mymaxjob;
Job myjobtab;
if (oldjobtab) {
myjobtab = oldjobtab;
mymaxjob = oldmaxjob;
} else {
myjobtab= jobtab;
mymaxjob = maxjob;
}
selectjobtab(&myjobtab, &mymaxjob);
/* if there is no %, treat as a name */
if (*s != '%')