New file to override autoconf's AC_SEARCH_LIBS.
[gnulib.git] / lib / getdate.y
index df9614f..3807e2f 100644 (file)
@@ -10,7 +10,7 @@
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
-# ifdef FORCE_ALLOCA_H
+# ifdef HAVE_ALLOCA_H
 #  include <alloca.h>
 # endif
 #endif
 #include <stdio.h>
 #include <ctype.h>
 
+#if HAVE_STDLIB_H
+# include <stdlib.h> /* for `free'; used by Bison 1.27 */
+#endif
+
 #if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
 # define IN_CTYPE_DOMAIN(c) 1
 #else
 # include <string.h>
 #endif
 
+#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
+# define __attribute__(x)
+#endif
+
+#ifndef ATTRIBUTE_UNUSED
+# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
+#endif
+
 /* Some old versions of bison generate parsers that use bcopy.
    That loses on systems that don't provide the function, so we have
    to redefine it here.  */
@@ -471,7 +483,7 @@ static TABLE const MonthDayTable[] = {
     { "thurs",         tDAY, 4 },
     { "friday",                tDAY, 5 },
     { "saturday",      tDAY, 6 },
-    { NULL }
+    { NULL, 0, 0 }
 };
 
 /* Time units table. */
@@ -486,7 +498,7 @@ static TABLE const UnitsTable[] = {
     { "min",           tMINUTE_UNIT,   1 },
     { "second",                tSEC_UNIT,      1 },
     { "sec",           tSEC_UNIT,      1 },
-    { NULL }
+    { NULL, 0, 0 }
 };
 
 /* Assorted relative-time words. */
@@ -511,7 +523,7 @@ static TABLE const OtherTable[] = {
     { "eleventh",      tUNUMBER,       11 },
     { "twelfth",       tUNUMBER,       12 },
     { "ago",           tAGO,   1 },
-    { NULL }
+    { NULL, 0, 0 }
 };
 
 /* The timezone table. */
@@ -596,7 +608,7 @@ static TABLE const TimezoneTable[] = {
     { "nzst",  tZONE,     -HOUR (12) },        /* New Zealand Standard */
     { "nzdt",  tDAYZONE,  -HOUR (12) },        /* New Zealand Daylight */
     { "idle",  tZONE,     -HOUR (12) },        /* International Date Line East */
-    {  NULL  }
+    {  NULL, 0, 0  }
 };
 
 /* Military timezone table. */
@@ -626,7 +638,7 @@ static TABLE const MilitaryTable[] = {
     { "x",     tZONE,  HOUR (-11) },
     { "y",     tZONE,  HOUR (-12) },
     { "z",     tZONE,  HOUR (  0) },
-    { NULL }
+    { NULL, 0, 0 }
 };
 
 \f
@@ -635,7 +647,7 @@ static TABLE const MilitaryTable[] = {
 /* ARGSUSED */
 static int
 yyerror (s)
-     char *s;
+     char *s ATTRIBUTE_UNUSED;
 {
   return 0;
 }
@@ -698,7 +710,7 @@ LookupWord (buff)
 
   /* Make it lowercase. */
   for (p = buff; *p; p++)
-    if (ISUPPER (*p))
+    if (ISUPPER ((unsigned char) *p))
       *p = tolower (*p);
 
   if (strcmp (buff, "am") == 0 || strcmp (buff, "a.m.") == 0)
@@ -779,7 +791,7 @@ LookupWord (buff)
       }
 
   /* Military timezones. */
-  if (buff[1] == '\0' && ISALPHA (*buff))
+  if (buff[1] == '\0' && ISALPHA ((unsigned char) *buff))
     {
       for (tp = MilitaryTable; tp->name; tp++)
        if (strcmp (buff, tp->name) == 0)
@@ -810,7 +822,7 @@ LookupWord (buff)
 static int
 yylex ()
 {
-  register char c;
+  register unsigned char c;
   register char *p;
   char buff[20];
   int Count;
@@ -818,7 +830,7 @@ yylex ()
 
   for (;;)
     {
-      while (ISSPACE (*yyInput))
+      while (ISSPACE ((unsigned char) *yyInput))
        yyInput++;
 
       if (ISDIGIT (c = *yyInput) || c == '-' || c == '+')
@@ -869,8 +881,7 @@ yylex ()
 
 /* Yield A - B, measured in seconds.  */
 static long
-difftm (a, b)
-     struct tm *a, *b;
+difftm (struct tm *a, struct tm *b)
 {
   int ay = a->tm_year + (TM_YEAR_ORIGIN - 1);
   int by = b->tm_year + (TM_YEAR_ORIGIN - 1);
@@ -898,12 +909,15 @@ get_date (const char *p, const time_t *now)
   yyInput = p;
   Start = now ? *now : time ((time_t *) NULL);
   tmp = localtime (&Start);
+  if (!tmp)
+    return -1;
   yyYear = tmp->tm_year + TM_YEAR_ORIGIN;
   yyMonth = tmp->tm_mon + 1;
   yyDay = tmp->tm_mday;
   yyHour = tmp->tm_hour;
   yyMinutes = tmp->tm_min;
   yySeconds = tmp->tm_sec;
+  tm.tm_isdst = tmp->tm_isdst;
   yyMeridian = MER24;
   yyRelSeconds = 0;
   yyRelMinutes = 0;
@@ -939,7 +953,6 @@ get_date (const char *p, const time_t *now)
   tm.tm_hour += yyRelHour;
   tm.tm_min += yyRelMinutes;
   tm.tm_sec += yyRelSeconds;
-  tm.tm_isdst = -1;
   tm0 = tm;
 
   Start = mktime (&tm);
@@ -986,7 +999,11 @@ get_date (const char *p, const time_t *now)
 
   if (yyHaveZone)
     {
-      long delta = yyTimezone * 60L + difftm (&tm, gmtime (&Start));
+      long delta;
+      struct tm *gmt = gmtime (&Start);
+      if (!gmt)
+       return -1;
+      delta = yyTimezone * 60L + difftm (&tm, gmt);
       if ((Start + delta < Start) != (delta < 0))
        return -1;              /* time_t overflow */
       Start += delta;