AUSAM/source/S/gcat.c
/*
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);
}