about summary refs log tree commit diff
path: root/Src/Modules/parameter.c
diff options
context:
space:
mode:
authorTanaka Akira <akr@users.sourceforge.net>1999-12-13 06:10:07 +0000
committerTanaka Akira <akr@users.sourceforge.net>1999-12-13 06:10:07 +0000
commita557e3e6fa91b3c0dc6219cb05d1931168b5e5df (patch)
treea575cd4dcd5c91a635bcca54d8cd74e829ac5450 /Src/Modules/parameter.c
parent8699df93e16a45384168b0f5bbc5de417aa6d866 (diff)
downloadzsh-a557e3e6fa91b3c0dc6219cb05d1931168b5e5df.tar.gz
zsh-a557e3e6fa91b3c0dc6219cb05d1931168b5e5df.tar.xz
zsh-a557e3e6fa91b3c0dc6219cb05d1931168b5e5df.zip
manual/9007
Diffstat (limited to 'Src/Modules/parameter.c')
-rw-r--r--Src/Modules/parameter.c83
1 files changed, 81 insertions, 2 deletions
diff --git a/Src/Modules/parameter.c b/Src/Modules/parameter.c
index c512ed2e2..0169b4654 100644
--- a/Src/Modules/parameter.c
+++ b/Src/Modules/parameter.c
@@ -1325,6 +1325,83 @@ scanpmjobstates(HashTable ht, ScanFunc func, int flags)
     }
 }
 
+/* Functions for the jobdirs special parameter. */
+
+/**/
+static char *
+pmjobdir(int job)
+{
+    char *ret;
+
+    ret = dupstring(jobtab[job].pwd);
+    return ret;
+}
+
+/**/
+static HashNode
+getpmjobdir(HashTable ht, char *name)
+{
+    Param pm = NULL;
+    int job;
+
+    HEAPALLOC {
+       pm = (Param) zhalloc(sizeof(struct param));
+       pm->nam = dupstring(name);
+       pm->flags = PM_SCALAR | PM_READONLY;
+       pm->sets.cfn = NULL;
+       pm->gets.cfn = strgetfn;
+       pm->unsetfn = NULL;
+       pm->ct = 0;
+       pm->env = NULL;
+       pm->ename = NULL;
+       pm->old = NULL;
+       pm->level = 0;
+
+       if ((job = atoi(name)) >= 1 && job < MAXJOB &&
+           jobtab[job].stat && jobtab[job].procs &&
+           !(jobtab[job].stat & STAT_NOPRINT))
+           pm->u.str = pmjobdir(job);
+       else {
+           pm->u.str = dupstring("");
+           pm->flags |= PM_UNSET;
+       }
+    } LASTALLOC;
+
+    return (HashNode) pm;
+}
+
+/**/
+static void
+scanpmjobdirs(HashTable ht, ScanFunc func, int flags)
+{
+    struct param pm;
+    int job;
+    char buf[40];
+
+    pm.flags = PM_SCALAR | PM_READONLY;
+    pm.sets.cfn = NULL;
+    pm.gets.cfn = strgetfn;
+    pm.unsetfn = NULL;
+    pm.ct = 0;
+    pm.env = NULL;
+    pm.ename = NULL;
+    pm.old = NULL;
+    pm.level = 0;
+
+    for (job = 1; job < MAXJOB; job++) {
+       if (jobtab[job].stat && jobtab[job].procs &&
+           !(jobtab[job].stat & STAT_NOPRINT)) {
+           sprintf(buf, "%d", job);
+           pm.nam = dupstring(buf);
+           if (func != scancountparams &&
+               ((flags & (SCANPM_WANTVALS|SCANPM_MATCHVAL)) ||
+                !(flags & SCANPM_WANTKEYS)))
+               pm.u.str = pmjobdir(job);
+           func((HashNode) &pm, flags);
+       }
+    }
+}
+
 /* Functions for the nameddirs special parameter. */
 
 /**/
@@ -1833,6 +1910,9 @@ static struct pardef partab[] = {
     { "jobstates", PM_READONLY,
       getpmjobstate, scanpmjobstates, hashsetfn,
       NULL, NULL, stdunsetfn, NULL },
+    { "jobdirs", PM_READONLY,
+      getpmjobdir, scanpmjobdirs, hashsetfn,
+      NULL, NULL, stdunsetfn, NULL },
     { "nameddirs", 0,
       getpmnameddir, scanpmnameddirs, setpmnameddirs,
       NULL, NULL, stdunsetfn, NULL },
@@ -1889,8 +1969,7 @@ boot_parameter(Module m)
 	    if (def->hsetfn)
 		def->pm->sets.hfn = def->hsetfn;
 	} else {
-	    if (!(def->pm = createparam(def->name, def->flags | PM_HIDE |
-					PM_REMOVABLE)))
+	    if (!(def->pm = createparam(def->name, def->flags | PM_HIDE)))
 		return 1;
 	    def->pm->sets.afn = def->setfn;
 	    def->pm->gets.afn = def->getfn;