diff lib-src/fakemail.c @ 69790:1e68e7f3b824

* lib-src/b2m.c (main): Don't include <limits.h>. (TM_YEAR_BASE): New macro. (TM_YEAR_IN_ASCTIME_RANGE): Don't define if already defined, so that s/ files can override this. Use the more-conservative range 1000-9999. (main): Check for asctime returning NULL. * lib-src/fakemail.c: Likewise. * src/editfns.c (TM_YEAR_IN_ASCTIME_RANGE): New macro, identical to ../lib-src/b2m.c and ../lib-src/editfns.c. (Fcurrent_time_string): Use it. Document that the year might not consume 4 columns if it's outside the range 1000-9999. Check for asctime failure. Don't assume that the output string length is always exactly 24.
author Paul Eggert <eggert@twinsun.com>
date Tue, 04 Apr 2006 04:13:02 +0000
parents e112ec9aa49b
children 8e7233f487a3 65ca8fb66a0d
line wrap: on
line diff
--- a/lib-src/fakemail.c	Tue Apr 04 03:39:23 2006 +0000
+++ b/lib-src/fakemail.c	Tue Apr 04 04:13:02 2006 +0000
@@ -53,7 +53,6 @@
 #include "ntlib.h"
 #endif
 
-#include <limits.h>
 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>
@@ -71,15 +70,13 @@
 #define true 1
 #define false 0
 
-/* True if TM_YEAR is a struct tm's tm_year value that is acceptable
-   to asctime.  Glibc asctime returns a useful string unless TM_YEAR
-   is nearly INT_MAX, but the C Standard lets C libraries overrun a
-   buffer if TM_YEAR needs more than 4 bytes.  */
-#ifdef __GLIBC__
-# define TM_YEAR_IN_ASCTIME_RANGE(tm_year) ((tm_year) <= INT_MAX - 1900)
-#else
+#define TM_YEAR_BASE 1900
+
+/* Nonzero if TM_YEAR is a struct tm's tm_year value that causes
+   asctime to have well-defined behavior.  */
+#ifndef TM_YEAR_IN_ASCTIME_RANGE
 # define TM_YEAR_IN_ASCTIME_RANGE(tm_year) \
-    (-999 - 1900 <= (tm_year) && (tm_year) <= 9999 - 1900)
+    (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
 #endif
 
 /* Various lists */
@@ -378,9 +375,9 @@
      Don't use 'ctime', as that might dump core if the hardware clock
      is set to a bizarre value.  */
   tm = localtime (&idiotic_interface);
-  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)))
+  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)
+	 && (the_date = asctime (tm))))
     fatal ("current time is out of range", 0);
-  the_date = asctime (tm);
   /* the_date has an unwanted newline at the end */
   date_length = strlen (the_date) - 1;
   the_date[date_length] = '\0';