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:
parent
24474bd34a
commit
6a8aa2aa5a
3 changed files with 85 additions and 48 deletions
|
@ -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.
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
34
Src/jobs.c
34
Src/jobs.c
|
@ -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 != '%')
|
||||
|
|
Loading…
Reference in a new issue