]> code.delx.au - gnu-emacs/blobdiff - lib-src/b2m.c
(calc-arithmetic-menu): Add item for `calc-symclip'.
[gnu-emacs] / lib-src / b2m.c
index 5bebe560e2a6d187512b2d4904758f87b08e823f..7de48e6a522ec3bb4f7fe8a213ee9b0d70568f11 100644 (file)
 
 typedef int logical;
 
+#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) \
+    (1000 - TM_YEAR_BASE <= (tm_year) && (tm_year) <= 9999 - TM_YEAR_BASE)
+#endif
+
 /*
  * A `struct linebuffer' is a structure which holds a line of text.
  * `readline' reads a line from a stream into a linebuffer and works
@@ -85,8 +94,9 @@ main (argc, argv)
      int argc;
      char **argv;
 {
-  logical labels_saved, printing, header;
+  logical labels_saved, printing, header, first, last_was_blank_line;
   time_t ltoday;
+  struct tm *tm;
   char *labels, *p, *today;
   struct linebuffer data;
 
@@ -129,9 +139,16 @@ main (argc, argv)
       exit (EXIT_SUCCESS);
     }
 
-  labels_saved = printing = header = FALSE;
+  labels_saved = printing = header = last_was_blank_line = FALSE;
+  first = TRUE;
   ltoday = time (0);
-  today = ctime (&ltoday);
+  /* Convert to a string, checking for out-of-range time stamps.
+     Don't use 'ctime', as that might dump core if the hardware clock
+     is set to a bizarre value.  */
+  tm = localtime (&ltoday);
+  if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)
+        && (today = asctime (tm))))
+    fatal ("current time is out of range");
   data.size = 200;
   data.buffer = xnew (200, char);
 
@@ -154,6 +171,10 @@ main (argc, argv)
            continue;
          else if (data.buffer[1] == '\f')
            {
+             if (first)
+               first = FALSE;
+             else if (! last_was_blank_line)
+               puts("");
              /* Save labels. */
              readline (&data, stdin);
              p = strtok (data.buffer, " ,\r\n\t");
@@ -179,7 +200,13 @@ main (argc, argv)
        }
 
       if (printing)
-       puts (data.buffer);
+       {
+         puts (data.buffer);
+         if (data.buffer[0] == '\0')
+           last_was_blank_line = TRUE;
+         else
+           last_was_blank_line = FALSE;
+       }
     }
 
   return EXIT_SUCCESS;