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
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;
exit (EXIT_SUCCESS);
}
- labels_saved = printing = header = FALSE;
+ labels_saved = printing = header = last_was_blank_line = FALSE;
+ first = TRUE;
ltoday = time (0);
- today = ctime (<oday);
+ /* 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)
+ && (today = asctime (tm))))
+ fatal ("current time is out of range");
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;