|
|
BSD 4.3reno
/* date.c */
#include "tws.h"
#include <stdio.h>
#include <strings.h>
#include <sys/time.h>
char *dates[] = {
"11 MAR 1980 1559-PST",
"12 March 1980 11:41-EST",
"10 Feb 1982 11:22:30-PST",
"85/10/29 14:44:13",
"2 Dec 1986 1103-PST (Tuesday)",
"27-Dec-1986 2323",
"06-Oct-88 00:57",
"12/02/88 12:36:12 EST",
"Mon, 05 Dec 88 22:17:19 PST",
"Fri, 16 Dec 88 18:49:09 PST",
"5 Jan 89 11:45 +0100",
"Fri Jan 6 12:46:18 PST 1989",
"Tue Jan 24 07:41:26 1989 CST",
"2/3/89 6:33 AM",
"13 February 1989, 10:02:09 EST",
"Tue Feb 14 13:05:06 PST 1989",
"14 Feb 89 17:17:23 GMT",
"01 Apr 89 00:00:01 GMT",
"10 Jul 89 15:24",
"Tue Nov 28 16:31:28 1989",
"Wed Nov 29 14:54:37 -0800 1989",
"Wed, 22 Nov 89 22:29:04 JST",
0
};
static int lflag = 0; /* long output, decode tw_flags */
static int tflag = 0; /* run test on standard test dates */
static int bflag = 0; /* run benchmark on standard test dates */
static char *argv0 = "?";
/* ARGSUSED */
void
main (argc, argv)
int argc;
char **argv;
{
register char *cp, **p;
FILE *f = stdin;
char buf[1024];
if (argv0 = rindex(argv[0], '/'))
++argv0;
else
argv0 = argv[0];
argc--;
argv++;
while (argc > 0 && *argv[0] == '-') {
if (strcmp("-l", argv[0]) == 0)
lflag = 1;
else if (strcmp("-t", argv[0]) == 0)
tflag = 1;
else if (strcmp("-b", argv[0]) == 0)
bflag = 1;
else
break; /* force "usage" error */
argc--;
argv++;
}
if (argc > 1) {
fprintf(stderr, "usage: %s [-l] [file]\n", argv0);
exit(1);
}
if (argc == 1 && (f = fopen(argv[0], "r")) == 0) {
perror(argv[0]);
exit(1);
}
if (bflag) {
/* Benchmark standard dates */
dobench();
exit(0);
}
if (tflag) {
/* Test standard dates */
for (p = dates; *p; p++)
doit(*p);
exit(0);
}
while (fgets(buf, sizeof(buf), f)) {
cp = buf + strlen(buf) - 1;
if (cp >= buf && *cp == '\n')
*cp = '\0';
doit(buf);
}
exit (0);
}
doit(buf)
register char *buf;
{
register char *cp, *d;
register struct tws *t;
register int i;
t = dparsetime(buf);
i = 30;
if (t) {
d = dasctime(t);
if ((t->tw_flags & TW_SZONE) == TW_SZNIL)
i -= 4;
else if (cp = rindex(d, ' '))
i -= 4 - strlen(cp);
} else
d = "<couldn't parse>";
printf ("%*s\t\"%s\"", i, d, buf);
if (lflag && t) {
i = 0;
if ((t->tw_flags & TW_SDAY) == TW_SEXP) {
printf(" (E-day");
i++;
}
if ((t->tw_flags & TW_SDAY) == TW_SIMP) {
if (i == 0)
printf(" (");
else if (i > 0)
printf(", ");
printf("I-day");
i++;
}
if ((t->tw_flags & TW_SZONE) == TW_SZEXP) {
if (i == 0)
printf(" (");
else if (i > 0)
printf(", ");
printf("E-zone");
i++;
}
if (i > 0)
putchar(')');
}
putchar('\n');
}
dobench()
{
register char **p;
register int n, i;
struct timeval t1, t2;
long ms;
/* Pagefault things in (this may make timings more repeatable) */
for (p = dates; *p; p++)
(void) dparsetime(*p);
/* Bench-ho! */
n = 0;
gettimeofday(&t1, 0);
for (i = 1000; i > 0; --i)
for (p = dates; *p; p++) {
++n;
if (dparsetime(*p) == 0) {
fprintf(stderr, "%s: Lose (parse %d)\n",
argv0, n);
exit(1);
}
}
gettimeofday(&t2, 0);
ms = ((t2.tv_sec * 1000) + t2.tv_usec / 1000) -
((t1.tv_sec * 1000) + t1.tv_usec / 1000);
printf("%s: %d parses took %.2f seconds (%.2f per second)\n",
argv0, n, (float)ms / 1000, (float)(n * 1000) / ms);
}
/* XXX need to use varargs */
void
adios(what, fmt, a, b, c, d, e, f)
char *what, *fmt, *a, *b, *c, *d, *e, *f;
{
if (what)
fprintf(stderr, "%s: ", what);
fprintf(stderr, fmt, a, b, c, d, e, f);
exit(1);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.