Ondrej Vasik 3a1add
diff -urNp coreutils-6.12-orig/lib/getdate.y coreutils-6.12/lib/getdate.y
Ondrej Vasik 3a1add
--- coreutils-6.12-orig/lib/getdate.y	2008-01-31 19:37:19.000000000 +0100
Ondrej Vasik 3a1add
+++ coreutils-6.12/lib/getdate.y	2008-10-08 15:49:35.000000000 +0200
Ondrej Vasik 3a1add
@@ -1,8 +1,8 @@
Ondrej Vasik 3a1add
 %{
Ondrej Vasik 3a1add
 /* Parse a string into an internal time stamp.
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
-   Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007 Free Software
Ondrej Vasik 3a1add
-   Foundation, Inc.
Ondrej Vasik 3a1add
+   Copyright (C) 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008
Ondrej Vasik 3a1add
+   Free Software Foundation, Inc.
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
    This program is free software: you can redistribute it and/or modify
Ondrej Vasik 3a1add
    it under the terms of the GNU General Public License as published by
Ondrej Vasik 3a1add
@@ -60,7 +60,7 @@
Ondrej Vasik 3a1add
 # undef static
Ondrej Vasik 3a1add
 #endif
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
-#include <ctype.h>
Ondrej Vasik 3a1add
+#include <c-ctype.h>
Ondrej Vasik 3a1add
 #include <limits.h>
Ondrej Vasik 3a1add
 #include <stdio.h>
Ondrej Vasik 3a1add
 #include <stdlib.h>
Ondrej Vasik 3a1add
@@ -205,7 +205,7 @@ typedef struct
Ondrej Vasik 3a1add
 union YYSTYPE;
Ondrej Vasik 3a1add
 static int yylex (union YYSTYPE *, parser_control *);
Ondrej Vasik 3a1add
 static int yyerror (parser_control const *, char const *);
Ondrej Vasik 3a1add
-static long int time_zone_hhmm (textint, long int);
Ondrej Vasik 3a1add
+static long int time_zone_hhmm (parser_control *, textint, long int);
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 /* Extract into *PC any date and time info from a string of digits
Ondrej Vasik 3a1add
    of the form e.g., YYYYMMDD, YYMMDD, HHMM, HH (and sometimes YYY,
Ondrej Vasik 3a1add
@@ -246,6 +246,31 @@ digits_to_date_time (parser_control *pc,
Ondrej Vasik 3a1add
     }
Ondrej Vasik 3a1add
 }
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
+/* Increment PC->rel by FACTOR * REL (FACTOR is 1 or -1).  */
Ondrej Vasik 3a1add
+static void
Ondrej Vasik 3a1add
+apply_relative_time (parser_control *pc, relative_time rel, int factor)
Ondrej Vasik 3a1add
+{
Ondrej Vasik 3a1add
+  pc->rel.ns += factor * rel.ns;
Ondrej Vasik 3a1add
+  pc->rel.seconds += factor * rel.seconds;
Ondrej Vasik 3a1add
+  pc->rel.minutes += factor * rel.minutes;
Ondrej Vasik 3a1add
+  pc->rel.hour += factor * rel.hour;
Ondrej Vasik 3a1add
+  pc->rel.day += factor * rel.day;
Ondrej Vasik 3a1add
+  pc->rel.month += factor * rel.month;
Ondrej Vasik 3a1add
+  pc->rel.year += factor * rel.year;
Ondrej Vasik 3a1add
+  pc->rels_seen = true;
Ondrej Vasik 3a1add
+}
Ondrej Vasik 3a1add
+
Ondrej Vasik 3a1add
+/* Set PC-> hour, minutes, seconds and nanoseconds members from arguments.  */
Ondrej Vasik 3a1add
+static void
Ondrej Vasik 3a1add
+set_hhmmss (parser_control *pc, long int hour, long int minutes,
Ondrej Vasik 3a1add
+	    time_t sec, long int nsec)
Ondrej Vasik 3a1add
+{
Ondrej Vasik 3a1add
+  pc->hour = hour;
Ondrej Vasik 3a1add
+  pc->minutes = minutes;
Ondrej Vasik 3a1add
+  pc->seconds.tv_sec = sec;
Ondrej Vasik 3a1add
+  pc->seconds.tv_nsec = nsec;
Ondrej Vasik 3a1add
+}
Ondrej Vasik 3a1add
+
Ondrej Vasik 3a1add
 %}
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 /* We want a reentrant parser, even if the TZ manipulation and the calls to
Ondrej Vasik 3a1add
@@ -268,7 +293,7 @@ digits_to_date_time (parser_control *pc,
Ondrej Vasik 3a1add
 %token tAGO tDST
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 %token tYEAR_UNIT tMONTH_UNIT tHOUR_UNIT tMINUTE_UNIT tSEC_UNIT
Ondrej Vasik 3a1add
-%token <intval> tDAY_UNIT
Ondrej Vasik 3a1add
+%token <intval> tDAY_UNIT tDAY_SHIFT
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 %token <intval> tDAY tDAYZONE tLOCAL_ZONE tMERIDIAN
Ondrej Vasik 3a1add
 %token <intval> tMONTH tORDINAL tZONE
Ondrej Vasik 3a1add
@@ -279,7 +304,7 @@ digits_to_date_time (parser_control *pc,
Ondrej Vasik 3a1add
 %type <intval> o_colon_minutes o_merid
Ondrej Vasik 3a1add
 %type <timespec> seconds signed_seconds unsigned_seconds
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
-%type <rel> relunit relunit_snumber
Ondrej Vasik 3a1add
+%type <rel> relunit relunit_snumber dayshift
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 %%
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
@@ -313,7 +338,6 @@ item:
Ondrej Vasik 3a1add
   | day
Ondrej Vasik 3a1add
       { pc->days_seen++; }
Ondrej Vasik 3a1add
   | rel
Ondrej Vasik 3a1add
-      { pc->rels_seen = true; }
Ondrej Vasik 3a1add
   | number
Ondrej Vasik 3a1add
   | hybrid
Ondrej Vasik 3a1add
   ;
Ondrej Vasik 3a1add
@@ -321,45 +345,32 @@ item:
Ondrej Vasik 3a1add
 time:
Ondrej Vasik 3a1add
     tUNUMBER tMERIDIAN
Ondrej Vasik 3a1add
       {
Ondrej Vasik 3a1add
-	pc->hour = $1.value;
Ondrej Vasik 3a1add
-	pc->minutes = 0;
Ondrej Vasik 3a1add
-	pc->seconds.tv_sec = 0;
Ondrej Vasik 3a1add
-	pc->seconds.tv_nsec = 0;
Ondrej Vasik 3a1add
+	set_hhmmss (pc, $1.value, 0, 0, 0);
Ondrej Vasik 3a1add
 	pc->meridian = $2;
Ondrej Vasik 3a1add
       }
Ondrej Vasik 3a1add
   | tUNUMBER ':' tUNUMBER o_merid
Ondrej Vasik 3a1add
       {
Ondrej Vasik 3a1add
-	pc->hour = $1.value;
Ondrej Vasik 3a1add
-	pc->minutes = $3.value;
Ondrej Vasik 3a1add
-	pc->seconds.tv_sec = 0;
Ondrej Vasik 3a1add
-	pc->seconds.tv_nsec = 0;
Ondrej Vasik 3a1add
+	set_hhmmss (pc, $1.value, $3.value, 0, 0);
Ondrej Vasik 3a1add
 	pc->meridian = $4;
Ondrej Vasik 3a1add
       }
Ondrej Vasik 3a1add
   | tUNUMBER ':' tUNUMBER tSNUMBER o_colon_minutes
Ondrej Vasik 3a1add
       {
Ondrej Vasik 3a1add
-	pc->hour = $1.value;
Ondrej Vasik 3a1add
-	pc->minutes = $3.value;
Ondrej Vasik 3a1add
-	pc->seconds.tv_sec = 0;
Ondrej Vasik 3a1add
-	pc->seconds.tv_nsec = 0;
Ondrej Vasik 3a1add
+	set_hhmmss (pc, $1.value, $3.value, 0, 0);
Ondrej Vasik 3a1add
 	pc->meridian = MER24;
Ondrej Vasik 3a1add
 	pc->zones_seen++;
Ondrej Vasik 3a1add
-	pc->time_zone = time_zone_hhmm ($4, $5);
Ondrej Vasik 3a1add
+	pc->time_zone = time_zone_hhmm (pc, $4, $5);
Ondrej Vasik 3a1add
       }
Ondrej Vasik 3a1add
   | tUNUMBER ':' tUNUMBER ':' unsigned_seconds o_merid
Ondrej Vasik 3a1add
       {
Ondrej Vasik 3a1add
-	pc->hour = $1.value;
Ondrej Vasik 3a1add
-	pc->minutes = $3.value;
Ondrej Vasik 3a1add
-	pc->seconds = $5;
Ondrej Vasik 3a1add
+	set_hhmmss (pc, $1.value, $3.value, $5.tv_sec, $5.tv_nsec);
Ondrej Vasik 3a1add
 	pc->meridian = $6;
Ondrej Vasik 3a1add
       }
Ondrej Vasik 3a1add
   | tUNUMBER ':' tUNUMBER ':' unsigned_seconds tSNUMBER o_colon_minutes
Ondrej Vasik 3a1add
       {
Ondrej Vasik 3a1add
-	pc->hour = $1.value;
Ondrej Vasik 3a1add
-	pc->minutes = $3.value;
Ondrej Vasik 3a1add
-	pc->seconds = $5;
Ondrej Vasik 3a1add
+	set_hhmmss (pc, $1.value, $3.value, $5.tv_sec, $5.tv_nsec);
Ondrej Vasik 3a1add
 	pc->meridian = MER24;
Ondrej Vasik 3a1add
 	pc->zones_seen++;
Ondrej Vasik 3a1add
-	pc->time_zone = time_zone_hhmm ($6, $7);
Ondrej Vasik 3a1add
+	pc->time_zone = time_zone_hhmm (pc, $6, $7);
Ondrej Vasik 3a1add
       }
Ondrej Vasik 3a1add
   ;
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
@@ -381,16 +392,9 @@ zone:
Ondrej Vasik 3a1add
       { pc->time_zone = $1; }
Ondrej Vasik 3a1add
   | tZONE relunit_snumber
Ondrej Vasik 3a1add
       { pc->time_zone = $1;
Ondrej Vasik 3a1add
-	pc->rel.ns += $2.ns;
Ondrej Vasik 3a1add
-	pc->rel.seconds += $2.seconds;
Ondrej Vasik 3a1add
-	pc->rel.minutes += $2.minutes;
Ondrej Vasik 3a1add
-	pc->rel.hour += $2.hour;
Ondrej Vasik 3a1add
-	pc->rel.day += $2.day;
Ondrej Vasik 3a1add
-	pc->rel.month += $2.month;
Ondrej Vasik 3a1add
-	pc->rel.year += $2.year;
Ondrej Vasik 3a1add
-        pc->rels_seen = true; }
Ondrej Vasik 3a1add
+	apply_relative_time (pc, $2, 1); }
Ondrej Vasik 3a1add
   | tZONE tSNUMBER o_colon_minutes
Ondrej Vasik 3a1add
-      { pc->time_zone = $1 + time_zone_hhmm ($2, $3); }
Ondrej Vasik 3a1add
+      { pc->time_zone = $1 + time_zone_hhmm (pc, $2, $3); }
Ondrej Vasik 3a1add
   | tDAYZONE
Ondrej Vasik 3a1add
       { pc->time_zone = $1 + 60; }
Ondrej Vasik 3a1add
   | tZONE tDST
Ondrej Vasik 3a1add
@@ -495,25 +499,11 @@ date:
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 rel:
Ondrej Vasik 3a1add
     relunit tAGO
Ondrej Vasik 3a1add
-      {
Ondrej Vasik 3a1add
-	pc->rel.ns -= $1.ns;
Ondrej Vasik 3a1add
-	pc->rel.seconds -= $1.seconds;
Ondrej Vasik 3a1add
-	pc->rel.minutes -= $1.minutes;
Ondrej Vasik 3a1add
-	pc->rel.hour -= $1.hour;
Ondrej Vasik 3a1add
-	pc->rel.day -= $1.day;
Ondrej Vasik 3a1add
-	pc->rel.month -= $1.month;
Ondrej Vasik 3a1add
-	pc->rel.year -= $1.year;
Ondrej Vasik 3a1add
-      }
Ondrej Vasik 3a1add
+      { apply_relative_time (pc, $1, -1); }
Ondrej Vasik 3a1add
   | relunit
Ondrej Vasik 3a1add
-      {
Ondrej Vasik 3a1add
-	pc->rel.ns += $1.ns;
Ondrej Vasik 3a1add
-	pc->rel.seconds += $1.seconds;
Ondrej Vasik 3a1add
-	pc->rel.minutes += $1.minutes;
Ondrej Vasik 3a1add
-	pc->rel.hour += $1.hour;
Ondrej Vasik 3a1add
-	pc->rel.day += $1.day;
Ondrej Vasik 3a1add
-	pc->rel.month += $1.month;
Ondrej Vasik 3a1add
-	pc->rel.year += $1.year;
Ondrej Vasik 3a1add
-      }
Ondrej Vasik 3a1add
+      { apply_relative_time (pc, $1, 1); }
Ondrej Vasik 3a1add
+  | dayshift
Ondrej Vasik 3a1add
+      { apply_relative_time (pc, $1, 1); }
Ondrej Vasik 3a1add
   ;
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 relunit:
Ondrej Vasik 3a1add
@@ -575,6 +565,11 @@ relunit_snumber:
Ondrej Vasik 3a1add
       { $$ = RELATIVE_TIME_0; $$.seconds = $1.value; }
Ondrej Vasik 3a1add
   ;
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
+dayshift:
Ondrej Vasik 3a1add
+    tDAY_SHIFT
Ondrej Vasik 3a1add
+      { $$ = RELATIVE_TIME_0; $$.day = $1; }
Ondrej Vasik 3a1add
+  ;
Ondrej Vasik 3a1add
+
Ondrej Vasik 3a1add
 seconds: signed_seconds | unsigned_seconds;
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 signed_seconds:
Ondrej Vasik 3a1add
@@ -600,14 +595,7 @@ hybrid:
Ondrej Vasik 3a1add
 	/* Hybrid all-digit and relative offset, so that we accept e.g.,
Ondrej Vasik 3a1add
 	   "YYYYMMDD +N days" as well as "YYYYMMDD N days".  */
