Your message dated Mon, 30 Nov 2009 15:33:04 +0000
with message-id <[email protected]>
and subject line Bug#86662: fixed in at 3.1.12-1
has caused the Debian Bug report #86662,
regarding test harness for the lexer/parser in at(1)
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact [email protected]
immediately.)


-- 
86662: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=86662
Debian Bug Tracking System
Contact [email protected] with problems
--- Begin Message ---
Package: at
Version: 3.1.8-10
Severity: wishlist
Tags: patch
X-Debbugs-CC: [email protected]

I wish there was a test harness for the lexer/parser in at(1).

Well what do you know, I just happen to have a patch!

NOTE: When applied to at-3.1.8-10, expect 2630 of 3656 subtests to fail.
A patch with a new lexer/parser that fixes these problems is coming up
next.

Dave


diff -u at-3.1.8/Makefile.in.orig at-3.1.8/Makefile.in
--- at-3.1.8/Makefile.in.orig   Wed Feb 14 13:59:09 2001
+++ at-3.1.8/Makefile.in        Mon Feb 19 14:48:42 2001
@@ -51,6 +51,8 @@
 
 OTHERS         = parsetime.l parsetime.y
 
+TEST_VERBOSE   = 0
+
 DOCS =  Problems Copyright README ChangeLog timespec
 
 MISC =  COPYING  Makefile.in configure acconfig.h install-sh \
@@ -150,6 +152,9 @@
 
 parsetest: lex.yy.c y.tab.c
        $(CC) -o parsetest $(CFLAGS) $(DEFS) -DTEST_PARSER -DNEED_YYWRAP 
lex.yy.c y.tab.c
+
+test: parsetest
+       PERL_DL_NONLAZY=1 perl -e 'use Test::Harness qw(&runtests $$verbose); 
$$verbose=$(TEST_VERBOSE); runtests @ARGV;' test.pl
 
 .depend: $(CSRCS)
        gcc $(CFLAGS) $(DEFS) -MM $(CSRCS) > .depend
