summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--Functions/Calendar/calendar_scandate84
2 files changed, 51 insertions, 37 deletions
diff --git a/ChangeLog b/ChangeLog
index 4737347d7..a9a27cb8c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2007-08-21 Peter Stephenson <pws@csr.com>
+ * unposted: Functions/Calendar/calendar_scandate: ensure we
+ match the first time on the line so as to hook up with date.
+ Could usefully be done with the date too, but not as crucial.
+
* users/11790: Functions/Zle/{up,down}-line-or-beginning-search:
emulate -L zsh to avoid nounset problem.
diff --git a/Functions/Calendar/calendar_scandate b/Functions/Calendar/calendar_scandate
index 38647f84e..eed70671c 100644
--- a/Functions/Calendar/calendar_scandate
+++ b/Functions/Calendar/calendar_scandate
@@ -257,54 +257,64 @@ else
fi
# Look for a time separately; we need colons for this.
-case $line in
- # with seconds, am/pm: don't match / in front.
- ((#ibm)${~tspat}(<0-12>):(<0-59>)[.:]((<0-59>)(.<->|))[[:space:]]#([ap])(|.)[[:space:]]#m(.|[[:space:]]|(#e))(*))
+# We want to look for the first time to ensure it's associated
+# with a date at the start of the line. Of course there may be
+# a time followed by some other text followed by a date, but
+# in that case the whole thing is too ambiguous to worry about
+# (and we don't need to worry about this for a calendar entry where
+# the date must be at the start).
+#
+# We do this by minimal matching at the head, i.e. ${...#...}.
+# To use a case statement we'd need to be able to request non-greedy
+# matching for a pattern.
+rest=${line#(#ibm)${~tspat}(<0-12>):(<0-59>)[.:]((<0-59>)(.<->|))[[:space:]]#([ap])(|.)[[:space:]]#m(.|[[:space:]]|(#e))}
+if [[ $rest != $line ]]; then
hour=$match[2]
minute=$match[3]
second=$match[5]
[[ $match[7] = (#i)p ]] && (( hour <= 12 )) && (( hour += 12 ))
time_found=1
- ;;
-
+else
# no seconds, am/pm
- ((#ibm)${~tspat}(<0-12>):(<0-59>)[[:space:]]#([ap])(|.)[[:space:]]#m(.|[[:space:]]|(#e))(*))
- hour=$match[2]
- minute=$match[3]
- [[ $match[4] = (#i)p ]] && (( hour <= 12 )) && (( hour += 12 ))
- time_found=1
- ;;
-
- # no colon, even, but a.m./p.m. indicator
- ((#ibm)${~tspat}(<0-12>)[[:space:]]#([ap])(|.)[[:space:]]#m(.|[[:space:]]|(#e))(*))
- hour=$match[2]
- minute=0
- [[ $match[3] = (#i)p ]] && (( hour <= 12 )) && (( hour += 12 ))
- time_found=1
- ;;
-
- # 24 hour clock, with seconds
- ((#ibm)${~tspat}(<0-24>):(<0-59>)[.:]((<0-59>)(.<->|))(*))
- hour=$match[2]
- minute=$match[3]
- second=$match[5]
- time_found=1
- ;;
-
- # 24 hour clock, no seconds
- ((#ibm)${~tspat}(<0-24>):(<0-59>)(*))
- hour=$match[2]
- minute=$match[3]
- time_found=1
- ;;
-esac
-
+ rest=${line#(#ibm)${~tspat}(<0-12>):(<0-59>)[[:space:]]#([ap])(|.)[[:space:]]#m(.|[[:space:]]|(#e))}
+ if [[ $rest != $line ]]; then
+ hour=$match[2]
+ minute=$match[3]
+ [[ $match[4] = (#i)p ]] && (( hour <= 12 )) && (( hour += 12 ))
+ time_found=1
+ else
+ # no colon, even, but a.m./p.m. indicator
+ rest=${line#(#ibm)${~tspat}(<0-12>)[[:space:]]#([ap])(|.)[[:space:]]#m(.|[[:space:]]|(#e))}
+ if [[ $rest != $line ]]; then
+ hour=$match[2]
+ minute=0
+ [[ $match[3] = (#i)p ]] && (( hour <= 12 )) && (( hour += 12 ))
+ time_found=1
+ else
+ # 24 hour clock, with seconds
+ rest=${line#(#ibm)${~tspat}(<0-24>):(<0-59>)[.:]((<0-59>)(.<->|))(.|[[:space:]]|(#e))}
+ if [[ $rest != $line ]]; then
+ hour=$match[2]
+ minute=$match[3]
+ second=$match[5]
+ time_found=1
+ else
+ rest=${line#(#ibm)${~tspat}(<0-24>):(<0-59>)(.|[[:space:]]|(#e))}
+ if [[ $rest != $line ]]; then
+ hour=$match[2]
+ minute=$match[3]
+ time_found=1
+ fi
+ fi
+ fi
+ fi
+fi
(( hour == 24 )) && hour=0
if (( time_found )); then
# time was found
time_start=$mbegin[2]
- time_end=$mend[-2]
+ time_end=$mend[-1]
# Remove the timespec because it may be in the middle of
# the date (as in the output of "date".
# There may be a time zone, too, which we don't yet handle.