File:  [CSRG BSD Unix] / 43BSDReno / contrib / mh / zotnet / tws / dtest.c
Revision 1.1: download - view: text, annotated - select for diffs
Tue Apr 24 16:12:56 2018 UTC (8 years, 1 month ago) by root
CVS tags: MAIN, HEAD
Initial revision

/* 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);
}


unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.