]> code.delx.au - gnu-emacs/blobdiff - lib-src/b2m.c
Add NO_RETURN specifiers to functions in lib-src.
[gnu-emacs] / lib-src / b2m.c
index 5bebe560e2a6d187512b2d4904758f87b08e823f..f31b33f9780e9442abb6b83c5cf0f4187a0f53d1 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
@@ -55,12 +64,13 @@ struct linebuffer
   char *buffer;
 };
 
-extern char *strtok();
+extern char *strtok(char *, const char *);
 
-long *xmalloc (), *xrealloc ();
-char *concat ();
-long readline ();
-void fatal ();
+long *xmalloc (unsigned int size);
+long *xrealloc (char *ptr, unsigned int size);
+char *concat (char *s1, char *s2, char *s3);
+long readline (struct linebuffer *linebuffer, register FILE *stream);
+void fatal (char *message) NO_RETURN;
 
 /*
  * xnew -- allocate storage.  SYNOPSIS: Type *xnew (int n, Type);
@@ -81,12 +91,11 @@ struct option longopts[] =
 extern int optind;
 
 int
-main (argc, argv)
-     int argc;
-     char **argv;
+main (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 +138,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 +170,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 +199,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;
@@ -192,8 +218,7 @@ main (argc, argv)
  * concatenate those of s1, s2, s3.
  */
 char *
-concat (s1, s2, s3)
-     char *s1, *s2, *s3;
+concat (char *s1, char *s2, char *s3)
 {
   int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
   char *result = xnew (len1 + len2 + len3 + 1, char);
@@ -212,9 +237,7 @@ concat (s1, s2, s3)
  * which is the length of the line including the newline, if any.
  */
 long
-readline (linebuffer, stream)
-     struct linebuffer *linebuffer;
-     register FILE *stream;
+readline (struct linebuffer *linebuffer, register FILE *stream)
 {
   char *buffer = linebuffer->buffer;
   register char *p = linebuffer->buffer;
@@ -264,8 +287,7 @@ readline (linebuffer, stream)
  * Like malloc but get fatal error if memory is exhausted.
  */
 long *
-xmalloc (size)
-     unsigned int size;
+xmalloc (unsigned int size)
 {
   long *result = (long *) malloc (size);
   if (result == NULL)
@@ -274,9 +296,7 @@ xmalloc (size)
 }
 
 long *
-xrealloc (ptr, size)
-     char *ptr;
-     unsigned int size;
+xrealloc (char *ptr, unsigned int size)
 {
   long *result = (long *) realloc (ptr, size);
   if (result == NULL)
@@ -285,8 +305,7 @@ xrealloc (ptr, size)
 }
 
 void
-fatal (message)
-     char *message;
+fatal (char *message)
 {
   fprintf (stderr, "%s: %s\n", progname, message);
   exit (EXIT_FAILURE);