You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by se...@apache.org on 2007/12/20 00:38:42 UTC

svn commit: r605740 - /incubator/stdcxx/trunk/bin/duration

Author: sebor
Date: Wed Dec 19 15:38:41 2007
New Revision: 605740

URL: http://svn.apache.org/viewvc?rev=605740&view=rev
Log:
2007-12-19  Martin Sebor  <se...@roguewave.com>

	* bin/duration (func_return_value): Added a global variable to make
	it possible to efficiently return large values (>255) from functions.
	(get): Renamed "local" parameters and used func_return_value to
	return values instead of echo-ing them to stdout so as to avoid
	starting a subshell for each invocation of the function.
	(seconds_from_epoch): Used func_return_value and corrected off-by-1
	error in the computation of the offset. Corrected the Epoch to 1970
	rather than the non-existent year 0.
	Made both script arguments optional and changed script behavior to
	write the offset from the Epoch when one or both arguments are not
	provided.

Modified:
    incubator/stdcxx/trunk/bin/duration   (contents, props changed)

Modified: incubator/stdcxx/trunk/bin/duration
URL: http://svn.apache.org/viewvc/incubator/stdcxx/trunk/bin/duration?rev=605740&r1=605739&r2=605740&view=diff
==============================================================================
--- incubator/stdcxx/trunk/bin/duration (original)
+++ incubator/stdcxx/trunk/bin/duration Wed Dec 19 15:38:41 2007
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# $Id:$
+# $Id: duration 601591 2007-12-06 01:09:56Z sebor $
 #
 ########################################################################
 #
@@ -28,7 +28,7 @@
 #     duration - Write the amount of time between two dates.
 #
 # SYNOPSIS
-#     duration [option(s)...] date-1 [date-2]
+#     duration [ option(s)... ] [ date-1 [ date-2 ]]
 #
 # DESCRIPTION
 #     The duration utility computes the amount of time elapsed between
@@ -36,6 +36,13 @@
 #     "C" locale, making adjustments for time zone offsets, and writes
 #     the difference to standard output.
 #
+#     The effect of invoking it with no arguments is the same as
+#       duration "`date`".
+#
+#     The effect of invoking it with one argument is the same as
+#       duration "Thu Jan 1 00:00:00 UTC 1970" "`date`"
+#     where 1/1/1970 is the Epoch (the beginning of UNIX time).
+#
 ########################################################################
 
 
@@ -43,6 +50,8 @@
 myname=$0
 verbose=0
 
+# used to return large values (>255) from functions
+func_return_value=0
 
 # returns 1 if the argument is a leap year, 0 otherwise
 isleap ()
