eÿarc.c N ¢T)¶ arc(){ } circle.c N ¢T)¶ circle(){ } close.c N ¢T)¶ closevt(){ closepl(); } closepl(){ extern struct { int fildes,nunused; char *nxtfree,buff[512]; } fout; fflush(&fout); } dot.c N ¢T)¶ dot(){ } {erase.c N ¢T)¶ [ #include "con.h" erase(){ int i; for(i=0; i<11*VERTRES; i++) spew(DOWN); return; } dlabel.c N ¢T)¶ v #include "con.h" label(s) char *s; { int i,c; while((c = *s++) != '\0'){ xnow =+ 6; spew(c); } return; } line.c W ž–)¶ #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; float xd,yd; float dist2(),sqrt(); movep(cx0,cy0); maxp = sqrt(dist2(cx0,cy0,cx1,cy1))/2.; xd = cx1-cx0; yd = cy1-cy0; if(xd >= 0)chx = RIGHT; else chx = LEFT; if(yd >= 0)chy = UP; else chy = DOWN; if(maxp == 0){ xd=0; yd=0; } else{ xd =/maxp; yd =/maxp; } inplot(); for (tt=0; tt<=maxp; tt++){ j= cx0+xd*tt-xnow; xnow =+ j; j = abval(j); while(j-- > 0)spew(chx); j = cy0+yd*tt-ynow; ynow =+ j; j = abval(j); while(j-- > 0)spew(chy); spew ('.'); } outplot(); return; } linmod.c N ¢T)¶ linemod(){ } ;move.c W 2—)¶ A move(xi,yi){ movep(xconv(xsc(xi)),yconv(ysc(yi))); return; } open.c N U)¶ &# /* gsi plotting output routines */ # define DOWN 012 # define UP 013 # define LEFT 010 # define RIGHT 040 # define BEL 007 # define ACK 006 #define PLOTIN 063 #define PLOTOUT 064 # 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 ITTY[3], PTTY[3], OUTF; 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 () { extern fout; int reset(); xnow = ynow = 0; OUTF = 1; printf("\r"); gtty(OUTF, ITTY); signal (2, &reset); PTTY[0] = ITTY[0]; PTTY[1] = ITTY[1]; PTTY[2] = ITTY[2] & (~ 020); /* don't map lf */ PTTY[2] =| 001; /* no delays */ /* initialize constants */ fout = 1; xscale = 4096./(HORZRESP * WIDTH); yscale = 4096 /(VERTRESP * HEIGHT); xoffset = OFFSET * HORZRESP; return; } openvt(){ openpl(); } point.c N £T)¶ 7 point(xi,yi){ move(xi,yi); label("."); return; } tspace.c N —U)¶ ” # include "con.h" space(x0,y0,x1,y1){ botx = -2047.; boty = -2047.; obotx = x0; oboty = y0; scalex = 4096./(x1-x0); scaley = 4096./(y1-y0); } subr.c W |—)¶ o#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(PLOTIN); } outplot() { extern struct { int fildes, nunused; char *nxtfree, buff[512]; } fout; spew(ESC); spew(PLOTOUT); fflush(&fout); stty (OUTF, ITTY); } spew(ch) { extern struct { int fildes, nunused; char *nxtfree, buff[512]; } fout; if(ch == UP){ putc(ESC,&fout); ch = DOWN; } putc(ch, &fout); } 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; } movep (xg,yg) { int i,ch; if((xg == xnow) && (yg == ynow))return; /* if we need to go to left margin, just CR */ if (xg < xnow/2) { spew(CR); xnow = 0; } i = (xg-xnow)/HORZRES; if(xnow < xg)ch = RIGHT; else ch = LEFT; xnow =+ i*HORZRES; i = abval(i); while(i--)spew(ch); i = abval(xg-xnow); inplot(); while(i--) spew(ch); outplot(); i=(yg-ynow)/VERTRES; if(ynow < yg)ch = UP; else ch = DOWN; ynow =+ i*VERTRES; i = abval(i); while(i--)spew(ch); i=abval(yg-ynow); inplot(); while(i--)spew(ch); outplot(); xnow = xg; ynow = yg; } xsc(xi){ int xa; xa = (xi - obotx) * scalex + botx; return(xa); } ysc(yi){ int ya; ya = (yi - oboty) *scaley +boty; return(ya); } Econ.h V )¶ ~# /* gsi plotting output routines */ # define DOWN 012 # define UP 013 # define LEFT 010 # define RIGHT 040 # define BEL 007 # define ESC 033 # define ACK 006 #define PLOTIN 063 #define PLOTOUT 064 # 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 ITTY[3], PTTY[3], OUTF; extern float HEIGHT, WIDTH, OFFSET; extern int xscale, xoffset, yscale; extern float botx, boty, obotx, oboty, scalex,scaley;