X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fgetdate.y;h=f3014fb944c7b22e3a8e37507fc01220e3092f95;hb=b4e2cc126eeaa01f81c71bf233f7b69dba38d998;hp=09340da8b8580e8d378a29ec7fcacb3dd3a66421;hpb=23dd080773057f6fbbcb37f1d616ec0c1fb762af;p=gnulib.git diff --git a/lib/getdate.y b/lib/getdate.y index 09340da8b..f3014fb94 100644 --- a/lib/getdate.y +++ b/lib/getdate.y @@ -6,11 +6,11 @@ ** and Jim Berets 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 @@ -35,20 +35,6 @@ 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__ -#define alloca __builtin_alloca -#else -#ifdef HAVE_ALLOCA_H -#include -#else -#ifdef _AIX - #pragma alloca -#else -void *alloca (); -#endif -#endif -#endif #ifdef __GNUC__ #undef alloca @@ -382,25 +368,24 @@ number : tUNUMBER { yyYear = $1; else { if($1>10000) { - time_t date_part; - - date_part= $1/10000; yyHaveDate++; - yyDay= (date_part)%100; - yyMonth= (date_part/100)%100; - yyYear = date_part/10000; - } - yyHaveTime++; - if ($1 < 100) { - yyHour = $1; - yyMinutes = 0; + yyDay= ($1)%100; + yyMonth= ($1/100)%100; + yyYear = $1/10000; } else { - yyHour = $1 / 100; - yyMinutes = $1 % 100; - } - yySeconds = 0; - yyMeridian = MER24; + yyHaveTime++; + if ($1 < 100) { + yyHour = $1; + yyMinutes = 0; + } + else { + yyHour = $1 / 100; + yyMinutes = $1 % 100; + } + yySeconds = 0; + yyMeridian = MER24; + } } } ; @@ -898,53 +883,38 @@ yylex() } } - -#define TM_YEAR_ORIGIN 1900 - -/* Yield A - B, measured in seconds. */ -static time_t -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); - return - ( - ( - ( - /* 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 */ - + (time_t)(ay-by) * 365 - )*24 + (a->tm_hour - b->tm_hour) - )*60 + (a->tm_min - b->tm_min) - )*60 + (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;