Ondrej Vasik 3a1add
 	digits_to_date_time (pc, $1);
Ondrej Vasik 3a1add
-	pc->rel.ns += $2.ns;
Ondrej Vasik 3a1add
-	pc->rel.seconds += $2.seconds;
Ondrej Vasik 3a1add
-	pc->rel.minutes += $2.minutes;
Ondrej Vasik 3a1add
-	pc->rel.hour += $2.hour;
Ondrej Vasik 3a1add
-	pc->rel.day += $2.day;
Ondrej Vasik 3a1add
-	pc->rel.month += $2.month;
Ondrej Vasik 3a1add
-	pc->rel.year += $2.year;
Ondrej Vasik 3a1add
-	pc->rels_seen = true;
Ondrej Vasik 3a1add
+	apply_relative_time (pc, $2, 1);
Ondrej Vasik 3a1add
       }
Ondrej Vasik 3a1add
   ;
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
@@ -688,10 +676,10 @@ static table const time_units_table[] =
Ondrej Vasik 3a1add
 /* Assorted relative-time words. */
Ondrej Vasik 3a1add
 static table const relative_time_table[] =
Ondrej Vasik 3a1add
 {
Ondrej Vasik 3a1add
-  { "TOMORROW",	tDAY_UNIT,	 1 },
Ondrej Vasik 3a1add
-  { "YESTERDAY",tDAY_UNIT,	-1 },
Ondrej Vasik 3a1add
-  { "TODAY",	tDAY_UNIT,	 0 },
Ondrej Vasik 3a1add
-  { "NOW",	tDAY_UNIT,	 0 },
Ondrej Vasik 3a1add
+  { "TOMORROW",	tDAY_SHIFT,	 1 },
Ondrej Vasik 3a1add
+  { "YESTERDAY",tDAY_SHIFT,	-1 },
Ondrej Vasik 3a1add
+  { "TODAY",	tDAY_SHIFT,	 0 },
Ondrej Vasik 3a1add
+  { "NOW",	tDAY_SHIFT,	 0 },
Ondrej Vasik 3a1add
   { "LAST",	tORDINAL,	-1 },
Ondrej Vasik 3a1add
   { "THIS",	tORDINAL,	 0 },
Ondrej Vasik 3a1add
   { "NEXT",	tORDINAL,	 1 },
Ondrej Vasik 3a1add
@@ -814,15 +802,33 @@ static table const military_table[] =
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 /* Convert a time zone expressed as HH:MM into an integer count of
Ondrej Vasik 3a1add
    minutes.  If MM is negative, then S is of the form HHMM and needs
Ondrej Vasik 3a1add
-   to be picked apart; otherwise, S is of the form HH.  */
Ondrej Vasik 3a1add
+   to be picked apart; otherwise, S is of the form HH.  As specified in
Ondrej Vasik 3a1add
+   http://www.opengroup.org/susv3xbd/xbd_chap08.html#tag_08_03, allow
Ondrej Vasik 3a1add
+   only valid TZ range, and consider first two digits as hours, if no
Ondrej Vasik 3a1add
+   minutes specified.  */
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 static long int
Ondrej Vasik 3a1add
-time_zone_hhmm (textint s, long int mm)
Ondrej Vasik 3a1add
+time_zone_hhmm (parser_control *pc, textint s, long int mm)
Ondrej Vasik 3a1add
 {
Ondrej Vasik 3a1add
+  long int n_minutes;
Ondrej Vasik 3a1add
+
Ondrej Vasik 3a1add
+  /* If the length of S is 1 or 2 and no minutes are specified,
Ondrej Vasik 3a1add
+     interpret it as a number of hours.  */
Ondrej Vasik 3a1add
+  if (s.digits <= 2 && mm < 0)
Ondrej Vasik 3a1add
+    s.value *= 100;
Ondrej Vasik 3a1add
+
Ondrej Vasik 3a1add
   if (mm < 0)
Ondrej Vasik 3a1add
-    return (s.value / 100) * 60 + s.value % 100;
Ondrej Vasik 3a1add
+    n_minutes = (s.value / 100) * 60 + s.value % 100;
Ondrej Vasik 3a1add
   else
Ondrej Vasik 3a1add
-    return s.value * 60 + (s.negative ? -mm : mm);
Ondrej Vasik 3a1add
+    n_minutes = s.value * 60 + (s.negative ? -mm : mm);
Ondrej Vasik 3a1add
+
Ondrej Vasik 3a1add
+  /* If the absolute number of minutes is larger than 24 hours,
Ondrej Vasik 3a1add
+     arrange to reject it by incrementing pc->zones_seen.  Thus,
Ondrej Vasik 3a1add
+     we allow only values in the range UTC-24:00 to UTC+24:00.  */
Ondrej Vasik 3a1add
+  if (24 * 60 < abs (n_minutes))
Ondrej Vasik 3a1add
+    pc->zones_seen++;
Ondrej Vasik 3a1add
+
Ondrej Vasik 3a1add
+  return n_minutes;
Ondrej Vasik 3a1add
 }
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 static int
Ondrej Vasik 3a1add
@@ -919,7 +925,7 @@ lookup_word (parser_control const *pc, c
Ondrej Vasik 3a1add
   for (p = word; *p; p++)
Ondrej Vasik 3a1add
     {
Ondrej Vasik 3a1add
       unsigned char ch = *p;
Ondrej Vasik 3a1add
-      *p = toupper (ch);
Ondrej Vasik 3a1add
+      *p = c_toupper (ch);
Ondrej Vasik 3a1add
     }
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
   for (tp = meridian_table; tp->name; tp++)
Ondrej Vasik 3a1add
@@ -984,7 +990,7 @@ yylex (YYSTYPE *lvalp, parser_control *p
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
   for (;;)
Ondrej Vasik 3a1add
     {
Ondrej Vasik 3a1add
-      while (c = *pc->input, isspace (c))
Ondrej Vasik 3a1add
+      while (c = *pc->input, c_isspace (c))
Ondrej Vasik 3a1add
 	pc->input++;
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
       if (ISDIGIT (c) || c == '-' || c == '+')
Ondrej Vasik 3a1add
@@ -995,7 +1001,7 @@ yylex (YYSTYPE *lvalp, parser_control *p
Ondrej Vasik 3a1add
 	  if (c == '-' || c == '+')
Ondrej Vasik 3a1add
 	    {
Ondrej Vasik 3a1add
 	      sign = c == '-' ? -1 : 1;
Ondrej Vasik 3a1add
-	      while (c = *++pc->input, isspace (c))
Ondrej Vasik 3a1add
+	      while (c = *++pc->input, c_isspace (c))
Ondrej Vasik 3a1add
 		continue;
Ondrej Vasik 3a1add
 	      if (! ISDIGIT (c))
Ondrej Vasik 3a1add
 		/* skip the '-' sign */
Ondrej Vasik 3a1add
@@ -1099,7 +1105,7 @@ yylex (YYSTYPE *lvalp, parser_control *p
Ondrej Vasik 3a1add
 	    }
Ondrej Vasik 3a1add
 	}
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
-      if (isalpha (c))
Ondrej Vasik 3a1add
+      if (c_isalpha (c))
Ondrej Vasik 3a1add
 	{
Ondrej Vasik 3a1add
 	  char buff[20];
Ondrej Vasik 3a1add
 	  char *p = buff;
Ondrej Vasik 3a1add
@@ -1111,7 +1117,7 @@ yylex (YYSTYPE *lvalp, parser_control *p
Ondrej Vasik 3a1add
 		*p++ = c;
Ondrej Vasik 3a1add
 	      c = *++pc->input;
Ondrej Vasik 3a1add
 	    }
Ondrej Vasik 3a1add
-	  while (isalpha (c) || c == '.');
Ondrej Vasik 3a1add
+	  while (c_isalpha (c) || c == '.');
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
 	  *p = '\0';
Ondrej Vasik 3a1add
 	  tp = lookup_word (pc, buff);
Ondrej Vasik 3a1add
@@ -1224,7 +1230,7 @@ get_date (struct timespec *result, char 
Ondrej Vasik 3a1add
   if (! tmp)
Ondrej Vasik 3a1add
     return false;
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
-  while (c = *p, isspace (c))
Ondrej Vasik 3a1add
+  while (c = *p, c_isspace (c))
Ondrej Vasik 3a1add
     p++;
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
   if (strncmp (p, "TZ=\"", 4) == 0)
Ondrej Vasik 3a1add
@@ -1436,25 +1442,6 @@ get_date (struct timespec *result, char 
Ondrej Vasik 3a1add
 	    goto fail;
Ondrej Vasik 3a1add
 	}
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
-      if (pc.zones_seen)
Ondrej Vasik 3a1add
-	{
Ondrej Vasik 3a1add
-	  long int delta = pc.time_zone * 60;
Ondrej Vasik 3a1add
-	  time_t t1;
Ondrej Vasik 3a1add
-#ifdef HAVE_TM_GMTOFF
Ondrej Vasik 3a1add
-	  delta -= tm.tm_gmtoff;
Ondrej Vasik 3a1add
-#else
Ondrej Vasik 3a1add
-	  time_t t = Start;
Ondrej Vasik 3a1add
-	  struct tm const *gmt = gmtime (&t);
Ondrej Vasik 3a1add
-	  if (! gmt)
Ondrej Vasik 3a1add
-	    goto fail;
Ondrej Vasik 3a1add
-	  delta -= tm_diff (&tm, gmt);
Ondrej Vasik 3a1add
-#endif
Ondrej Vasik 3a1add
-	  t1 = Start - delta;
Ondrej Vasik 3a1add
-	  if ((Start < t1) != (delta < 0))
Ondrej Vasik 3a1add
-	    goto fail;	/* time_t overflow */
Ondrej Vasik 3a1add
-	  Start = t1;
Ondrej Vasik 3a1add
-	}
Ondrej Vasik 3a1add
-
Ondrej Vasik 3a1add
       /* Add relative date.  */
Ondrej Vasik 3a1add
       if (pc.rel.year | pc.rel.month | pc.rel.day)
Ondrej Vasik 3a1add
 	{
Ondrej Vasik 3a1add
@@ -1477,6 +1464,27 @@ get_date (struct timespec *result, char 
Ondrej Vasik 3a1add
 	    goto fail;
Ondrej Vasik 3a1add
 	}
Ondrej Vasik 3a1add
 
Ondrej Vasik 3a1add
+      /* The only "output" of this if-block is an updated Start value,
Ondrej Vasik 3a1add
+	 so this block must follow others that clobber Start.  */
Ondrej Vasik 3a1add
+      if (pc.zones_seen)
Ondrej Vasik 3a1add
+	{
Ondrej Vasik 3a1add
+	  long int delta = pc.time_zone * 60;
Ondrej Vasik 3a1add
+	  time_t t1;
Ondrej Vasik 3a1add
+#ifdef HAVE_TM_GMTOFF
Ondrej Vasik 3a1add
+	  delta -= tm.tm_gmtoff;
Ondrej Vasik 3a1add
+#else
Ondrej Vasik 3a1add
+	  time_t t = Start;
Ondrej Vasik 3a1add
+	  struct tm const *gmt = gmtime (&t);
Ondrej Vasik 3a1add
+	  if (! gmt)
Ondrej Vasik 3a1add
+	    goto fail;
Ondrej Vasik 3a1add
+	  delta -= tm_diff (&tm, gmt);
Ondrej Vasik 3a1add
+#endif
Ondrej Vasik 3a1add
+	  t1 = Start - delta;
Ondrej Vasik 3a1add
+	  if ((Start < t1) != (delta < 0))
Ondrej Vasik 3a1add
+	    goto fail;	/* time_t overflow */
Ondrej Vasik 3a1add
+	  Start = t1;
Ondrej Vasik 3a1add
+	}
Ondrej Vasik 3a1add
+
Ondrej Vasik 3a1add
       /* Add relative hours, minutes, and seconds.  On hosts that support
Ondrej Vasik 3a1add
 	 leap seconds, ignore the possibility of leap seconds; e.g.,
Ondrej Vasik 3a1add
 	 "+ 10 minutes" adds 600 seconds, even if one of them is a