From a016fed99f33d040c18515cc749f98a254b5a7e5 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 14 Jun 2007 13:25:58 +0000 Subject: 23560: improve $zsh_scheduled_events to make it easier to parse --- ChangeLog | 6 ++++ Doc/Zsh/mod_sched.yo | 10 +++++-- Functions/Calendar/calendar | 9 ++---- Src/Builtins/sched.c | 69 ++++++++++++++++++++------------------------- 4 files changed, 46 insertions(+), 48 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9dddc0c66..80947dc11 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-06-14 Peter Stephenson + + * 23560: Doc/Zsh/mod_sched.yo, Src/Builtins/sched.c: improved + version of 23554 making $zsh_scheduled_events more useful + for programming. + 2007-06-12 Clint Adams * 23556: Completion/Unix/Command/_rrdtool: completion diff --git a/Doc/Zsh/mod_sched.yo b/Doc/Zsh/mod_sched.yo index 0e9075841..22ad4afd2 100644 --- a/Doc/Zsh/mod_sched.yo +++ b/Doc/Zsh/mod_sched.yo @@ -48,9 +48,13 @@ item(zsh_scheduled_events)( A readonly array corresponding to the events scheduled by the tt(sched) builtin. The indices of the array correspond to the numbers shown when tt(sched) is run with no arguments (provided that the -tt(KSH_ARRAYS) option is not set). The value of the -corresponding element is the same as the text shown to the right -of the index in the tt(sched) listing. +tt(KSH_ARRAYS) option is not set). The value of the array +consists of the scheduled time in seconds since the epoch +(see ifnzman(The zsh/datetime Module)\ +ifzman(the section `The zsh/datetime Module') for facilities for +using this number), followed by a colon, followed by any options +(which may be empty but will be preceeded by a `tt(-)' otherwise), +followed by a colon, followed by the command to be executed. The tt(sched) builtin should be used for manipulating the events. Note that this will have an immediate effect on the contents of the array, diff --git a/Functions/Calendar/calendar b/Functions/Calendar/calendar index 08903d04c..b3cb58425 100644 --- a/Functions/Calendar/calendar +++ b/Functions/Calendar/calendar @@ -352,13 +352,8 @@ fi if [[ -n $sched ]]; then if [[ $next -ge 0 ]]; then # Remove any existing calendar scheduling. - # Luckily sched doesn't delete its schedule in a subshell. - sched | while read line; do - if [[ $line = (#b)[[:space:]]#(<->)[[:space:]]##*[[:space:]]'calendar -s'* ]]; then - # End of pipeline run in current shell, so delete directly. - sched -1 $match[1] - fi - done + i=${"${(@)zsh_scheduled_events#*:*:}"[(I)calendar -s*]} + (( i )) && sched -$i $sched $next calendar "${calopts[@]}" $next $next else $showprog $start $stop \ diff --git a/Src/Builtins/sched.c b/Src/Builtins/sched.c index 1c7c0341f..21a2aad32 100644 --- a/Src/Builtins/sched.c +++ b/Src/Builtins/sched.c @@ -145,40 +145,6 @@ checksched(void) } } -/* - * Format event sch. If sn is zero, allocate string on the heap - * and return it; if non-zero, print with that as scheduled event - * number. - */ - -static -char *schedtext(struct schedcmd *sch, int sn) -{ - char *str, tbuf[40], *flagstr, *endstr; - time_t t; - struct tm *tmp; - - t = sch->time; - tmp = localtime(&t); - ztrftime(tbuf, 20, "%a %b %e %k:%M;%S", tmp); - if (sch->flags & SCHEDFLAG_TRASH_ZLE) - flagstr = "-o "; - else - flagstr = ""; - if (*sch->cmd == '-') - endstr = "-- "; - else - endstr = ""; - if (sn) { - printf("%3d %s %s%s%s\n", sn, tbuf, flagstr, endstr, sch->cmd); - return NULL; - } else { - str = (char *)zhalloc(48 + strlen(sch->cmd)); - sprintf(str, "%s %s%s%s", tbuf, flagstr, endstr, sch->cmd); - return str; - } -} - /**/ static int bin_sched(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func)) @@ -238,8 +204,24 @@ bin_sched(char *nam, char **argv, UNUSED(Options ops), UNUSED(int func)) /* given no arguments, display the schedule list */ if (!*argptr) { - for (sn = 1, sch = schedcmds; sch; sch = sch->next, sn++) - (void)schedtext(sch, 1); + for (sn = 1, sch = schedcmds; sch; sch = sch->next, sn++) { + char tbuf[40], *flagstr, *endstr; + time_t t; + struct tm *tmp; + + t = sch->time; + tmp = localtime(&t); + ztrftime(tbuf, 20, "%a %b %e %k:%M:%S", tmp); + if (sch->flags & SCHEDFLAG_TRASH_ZLE) + flagstr = "-o "; + else + flagstr = ""; + if (*sch->cmd == '-') + endstr = "-- "; + else + endstr = ""; + printf("%3d %s %s%s%s\n", sn, tbuf, flagstr, endstr, sch->cmd); + } return 0; } else if (!argptr[1]) { /* other than the two cases above, sched * @@ -365,8 +347,19 @@ schedgetfn(UNUSED(Param pm)) ; aptr = ret = zhalloc(sizeof(char **) * (i+1)); - for (sch = schedcmds; sch; sch = sch->next, aptr++) - *aptr = schedtext(sch, 0); + for (sch = schedcmds; sch; sch = sch->next, aptr++) { + char tbuf[40], *flagstr; + time_t t; + + t = sch->time; + sprintf(tbuf, "%ld", t); + if (sch->flags & SCHEDFLAG_TRASH_ZLE) + flagstr = "-o"; + else + flagstr = ""; + *aptr = (char *)zhalloc(5 + strlen(tbuf) + strlen(sch->cmd)); + sprintf(*aptr, "%s:%s:%s", tbuf, flagstr, sch->cmd); + } *aptr = NULL; return ret; -- cgit 1.4.1