From 235e9bd1bfe35caf51ba988268e075c24e3615fe Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Mon, 16 Mar 2015 15:07:35 +0000 Subject: 34721: new glob qualifier functions before, after --- ChangeLog | 5 ++++ Doc/Zsh/calsys.yo | 35 +++++++++++++++++++------ Functions/Calendar/after | 67 +++++++++++++++++++++++++++++++++++++++++++++++ Functions/Calendar/before | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 166 insertions(+), 8 deletions(-) create mode 100644 Functions/Calendar/after create mode 100644 Functions/Calendar/before diff --git a/ChangeLog b/ChangeLog index 9d399f014..9fc3f9822 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2015-03-16 Peter Stephenson + + * 34721: Doc/Zsh/calsys.yo, Functions/Calendar/after, + Functions/Calendar/before: new glob qualifier functions. + 2015-03-16 Daniel Shahaf * 34671 plus tweaks: Completion/Base/Utility/_describe diff --git a/Doc/Zsh/calsys.yo b/Doc/Zsh/calsys.yo index 0d7abbf86..6b5fe27fb 100644 --- a/Doc/Zsh/calsys.yo +++ b/Doc/Zsh/calsys.yo @@ -10,9 +10,9 @@ or future events, details of which are stored in a text file (typically tt(calendar) in the user's home directory). The version provided here includes a mechanism for alerting the user when an event is due. -In addition a function tt(age) is provided that can be used in a glob -qualifier; it allows files to be selected based on their modification -times. +In addition functions tt(age), tt(before) and tt(after) are provided +that can be used in a glob qualifier; they allow files to be selected +based on their modification times. The format of the tt(calendar) file and the dates used there in and in the tt(age) function are described first, then the functions that can @@ -122,10 +122,10 @@ enditemize() Here, square brackets indicate optional elements, possibly with alternatives. Fractions of a second are recognised but ignored. For absolute times (the normal format require by the tt(calendar) file and the -tt(age) function) a date is mandatory but a time of day is not; the time -returned is at the start of the date. One variation is allowed: if -tt(a.m.) or tt(p.m.) or one of their variants is present, an hour without a -minute is allowed, e.g. tt(3 p.m.). +tt(age), tt(before) and tt(after) functions) a date is mandatory but a +time of day is not; the time returned is at the start of the date. One +variation is allowed: if tt(a.m.) or tt(p.m.) or one of their variants +is present, an hour without a minute is allowed, e.g. tt(3 p.m.). Time zones are not handled, though if one is matched following a time specification it will be removed to allow a surrounding date to be @@ -605,8 +605,10 @@ left in a file with the suffix tt(.old). enditem() subsect(Glob qualifiers) -findex(age) +startitem() +item(tt(age))( +findex(age) The function tt(age) can be autoloaded and use separately from the calendar system, although it uses the function tt(calendar_scandate) for date formatting. It requires the tt(zsh/stat) builtin, but uses @@ -675,6 +677,23 @@ example(print *+LPAR()e-age :file1 :file2-+RPAR()) matches all files modified no earlier than tt(file1) and no later than tt(file2); precision here is to the nearest second. +) +xitem(tt(after)) +item(tt(before))( +findex(after) +findex(before) +The functions tt(after) and tt(before) are simpler versions of tt(age) +that take just one argument. The argument is parsed similarly to an +argument of tt(age); if it is not given the variable tt(AGEREF) is +consulted. As the names of the functions suggest, a file matches if its +modification time is after or before the time and date specified. If +a time only is given the date is today. + +The two following examples are therefore equivalent: +example(print *+LPAR()e-after 12:00-RPAR() +print *+LPAR()e-after today:12:00-RPAR()) +) +enditem() texinode(Calendar Styles)(Calendar Utility Functions)(Calendar System User Functions)(Calendar Function System) sect(Styles) diff --git a/Functions/Calendar/after b/Functions/Calendar/after new file mode 100644 index 000000000..7fb0166f7 --- /dev/null +++ b/Functions/Calendar/after @@ -0,0 +1,67 @@ +# Glob qualifier function, e.g +# +# print *(e:after 2014/08/01:) +# print *(e-after today:12:00-) +# +# If named before: +# Match files modified before a given time. +# +# If named after: +# Match files modified after a given time. Use as glob qualifier. +# N.B.: "after" actually includes the given time as it is to second +# precision (it would be inconvenient to exclude the first second of a date). +# It should therefore more logically be called "from", but that's a less +# obvious name. +# +# File to test is in $REPLY. +# +# Similar to age, but only takes at most one data, which is +# compared directly with the current time. + +emulate -L zsh + +zmodload -F zsh/stat b:zstat +zmodload -i zsh/parameter + +autoload -Uz calendar_scandate + +local timefmt +local -a vals tmp + +[[ -e $REPLY ]] || return 1 +zstat -A vals +mtime -- $REPLY || return 1 + +if (( $# == 1 )); then + if [[ $1 = :* ]]; then + timefmt="%Y/%m/%d:%H:%M:%S" + zstat -A tmp -F $timefmt +mtime -- ${1#:} || return 1 + local AGEREF=$tmp[1] + else + local AGEREF=$1 + fi +fi + +integer mtime=$vals[1] date1 date2 +local REPLY REPLY2 + +# allow a time only (meaning today) +if calendar_scandate -t $AGEREF; then + date1=$REPLY + + case $0 in + (after) + (( mtime >= date1 )) + ;; + + (before) + (( mtime < date1 )) + ;; + + (*) + print "$0: must be named 'after' or 'before'" >&2 + return 1 + ;; + esac +else + return 1 +fi diff --git a/Functions/Calendar/before b/Functions/Calendar/before new file mode 100644 index 000000000..7fb0166f7 --- /dev/null +++ b/Functions/Calendar/before @@ -0,0 +1,67 @@ +# Glob qualifier function, e.g +# +# print *(e:after 2014/08/01:) +# print *(e-after today:12:00-) +# +# If named before: +# Match files modified before a given time. +# +# If named after: +# Match files modified after a given time. Use as glob qualifier. +# N.B.: "after" actually includes the given time as it is to second +# precision (it would be inconvenient to exclude the first second of a date). +# It should therefore more logically be called "from", but that's a less +# obvious name. +# +# File to test is in $REPLY. +# +# Similar to age, but only takes at most one data, which is +# compared directly with the current time. + +emulate -L zsh + +zmodload -F zsh/stat b:zstat +zmodload -i zsh/parameter + +autoload -Uz calendar_scandate + +local timefmt +local -a vals tmp + +[[ -e $REPLY ]] || return 1 +zstat -A vals +mtime -- $REPLY || return 1 + +if (( $# == 1 )); then + if [[ $1 = :* ]]; then + timefmt="%Y/%m/%d:%H:%M:%S" + zstat -A tmp -F $timefmt +mtime -- ${1#:} || return 1 + local AGEREF=$tmp[1] + else + local AGEREF=$1 + fi +fi + +integer mtime=$vals[1] date1 date2 +local REPLY REPLY2 + +# allow a time only (meaning today) +if calendar_scandate -t $AGEREF; then + date1=$REPLY + + case $0 in + (after) + (( mtime >= date1 )) + ;; + + (before) + (( mtime < date1 )) + ;; + + (*) + print "$0: must be named 'after' or 'before'" >&2 + return 1 + ;; + esac +else + return 1 +fi -- cgit 1.4.1