AUSAM/source/S/gcat.c

Compare this file to the similar file:
Show the results in this format:


/*
		GCAT		By  Richard Grevis

	SETS A TEKTRONICS TERMINAL UP SO
	THAT IT CAN PLOT GRAPHICS INSTRUCTIONS
	(GENERATED BY A PLOTTING PROGRAM).

	IT BEHAVES EXACTLY LIKE "CAT", AND
	IF A "RUBOUT" IS HIT, THE TERMINAL
	WILL RECOVER STATUS.

*/
#
#define FF1	040000	 /* STTY STUFF */
#define NLDELAY	001400
#define LCASE	    04
#define RAW	040
#define CRLF  020

	 char buffer[512];
	 int  flag1;
	 int  flag2;	/*	FLAG FOR BREAK-POINTS	*/
	 int  flag3;	/*	FLAG TO SKIP PAST EARLY PLOTS OR TEXT	*/
	 int plotteron;
	int x,y;
	int ttyold[3] , ttynew[3];
main(ac,av)
	int ac;
	char **av;
{
	register int  fid;
	register int chars;
	register int previous;
	int  k;
	int rubout();		/* JUMP TO THIS ON INTERUPT */
	double atof(),scale;

	graphic();		/* CHANGE STANDARD OUTPUT TO GRAPHIC MODE */
	signal(2,rubout);
	if(ac == 1) k=0;
	else k=1;	/* try to loop the correct number of times */
	for(;k<ac;k++)
	{
		if(ac>1)
		{
			if(*av[k] == '-')
			{
				flag1++;
				switch(av[k][1])
				{
					case 's':		/* SKIP 'n' BELLS */
						if(flag1>1) flag1--;
						flag2 = atoi(av[k] + 2);
						break;
					case 'p':		/* OUTPUT TO PLOTTER */
						if(flag1>1) flag1--;
						stty(1,ttyold);
						close(1);
						if(open("/dev/plotter",2)<0)
						{
							prints(2,"\n/dev/plotter :  CANNOT OPEN !");
							exit();
						}
						plotteron = 1;
						graphic();
						break;
					case 'b':		/* BREAKS */
						flag1 = 2;
						break;
					case 'c':	/* change char size */
						flag3 = 1;	/* only for hard-copy plotter */
						if(flag1>1) flag1--;
						scale = atof(av[k] + 2);
						x = scale*56.0;
						y = scale*88.0;
						break;
					default :
						if(flag1>1)flag1--;
						break;
				}
				if(k == ac-1)	/* this makes pipes work */
				{
					ac = 1;
					 k=  -1;
				}
				continue;
			}
			close(0);
			if(fid = open(av[k],0))		/* FILE IS NOW STANDARD INPUT */
			{
				if(fid<0)
				{
					prints(2,"\n");
					prints(2,av[k]);
					prints(2," : WELL, I CAN'T FIND IT \n ");
					rubout();
				}
				prints(2,"\n\terror, try again \n");
				rubout();
			}
		}
		chars = 512;
		while(chars == 512)
		{

			chars = 0;
			previous = 0;
			/* the next statement help pipes work */

			while(chars<512)
			{
				chars =+ read(0,buffer+chars,512-chars);
				if(chars == previous)
				{
					chars =- 1;
					break;
				}
				previous = chars;
			}
			if(flag1) depage(chars);
			else write(1,buffer,chars);
		}
	}
	rubout();
}

graphic()
{
	if(gtty(1,ttyold))
	{
		prints(2,"\nSTANDARD OUTPUT NOT A DEVICE\n");
		return;
	}
	ttynew[0] = ttyold[0];
	ttynew[1] = ttyold[1];
	ttynew[2] = ttyold[2];
	ttynew[2] =| FF1;
	ttynew[2] =| CRLF;
	ttynew[2] =& ~(NLDELAY | LCASE |RAW);
	stty(1,ttynew);
	return;
}

rubout()
{
	stty(1,ttyold);
	putchar('\037');		/* TO RETURN TO ALPHA MODE */
	exit();
}

/*
		DEPAGE IS THE A HACKED UP 
		MESS, DUE TO THE FACT THAT
		OPTIONS HAVE BEEN ADDED ON
		WITH GAY ABANDON.
*/


depage(c)
	 int c;

{
	register char *end;
	register char *p;
	register int num;
	int dummy[10];
	char  *starter;
	char *s;

	if(flag3)
	{

	/* CODE TO CHANGE CHARACTER SIZE FOR THE 4662 PLOTTER */

		flag3 = 0;
		printf("\033AI%d,%d\005",x,y);
	}
	starter = buffer;
	end= starter  +c ;

	/* STRIP NEWPAGES AND REPLACE WITH 'BELLS' */

	for(p=starter;p<end;p++)
	{
		if(*p != '\033')continue;
		if(*(p+1) != '\014')continue;
		*p = 0;
		*++p = '\007';
	}
	num = -1;
	if(flag2)		/* I THINK THIS FLAG WILL BE THE  SOURCE */
	{			/* OF BUGS, I JUST HAVE NOT FOUND THEM   */
		for(p=buffer;p<end;p++)
		{
			num++;
			if(*p != '\007')continue;
			if(--flag2)continue;
			starter = p  ;
			c =- num  ;
			break;			/* TO BREAK OUT OF LOOP */
		}
		if(flag2)return;
	}
	if(flag1 == 2)
	{
		s = starter;
		num = 1;
		for(p=starter;p<end;p++)
		{
			if(*p != '\007')
			{
				num++;
				continue;
			}
			write(1,s,num);
			s = p;
			num = 1;
			prints(2,"\nbreak ?");
			if(plotteron)
			{
				write(1,"\033AK",3);
				read(1,dummy,10);
				write(1,"\033AL",3);
			}
			else read(2,dummy,1);
		}
		 write(1,s,num);
	}
	else write(1,starter,c);
}