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