changeset 158:287ce6d3ead5

GNU shell utilities
author Jim Meyering <jim@meyering.net>
date Tue, 19 Apr 1994 13:02:55 +0000
parents 70069d83275c
children ca3b7efb9605
files lib/getdate.y
diffstat 1 files changed, 22 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/lib/getdate.y
+++ b/lib/getdate.y
@@ -6,11 +6,11 @@
 **  <rsalz@bbn.com> and Jim Berets <jberets@bbn.com> in August, 1990;
 **  send any email to Rich.
 **
-**  This grammar has nine shift/reduce conflicts.
+**  This grammar has 10 shift/reduce conflicts.
 **
 **  This code is in the public domain and has no copyright.
 */
-/* SUPPRESS 287 on yaccpar_sccsid *//* Unusd static variable */
+/* SUPPRESS 287 on yaccpar_sccsid *//* Unused static variable */
 /* SUPPRESS 288 on yyerrlab *//* Label unused */
 
 #ifdef HAVE_CONFIG_H
@@ -31,26 +31,6 @@
 #undef static
 #endif
 
-/* The following block of alloca-related preprocessor directives is here
-   solely to allow compilation by non GNU-C compilers of the C parser
-   produced from this file by old versions of bison.  Newer versions of
-   bison include a block similar to this one in bison.simple.  */
-
-#ifdef __GNUC__
-#undef alloca
-#define alloca __builtin_alloca
-#else
-#ifdef HAVE_ALLOCA_H
-#include <alloca.h>
-#else
-#ifdef _AIX /* for Bison */
- #pragma alloca
-#else
-void *alloca ();
-#endif
-#endif
-#endif
-
 #include <stdio.h>
 #include <ctype.h>
 
@@ -883,51 +863,38 @@
     }
 }
 
-
-#define TM_YEAR_ORIGIN 1900
-
-/* Yield A - B, measured in seconds.  */
-static long
-difftm (a, b)
-     struct tm *a, *b;
-{
-  int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
-  int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
-  int days = (
-	      /* difference in day of year */
-	      a->tm_yday - b->tm_yday
-	      /* + intervening leap days */
-	      +  ((ay >> 2) - (by >> 2))
-	      -  (ay/100 - by/100)
-	      +  ((ay/100 >> 2) - (by/100 >> 2))
-	      /* + difference in years * 365 */
-	      +  (long)(ay-by) * 365
-	      );
-  return (60*(60*(24*days + (a->tm_hour - b->tm_hour))
-	      + (a->tm_min - b->tm_min))
-	  + (a->tm_sec - b->tm_sec));
-}
-
 time_t
 get_date(p, now)
     char		*p;
     struct timeb	*now;
 {
-    struct tm		*tm, gmt;
+    struct tm		*tm;
     struct timeb	ftz;
     time_t		Start;
     time_t		tod;
 
     yyInput = p;
-    if (now == NULL) {
+    if (now == NULL)
+      {
+	int tz;
+	struct tm *tmp;
+	time_t epoch = 0;
+
         now = &ftz;
 	(void)time(&ftz.time);
 
-	if (! (tm = gmtime (&ftz.time)))
-	    return -1;
-	gmt = *tm;	/* Make a copy, in case localtime modifies *tm.  */
-	ftz.timezone = difftm (&gmt, localtime (&ftz.time)) / 60;
-    }
+	/* Compute local timezone.  Do *not* take daylight savings
+	   into account here.  */
+	tmp = localtime (&epoch);
+	tz = tmp->tm_hour * 60 + tmp->tm_min;	/* Minutes east of UTC.  */
+	if (tz > 0)
+	  {
+	    tz = 24 * 60 - tz;			/* Minutes west of UTC.  */
+	    if (tmp->tm_year == 70)
+	      tz -= 24 * 60;			/* Account for date line.  */
+	  }
+	ftz.timezone = tz;
+      }
 
     tm = localtime(&now->time);
     yyYear = tm->tm_year;
@@ -980,6 +947,7 @@
 #if	defined(TEST)
 
 /* ARGSUSED */
+int
 main(ac, av)
     int		ac;
     char	*av[];