Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

PATCH: Add jobdirs association to parameter module



This proposed patch adds a new association to the parameter module
called jobdirs.  This provides an association with job numbers and the
directories in which the jobs were started.

I decided to use the name jobdirs instead of jobpwds since the "jobs"
builtin uses the "-d" to list these directories.  Though I could see
that jobpwds might also be appropriate.

It is possible to use the "jobs -d" command to get this same
information with a little processing. Though adding an association
seems to be a cleaner way for zsh functions or scripts to get this
information.

-FR
--- old/Src/Modules/parameter.c Mon Dec  6 02:26:32 1999
+++ Src/Modules/parameter.c     Sun Dec 12 20:58:25 1999
@@ -1325,6 +1325,83 @@
     }
 }
 
+/* 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 @@
     { "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 @@
            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;
--- old/Src/Modules/parameter.mdd       Wed Nov  3 03:07:27 1999
+++ Src/Modules/parameter.mdd   Fri Dec 10 11:34:25 1999
@@ -1,3 +1,3 @@
-autoparams="parameters commands functions dis_functions funcstack builtins
dis_builtins reswords dis_reswords options modules dirstack history
historywords jobtexts jobstates nameddirs userdirs aliases dis_aliases galiases
dis_galiases"
+autoparams="parameters commands functions dis_functions funcstack builtins
dis_builtins reswords dis_reswords options modules dirstack history
historywords jobtexts jobdirs jobstates nameddirs userdirs aliases dis_aliases
galiases dis_galiases"
 
 objects="parameter.o"
--- old/zsh/Doc/Zsh/mod_parameter.yo    Wed Nov  3 03:07:19 1999
+++ Doc/Zsh/mod_parameter.yo    Fri Dec 10 11:32:09 1999
@@ -110,6 +110,10 @@
 item(tt(historywords))(
 A special array containing the words stored in the history.
 )
+vindex(jobdirs)
+item(tt(jobdirs))(
+This association maps job numbers to the directories from which the job was
started (which may not be the current directory of the job).
+)
 vindex(jobtexts)
 item(tt(jobtexts))(
 This association maps job numbers to the texts of the command lines


__________________________________________________
Do You Yahoo!?
Thousands of Stores.  Millions of Products.  All in one place.
Yahoo! Shopping: http://shopping.yahoo.com



Messages sorted by: Reverse Date, Date, Thread, Author