File:  [Research Unix] / researchv8dc / cmd / view2d / term / view2d.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:59 2018 UTC (8 years, 3 months ago) by root
Branches: belllabs, MAIN
CVS tags: researchv8, HEAD
researchv8 Dan Cross

#include	<stdio.h>
#include	<signal.h>
#include	<sgtty.h>
#include	"/usr/jerq/include/jioctl.h"

#define		MAX		32767

struct sgttyb sttybuf, sttysave;
char *zflag = "";
int shade = 0;
int grid = 1;
typedef struct Point
{
	int x, y;
} Point;
struct Frame
{
	short z[4096];
	short time;
} frames[200];
int zmax = -1000000000, zmin = 1000000000;
int nsleep, ntime;
int nframes = 0;
int period = 5;
int floor = -32767;
char *progname;
short ts, te, timewarp;

main(argc, argv)
	char **argv;
{
	char buf[512];
	int zc, scale, m, i;
	short ragnorok, dim;
	short *nz, *p, *q;
	int fd;
	int cv, tmin, tmax;
	short nx, ny, fru, frv;
	char *s;
	char **av = argv;
	int ac = argc;
	extern char *getenv();
	int magic[4];

	timewarp = 0;
	progname = argv[0];
	cv = ((s = getenv("TERM")) == 0) || strcmp(s, "5620");
	ioctl(0, TIOCGETP, &sttysave);
	strcpy(buf, "level");
	for(argc--, argv++; *argv && (**argv == '-'); argv++)
		switch(argv[0][1])
		{
		case 'z':
			zflag = "-z";
			break;
		case 's':
			shade++;
			break;
		case 'g':
			grid = 0;
			break;
		case 'T':
			if(argv[0][2] == 'c') cv = 1;
			else if(argv[0][2] == '5') cv = 0;
			else if(argv[0][2] == 'p') cv = 2;
			else goto err;
			break;
		case 't':
			i = sscanf(&argv[0][2], "%hd, %hd", &ts, &te);
			if(i==0) error("bad TS,TE");
			timewarp = i;
			break;
		case 'p':
			sscanf(&argv[0][2], "%d", &period);
			break;
		case 'i':
			sscanf(&argv[0][2], "%d", &floor);
			break;
		case 'S':
		case 'b':
		case 'm':
		case 'w':
			/* these options only apply in color, so assume -Tc */
			cv = 1;
			break;
		case 'c':
		case 'v':
			break;
		default:
		err:
			fprintf(stderr, "Usage: view2d [-Tdev] [-ptime] [-cn] [-ms]\n");
			exit(1);
		}
	if((fd = open(*argv, 0)) == -1)
		quit("cannot open input");
	if(cv==1)
	{
		if(access("/usr/bin/level", 1) == -1)
		{
			fprintf(stderr, "go to kwee to use the frame buffer\n");
			exit(1);
		}
		dup2(fd,0);     /* close(0); dup(fd); close(fd); */
		strcpy(*av, "level");
		execvp(*av, av);
		perror("level");
		exit(1);
	} else if(cv==2) {
		if(access("/usr/bin/contour", 1) == -1)
		{
			fprintf(stderr, "can't find /usr/bin/contour\n");
			exit(1);
		}
		dup2(fd,0);     /* close(0); dup(fd); close(fd); */
		strcpy(*av, "contour");
		execvp(*av, av);
		perror("contour");
		exit(1);
	}
	sprintf(buf, "/usr/jerq/bin/32ld %s vwd.m", zflag);
	if(system(buf)) exit(1);
	sttybuf = sttysave;
	sttybuf.sg_flags |= RAW;
	sttybuf.sg_flags &= ~ECHO;
	ioctl(0, TIOCSETP, &sttybuf);
	nz = frames[0].z;
	rd2dh(fd, &nx, &ny);
	putchar('X'); sendn(nx);
	putchar('Y'); sendn(ny);
	if(grid) putchar('G');
	if(shade) putchar('S');
	putchar('P');
	sendn(period);
	m = 2*nx*ny;
	tmin = MAX;
	tmax = -MAX;
	while( rd2di( &frames[nframes].time, frames[nframes].z) )
	{
		if(frames[nframes].time < tmin) tmin = frames[nframes].time;
		if(frames[nframes].time > tmax) tmax = frames[nframes].time;
		for(nz = frames[nframes].z, i = nx*ny; i; i--)
		{
			if(*nz < zmin) zmin = *nz;
			if(*nz > zmax) zmax = *nz;
			nz++;
		}
		nframes++;
	}
	putchar('n');
	sendn(nframes);
	zc = (zmax+zmin)/2;
	scale = (zmax-zmin)/2+1;
#define	SCALE(x,m)	((int)((((long)x)*(m))/scale))
	putchar('I');
	sendn(floor,MAX);
	for(m = 0; m < nframes; m++)
	{
		putchar('F');
		sprintf(buf, "%d", frames[m].time);
		sends(buf);
		for(q = nx*ny + (p = frames[m].z); q != p; p++)
			sendn(SCALE(*p - zc, MAX-2));
	}

	putchar('Q');
	fflush(stdout);
	(void)getchar();
	quit(0);
}

quit(s)
	char *s;
{
	ioctl(0, JTERM, 0);
	ioctl(0, TIOCSETP, &sttysave);
	if(s)
		printf("view2d: %s\n", s);
	exit(0);
}

sendn(n)
{
	putchar(n>>8);
	putchar(n);
}

sends(s)
	char *s;
{
	for(;;)
	{
		putchar(*s);
		if(*s++ == 0) break;
	}
}

abs(n)
{
	return(n<0? -n:n);
}

sendframe(t, dim)
{
	struct Frame *f1, *f2;
	int t1, t2, m, tt;
	register short *a, *b, i;

	t1 = t2 = 32767;
	for(i = 0; i < nframes; i++)
	{
		tt = abs(frames[i].time - t);
		if(tt < t1)
		{
			f2 = f1; t2 = t1;
			f1 = &frames[i]; t1 = tt;
		}
		else if(tt < t2)
		{
			f2 = &frames[i]; t2 = tt;
		}
	}
	putchar('F');
	sendn(t);
	for(m = dim, a = f1->z, b = f2->z; m--; a++, b++)
		sendn(*a + t1*(*b-*a)/(t1+t2));
}

unix.superglobalmegacorp.com

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