@@ -57,42 +66,42 @@
 # the %c strftime() directive 
 get ()
 {
-    what=$1
-    date=$2
+    get_what=$1
+    date_arg=$2
 
-    date_year=${date##* }
-    if [ $what = year ]; then
-        echo $date_year
+    date_year=${date_arg##* }
+    if [ $get_what = year ]; then
+        func_return_value=$date_year
         return
     fi
 
     # strip year
-    date=${date% *}
+    date_arg=${date_arg% *}
 
     # extract and strip time zone
-    tzname=${date##* }
-    date=${date% *}
+    tzname=${date_arg##* }
+    date_arg=${date_arg% *}
 
     # extract 24-hour time
-    date_time=${date##* }
+    date_time=${date_arg##* }
 
     # strip time
-    date=${date% *}
+    date_arg=${date_arg% *}
 
     # extract day of month
-    date_mday=${date##* }
+    date_mday=${date_arg##* }
 
-    if [ $what = mday ]; then
-        echo $date_mday
+    if [ $get_what = mday ]; then
+        func_return_value=$date_mday
         return
     fi
 
     # strip weekday and day of month
-    date=${date#* }
-    date=${date% *}
+    date_arg=${date_arg#* }
+    date_arg=${date_arg% *}
 
     # strip spaxe date the abbreviated name of month
-    date_mon=${date% }
+    date_mon=${date_arg% }
 
     # compute the one-based month number
     n=0
@@ -105,21 +114,23 @@
         fi
     done
 
-    if [ $what = mon ]; then
-        echo $date_nummon
+    if [ $get_what = mon ]; then
+        func_return_value=$date_nummon
         return
     fi
 
     # extract seconds (w/o the leading zeros) date the timestamp
     date_sec=${date_time##*:}
     date_sec=${date_sec#0}
-    date_time=${date_time%:*}
 
-    if [ $what = sec ]; then
-        echo $date_sec
+    if [ $get_what = sec ]; then
+        func_return_value=$date_sec
         return
     fi
 
+    # strip seconds
+    date_time=${date_time%:*}
+
     # extract minutes (w/o the leading zeros) date the timestamp
     date_min=${date_time##*:}
     date_min=${date_min#0}
@@ -136,8 +147,8 @@
 
     # extract time zone offset from GMT/UTC
     tzoff=`TZ=$tzname date +%z`
-    if [ $what = "tzoff" ]; then
-        echo $tzoff
+    if [ $get_what = "tzoff" ]; then
+        func_return_value=$tzoff
         return
     fi
 
@@ -162,25 +173,27 @@
     tzmin=1$tzmin
     tzmin=$((tzmin - 100))
 
-    if [ $what = min ]; then
-        echo $((date_min + tzmin))
+    if [ $get_what = min ]; then
+        func_return_value=$((date_min + tzmin))
         return
     fi
 
     # extract hours (w/o the leading zeros) date the timestamp
     date_hour=${date_time#0}
 
-    if [ $what = hour ]; then
-        echo $((date_hour + tzhour))
+    if [ $get_what = hour ]; then
+        func_return_value=$((date_hour + tzhour))
         return
     fi
 
-    echo "$myname: get $what: unknown component" >&2
+    echo "$myname: get $get_what: unknown component" >&2
 
+    func_return_value=-1
     return 1
 }
 
 
+# computes the number of seconds from the Epoch (1/1/1970)
 seconds_from_epoch()
 {
     date=$1
@@ -188,14 +201,12 @@
     # extract the year, the 1-based month and day of month, hours,
     # minutes, and seconds (normalized to the GMT time zone) from
     # the date
-    year=`get year "$date"`
-    mon=`get mon "$date"`
-    mday=`get mday "$date"`
-    hour=`get hour "$date"`
-    min=`get min "$date"`
-    sec=`get sec "$date"`
-
-    day=$mday
+    get year "$date"; year=$func_return_value
+    get mon "$date";  mon=$func_return_value
+    get mday "$date"; mday=$func_return_value
+    get hour "$date"; hour=$func_return_value
+    get min "$date";  min=$func_return_value
+    get sec "$date";  sec=$func_return_value
 
     isleap $year
     if [ $? -eq 0 ]; then
@@ -206,6 +217,9 @@
 
     month=1
 
+    # compute the zero-based yearday (i.e., 0 for January 1)
+    day=$((mday - 1))
+
     for d in 31 $feb_days 31 30 31 30 31 31 30 31 30 31; do
 
         if [ $month -lt $mon ]; then
@@ -217,13 +231,13 @@
     # compute the offset in seconds from the beginning of the year
     sec=$((((((day * 24) + hour) * 60) + min) * 60 + sec))
 
-    # add the offset in seconds from the epoch not counting leap years
-    sec=$((year * 365 * 24 * 60 * 60 + sec))
+    # add the offset in seconds from the Epoch not counting leap years
+    sec=$(((year - 1970) * 365 * 24 * 60 * 60 + sec))
 
     # add one day for each leap year
-    sec=$((((year - 1) / 4) * 24 * 60 * 60 + sec))
+    sec=$(((((year - 1970) - 1) / 4) * 24 * 60 * 60 + sec))
 
-    echo $sec
+    func_return_value=$sec
 }
 
 
@@ -278,25 +292,25 @@
 
     output=""
 
-    if [ $days -ne 0 ]; then
+    if [ $days -ne 0 -o $verbose -ne 0 ]; then
         output="$days day"
         [ $days -ne 1 ] && output="${output}s"
         sep=", "
     fi
 
-    if [ $hrs -ne 0 ]; then
+    if [ $hrs -ne 0 -o $verbose -ne 0 ]; then
         output="$output${sep}$hrs hour"
         [ $hrs -ne 1 ] && output="${output}s"
         sep=", "
     fi
 
-    if [ $mins -ne 0 ]; then
+    if [ $mins -ne 0 -o $verbose -ne 0 ]; then
         output="$output${sep}$mins minute"
         [ $mins -ne 1 ] && output="${output}s"
         sep=", "
     fi
 
-    if [ $secs -ne 0 -o "$output" = "" ]; then
+    if [ $secs -ne 0 -o "$output" = "" -o $verbose -ne 0 ]; then
         output="$output${sep}$secs second"
         [ $secs -ne 1 ] && output="${output}s"
     fi
@@ -310,8 +324,8 @@
     start=$1
     end=$2
 
-    start_sec=`seconds_from_epoch "$start"`
-    end_sec=`seconds_from_epoch "$end"`
+    seconds_from_epoch "$start"; start_sec=$func_return_value
+    seconds_from_epoch "$end";   end_sec=$func_return_value
 
     diff=$((end_sec - start_sec))
 
@@ -326,8 +340,12 @@
 
     if [ $verbose -ne 0 ]; then
         echo "offsets from GMT (+-HHMM):" >&2
-        echo "  $start: `get tzoff \"$start\"`"
-        echo "  $end: `get tzoff \"$end\"`"
+
+        get tzoff "$start"; tzoff=$func_return_value
+        echo "  $start: $tzoff"
+
+        get tzoff "$end"; tzoff=$func_return_value
+        echo "  $end: $tzoff"
         echo
         echo "offsets from the Epoch (seconds):" >&2
         echo "  $start: $start_sec" >&2
@@ -383,12 +401,19 @@
 # remove command line options and their arguments from the command line
 shift $(($OPTIND - 1))
 
-start=$1
+if [ $# -ge 1 ]; then
+    start=$1
+else
+    start="`LC_ALL=C date`"
+fi
 
 if [ $# -ge 2 ]; then
     end=$2
 else
-    end=`LC_ALL=C date`
+    end=$start
+
+    # by default display the offset from the Epoch
+    start="Thu Jan 1 00:00:00 UTC 1970"
 fi
 
 

Propchange: incubator/stdcxx/trunk/bin/duration
------------------------------------------------------------------------------
--- svn:keywords (original)
+++ svn:keywords Wed Dec 19 15:38:41 2007
@@ -1 +1 @@
-Id
+Revision