#undef static
#endif
-#include <limits.h>
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
typedef int logical;
-/* 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
/*
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);
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;
exit (EXIT_SUCCESS);
}
- labels_saved = printing = header = FALSE;
+ labels_saved = printing = header = last_was_blank_line = FALSE;
+ first = TRUE;
ltoday = time (0);
/* 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 (<oday);
- if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)))
+ if (! (tm && TM_YEAR_IN_ASCTIME_RANGE (tm->tm_year)
+ && (today = asctime (tm))))
fatal ("current time is out of range");
- today = asctime (tm);
data.size = 200;
data.buffer = xnew (200, char);
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");
}
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;
* 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);
* 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;
* 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)
}
long *
-xrealloc (ptr, size)
- char *ptr;
- unsigned int size;
+xrealloc (char *ptr, unsigned int size)
{
long *result = (long *) realloc (ptr, size);
if (result == NULL)
}
void
-fatal (message)
- char *message;
+fatal (char *message)
{
fprintf (stderr, "%s: %s\n", progname, message);
exit (EXIT_FAILURE);