diff -u at-3.1.8/test.pl.orig at-3.1.8/test.pl
--- at-3.1.8/test.pl.orig       Mon Feb 19 14:51:37 2001
+++ at-3.1.8/test.pl    Mon Feb 19 14:30:17 2001
@@ -0,0 +1,800 @@
+#!/usr/bin/perl -w
+#
+# test.pl - tests vailidity of lexer/parser for at(1)
+#
+# Copyright 2001 David D. Kilzer
+#
+# Licensed under the GNU Public License
+#
+# Environment variables:
+#   TEST_VERBOSE
+#     0 - no verbosity
+#     1 - verbose output only on failed tests, and all stderr output
+#   > 1 - verbose output on every test, and all stderr output
+#
+
+use strict;
+
+use constant SECOND => 1;              # seconds per second
+use constant MINUTE => 60*SECOND;      # seconds per minute
+use constant HOUR   => 60*MINUTE;      # seconds per hour
+use constant DAY    => 24*HOUR;                # seconds per day
+use constant WEEK   =>  7*DAY;         # seconds per week
+
+use vars qw($verbose);
+
+use POSIX;                             # strftime
+use Time::Local;                       # timelocal() and timegm()
+
+BEGIN { $| = 1; }                      # no output buffering
+
+
+#
+# Subroutines
+#
+sub is_dst (;$);                       # is time in DST?
+sub get_utc_offset (;$);               # calculate hours offset from UTC
+
+
+#
+# Data structures containing test data
+#
+my @date_tests;                # date strings
+my @time_tests;                # time strings
+my @date_time_tests_time;      # time + date strings (just times)
+my @date_time_tests_date;      # time + date strings (just dates)
+my @inc_dec_tests;             # increment and decrement strings
+my @misc_tests;                        # miscellaneous strings (mostly for DST)
+
+my $num_tests;                 # number of tests
+my $show_stderr;               # set to "2> /dev/null" if (! $verbose)
+my $utc_off;                   # timezone offset in minutes west of UTC
+
+
+#
+# Set variables before running tests
+#
+$verbose = $ENV{'TEST_VERBOSE'} || 0;
+
+$show_stderr = ($verbose > 0 ? "" : "2> /dev/null");
+
+$utc_off = get_utc_offset();
+
+
+#
+# Tests for dates only
+#   These tests include both relative and specific dates.
+#   They are not combined with any other tests.
+#
+# Format: "string", month, day, year, hour, minute, [offset]
+#
+...@date_tests = 
+(
+[ "dec 31",            12, 31, '$y', '$h', '$mi' ],
+[ "Dec 31",            12, 31, '$y', '$h', '$mi' ],
+[ "DEC 31",            12, 31, '$y', '$h', '$mi' ],
+[ "december 31",       12, 31, '$y', '$h', '$mi' ],
+[ "December 31",       12, 31, '$y', '$h', '$mi' ],
+[ "DECEMBER 31",       12, 31, '$y', '$h', '$mi' ],
+[ "Dec 31 10",         12, 31, 2010, '$h', '$mi' ],
+[ "December 31 10",    12, 31, 2010, '$h', '$mi' ],
+[ "Dec 31 2010",       12, 31, 2010, '$h', '$mi' ],
+[ "December 31 2010",  12, 31, 2010, '$h', '$mi' ],
+[ "Dec 31,10",         12, 31, 2010, '$h', '$mi' ],
+[ "Dec 31, 10",                12, 31, 2010, '$h', '$mi' ],
+[ "December 31,10",    12, 31, 2010, '$h', '$mi' ],
+[ "December 31, 10",   12, 31, 2010, '$h', '$mi' ],
+[ "Dec 31,2010",       12, 31, 2010, '$h', '$mi' ],
+[ "Dec 31, 2010",      12, 31, 2010, '$h', '$mi' ],
+[ "December 31,2010",  12, 31, 2010, '$h', '$mi' ],
+[ "December 31, 2010", 12, 31, 2010, '$h', '$mi' ],
+[ "sun",               '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 0 ? 7 : ((7 - $wd + 0) % 7)) * DAY)' ],
+[ "Sun",               '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 0 ? 7 : ((7 - $wd + 0) % 7)) * DAY)' ],
+[ "SUN",               '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 0 ? 7 : ((7 - $wd + 0) % 7)) * DAY)' ],
+[ "sunday",            '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 0 ? 7 : ((7 - $wd + 0) % 7)) * DAY)' ],
+[ "Sunday",            '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 0 ? 7 : ((7 - $wd + 0) % 7)) * DAY)' ],
+[ "SUNDAY",            '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 0 ? 7 : ((7 - $wd + 0) % 7)) * DAY)' ],
+[ "Mon",               '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 1 ? 7 : ((7 - $wd + 1) % 7)) * DAY)' ],
+[ "Monday",            '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 1 ? 7 : ((7 - $wd + 1) % 7)) * DAY)' ],
+[ "Tue",               '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 2 ? 7 : ((7 - $wd + 2) % 7)) * DAY)' ],
+[ "Tuesday",           '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 2 ? 7 : ((7 - $wd + 2) % 7)) * DAY)' ],
+[ "Wed",               '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 3 ? 7 : ((7 - $wd + 3) % 7)) * DAY)' ],
+[ "Wednesday",         '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 3 ? 7 : ((7 - $wd + 3) % 7)) * DAY)' ],
+[ "Thu",               '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 4 ? 7 : ((7 - $wd + 4) % 7)) * DAY)' ],
+[ "Thursday",          '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 4 ? 7 : ((7 - $wd + 4) % 7)) * DAY)' ],
+[ "Fri",               '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 5 ? 7 : ((7 - $wd + 5) % 7)) * DAY)' ],
+[ "Friday",            '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 5 ? 7 : ((7 - $wd + 5) % 7)) * DAY)' ],
+[ "Sat",               '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 6 ? 7 : ((7 - $wd + 6) % 7)) * DAY)' ],
+[ "Saturday",          '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 6 ? 7 : ((7 - $wd + 6) % 7)) * DAY)' ],
+[ "now",               '$mo', '$d', '$y', '$h', '$mi' ],
+[ "Now",               '$mo', '$d', '$y', '$h', '$mi' ],
+[ "NOW",               '$mo', '$d', '$y', '$h', '$mi' ],
+[ "today",             '$mo', '$d', '$y', '$h', '$mi' ],
+[ "Today",             '$mo', '$d', '$y', '$h', '$mi' ],
+[ "TODAY",             '$mo', '$d', '$y', '$h', '$mi' ],
+[ "tomorrow",          '$mo', '$d', '$y', '$h', '$mi', '1 * DAY' ],
+[ "Tomorrow",          '$mo', '$d', '$y', '$h', '$mi', '1 * DAY' ],
+[ "TOMORROW",          '$mo', '$d', '$y', '$h', '$mi', '1 * DAY' ],
+[ "10-12-31",          12, 31, 2010, '$h', '$mi' ],
+[ "2010-12-31",                12, 31, 2010, '$h', '$mi' ],
+[ "31.12.10",          12, 31, 2010, '$h', '$mi' ],
+[ "31.12.2010",                12, 31, 2010, '$h', '$mi' ],
+[ "31 Dec",            12, 31, '$y', '$h', '$mi' ],
+[ "31 December",       12, 31, '$y', '$h', '$mi' ],
+[ "31 Dec 10",         12, 31, 2010, '$h', '$mi' ],
+[ "31 Dec 2010",       12, 31, 2010, '$h', '$mi' ],
+[ "31 December 10",    12, 31, 2010, '$h', '$mi' ],
+[ "31 December 2010",  12, 31, 2010, '$h', '$mi' ],
+[ "12/31/10",          12, 31, 2010, '$h', '$mi' ],
+[ "12/31/2010",                12, 31, 2010, '$h', '$mi' ],
+[ "13010",             01, 30, 2010, '$h', '$mi' ],
+[ "1302010",           01, 30, 2010, '$h', '$mi' ],
+[ "013010",            01, 30, 2010, '$h', '$mi' ],
+[ "01302010",          01, 30, 2010, '$h', '$mi' ],
+[ "123110",            12, 31, 2010, '$h', '$mi' ],
+[ "12312010",          12, 31, 2010, '$h', '$mi' ],
+[ "next minute",       '$mo', '$d', '$y', '$h', '$mi', '1 * MINUTE' ],
+[ "next hour",         '$mo', '$d', '$y', '$h', '$mi', '1 * HOUR' ],
+[ "next day",          '$mo', '$d', '$y', '$h', '$mi', '1 * DAY' ],
+[ "next week",         '$mo', '$d', '$y', '$h', '$mi', '1 * WEEK' ],
+[ "next month",                '($mo == 12 ? 1 : $mo + 1)', '$d', '($mo == 12 
? $y + 1 : $y)', '$h', '$mi' ],
+[ "next year",         '$mo', '$d', '$y + 1', '$h', '$mi' ],
+);
+
+
+#
+# Tests for times only
+#   These tests include specific times and time aliases.
+#   They are not combined with any other tests.
+#
+# Format: "string", month, day, year, hour, minute, [offset]
+#
+...@time_tests = 
+(
+[ "0800",              '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "2300",              '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "8:00",              '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "08:00",             '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "23:00",             '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "8'00",              '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "08'00",             '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "23'00",             '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "8.00",              '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "08.00",             '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "23.00",             '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "8h00",              '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "08h00",             '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "23h00",             '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "8,00",              '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "08,00",             '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "23,00",             '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "8:00 am",           '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "08:00 am",          '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "11:00 pm",          '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "8'00 am",           '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "08'00 am",          '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "11'00 pm",          '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "8.00 am",           '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "08.00 am",          '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "11.00 pm",          '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "8h00 am",           '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "08h00 am",          '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "11h00 pm",          '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "8,00 am",           '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "08,00 am",          '$mo', '$d', '$y',  8, 0,
+                       '(($h*60+$mi) < ( 8*60+0) ? 0 : 1 * DAY)' ],
+[ "11,00 pm",          '$mo', '$d', '$y', 23, 0,
+                       '(($h*60+$mi) < (23*60+0) ? 0 : 1 * DAY)' ],
+[ "0800 utc",          '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "2300 utc",          '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "8:00 utc",          '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "08:00 utc",         '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "23:00 utc",         '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "8'00 utc",          '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "08'00 utc",         '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "23'00 utc",         '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "8.00 utc",          '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "08.00 utc",         '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "23.00 utc",         '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "8h00 utc",          '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "08h00 utc",         '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "23h00 utc",         '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "8,00 utc",          '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "08,00 utc",         '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "23,00 utc",         '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "8:00 am utc",       '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "08:00 am utc",      '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "11:00 pm utc",      '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "8'00 am utc",       '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "08'00 am utc",      '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "11'00 pm utc",      '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "8.00 am utc",       '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "08.00 am utc",      '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "11.00 pm utc",      '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "8h00 am utc",       '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "08h00 am utc",      '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "11h00 pm utc",      '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "8,00 am utc",       '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "08,00 am utc",      '$mo', '$d', '$y',  8, 0,
+       '(($h*60+$mi+$utc_off) < ( 8*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "11,00 pm utc",      '$mo', '$d', '$y', 23, 0,
+       '(($h*60+$mi+$utc_off) < (23*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "noon",              '$mo', '$d', '$y', 12, 0,
+                       '(($h*60+$mi) < (12*60+0) ? 0 : 1 * DAY)' ],
+[ "Noon",              '$mo', '$d', '$y', 12, 0,
+                       '(($h*60+$mi) < (12*60+0) ? 0 : 1 * DAY)' ],
+[ "NOON",              '$mo', '$d', '$y', 12, 0,
+                       '(($h*60+$mi) < (12*60+0) ? 0 : 1 * DAY)' ],
+[ "midnight",          '$mo', '$d', '$y',  0, 0,
+                       '(($h*60+$mi) < ( 0*60+0) ? 1 * DAY : 1 * DAY)' ],
+[ "teatime",           '$mo', '$d', '$y', 16, 0,
+                       '(($h*60+$mi) < (16*60+0) ? 0 : 1 * DAY)' ],
+[ "noon utc",          '$mo', '$d', '$y', 12, 0,
+       '(($h*60+$mi+$utc_off) < (12*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "noon UTC",          '$mo', '$d', '$y', 12, 0,
+       '(($h*60+$mi+$utc_off) < (12*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+[ "midnight utc",      '$mo', '$d', '$y',  0, 0,
+       '(($h*60+$mi+$utc_off) < ( 0*60+0) ? 1 * DAY : 1 * DAY) - $utc_off * 
MINUTE' ],
+[ "teatime utc",       '$mo', '$d', '$y', 16, 0,
+       '(($h*60+$mi+$utc_off) < (16*60+0) ? 0 : 1 * DAY) - $utc_off * MINUTE' 
],
+);
+
+
+#
+# Tests for combining times and dates and inc/dec
+#   These tests include specific times and time aliases that are
+#   combined with @date_time_tests_date and with @inc_dec_tests
+#   during testing.
+#
+# Format: "string", month, day, year, hour, minute, [offset]
+#
+...@date_time_tests_time = 
+(
+[ "0800",              '$mo', '$d', '$y',  8, 0 ],
+[ "2300",              '$mo', '$d', '$y', 23, 0 ],
+[ "8:00",              '$mo', '$d', '$y',  8, 0 ],
+[ "23:00",             '$mo', '$d', '$y', 23, 0 ],
+[ "8'00",              '$mo', '$d', '$y',  8, 0 ],
+[ "23'00",             '$mo', '$d', '$y', 23, 0 ],
+[ "8.00",              '$mo', '$d', '$y',  8, 0 ],
+[ "23.00",             '$mo', '$d', '$y', 23, 0 ],
+[ "8h00",              '$mo', '$d', '$y',  8, 0 ],
+[ "23h00",             '$mo', '$d', '$y', 23, 0 ],
+[ "8,00",              '$mo', '$d', '$y',  8, 0 ],
+[ "23,00",             '$mo', '$d', '$y', 23, 0 ],
+[ "8:00 am",           '$mo', '$d', '$y',  8, 0 ],
+[ "11:00 pm",          '$mo', '$d', '$y', 23, 0 ],
+[ "8'00 am",           '$mo', '$d', '$y',  8, 0 ],
+[ "11'00 pm",          '$mo', '$d', '$y', 23, 0 ],
+[ "8.00 am",           '$mo', '$d', '$y',  8, 0 ],
+[ "11.00 pm",          '$mo', '$d', '$y', 23, 0 ],
+[ "8h00 am",           '$mo', '$d', '$y',  8, 0 ],
+[ "11h00 pm",          '$mo', '$d', '$y', 23, 0 ],
+[ "8,00 am",           '$mo', '$d', '$y',  8, 0 ],
+[ "11,00 pm",          '$mo', '$d', '$y', 23, 0 ],
+[ "0800 utc",          '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "2300 utc",          '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "8:00 utc",          '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "23:00 utc",         '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "8'00 utc",          '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "23'00 utc",         '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "8.00 utc",          '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "23.00 utc",         '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "8h00 utc",          '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "23h00 utc",         '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "8,00 utc",          '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "23,00 utc",         '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "8:00 am utc",       '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "11:00 pm utc",      '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "8'00 am utc",       '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "11'00 pm utc",      '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "8.00 am utc",       '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "11.00 pm utc",      '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "8h00 am utc",       '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "11h00 pm utc",      '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "8,00 am utc",       '$mo', '$d', '$y',  8, 0,
+       '- $utc_off * MINUTE' ],
+[ "11,00 pm utc",      '$mo', '$d', '$y', 23, 0,
+       '- $utc_off * MINUTE' ],
+[ "noon",              '$mo', '$d', '$y', 12, 0 ],
+[ "midnight",          '$mo', '$d', '$y',  0, 0 ],
+[ "teatime",           '$mo', '$d', '$y', 16, 0 ],
+[ "noon utc",          '$mo', '$d', '$y', 12, 0,
+       '- $utc_off * MINUTE' ],
+[ "midnight utc",      '$mo', '$d', '$y',  0, 0,
+       '- $utc_off * MINUTE' ],
+[ "teatime utc",       '$mo', '$d', '$y', 16, 0,
+       '- $utc_off * MINUTE' ],
+);
+
+
+#
+# Tests for combining times and dates and inc/dec
+#   These tests include both relative and specific dates that are
+#   combined with @date_time_tests_time and with @inc_dec_tests
+#   during testing.
+#
+# Format: "string", month, day, year, hour, minute, [offset]
+#
+...@date_time_tests_date = 
+(
+[ "Dec 31",            12, 31, '($mo==12 && $d==31 ? $y+1 : $y)', '$h', '$mi' 
],
+[ "Dec 31 10",         12, 31, 2010, '$h', '$mi' ],
+[ "Dec 31 2010",       12, 31, 2010, '$h', '$mi' ],
+[ "Dec 31, 10",                12, 31, 2010, '$h', '$mi' ],
+[ "December 31, 2010", 12, 31, 2010, '$h', '$mi' ],
+[ "Monday",            '$mo', '$d', '$y', '$h', '$mi',
+                       '(($wd == 1 ? 7 : ((7 - $wd + 1) % 7)) * DAY)' ],
+[ "today",             '$mo', '$d', '$y', '$h', '$mi' ],
+[ "tomorrow",          '$mo', '$d', '$y', '$h', '$mi', '1 * DAY' ],
+[ "10-12-31",          12, 31, 2010, '$h', '$mi' ],
+[ "2010-12-31",                12, 31, 2010, '$h', '$mi' ],
+[ "31.12.10",          12, 31, 2010, '$h', '$mi' ],
+[ "31.12.2010",                12, 31, 2010, '$h', '$mi' ],
+[ "31 Dec",            12, 31, '($mo==12 && $d==31 ? $y+1 : $y)', '$h', '$mi' 
],
+[ "31 Dec 10",         12, 31, 2010, '$h', '$mi' ],
+[ "31 Dec 2010",       12, 31, 2010, '$h', '$mi' ],
+[ "12/31/10",          12, 31, 2010, '$h', '$mi' ],
+[ "12/31/2010",                12, 31, 2010, '$h', '$mi' ],
+[ "13010",             01, 30, 2010, '$h', '$mi' ],
+[ "1302010",           01, 30, 2010, '$h', '$mi' ],
+[ "123110",            12, 31, 2010, '$h', '$mi' ],
+[ "12312010",          12, 31, 2010, '$h', '$mi' ],
+[ "next minute",       '$mo', '$d', '$y', '$h', '$mi', '1 * MINUTE' ],
+[ "next hour",         '$mo', '$d', '$y', '$h', '$mi', '1 * HOUR' ],
+[ "next day",          '$mo', '$d', '$y', '$h', '$mi', '1 * DAY' ],
+[ "next week",         '$mo', '$d', '$y', '$h', '$mi', '1 * WEEK' ],
+[ "next month",                '($mo == 12 ? 1 : $mo + 1)', '$d', '($mo == 12 
? $y + 1 : $y)', '$h', '$mi' ],
+[ "next year",         '$mo', '$d', '$y + 1', '$h', '$mi' ],
+);
+
+
+#
+# Tests for combining times and dates and inc/dec
+#   These tests include both increments and decrements that are
+#   combined with @date_time_tests_time and with @date_time_tests_date
+#   during testing.  Note how these tests refer to elements from
+#   the data structures that they will be combined with ($$i[N]).
+#
+# Format: "string", month, day, year, hour, minute, [offset]
+#
+...@inc_dec_tests = 
+(
+[ "- 1 min",           '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '-  1 
* MINUTE' ],
+[ "- 1 minute",                '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', 
'$$i[5]', '-  1 * MINUTE' ],
+[ "- 1 hour",          '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '-  1 
* HOUR'   ],
+[ "- 1 day",           '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '-  1 
* DAY'    ],
+[ "- 1 week",          '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '-  1 
* WEEK'   ],
+[ "- 1 month",         '($$i[1] == 1 ? 12 : $$i[1] - 1)', '$$i[2]', '($$i[1] 
== 1 ? $$i[3] - 1 : $$i[3])', '$$i[4]', '$$i[5]' ],
+[ "- 1 year",          '$$i[1]', '$$i[2]', '$$i[3] -  1', '$$i[4]', '$$i[5]' ],
+[ "- 10 min",          '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '- 10 
* MINUTE' ],
+[ "- 10 minutes",      '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '- 10 
* MINUTE' ],
+[ "- 10 hours",                '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', 
'$$i[5]', '- 10 * HOUR'   ],
+[ "- 10 days",         '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '- 10 
* DAY'    ],
+[ "- 10 weeks",                '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', 
'$$i[5]', '- 10 * WEEK'   ],
+[ "- 10 months",       '($$i[1] > 10 ? $$i[1] - 10 : $$i[1] + 2)', '$$i[2]', 
'($$i[1] > 10 ? $$i[3]: $$i[3] - 1)', '$$i[4]', '$$i[5]' ],
+[ "- 10 years",                '$$i[1]', '$$i[2]', '$$i[3] - 10', '$$i[4]', 
'$$i[5]' ],
+[ "+ 1 min",           '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '+  1 
* MINUTE' ],
+[ "+ 1 minute",                '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', 
'$$i[5]', '+  1 * MINUTE' ],
+[ "+ 1 hour",          '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '+  1 
* HOUR'   ],
+[ "+ 1 day",           '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '+  1 
* DAY'    ],
+[ "+ 1 week",          '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '+  1 
* WEEK'   ],
+[ "+ 1 month",         '($$i[1] == 12 ? 1 : $$i[1] + 1)', '$$i[2]', '($$i[1] 
== 12 ? $$i[3] + 1 : $$i[3])', '$$i[4]', '$$i[5]' ],
+[ "+ 1 year",          '$$i[1]', '$$i[2]', '$$i[3] +  1', '$$i[4]', '$$i[5]' ],
+[ "+ 10 min",          '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '+ 10 
* MINUTE' ],
+[ "+ 10 minutes",      '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '+ 10 
* MINUTE' ],
+[ "+ 10 hours",                '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', 
'$$i[5]', '+ 10 * HOUR'   ],
+[ "+ 10 days",         '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', '$$i[5]', '+ 10 
* DAY'    ],
+[ "+ 10 weeks",                '$$i[1]', '$$i[2]', '$$i[3]', '$$i[4]', 
'$$i[5]', '+ 10 * WEEK'   ],
+[ "+ 10 months",       '($$i[1] < 3 ? $$i[1] + 10 : $$i[1] - 2)', '$$i[2]', 
'($$i[1] < 3 ? $$i[3] : $$i[3] + 1)', '$$i[4]', '$$i[5]' ],
+[ "+ 10 years",                '$$i[1]', '$$i[2]', '$$i[3] + 10', '$$i[4]', 
'$$i[5]' ],
+);
+
+
+#
+# Miscellaneous tests
+#   These tests include any specific test cases that won't fit easily
+#   into the test data above.  
+#   They are not combined with any other tests.
+#
+# Format: "string", month, day, year, hour, minute, [offset]
+#
+...@misc_tests = 
+(
+# Test moving back and forth across DST
+[ "March 1 + 3 months",                 '6', '1', '$y', '$h', '$mi' ],
+[ "June 1 - 3 months",          '3', '1', '$y', '$h', '$mi' ],
+[ "September 1 + 3 months",    '12', '1', '$y', '$h', '$mi' ],
+[ "December 1 - 3 months",      '9', '1', '$y', '$h', '$mi' ],
+[ "March 1 + 12 weeks",                 '3', '1', '$y', '$h', '$mi', '+12 * 
WEEK' ],
+[ "June 1 - 12 weeks",          '6', '1', '$y', '$h', '$mi', '-12 * WEEK' ],
+[ "September 1 + 12 weeks",     '9', '1', '$y', '$h', '$mi', '+12 * WEEK' ],
+[ "December 1 - 12 weeks",     '12', '1', '$y', '$h', '$mi', '-12 * WEEK' ],
+);
+
+
+$num_tests =   ($#date_tests + 1)
+            + ($#time_tests + 1)
+            + ($#misc_tests + 1)
+            + ($#date_time_tests_time + 1) * ($#date_time_tests_date + 1)
+            + ($#date_time_tests_time + 1) * ($#inc_dec_tests        + 1)
+            + ($#date_time_tests_date + 1) * ($#inc_dec_tests        + 1)
+            ;
+
+
+#
+# Print out the number of tests to perform
+#
+print "1..$num_tests\n";
+
+
+#
+# Run date, time and miscellaneous tests
+#
+foreach my $i (@date_tests, @time_tests, @misc_tests)
+{
+    my $s;     # current second
+    my $mi;    # current minute
+    my $h;     # current hour
+    my $d;     # current day
+    my $mo;    # current month
+    my $y;     # current year
+    my $wd;    # current week day
+    my $yd;    # current year day
+    my $dst;   # is daylight savings time?
+
+    my $epoch_time;    # time string in epoch seconds
+    my $offset = 0;    # offset for test in epoch seconds
+    my $t;             # time string to test against
+
+    my $o;             # output of parsetest command
+    my $run_time;      # internal timestamp used for comparison
+
+    ## WARNING:  Next two statements could run in different minutes!
+    $o = `./parsetest \"$$i[0]\" $show_stderr`;
+    $run_time = time();
+
+    ## Set variables for $run_time before calculating $offset
+    ($s, $mi, $h, $d, $mo, $y, $wd, $yd, $dst) = localtime($run_time);
+    $mo += 1;
+    $y += 1900;
+
+    $offset = eval "$$i[6]" if (defined $$i[6]);
+
+    $epoch_time = strftime("%s",
+                          0,
+                          eval "$$i[5]",
+                          eval "$$i[4]",
+                          eval "$$i[2]",
+                          eval "$$i[1] - 1",
+                          eval "$$i[3] - 1900",
+                          -1, # wday
+                          -1, # yday
+                          -1, # isdst
+                         );
+
+    ## Adjust +-1 hour when moving in or out of DST
+    if (     is_dst($epoch_time) && ! is_dst($epoch_time + $offset))
+    {  # DST to no DST
+       $epoch_time += 1 * HOUR;
+    }
+    elsif (! is_dst($epoch_time) &&   is_dst($epoch_time + $offset))
+    {  # no DST to DST
+       $epoch_time -= 1 * HOUR;
+    }
+
+    $t = strftime("%a %b %e %H:%M:00 %Y", localtime($epoch_time + $offset));
+
+    chomp $o;
+
+    print $o eq $t ? "ok" : "not ok", "\n";
+
+    print "'", $$i[0], "': '$o' =? '$t'\n"
+       if ($verbose > 1 || ($verbose == 1 && $o ne $t));
+}
+
+
+#
+# Run time + date tests
+#
+foreach my $i (@date_time_tests_time)
+{
+    foreach my $j (@date_time_tests_date)
+    {
+        my $s; # current second
+        my $mi;        # current minute
+        my $h; # current hour
+        my $d; # current day
+        my $mo;        # current month
+        my $y; # current year
+        my $wd;        # current week day
+        my $yd;        # current year day
+        my $dst;       # is daylight savings time?
+
+       my $epoch_time; # time string in epoch seconds
+       my $offset = 0; # offset for test in epoch seconds
+       my $t;          # time string to test against
+
+        my $o;         # output of parsetest command
+        my $run_time;  # internal timestamp used for comparison
+
+        ## WARNING:  Next two statements could run in different minutes!
+        $o = `./parsetest \"$$i[0] $$j[0]\" $show_stderr`;
+        $run_time = time();
+
+        ## Set variables for $run_time before calculating $offset
+        ($s, $mi, $h, $d, $mo, $y, $wd, $yd, $dst) = localtime($run_time);
+        $mo += 1;
+        $y += 1900;
+
+       if (defined $$i[6])
+       {
+           if (defined $$j[6])
+           {
+               $offset = eval "($$i[6]) + ($$j[6])";
+           }
+           else
+           {
+               $offset = eval "$$i[6]";
+           }
+       }
+       elsif (defined $$j[6])
+       {
+           $offset = eval "$$j[6]";
+       }
+
+       $epoch_time = strftime("%s",
+                              0,
+                              eval "$$i[5]",
+                              eval "$$i[4]",
+                              eval "$$j[2]",
+                              eval "$$j[1] - 1",
+                              eval "$$j[3] - 1900",
+                              -1, # wday
+                              -1, # yday
+                              -1, # isdst
+                             );
+
+       ## Adjust +-1 hour when moving in or out of DST
+       if (     is_dst($epoch_time) && ! is_dst($epoch_time + $offset))
+       {   # DST to no DST
+           $epoch_time += 1 * HOUR;
+       }
+       elsif (! is_dst($epoch_time) &&   is_dst($epoch_time + $offset))
+       {   # no DST to DST
+           $epoch_time -= 1 * HOUR;
+       }
+
+       $t = strftime("%a %b %e %H:%M:00 %Y", localtime($epoch_time + $offset));
+
+        chomp $o;
+
+        print $o eq $t ? "ok" : "not ok", "\n";
+
+        print "'$$i[0] $$j[0]': '$o' =? '$t'\n"
+           if ($verbose > 1 || ($verbose == 1 && $o ne $t));
+    }
+}
+
+
+#
+# Run time + inc_dec and date + inc_dec tests
+#
+foreach my $i (@date_time_tests_time, @date_time_tests_date)
+{
+    foreach my $j (@inc_dec_tests)
+    {
+        my $s; # current second
+        my $mi;        # current minute
+        my $h; # current hour
+        my $d; # current day
+        my $mo;        # current month
+        my $y; # current year
+        my $wd;        # current week day
+        my $yd;        # current year day
+        my $dst;       # is daylight savings time?
+
+       my $epoch_time; # time string in epoch seconds
+       my $offset = 0; # offset for test in epoch seconds
+       my $t;          # time string to test against
+
+        my $o; # output of parsetest command
+        my $run_time;  # internal timestamp used for comparison
+
+        ## WARNING:  Next two statements could run in different minutes!
+        $o = `./parsetest \"$$i[0] $$j[0]\" $show_stderr`;
+        $run_time = time();
+
+        ## Set variables for $run_time before calculating $offset
+        ($s, $mi, $h, $d, $mo, $y, $wd, $yd, $dst) = localtime($run_time);
+        $mo += 1;
+        $y += 1900;
+
+       if (defined $$i[6])
+       {
+           if (defined $$j[6])
+           {
+               $offset = eval "($$i[6]) + ($$j[6])";
+           }
+           else
+           {
+               $offset = eval "$$i[6]";
+           }
+       }
+       elsif (defined $$j[6])
+       {
+           $offset = eval "$$j[6]";
+       }
+
+        $epoch_time = strftime("%s",
+                              0,
+                              eval "$$i[5]",
+                              eval "$$i[4]",
+                              eval "eval \"$$j[2]\"",
+                              eval "eval \"$$j[1] - 1\"",
+                              eval "eval \"$$j[3] - 1900\"",
+                              -1, # wday
+                              -1, # yday
+                              -1, # isdst
+                             );
+
+       ## Adjust +-1 hour when moving in or out of DST
+       if (     is_dst($epoch_time) && ! is_dst($epoch_time + $offset))
+       {   # DST to no DST
+           $epoch_time += 1 * HOUR;
+       }
+       elsif (! is_dst($epoch_time) &&   is_dst($epoch_time + $offset))
+       {   # no DST to DST
+           $epoch_time -= 1 * HOUR;
+       }
+
+       $t = strftime("%a %b %e %H:%M:00 %Y", localtime($epoch_time + $offset));
+
+        chomp $o;
+
+        print $o eq $t ? "ok" : "not ok", "\n";
+
+        print "'$$i[0] $$j[0]': '$o' =? '$t'\n"
+           if ($verbose > 1 || ($verbose == 1 && $o ne $t));
+    }
+}
+
+exit 0;
+
+
+#
+# Subroutine:
+#   is_dst
+#
+# Description:
+#   returns true if the time passed in is in DST, else
+#   returns false if the time passed in is not in DST
+#
+# Arg 1:
+#   [Optional] time in epoch seconds; defaults to the current 
+#   time if no argument is given
+#
+sub is_dst (;$)
+{
+    my $t = shift || time();
+    return ((localtime($t))[8] > 0);
+}
+
+
+#
+# Subroutine:
+#   get_utc_offset
+#
+# Description:
+#   returns the number of offest hours from UTC for the current timezone
+#
+# Arg 1:
+#   [Optional] time in epoch seconds; defaults to the current 
+#   time if no argument is given
+#
+sub get_utc_offset (;$)
+{
+    my $t = shift || time();
+    my @t = localtime($t);
+    my $is_dst = $t[8];
+    return ((timelocal(@t) - timegm(@t) + ($is_dst > 0 ? HOUR : 0)) / MINUTE);
+}
+



--- End Message ---
--- Begin Message ---
Source: at
Source-Version: 3.1.12-1

We believe that the bug you reported is fixed in the latest version of
at, which is due to be installed in the Debian FTP archive:

at_3.1.12-1.diff.gz
  to main/a/at/at_3.1.12-1.diff.gz
at_3.1.12-1.dsc
  to main/a/at/at_3.1.12-1.dsc
at_3.1.12-1_amd64.deb
  to main/a/at/at_3.1.12-1_amd64.deb
at_3.1.12.orig.tar.gz
  to main/a/at/at_3.1.12.orig.tar.gz



A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to [email protected],
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Ansgar Burchardt <[email protected]> (supplier of updated at package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing [email protected])


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Format: 1.8
Date: Mon, 30 Nov 2009 20:03:34 +0900
Source: at
Binary: at
Architecture: source amd64
Version: 3.1.12-1
Distribution: unstable
Urgency: low
Maintainer: Ansgar Burchardt <[email protected]>
Changed-By: Ansgar Burchardt <[email protected]>
Description: 
 at         - Delayed job execution and batch processing
Closes: 86662 208367 316442 335374 359010 372671 386665 404965 406359 453707 
506829
Changes: 
 at (3.1.12-1) unstable; urgency=low
 .
   * New upstream release:
     + do not increment year twice (Closes: #404965) (LP: #312051)
     + do not increment day of month twice (Closes: #386665)
     + update documentation on removed environment variables
       (Closes: #335374)
     + add -f option to stay in foreground (Closes: #208367) - thanks to
       Marcela Maslanova <[email protected]>
     + error when day of month is 0 (Closes: #372671)
     + make less assumptations on open file descriptors (Closes: #453707)
     + add status action to init script (Closes: #506829)
     + make stdout, stderr available to sendmail process (Closes: #316442)
     + document -b option (LP: #156493)
     + document 4-digit years and ISO date format (Closes: #359010)
     + add test suite for date/time parser (Closes: #86662)
       - add build-dep on perl (>= 5.10.1) for Test::More 0.92
   * use dh_installinit (Closes: #406359)
   * remove support for upgrading from pre-3.1.9
   * remove rc, pam (moved upstream)
   * remove Cyril Brulebois from Uploaders as requested on IRC
   * now depends on lsb-base (>= 3.2-14) for status_of_proc in init script
   * add dependency on libpam-runtime (>= 1.0.1-11) for
     common-session-noninteractive
   * update debian/copyright
   * bump Standards-Version to 3.8.3 (no changes)
   * debian/control: Add DM-Upload-Allowed: yes.
Checksums-Sha1: 
 1b658739322649af7e2b6885fc275a301046c3a7 1105 at_3.1.12-1.dsc
 1cf47df152e9d119e083c11eefaf6368c993a8af 122082 at_3.1.12.orig.tar.gz
 5d7ab7971665710715d6ec37b2310860141b1851 9366 at_3.1.12-1.diff.gz
 65a8f6d8b79b487570c7539a9160f75e6a97bcac 50138 at_3.1.12-1_amd64.deb
Checksums-Sha256: 
 a22cac0f0b60ddb3edad8324b0fbb6c3f3057bf07a64c1d9b605afb442c2fc62 1105 
at_3.1.12-1.dsc
 7c55c6ab4fbe8add9e68f31b2b0ebf3fe805c9a4e7cfb2623a3d8a4789cc18f3 122082 
at_3.1.12.orig.tar.gz
 65513b71abd97db360f0e83606fb2e52ae82d6cba13b9924a8346eb385cc04df 9366 
at_3.1.12-1.diff.gz
 37b0f8ae858bea8bbc2775b0b3a0531f54279b55ac25ee7410eca3568dac6bc0 50138 
at_3.1.12-1_amd64.deb
Files: 
 9a16c9baf37901948f45bfacdd3e677c 1105 admin standard at_3.1.12-1.dsc
 1e67991776148fb319fd77a2e599a765 122082 admin standard at_3.1.12.orig.tar.gz
 975ebe1fd25b42c3b2b66597ae7d31d6 9366 admin standard at_3.1.12-1.diff.gz
 afe3edc58c3698cef8b4e643e86ea214 50138 admin standard at_3.1.12-1_amd64.deb

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)

iEYEARECAAYFAksT2IMACgkQeGfVPHR5Nd0vgQCfYeq3OVV+pSgdBmYeCbUW3Dnp
hYQAn340BZKPOUCKNCR0k+b6iIbh98PJ
=Cp7l
-----END PGP SIGNATURE-----



--- End Message ---

Reply via email to