e arc.c $ arc(){ } box.c $ r box(x0, y0, x1, y1) { move(x0, y0); cont(x0, y1); cont(x1, y1); cont(x1, y0); cont(x0, y0); move(x1, y1); } circle.c $ circle(){ } close.c $ T #include <stdio.h> closevt(){ closepl(); } closepl(){ fflush(stdout); reset(); } con.h $ # #include <sgtty.h> /* gsi plotting output routines */ # define DOUBLE 010 #define ADDR 0100 #define COM 060 #define PENUP 04 #define MAXX 070 #define MAXY 07 #define SPACES 7 # define DOWN 012 # define UP 013 # define LEFT 010 # define RIGHT 040 # define BEL 007 # define ESC 033 # define ACK 006 # define INPLOT 'P' # define CR 015 # define FF 014 # define VERTRESP 48 # define HORZRESP 60. # define VERTRES 8. # define HORZRES 6. /* down is line feed, up is reverse line feed, left is backspace, right is space. 48 points per inch vertically, 60 horizontally */ extern int xnow, ynow; extern int OUTF; extern struct sgttyb ITTY, PTTY; extern float HEIGHT, WIDTH, OFFSET; extern int xscale, xoffset, yscale; extern float botx, boty, obotx, oboty, scalex,scaley; dot.c $ dot(){ } 8erase.c $ f #include "con.h" erase(){ int i; for(i=0; i<11*(VERTRESP/VERTRES); i++) spew(DOWN); return; } label.c LJ$ | #include "con.h" label(s) char *s; { int i,c; while((c = *s++) != '\0'){ xnow += HORZRES; spew(c); } return; } line.c $ #include "con.h" line(x0,y0,x1,y1){ iline(xconv(xsc(x0)),yconv(ysc(y0)),xconv(xsc(x1)),yconv(ysc(y1))); return; } cont(x0,y0){ iline(xnow,ynow,xconv(xsc(x0)),yconv(ysc(y0))); return; } iline(cx0,cy0,cx1,cy1){ int maxp,tt,j,np; char chx,chy,command; float xd,yd; float dist2(),sqrt(); movep(cx0,cy0); maxp = sqrt(dist2(cx0,cy0,cx1,cy1))/2.; xd = cx1-cx0; yd = cy1-cy0; command = COM|((xd<0)<<1)|(yd<0); if(maxp == 0){ xd=0; yd=0; } else { xd /= maxp; yd /= maxp; } inplot(); spew(command); for (tt=0; tt<=maxp; tt++){ chx= cx0+xd*tt-xnow; xnow += chx; chx = abval(chx); chy = cy0+yd*tt-ynow; ynow += chy; chy = abval(chy); spew(ADDR|chx<<3|chy); } outplot(); return; } 1linmod.c $ linemod(){ } (move.c $ A move(xi,yi){ movep(xconv(xsc(xi)),yconv(ysc(yi))); return; } wopen.c E$ # #include <sgtty.h> /* gsi plotting output routines */ # define DOWN 012 # define UP 013 # define LEFT 010 # define RIGHT 040 # define BEL 007 # define ACK 006 # define CR 015 # define FF 014 # define VERTRESP 48 # define HORZRESP 60. # define HORZRES 6. # define VERTRES 8. /* down is line feed, up is reverse oyne feed, left is bwckspace, right is space. 48 points per inch vertically, 60 horizontally */ int xnow, ynow; int OUTF; struct sgttyb ITTY, PTTY; float HEIGHT = 6.0, WIDTH = 6.0, OFFSET = 0.0; int xscale, xoffset, yscale; float botx = 0., boty = 0., obotx = 0., oboty = 0.; float scalex = 1., scaley = 1.; openpl () { int reset(); xnow = ynow = 0; OUTF = 1; printf("\r"); gtty(OUTF, &ITTY); signal (2, reset); PTTY = ITTY; PTTY.sg_flags &= ~CRMOD; /* don't map lf */ /* initialize constants */ xscale = 4096./(HORZRESP * WIDTH); yscale = 4096 /(VERTRESP * HEIGHT); xoffset = OFFSET * HORZRESP; return; } openvt(){ openpl(); } point.c $ H #include "con.h" point(xi,yi){ move(xi,yi); label("."); return; } space.c ]$ # include "con.h" float deltx = 4095.; float delty = 4095.; space(x0,y0,x1,y1){ botx = -2047.; boty = -2047.; obotx = x0; oboty = y0; scalex = deltx/(x1-x0); scaley = delty/(y1-y0); } subr.c $ #include <stdio.h> #include "con.h" abval(q) { return (q>=0 ? q : -q); } xconv (xp) { /* x position input is -2047 to +2047, output must be 0 to PAGSIZ*HORZRES */ xp += 2048; /* the computation is newx = xp*(PAGSIZ*HORZRES)/4096 */ return (xoffset + xp /xscale); } yconv (yp) { /* see description of xconv */ yp += 2048; return (yp / yscale); } inplot() { stty(OUTF, &PTTY); spew(ESC); spew (INPLOT); } outplot() { spew(ESC); spew(ACK); spew(ESC); spew(ACK); fflush(stdout); stty (OUTF, &ITTY); } spew(ch) { putc(ch, stdout); } tobotleft () { move(-2048,-2048); } reset() { outplot(); exit(); } float dist2 (x1, y1, x2, y2) { float t,v; t = x2-x1; v = y1-y2; return (t*t+v*v); } swap (pa, pb) int *pa, *pb; { int t; t = *pa; *pa = *pb; *pb = t; } #define DOUBLE 010 #define ADDR 0100 #define COM 060 #define MAXX 070 #define MAXY 07 extern xnow,ynow; #define SPACES 7 movep(ix,iy){ int dx,dy,remx,remy,pts,i; int xd,yd; int addr,command; char c; if(xnow == ix && ynow == iy)return; inplot(); dx = ix-xnow; dy = iy-ynow; command = COM|PENUP|((dx<0)<<1)|(dy<0); dx = abval(dx); dy = abval(dy); xd = dx/(SPACES*2); yd = dy/(SPACES*2); pts = xd<yd?xd:yd; if((i=pts)>0){ c=command|DOUBLE; addr=ADDR; if(xd>0)addr|=MAXX; if(yd>0)addr|=MAXY; spew(c); while(i--){ spew(addr); } } if(xd!=yd){ if(xd>pts){ i=xd-pts; addr=ADDR|MAXX; } else{ i=yd-pts; addr=ADDR|MAXY; } c=command|DOUBLE; spew(c); while(i--){ spew(addr); } } remx=dx-xd*SPACES*2; remy=dy-yd*SPACES*2; addr=ADDR; i = 0; if(remx>7){ i=1; addr|=MAXX; remx -= 7; } if(remy>7){ i=1; addr|=MAXY; remy -= 7; } while(i--){ spew(command); spew(addr); } if(remx>0||remy>0){ spew(command); spew(ADDR|remx<<3|remy); } xnow=ix; ynow=iy; outplot(); return; } xsc(xi){ int xa; xa = (xi - obotx) * scalex + botx; return(xa); } ysc(yi){ int ya; ya = (yi - oboty) *scaley +boty; return(ya); } O