[comp.sources.amiga] v89i092: plplot - scientific plotting library, Part07/07

page%rishathra@Sun.COM (Bob Page) (04/25/89)

Submitted-by: amr@dukee.egr.duke.edu (Tony Richardson)
Posting-number: Volume 89, Issue 92
Archive-name: applications/plplot.7

# This is a shell archive.
# Remove anything above and including the cut line.
# Then run the rest of the file through 'sh'.
# Unpacked files will be owned by you and have default permissions.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: SHell ARchive
# Run the following text through 'sh' to create:
#	plot3d.c
#	plplot.h
#	plpoi1.c
#	plpoin.c
#	plptex.c
#	plr135.c
#	plr45.c
#	plschr.c
#	plside3.c
#	plsmaj.c
#	plsmin.c
#	plssym.c
#	plstar.c
#	plstik.c
#	plstr.c
#	plstrl.c
#	plstyl.c
#	plsvpa.c
#	plsym.c
#	plsym1.c
#	plt3zz.c
#	pltext.c
#	plvpor.c
#	plvsta.c
#	plw3d.c
#	plwind.c
#	plxtik.c
#	plxybx.c
#	plxytx.c
#	plytik.c
#	plzbx.c
#	plztx.c
#	round.c
#	scratch
#	setphy.c
#	setpxl.c
#	setsub.c
#	stindex.c
#	strpos.c
#	tektronix.c
#	xform.c
# This is archive 7 of a 7-part kit.
# This archive created: Thu Apr 20 13:47:08 1989
echo "extracting plot3d.c"
sed 's/^X//' << \SHAR_EOF > plot3d.c
X/* Plots a 3-d representation of the function z[x][y]. The x values */
X/* are stored as x[0..nx-1], the y values as y[0..ny-1], and the */
X/* z values are in the 2-d array z[][0..ly-1]. The integer "opt" */
X/* specifies: */
X/*  opt = 1:  Draw lines parallel to x-axis */
X/*  opt = 2:  Draw lines parallel to y-axis */
X/*  opt = 3:  Draw lines parallel to both axes */
X
X/* "work" is an integer work array of size at least 4*max(nx,ny) */
X
X#include "plplot.h"
X#include <math.h>
X
Xvoid plot3d(x,y,z,work,ly,nx,ny,opt)
Xint ly, nx, ny, opt;
Xfloat x[],y[],*z;
Xint work[];
X{
X      int b;
X      float cxx, cxy, cyx, cyy, cyz;
X
X      int init;
X      int i, ix, iy;
X
X      int level;
X      glev(&level);
X      if (level < 3) fatal("Please set up window before calling PLOT3D");
X 
X      if (opt<1 || opt>3) fatal("Bad option in PLOT3D");
X      if (nx<=0 || ny<=0 || ly<ny) fatal("Bad array dimensions in PLOT3D.");
X
X/* Check that points in x and in y are strictly increasing */
X
X      for (i=0; i<nx-1; i++)
X        if (x[i]>=x[i+1]) fatal("X(*) must be strictly increasing in PLOT3D");
X
X      for (i=0; i<ny-1; i++)
X        if (y[i]>=y[i+1]) fatal("Y(*) must be strictly increasing in PLOT3D");
X
X      b = 2*max(nx,ny)+1;
X      gw3wc(&cxx,&cxy,&cyx,&cyy,&cyz);
X      init = 1;
X      
X      if (cxx >= 0.0 && cxy <= 0.0) {
X        if (opt != 2) {
X          for (iy=2; iy<=ny; iy++)  {
X            plt3zz(1,iy,1,-1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X            init = 0;
X          }
X        }
X        else  {
X          plt3zz(1,ny,1,-1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X          init = 0;
X        }
X        if (opt != 1) 
X          for (ix=1; ix<=nx-1; ix++)
X            plt3zz(ix,ny,1,-1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X        else
X          plt3zz(1,ny,1,-1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X      }
X      else if (cxx <= 0.0 && cxy <= 0.0) {
X        if (opt != 1) {
X          for (ix=2; ix<=nx; ix++) {
X            plt3zz(ix,ny,-1,-1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X            init = 0;
X          }
X        }
X        else  {
X          plt3zz(nx,ny,-1,-1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X          init = 0;
X        }
X        if (opt != 2) 
X          for (iy=ny; iy>=2; iy--)
X            plt3zz(nx,iy,-1,-1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X        else
X          plt3zz(nx,ny,-1,-1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X      }
X      else if (cxx <= 0.0 && cxy >= 0.0) {
X        if (opt != 2) {
X          for (iy=ny-1; iy>=1; iy--) {
X            plt3zz(nx,iy,-1,1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X            init = 0;
X          }
X        }
X        else {
X          plt3zz(nx,1,-1,1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X          init = 0;
X        }
X        if (opt != 1)
X          for (ix=nx; ix>=2; ix--)
X            plt3zz(ix,1,-1,1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X        else
X          plt3zz(nx,1,-1,1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X      }
X      else if (cxx >= 0.0 && cxy >= 0.0) {
X        if (opt != 1) {
X          for (ix=nx-1; ix>=1; ix--) {
X            plt3zz(ix,1,1,1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X            init = 0;
X          }
X        }
X        else  {
X          plt3zz(1,1,1,1,opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X          init = 0;
X        }
X        if (opt != 2)
X          for (iy=1; iy<=ny-1; iy++)
X            plt3zz(1,iy,1,1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X        else
X          plt3zz(1,1,1,1,-opt,init,x,y,z,ly,nx,ny,&work[0],&work[b-1]);
X      }      
X}
SHAR_EOF
echo "extracting plplot.h"
sed 's/^X//' << \SHAR_EOF > plplot.h
X/* This file contains all of the type declarations for the functions *
X * in the plplot library.  This file should be included in all user  *
X * routines that make use of that library.                           */
X
X/* All of the void type declarations are made first. */
Xvoid pladv();
Xvoid plbeg();
Xvoid plbin();
Xvoid plbox();
Xvoid plccal();
Xvoid plclr();
Xvoid plcntr();
Xvoid plcol();
Xvoid plcont();
Xvoid pldeco();
Xvoid pldtik();
Xvoid plend();
Xvoid plenv();
Xvoid plerrx();
Xvoid plerry();
Xvoid plerx1();
Xvoid plery1();
Xvoid plfont();
Xvoid plform();
Xvoid plgra();
Xvoid plgspa();
Xvoid plhist();
Xvoid plhrsh();
Xvoid pljoin();
Xvoid pllab();
Xvoid pllclp();
Xvoid plline();
Xvoid plmtex();
Xvoid plnxtv();
Xvoid plpoi1();
Xvoid plpoin();
Xvoid plptex();
Xvoid plr135();
Xvoid plr45();
Xvoid plschr();
Xvoid plsmaj();
Xvoid plsmin();
Xvoid plssym();
Xvoid plstar();
Xvoid plstik();
Xvoid plstr();
Xvoid plstyl();
Xvoid plsvpa();
Xvoid plsym();
Xvoid plsym1();
Xvoid pltext();
Xvoid plupd();
Xvoid plvpor();
Xvoid plvsta();
Xvoid plwind();
Xvoid plxtik();
Xvoid plxybx();
Xvoid plxytx();
Xvoid plytik();
Xvoid plzbx();
Xvoid plztx();
X
X/* 3-D routine types*/
Xvoid pl3cut();
Xvoid plbox3();
Xvoid plgrid3();
Xvoid plot3d();
Xvoid plside3();
Xvoid plt3zz();
Xvoid plw3d();
X
X/* The novice plplot user will not need to call the following functions */
Xvoid fatal();
Xvoid genlin();
Xvoid movphy();
Xvoid draphy();
Xvoid movwor();
Xvoid drawor();
Xvoid setphy();
Xvoid setpxl();
Xvoid setsub();
Xvoid xform();
Xvoid glev();
Xvoid slev();
Xvoid gbase();
Xvoid sbase();
Xvoid gnms();
Xvoid snms();
Xvoid gdev();
Xvoid sdev();
Xvoid gcurr();
Xvoid scurr();
Xvoid gdom();
Xvoid sdom();
Xvoid grange();
Xvoid srange();
Xvoid gw3wc();
Xvoid sw3wc();
Xvoid gvpp();
Xvoid svpp();
Xvoid gspp();
Xvoid sspp();
Xvoid gclp();
Xvoid sclp();
Xvoid gphy();
Xvoid sphy();
Xvoid gsub();
Xvoid ssub();
Xvoid gumpix();
Xvoid sumpix();
Xvoid gatt();
Xvoid satt();
Xvoid gspd();
Xvoid sspd();
Xvoid gvpd();
Xvoid svpd();
Xvoid gvpw();
Xvoid svpw();
Xvoid gpixmm();
Xvoid spixmm();
Xvoid gwp();
Xvoid swm();
Xvoid gwm();
Xvoid swp();
Xvoid gdp();
Xvoid sdp();
Xvoid gmp();
Xvoid smp();
Xvoid gchr();
Xvoid schr();
Xvoid gsym();
Xvoid ssym();
Xvoid gmaj();
Xvoid smaj();
Xvoid gmin();
Xvoid smin();
X
X/* Functions that return floats */
Xfloat plstrl();
Xfloat dcmmx();
Xfloat dcmmy();
Xfloat dcscx();
Xfloat dcscy();
Xfloat mmdcx();
Xfloat mmdcy();
Xfloat scdcx();
Xfloat scdcy();
Xfloat wcmmx();
Xfloat wcmmy();
Xfloat w3wcx();
Xfloat w3wcy();
X
X/* Functions returning ints */
Xint plabv();
Xint plcvec();
Xint dcpcx();
Xint dcpcy();
Xint mmpcx();
Xint mmpcy();
Xint round();
Xint stindex();
Xint strpos();
Xint wcpcx();
Xint wcpcy();
X
X/* Device independent routines */
Xvoid grbeg();
Xvoid grclr();
Xvoid grcol();
Xvoid grinit();
Xvoid grgra();
Xvoid grline();
Xvoid grtext();
Xvoid grtidy();
X
X/* Declarations for any new device drivers should be added to the list *
X * below.  These routines are called only in the file plstar.c (except *
X * for beepw() which is also called by ???) */
Xvoid amiini();
Xvoid amitex();
Xvoid amigra();
Xvoid amicol();
Xvoid amiclr();
Xvoid amilin();
Xvoid amitid();
Xvoid beepw();
X
Xvoid tekini();
Xvoid tektex();
Xvoid tekgra();
Xvoid tekclr();
Xvoid tekcol();
Xvoid teklin();
Xvoid tektid();
X
Xvoid impini();
Xvoid imptex();
Xvoid impgra();
Xvoid impclr();
Xvoid impcol();
Xvoid implin();
Xvoid imptid();
X
Xvoid jetini();
Xvoid jettex();
Xvoid jetgra();
Xvoid jetclr();
Xvoid jetcol();
Xvoid jetlin();
Xvoid jettid();
SHAR_EOF
echo "extracting plpoi1.c"
sed 's/^X//' << \SHAR_EOF > plpoi1.c
X#include "plplot.h"
X
Xextern short int *hersh[];
X
Xvoid plpoi1(x,y,code)
Xfloat x,y;
Xint code;
X{
X      int sym, font, col;
X
X/* Initialize parameters. */
X
X      gatt(&font,&col);
X      sym = *(hersh[font-1]+code);
X      plhrsh(sym,wcpcx(x),wcpcy(y));
X}
SHAR_EOF
echo "extracting plpoin.c"
sed 's/^X//' << \SHAR_EOF > plpoin.c
X/* Plots single precision array y against x for n points using */
X/* ASCII code "code" */
X
X#include "plplot.h"
X
Xvoid plpoin(n,x,y,code)
Xint n, code;
Xfloat x[],y[];
X{
X      int i;
X
X      int level;
X      glev(&level);
X      if (level < 3) fatal("Please set up window before calling PLPOIN.");
X      if (code < 0 || code > 127) fatal("Invalid code in PLPOIN.");
X
X      for(i=0; i<n; i++)
X        plpoi1(x[i],y[i],code);
X}
SHAR_EOF
echo "extracting plptex.c"
sed 's/^X//' << \SHAR_EOF > plptex.c
X/* Prints out "text" at world cooordinate (x,y). The text may be       */
X/* at any angle "angle" relative to the horizontal. The parameter      */
X/* "just" adjusts the horizontal justification of the string:          */
X/*   just = 0.0 => left hand edge of string is at (x,y)                */
X/*   just = 1.0 => right hand edge of string is at (x,y)               */
X/*   just = 0.5 => centre of string is at (x,y) etc.                   */
X/* N.B. Centreline of the string passes through (x,y)                  */
X
X#include "plplot.h"
X#include <math.h>
X
Xvoid plptex(x,y,dx,dy,just,text)
Xfloat x,y,dx,dy,just;
Xchar *text;
X{      
X      int refx, refy;
X      float shift, cc, ss;
X      float xform[4],diag;
X      float xscl, xoff, yscl, yoff;
X   
X      int level;
X      glev(&level);
X      if (level < 3) fatal("Please set up window before calling PLPTEX.");
X
X      gwm(&xscl,&xoff,&yscl,&yoff);
X      cc = xscl * dx;
X      ss = yscl * dy;
X      diag = sqrt(cc*cc + ss*ss);
X      cc = cc/diag;
X      ss = ss/diag;
X      
X      gmp(&xscl,&xoff,&yscl,&yoff);
X      shift = 0.0;
X      
X      xform[0] = cc;
X      xform[1] = -ss;
X      xform[2] = ss;
X      xform[3] = cc;
X
X      if (just != 0.0) shift = plstrl(text) * just;
X      refx = wcpcx(x) - shift * cc * xscl;
X      refy = wcpcy(y) - shift * ss * yscl;
X      plstr(0,xform,refx,refy,text);
X}
SHAR_EOF
echo "extracting plr135.c"
sed 's/^X//' << \SHAR_EOF > plr135.c
X#include "plplot.h"
X
Xvoid plr135(ix,iy,isens)
Xint *ix, *iy, isens;
X{
X      *ix = -*ix;
X      *iy = -*iy;
X      plr45(ix,iy,isens);
X}
SHAR_EOF
echo "extracting plr45.c"
sed 's/^X//' << \SHAR_EOF > plr45.c
X#include "plplot.h"
X#include <math.h>
X
Xvoid plr45(ix,iy,isens)
Xint *ix, *iy, isens;
X{
X      int ixx, iyy;
X
X      ixx = *ix-isens*(*iy);
X      iyy = *ix * isens + *iy;
X      *ix = ixx/max(1,abs(ixx));
X      *iy = iyy/max(1,abs(iyy));
X}
SHAR_EOF
echo "extracting plschr.c"
sed 's/^X//' << \SHAR_EOF > plschr.c
X#include "plplot.h"
X
Xvoid plschr(def,scale)
Xfloat def,scale;
X{
X    float defalt, ht;
X
X    if (def != 0.0) 
X       schr(def,scale*def);
X    else {
X       gchr(&defalt,&ht);
X       schr(defalt,scale*defalt);
X    }
X}
SHAR_EOF
echo "extracting plside3.c"
sed 's/^X//' << \SHAR_EOF > plside3.c
X/* This routine draws sides around the front of the 3d plot so that */
X/* it does not appear to float */
X
X#include "plplot.h"
X
Xvoid plside3(x,y,z,nx,ny,ly,opt)
Xint nx, ny, ly, opt;
Xfloat *x, *y, *z;
X{
X    int i;
X    float cxx, cxy, cyx, cyy, cyz;
X    float xmin, ymin, zmin, xmax, ymax, zmax, zscale;
X    float tx, ty, ux, uy;
X
X    gw3wc(&cxx,&cxy,&cyx,&cyy,&cyz);
X    gdom(&xmin,&xmax,&ymin,&ymax);
X    grange(&zscale,&zmin,&zmax);
X
X    if (cxx >= 0.0 && cxy <= 0.0)  {
X        /* Get x, y coordinates of legs and plot */
X        if (opt != 1) {
X            for (i=0; i<nx; i++)  {
X                tx = w3wcx(*(x+i),*y,zmin);
X                ty = w3wcy(*(x+i),*y,zmin);
X                ux = w3wcx(*(x+i),*y,*(z+i*ly));
X                uy = w3wcy(*(x+i),*y,*(z+i*ly));
X                pljoin(tx,ty,ux,uy);
X            }
X        }
X
X        if (opt != 2) {
X            for (i=0; i<ny; i++)  {
X                tx = w3wcx(*x,*(y+i),zmin);
X                ty = w3wcy(*x,*(y+i),zmin);
X                ux = w3wcx(*x,*(y+i),*(z+i));
X                uy = w3wcy(*x,*(y+i),*(z+i));
X                pljoin(tx,ty,ux,uy);
X            }
X        }
X    }
X    else if(cxx <= 0.0  && cxy <= 0.0)  {
X        if (opt != 1 )  {
X            for (i=0; i<nx; i++)  {
X                tx = w3wcx(*(x+i),*(y+ny-1),zmin);
X                ty = w3wcy(*(x+i),*(y+ny-1),zmin);
X                ux = w3wcx(*(x+i),*(y+ny-1),*(z+i*ly+ny-1));
X                uy = w3wcy(*(x+i),*(y+ny-1),*(z+i*ly+ny-1));
X                pljoin(tx,ty,ux,uy);
X            }
X        }
X
X        if (opt != 2)  {
X            for (i=0; i<ny; i++)  {
X                tx = w3wcx(*x,*(y+i),zmin);
X                ty = w3wcy(*x,*(y+i),zmin);
X                ux = w3wcx(*x,*(y+i),*(z+i));
X                uy = w3wcy(*x,*(y+i),*(z+i));
X                pljoin(tx,ty,ux,uy);
X            }
X        }
X    }
X    else if(cxx <= 0.0  && cxy >= 0.0)  {
X        if (opt != 1)  {
X            for (i=0; i<nx; i++)  {
X                tx = w3wcx(*(x+i),*(y+ny-1),zmin);
X                ty = w3wcy(*(x+i),*(y+ny-1),zmin);
X                ux = w3wcx(*(x+i),*(y+ny-1),*(z+i*ly+ny-1));
X                uy = w3wcy(*(x+i),*(y+ny-1),*(z+i*ly+ny-1));
X                pljoin(tx,ty,ux,uy);
X            }
X        }
X
X        if (opt != 2)  {
X            for (i=0; i<ny; i++)  {
X                tx = w3wcx(*(x+nx-1),*(y+i),zmin);
X                ty = w3wcy(*(x+nx-1),*(y+i),zmin);
X                ux = w3wcx(*(x+nx-1),*(y+i),*(z+(nx-1)*ly+i));
X                uy = w3wcy(*(x+nx-1),*(y+i),*(z+(nx-1)*ly+i));
X                pljoin(tx,ty,ux,uy);
X            }
X        }
X    }
X    else if(cxx >= 0.0  && cxy >= 0.0)  {
X        if (opt != 1)  {
X            for (i=0; i<nx; i++)  {
X                tx = w3wcx(*(x+i),*y,zmin);
X                ty = w3wcy(*(x+i),*y,zmin);
X                ux = w3wcx(*(x+i),*y,*(z+i*ly));
X                uy = w3wcy(*(x+i),*y,*(z+i*ly));
X                pljoin(tx,ty,ux,uy);
X            }
X        }
X
X        if (opt != 2)  {
X            for (i=0; i<ny; i++)  {
X                tx = w3wcx(*(x+nx-1),*(y+i),zmin);
X                ty = w3wcy(*(x+nx-1),*(y+i),zmin);
X                ux = w3wcx(*(x+nx-1),*(y+i),*(z+(nx-1)*ly+i));
X                uy = w3wcy(*(x+nx-1),*(y+i),*(z+(nx-1)*ly+i));
X                pljoin(tx,ty,ux,uy);
X            }
X        }
X    }
X}
SHAR_EOF
echo "extracting plsmaj.c"
sed 's/^X//' << \SHAR_EOF > plsmaj.c
X#include "plplot.h"
X
Xvoid plsmaj(def,scale)
Xfloat def,scale;
X{
X    float defalt, ht;
X
X    if (def != 0.0)
X       smaj(def,scale*def);
X    else {
X       gmaj(&defalt,&ht);
X       smaj(defalt,scale*defalt);
X    }
X}
SHAR_EOF
echo "extracting plsmin.c"
sed 's/^X//' << \SHAR_EOF > plsmin.c
X#include "plplot.h"
X
Xvoid plsmin(def,scale)
Xfloat def, scale;
X{
X    float defalt, ht;
X    if (def !=  0.0) 
X       smin(def,scale*def);
X    else {
X       gmin(&defalt,&ht);
X       smin(defalt,scale*defalt);
X    }
X}
SHAR_EOF
echo "extracting plssym.c"
sed 's/^X//' << \SHAR_EOF > plssym.c
X#include "plplot.h"
X
Xvoid plssym(def,scale)
Xfloat def,scale;
X{
X    float defalt,ht;
X
X    if (def != 0.0) 
X       ssym(def,scale*def);
X    else {
X       gsym(&defalt,&ht);
X       ssym(defalt,scale*defalt);
X    }
X}
SHAR_EOF
echo "extracting plstar.c"
sed 's/^X//' << \SHAR_EOF > plstar.c
X#include "plplot.h"
X#include "declare.h"
X#include <stdio.h>
X
X/* Asks for number of plotting device, and call plbeg to divide the */
X/* page into nx by ny subpages */
X
Xstatic int mk=0, sp=0;
X
Xvoid plstar(nx,ny)
Xint nx, ny;
X{
X   int dev,lev;
X
X   glev(&lev);
X   if (lev != 0) plend();
X      
X   printf("\nPlotting Options:");
X   printf("\n < 1> Amiga");
X   printf("\n < 2> LaserJet II file    (landscape)");
X   printf("\n < 3> LaserJet II file    (portrait)");
X   printf("\n < 4> imPRESS     file    (landscape)");
X   printf("\n < 5> imPRESS     file    (portrait)");
X   printf("\n < 6> Tektronix   file    (landscape)");
X   printf("\n < 7> Tektronix   file    (portrait)");
X   printf("\n");
X   printf("\nEnter device number: ");
X   scanf("%d",&dev);
X   while(getchar() != '\n') /* Read all of line including new line char */
X       ;
X   plbeg(dev,nx,ny);
X}
X
X/* Initializes the graphics device "dev"  */
Xvoid grbeg(dev)
Xint dev;
X{
X   int termin, phyxmi, phyxma, phyymi, phyyma;
X   void grinit(), grclr(), grcol(), grgra();
X
X   /* Set up device specific stuff */
X
X   /* Use setpxl to set the device dots per mm in the x and y directions */
X   /* dpmmx = dots/mm in x direction (float) */
X   /* dpmmy = dots/mm in y direction (float) */
X   /* setpxl(dpmmx,dpmmy); */
X
X   /* PLPLOT assumes that the plot origin is in the lower left corner */
X   /* with y increasing upward and x increasing to the right */
X   /* Use setphy to specify how PLPLOT should translate plotting coords */
X   /* to device coords */
X   /* xmindev = minimum x device coordinate (int) */
X   /* xmaxdev = maximum x device coordinate (int) */
X   /* ymindev = minimum y device coordinate (int) */
X   /* ymaxdev = maximum y device coordinate (int) */
X   /* setphy(xmindev,xmaxdev,ymindev,ymaxdev); */
X
X   if (dev == 1) {
X     setpxl(2.52,2.25);
X     setphy(0,639,0,399);
X     termin = 1;
X   }
X   else if (dev == 2) {
X       setpxl(5.905,5.905);  /* 150 dpi mode */
X       termin = 0;
X       setphy(0,1409,0,1103);
X   }
X   else if (dev == 3) {
X       setpxl(5.905,5.905);  /* 150 dpi mode */
X       termin = 0;
X       setphy(0,1103,1409,0);
X   }
X   else if (dev == 4) {
X       setpxl(11.81,11.81);  /* 300 dpi */
X       termin = 0;
X       setphy(0,2999,0,2249);
X   }
X   else if (dev == 5) {
X       setpxl(11.81,11.81);  /* 300 dpi */
X       termin = 0;
X       setphy(2249,0,0,2999);
X   }
X   else if (dev == 6 )  {
X       setpxl(4.771,4.653);
X       termin = 0;
X       setphy(0,1023,0,779);
X   }
X   else if (dev == 7)  {
X       setpxl(4.653,4.771);
X       termin = 0;
X       setphy(779,0,0,1023);
X   }
X   else {
X     printf("\nUnknown output device\n");
X     exit(1);
X   }
X
X   sdev(dev,termin,0);
X   grinit();
X
X   /* Set default sizes, fonts, and colors */
X   plschr(4.0,1.0);
X   plssym(4.0,1.0);
X   plsmaj(3.0,1.0);
X   plsmin(1.5,1.0);
X   satt(1,1);
X
X   /* Switch to graphics mode and clear screen */
X   grgra();
X   grclr();
X   grcol();
X   plstyl(0,&mk,&sp);
X      
X   gphy(&phyxmi,&phyxma,&phyymi,&phyyma);
X   sclp(phyxmi,phyxma,phyymi,phyyma);
X}
X
X/* Clears the graphics screen */
Xvoid grclr()
X{
X      if (device == 1)
X        amiclr();
X      else if (device == 2 || device == 3)
X        jetclr();
X      else if (device == 4 || device == 5)
X        impclr();
X      else if (device == 6 || device == 7)
X        tekclr();
X}
X
X/* Sets up the line colour to value in global variable "colour" */
Xvoid grcol()
X{
X      if (device == 1)
X        amicol(colour);
X}
X
X/* Initializes the graphics device */
Xvoid grinit()
X{
X      if (device == 1)
X        amiini();
X      else if (device == 2 || device == 3)
X        jetini();
X      else if (device == 4 || device == 5)
X        impini();
X      else if (device == 6 || device == 7)
X        tekini();
X}
X
X/* Switches to graphics mode */
Xvoid grgra()
X{
X      if (device == 1)
X        amigra();
X      else if (device == 2 || device == 3)
X        jetgra();
X      else if (device == 4 || device == 5)
X        impgra();
X      else if (device == 6 || device == 7)
X        tekgra();
X
X      graphx = 1;
X}
X
X/* Draws a line from (x1,x2) to (x2,y2), used by genlin() */
X/* Notice how x and y are swapped to switch from the default */
X/* orientation */
Xvoid grline(x1,y1,x2,y2)
Xint x1,y1,x2,y2;
X{
X      if (device == 1)
X        amilin(x1,y1,x2,y2);
X      else if (device == 2)
X        jetlin(y1,x1,y2,x2);
X      else if (device == 3)
X        jetlin(x1,y1,x2,y2);
X      else if (device == 4)
X        implin(x1,y1,x2,y2);
X      else if (device == 5)
X        implin(y1,x1,y2,x2);
X      else if (device == 6)
X        teklin(x1,y1,x2,y2);
X      else if (device == 7)
X        teklin(y1,x1,y2,x2);
X}
X
X/* Switches to text mode */
Xvoid grtext()
X{
X      if (device == 1)
X        amitex();
X      else if (device == 2 || device == 3)
X        jettex();
X      else if (device == 4 || device == 5)
X        imptex();
X      else if (device == 6 || device == 7)
X        tektex();
X
X      graphx = 0;
X}
X
X/* Called by plend to tidy up graphics device */
Xvoid grtidy()
X{
X      if (device == 1)
X        amitid();
X      else if (device == 2 || device == 3)
X        jettid();
X      else if (device == 4 || device == 5)
X        imptid();
X      else if (device == 6 || device == 7)
X        tektid();
X}
SHAR_EOF
echo "extracting plstik.c"
sed 's/^X//' << \SHAR_EOF > plstik.c
X/* Draws a slanting tick at position (mx,my) (measured in mm) of */
X/* vector length (dx,dy) */
X
X#include "plplot.h"
X
Xvoid plstik(mx,my,dx,dy)
Xfloat mx, my, dx, dy;
X{
X      draphy(mmpcx(mx),mmpcy(my));
X      draphy(mmpcx(mx+dx),mmpcy(my+dy));
X      draphy(mmpcx(mx),mmpcy(my));
X}
SHAR_EOF
echo "extracting plstr.c"
sed 's/^X//' << \SHAR_EOF > plstr.c
X/* Prints out a "string" at reference position with physical         */
X/* coordinates (refx,refy). The coordinates of the vectors defining  */
X/* the string are passed through the linear mapping defined by the   */
X/* 2 x 2 matrix xform() before being plotted.                        */
X/* The reference position is at the left-hand edge of the string. If */
X/* base = 1, it is aligned with the baseline of the string. If       */
X/* base = 0, it is aligned with the centre of the character box.     */
X
X/* Note, all calculations are done in terms of millimetres. These */
X/* are scaled as necessary before plotting the string on the page */
X
X#include "plplot.h"
X#include <math.h>
X
Xvoid plstr(base,xform,refx,refy,string)
Xint base, refx, refy;
Xchar *string;
Xfloat xform[4];
X{
X      int symbol[256];
X      short int xygrid[300];
X      int ch, cx, cy, i, k, length, level, penup;
X      int xbase, ybase, ydisp, lx, ly, style;
X      int oline, uline;
X      float width, xorg, yorg, x, y, def, ht, dscale, scale;
X      float xscl, xoff, yscl, yoff;
X   
X      width = 0.0;
X      oline = 0;
X      uline = 0;
X
X      gchr(&def,&ht);
X      dscale = 0.05*ht;
X      scale = dscale;
X      gmp(&xscl,&xoff,&yscl,&yoff);
X
X/* Line style must be continuous */
X
X      gnms(&style);
X      snms(0);
X      
X      pldeco(symbol,&length,string);
X      xorg = 0.0;
X      yorg = 0.0;
X      level = 0;
X 
X      for (i=0; i<length; i++)  {
X        ch = symbol[i];
X        if (ch == -1) {
X          level = level + 1;
X          yorg = yorg + 16.0 * scale;
X          scale = dscale * pow(0.75,(double)abs(level));
X        }
X        else if (ch == -2) {  
X          level = level - 1;
X          scale = dscale * pow(0.75,(double)abs(level));
X          yorg = yorg - 16.0 * scale;
X        }
X        else if (ch == -3)
X          xorg = xorg - width * scale;
X        else if (ch == -4)
X          oline = !oline;
X        else if (ch == -5) 
X          uline = !uline;
X        else  {
X          if (plcvec(ch,xygrid)) {
X            xbase = xygrid[3];
X            width = xygrid[4] - xbase;
X            if (base == 0) {
X              ybase = 0;
X              ydisp = xygrid[1];
X            }
X            else  {
X              ybase = xygrid[1];
X              ydisp = 0;
X            }
X            k = 5;
X            penup = 1;
Xlab2:
X              cx = xygrid[k];
X              k = k+1;
X              cy = xygrid[k];
X              k = k+1;
X              if (cx == -64 && cy == -64) goto lab3;
X              if (cx == -64 && cy == 0) 
X                penup = 1;
X              else {
X                x = xorg + (cx - xbase) * scale;
X                y = yorg + (cy - ybase) * scale;
X                lx = refx + round(xscl*(xform[0]*x + xform[1]*y));
X                ly = refy + round(yscl*(xform[2]*x + xform[3]*y));
X                if (penup != 0) {
X                  movphy(lx,ly);
X                  penup = 0;
X                }
X                else
X                  draphy(lx,ly);
X              }
X            goto lab2;
Xlab3:
X            if (oline) {
X              x = xorg;
X              y = yorg + (30+ydisp)*scale;
X              lx = refx + round(xscl*(xform[0]*x + xform[1]*y));
X              ly = refy + round(yscl*(xform[2]*x + xform[3]*y));
X              movphy(lx,ly);
X              x = xorg + width*scale;
X              lx = refx + round(xscl*(xform[0]*x + xform[1]*y));
X              ly = refy + round(yscl*(xform[2]*x + xform[3]*y));
X              draphy(lx,ly);
X            }
X            if (uline) {
X              x = xorg;
X              y = yorg + (-5+ydisp)*scale;
X              lx = refx + round(xscl*(xform[0]*x + xform[1]*y));
X              ly = refy + round(yscl*(xform[2]*x + xform[3]*y));
X              movphy(lx,ly);
X              x = xorg + width*scale;
X              lx = refx + round(xscl*(xform[0]*x + xform[1]*y));
X              ly = refy + round(yscl*(xform[2]*x + xform[3]*y));
X              draphy(lx,ly);
X            }
X            xorg = xorg + width*scale;
X          }
X        }
X      }
X      snms(style);
X}
X
SHAR_EOF
echo "extracting plstrl.c"
sed 's/^X//' << \SHAR_EOF > plstrl.c
X/* Computes the length of a string in mm, including escape sequences  */
X
X#include "plplot.h"
X#include <math.h>
X
Xfloat plstrl(string)
Xchar *string;
X{
X      int symbol[256];
X      short int xygrid[300];
X      int ch, i, length, level;
X      float width, xorg, dscale, scale, def, ht;
X      float xscl, xoff, yscl, yoff;
X
X      width = 0.0;
X      gchr(&def,&ht);
X      dscale = 0.05*ht;
X      scale = dscale;
X      gmp(&xscl,&xoff,&yscl,&yoff);
X
X      pldeco(symbol,&length,string);
X      xorg = 0.0;
X      level = 0;
X 
X      for (i=0; i<length; i++) {
X        ch = symbol[i];
X        if (ch == -1) {
X          level = level + 1;
X          scale = dscale * pow(0.75,(double)abs(level));
X        }
X        else if (ch == -2) {  
X          level = level - 1;
X          scale = dscale * pow(0.75,(double)abs(level));
X        }
X        else if (ch == -3) 
X          xorg = xorg - width * scale;
X        else if (ch == -4 || ch == -5) 
X          ;
X        else {
X          if (plcvec(ch,xygrid)) {
X            width = xygrid[4] - xygrid[3];
X            xorg = xorg + width*scale;
X          }
X        }
X      }
X      return(xorg);
X}
SHAR_EOF
echo "extracting plstyl.c"
sed 's/^X//' << \SHAR_EOF > plstyl.c
X/* Set up a new line style of "nels" elements, with mark and space */
X/* lengths given by arrays "mk" and "sp". */
X
X#include "plplot.h"
X#include "declare.h"
X
Xvoid plstyl(nels,mk,sp)
Xint nels,mk[],sp[];
X{
X    int i;
X
X    if ((nels < 0) || (nels > 10)) {
X      fatal("Broken lines cannot have <0 or >10 elements");
X    }
X
X    nms = nels;
X    for (i=0; i<nels; i++) {
X        mark[i] = mk[i];
X        space[i] = sp[i];
X        if ((mk[i] < 0) || (sp[i] < 0))
X            fatal("Mark and space lengths must be > 0 in PLSTYL");
X    }
X
X    curel = 0;
X    pendn = 1;
X    timecnt = 0;
X    alarm = mark[curel];
X}
X
X/* Updates line style variables, called whenever alarm goes off */
X
Xvoid plupd()
X{
X    while ( timecnt >= alarm ) {
X        if (pendn != 0) {
X            pendn = 0;
X            timecnt = timecnt - alarm;
X            alarm = space[curel];
X        }
X        else {
X            pendn = 1;
X            timecnt = timecnt - alarm;
X            curel = curel + 1;
X            if (curel >= nms) curel = 0;
X            alarm = mark[curel];
X        }
X    }
X}
X
X
SHAR_EOF
echo "extracting plsvpa.c"
sed 's/^X//' << \SHAR_EOF > plsvpa.c
X/* Sets the edges of the viewport to the specified absolute          */
X/* coordinates (mm), measured with respect to the current subpage    */
X/* boundaries                                                        */
X
X#include "plplot.h"
X
Xvoid plsvpa(xmin,xmax,ymin,ymax)
Xfloat xmin, xmax, ymin, ymax;
X{
X
X    int nx, ny, cs;
X    float sxmin, symin;
X    float spdxmi, spdxma, spdymi, spdyma;
X    float vpdxmi, vpdxma, vpdymi, vpdyma;
X
X    int level;
X
X    glev(&level);
X    if (level<1) fatal("Please call PLSTAR before calling PLSVPA.");
X    if((xmin>=xmax)||(ymin>=ymax)||(xmin<0.)||(ymin<0.))
X        fatal("Invalid limits in PLSVPA.");
X
X    gsub(&nx,&ny,&cs);
X    if ((cs<=0) || (cs>(nx*ny)))
X        fatal("Please call PLADV or PLENV to go to a subpage.");
X
X    gspd(&spdxmi,&spdxma,&spdymi,&spdyma);
X    sxmin = dcmmx(spdxmi);
X    symin = dcmmy(spdymi);
X
X    vpdxmi = mmdcx(sxmin+xmin);
X    vpdxma = mmdcx(sxmin+xmax);
X    vpdymi = mmdcy(symin+ymin);
X    vpdyma = mmdcy(symin+ymax);
X    
X    svpd(vpdxmi,vpdxma,vpdymi,vpdyma);
X    svpp(dcpcx(vpdxmi),dcpcx(vpdxma),dcpcy(vpdymi),dcpcy(vpdyma));
X    sclp(dcpcx(vpdxmi),dcpcx(vpdxma),dcpcy(vpdymi),dcpcy(vpdyma));
X    slev(2);
X}
X
SHAR_EOF
echo "extracting plsym.c"
sed 's/^X//' << \SHAR_EOF > plsym.c
X/* Plots single precision array y against x for n points using */
X/* Hershey symbol "code" */
X
X#include "plplot.h"
X
Xvoid plsym(n,x,y,code)
Xint n, code;
Xfloat x[],y[];
X{
X      int i;
X
X      int level;
X      glev(&level);
X      if (level < 3) fatal("Please set up window before calling PLSYM.");
X      if (code < 0) fatal("Invalid code in PLSYM.");
X
X      for (i=0; i<n; i++) 
X        plsym1(x[i],y[i],code);
X}
SHAR_EOF
echo "extracting plsym1.c"
sed 's/^X//' << \SHAR_EOF > plsym1.c
X#include "plplot.h"
X
Xvoid plsym1(x,y,code)
Xfloat x,y;
Xint code;
X{
X      plhrsh(code,wcpcx(x),wcpcy(y));
X}
SHAR_EOF
echo "extracting plt3zz.c"
sed 's/^X//' << \SHAR_EOF > plt3zz.c
X/* Draws the next zig-zag line for a 3-d plot. The data is stored in */
X/* array z(*,ly) as a function of x() and y(). The subarray */
X/* z(1:nx,1:ny) is plotted out, starting at index (xstar0,ystar0). */
X/* Depending on the state of "flg0", the sequence of data points */
X/* sent to plnxtv is altered so as to allow cross-hatch plotting, */
X/* or plotting parallel to either the x-axis or the y-axis. */
X
X#include "plplot.h"
X
Xvoid plt3zz(xstar0,ystar0,dx,dy,flg0,init,x,y,z,ly,nx,ny,u,v)
Xint xstar0, ystar0, dx, dy, flg0, ly, nx, ny, init;
Xfloat x[], y[], *z;
Xint u[], v[];
X{
X      int flag;
X      int n;
X      int xstart, ystart;
X
X      n = 0;
X      xstart = xstar0;
X      ystart = ystar0;
X      flag = flg0;
X      
Xlab1:
X      if (1 <= xstart && xstart <= nx && 1 <= ystart && ystart <= ny) {
X        u[n] = wcpcx(w3wcx(x[xstart-1],y[ystart-1],
X                      *(z+(xstart-1)*ly+(ystart-1))));
X        v[n] = wcpcy(w3wcy(x[xstart-1],y[ystart-1],
X                      *(z+(xstart-1)*ly+(ystart-1))));
X        if (flag == -3) {
X          ystart = ystart + dy;
X          flag = -flag;
X        }
X        else if (flag == -2) 
X          ystart = ystart + dy;
X        else if (flag == -1) {
X          ystart = ystart + dy;
X          flag = 1;
X        }
X        else if (flag == 1)
X          xstart = xstart + dx;
X        else if (flag == 2)  {
X          xstart = xstart + dx;
X          flag = -2;
X        }
X        else if (flag == 3) {
X          xstart = xstart + dx;
X          flag = -flag;
X        }
X        n = n+1;
X        goto lab1;
X      }
X
X      if (flag == 1 || flag == -2) {
X        if (flag == 1) {
X          xstart = xstart - dx;
X          ystart = ystart + dy;
X        }
X        else if (flag == -2) {
X          ystart = ystart - dy;
X          xstart = xstart + dx;
X        }
X
X        if (1 <= xstart && xstart <= nx  && 1 <= ystart && ystart <= ny) {
X          u[n] = wcpcx(w3wcx(x[xstart-1],y[ystart-1],
X                       *(z+(xstart-1)*ly+(ystart-1))));
X          v[n] = wcpcy(w3wcy(x[xstart-1],y[ystart-1],
X                       *(z+(xstart-1)*ly+(ystart-1))));
X          n = n+1;
X        }
X
X      }        
X      plnxtv(u,v,n,init);
X}
SHAR_EOF
echo "extracting pltext.c"
sed 's/^X//' << \SHAR_EOF > pltext.c
X/* Switches back to text mode */
X
X#include "plplot.h"
X
Xvoid pltext()
X{
X      int dev,term,gra,level;
X
X      glev(&level);
X      if (level < 1) fatal("Please call PLSTAR before calling PLTEXT.");
X
X      gdev(&dev,&term,&gra);
X      if (term != 0) beepw();
X      grtext();
X}
SHAR_EOF
echo "extracting plvpor.c"
sed 's/^X//' << \SHAR_EOF > plvpor.c
X/* Sets the edges of the viewport to the specified normalized subpage */
X/* coordinates */
X
X#include "plplot.h"
X
Xvoid plvpor(xmin, xmax, ymin, ymax)
Xfloat xmin, xmax, ymin, ymax;
X{
X    float spdxmi, spdxma, spdymi, spdyma;
X    float vpdxmi, vpdxma, vpdymi, vpdyma;
X    int vppxmi, vppxma, vppymi, vppyma;
X    
X    int nx, ny, cs;
X
X    int level;
X
X    glev(&level);
X    if (level < 1) fatal("Please call PLSTAR before calling PLVPOR.");
X    if((xmin>=xmax)||(ymin>=ymax)||(xmin<0.)||
X       (ymin<0.)||(xmax>1.)||(ymax>1.))
X        fatal("Invalid limits in PLSVPA.");
X
X    gsub(&nx,&ny,&cs);
X    if ((cs<=0) || (cs>(nx*ny)))
X        fatal("Please call PLADV or PLENV to go to a subpage.");
X    gspd(&spdxmi,&spdxma,&spdymi,&spdyma);
X    vpdxmi = spdxmi + (spdxma - spdxmi) * xmin;
X    vpdxma = spdxmi + (spdxma - spdxmi) * xmax;
X    vpdymi = spdymi + (spdyma - spdymi) * ymin;
X    vpdyma = spdymi + (spdyma - spdymi) * ymax;
X    svpd(vpdxmi,vpdxma,vpdymi,vpdyma);
X
X    vppxmi = dcpcx(vpdxmi);
X    vppxma = dcpcx(vpdxma);
X    vppymi = dcpcy(vpdymi);
X    vppyma = dcpcy(vpdyma);
X    svpp(vppxmi,vppxma,vppymi,vppyma);
X    sclp(vppxmi,vppxma,vppymi,vppyma);
X    slev(2);
X}
SHAR_EOF
echo "extracting plvsta.c"
sed 's/^X//' << \SHAR_EOF > plvsta.c
X/* Defines a "standard" viewport with seven character heights for   */
X/* the left margin and four character heights everywhere else       */
X
X#include "plplot.h"
X                                                                   
Xvoid plvsta()
X{
X    float xmin, xmax, ymin, ymax;
X    float chrdef, chrht, spdxmi, spdxma, spdymi, spdyma;
X
X    int level;
X
X    glev(&level);
X    if (level < 1) fatal("Please call PLSTAR before calling PLVSTA.");
X
X    gchr(&chrdef,&chrht);
X    gspd(&spdxmi,&spdxma,&spdymi,&spdyma);
X
X/*  Find out position of subpage boundaries in millimetres, reduce by */
X/*  the desired border, and convert back into normalized subpage */
X/*  coordinates */
X
X    xmin = dcscx(mmdcx(dcmmx(spdxmi) + 7 * chrht));
X    xmax = dcscx(mmdcx(dcmmx(spdxma) - 4 * chrht));
X    ymin = dcscy(mmdcy(dcmmy(spdymi) + 4 * chrht));
X    ymax = dcscy(mmdcy(dcmmy(spdyma) - 4 * chrht));
X
X    plvpor(xmin,xmax,ymin,ymax);
X}
SHAR_EOF
echo "extracting plw3d.c"
sed 's/^X//' << \SHAR_EOF > plw3d.c
X/* Set up a window for three-dimensional plotting. The data are mapped */
X/* into a box with world coordinate size "basex" by "basey" by "height", */
X/* with the base being symmetrically positioned about zero. Thus */
X/* the mapping between data 3-d and world 3-d coordinates is given by: */
X
X/*   x = xmin   =>   wx = -0.5*basex */
X/*   x = xmax   =>   wx =  0.5*basex */
X/*   y = ymin   =>   wy = -0.5*basey */
X/*   y = ymax   =>   wy =  0.5*basey */
X/*   z = zmin   =>   wz =  0.0 */
X/*   z = zmax   =>   wz =  height */
X
X/* The world coordinate box is then viewed from position "alt"-"az", */
X/* measured in degrees. For proper operation, 0 <= alt <= 90 degrees, */
X/* but az can be any value. */
X
X#include "plplot.h"
X#include <math.h>
X
X#define  dtr   0.01745329252
X
Xvoid plw3d(basex,basey,height,xmin0,xmax0,ymin0,ymax0,zmin0,zmax0,alt,az)
Xfloat basex, basey, height, xmin0, xmax0, ymin0, ymax0, zmin0, zmax0;
Xfloat alt, az;
X{
X      float xmin, xmax, ymin, ymax, zmin, zmax, d;
X      float cx, cy, saz, caz, salt, calt, zscale;
X
X      int level;
X      glev(&level);
X      if (level < 3) fatal("Please set up 2-d window before calling PLW3D.");
X      if (basex <= 0.0 || basey <= 0.0 || height <= 0.0)
X              fatal("Invalid world coordinate boxsize in PLW3D.");
X      if (xmin0 == xmax0 || ymin0 == ymax0 || zmin0 == zmax0)
X              fatal("Invalid axis range in PLW3D.");
X      if (alt<0.0 || alt>90.0)
X              fatal("Altitude must be between 0 and 90 degrees in PLW3D.");
X
X      d = 1.0e-5*(xmax0-xmin0);
X      xmax = xmax0 + d;
X      xmin = xmin0 - d;
X      d = 1.0e-5*(ymax0-ymin0);
X      ymax = ymax0 + d;
X      ymin = ymin0 - d;
X      d = 1.0e-5*(zmax0-zmin0);
X      zmax = zmax0 + d;
X      zmin = zmin0 - d;
X      cx = basex/(xmax-xmin);
X      cy = basey/(ymax-ymin);
X      zscale = height/(zmax-zmin);
X      saz = sin(dtr*az);
X      caz = cos(dtr*az);
X      salt = sin(dtr*alt);
X      calt = cos(dtr*alt);
X      
X      sdom(xmin,xmax,ymin,ymax);
X      srange(zscale,zmin,zmax);
X      sbase(basex,basey,0.5*(xmin+xmax),0.5*(ymin+ymax));
X
X      sw3wc(cx*caz,-cy*saz,cx*saz*salt,cy*caz*salt,zscale*calt);
X}
X
SHAR_EOF
echo "extracting plwind.c"
sed 's/^X//' << \SHAR_EOF > plwind.c
X#include "plplot.h"
X
Xvoid plwind(xmin,xmax,ymin,ymax)
Xfloat xmin, xmax, ymin, ymax;
X{
X    int vppxmi, vppxma, vppymi, vppyma;
X    float dx, dy;
X    float vpwxmi, vpwxma, vpwymi, vpwyma;
X    float vpxmi, vpxma, vpymi, vpyma;
X    float wpxscl, wpxoff, wpyscl, wpyoff;
X    float wmxscl, wmxoff, wmyscl, wmyoff;
X
X    int level;
X
X    glev(&level);
X    if (level<2) fatal("Please set up viewport before calling PLWIND.");
X
X    gvpp(&vppxmi,&vppxma,&vppymi,&vppyma);
X    gvpd(&vpxmi,&vpxma,&vpymi,&vpyma);
X
X    dx = (xmax-xmin) * 1.0e-5;
X    dy = (ymax-ymin) * 1.0e-5;
X
X    if ((xmin == xmax) || (ymin == ymax))
X        fatal("Invalid window limits in PLWIND.");
X   
X/* The true plot window is made slightly larger than requested so that */
X/* the end limits will be on the graph  */
X 
X    svpw(xmin-dx,xmax+dx,ymin-dy,ymax+dy);
X    gvpw(&vpwxmi,&vpwxma,&vpwymi,&vpwyma);
X
X/* Compute the scaling between coordinate systems */
X
X    dx = vpwxma - vpwxmi;
X    dy = vpwyma - vpwymi;
X 
X    wpxscl  = (vppxma - vppxmi) / dx;
X    wpxoff  = (xmax * vppxmi - xmin * vppxma) / dx;
X    wpyscl  = (vppyma - vppymi) / dy;
X    wpyoff  = (ymax * vppymi - ymin * vppyma) / dy;
X    swp(wpxscl,wpxoff,wpyscl,wpyoff);
X
X    vpxmi = dcmmx(vpxmi);
X    vpxma = dcmmx(vpxma);
X    vpymi = dcmmy(vpymi);
X    vpyma = dcmmy(vpyma);
X    wmxscl = (vpxma - vpxmi) / dx;
X    wmxoff = (xmax * vpxmi - xmin * vpxma) / dx;
X    wmyscl = (vpyma - vpymi) / dy;
X    wmyoff = (ymax * vpymi - ymin * vpyma) / dy;
X    swm(wmxscl,wmxoff,wmyscl,wmyoff);
X
X    slev(3);
X}SHAR_EOF
echo "extracting plxtik.c"
sed 's/^X//' << \SHAR_EOF > plxtik.c
X#include "plplot.h"
X
Xvoid plxtik(x,y,below,above)
Xint x, y, below, above;
X{      
X      draphy(x,y);
X      if (below != 0) draphy(x,y-below);
X      if (above != 0) draphy(x,y+above);
X      draphy(x,y);
X}
SHAR_EOF
echo "extracting plxybx.c"
sed 's/^X//' << \SHAR_EOF > plxybx.c
X/* This draws a sloping line from (wx1,wy1) to (wx2,wy2)             */
X/*  which represents an axis of a 3-d graph with data values from    */
X/*  "vmin" to "vmax". Depending on "opt", vertical ticks and/or      */
X/*  subticks are placed on the line at major tick interval "tick"    */
X/*  with "nsub" subticks between major ticks. If "tick" and/or       */
X/*  "nsub" is zero, automatic tick positions are computed            */
X
X/* B: Draw box boundary                                              */
X/* I: Inverts tick marks (i.e. drawn downwards)                      */
X/* L: Logarithmic axes, major ticks at decades, minor ticks at units */
X/* N: Write numeric label                                            */
X/* T: Draw major tick marks                                          */
X/* S: Draw minor tick marks                                          */
X/* U: Write label on line                                            */
X
X#include "plplot.h"
X#include <stdio.h>
X#include <math.h>
X
X#define  betw(c,a,b)  ((a <= c && c <= b) || (b <= c && c <= a))
X
Xstatic float xlog[8] = 
X  {0.301030,0.477121,0.602060,0.698970,0.778151,0.845098,0.903090,0.954243};
X
Xvoid plxybx(opt,label,wx1,wy1,wx2,wy2,vmin,vmax,tick,nsub,nolast)
Xchar *opt, *label;
Xfloat wx1, wy1, wx2, wy2, vmin, vmax, tick;
Xint nsub, nolast;
X{
X      char string[40];
X      int lb,li,ll,ln,ls,lt,lu;
X      int major, minor, mode, prec;
X      int i, i1, i2, i3, i4;
X      int nsub1;
X      float xpmm, ypmm, defmaj, defmin, htmaj, htmin, tick1;
X      float pos, tn, tp, temp;
X      float dwx, dwy, lambda;
X
X      dwx = wx2 - wx1;
X      dwy = wy2 - wy1;
X
X/* Tick and subtick sizes in device coords */
X
X      gpixmm(&xpmm,&ypmm);
X      gmaj(&defmaj,&htmaj);
X      gmin(&defmin,&htmin);
X      
X      major=max(round(htmaj*ypmm),1);
X      minor=max(round(htmin*ypmm),1);
X
X      tick1=tick;
X      nsub1=nsub;
X
X      lb=strpos(opt,'B')!=-1||strpos(opt,'b')!=-1;
X      li=strpos(opt,'I')!=-1||strpos(opt,'i')!=-1;
X      ll=strpos(opt,'L')!=-1||strpos(opt,'l')!=-1;
X      ln=strpos(opt,'N')!=-1||strpos(opt,'n')!=-1;
X      ls=strpos(opt,'S')!=-1||strpos(opt,'s')!=-1;
X      lt=strpos(opt,'T')!=-1||strpos(opt,'t')!=-1;
X      lu=strpos(opt,'U')!=-1||strpos(opt,'u')!=-1;
X
X      if (lu) plxytx(wx1,wy1,wx2,wy2,3.2,0.5,0.5,label);
X      if (!lb) return;
X   
X      if (ll) tick1 = 1.0;
X      if (lt) pldtik(vmin,vmax,&tick1,&nsub1,&mode,&prec);
X
X      if (li) {
X        i1 = minor;
X        i2 = 0;
X        i3 = major;
X        i4 = 0;
X      }
X      else  {
X        i1 = 0;
X        i2 = minor;
X        i3 = 0;
X        i4 = major;
X      }  
X
X/* Draw the line */
X
X      movwor(wx1,wy1);
X      if (lt) {
X        tp=tick1*floor(vmin/tick1);
Xlab2:
X        tn=tp+tick1;
X        if (ls) {
X          if (ll) {
X            for (i=0; i<=7; i++)  {
X              temp=tp+xlog[i];
X              if (betw(temp,vmin,vmax)) {
X                lambda = (temp-vmin)/(vmax-vmin);
X                plxtik(wcpcx(wx1+lambda*dwx),wcpcy(wy1+lambda*dwy),i1,i2);
X              }
X            }
X          }
X          else  {
X            for(i=1; i <= nsub1-1; i++)  {
X              temp=tp+i*(tn-tp)/nsub1;
X              if (betw(temp,vmin,vmax)) {
X                lambda = (temp-vmin)/(vmax-vmin);
X                plxtik(wcpcx(wx1+lambda*dwx),wcpcy(wy1+lambda*dwy),i1,i2);
X              }
X            }
X          }
X        }
X        temp=tn;
X        if (betw(temp,vmin,vmax)) {
X          lambda = (temp-vmin)/(vmax-vmin);
X          plxtik(wcpcx(wx1+lambda*dwx),wcpcy(wy1+lambda*dwy),i3,i4);
X          tp=tn;
X          goto lab2;
X        }
X      }
X
X      drawor(wx2,wy2);
X
X/* Label the line */
X
X      if (ln && lt) {
X        tp=tick1*floor(vmin/tick1);
Xlab82:
X        tn=tp+tick1;
X        if (nolast && !betw(tn+tick1,vmin,vmax)) return;
X        if (betw(tn,vmin,vmax)) {
X          if (!ll) 
X            plform(tn,mode,prec,string);
X          else 
X            sprintf(string,"10\\u%-d",round(tn));
X          pos=(tn-vmin)/(vmax-vmin);
X          if (ln) plxytx(wx1,wy1,wx2,wy2,1.5,pos,0.5,string);
X          tp=tn;
X          goto lab82;
X        }
X      }
X}
SHAR_EOF
echo "extracting plxytx.c"
sed 's/^X//' << \SHAR_EOF > plxytx.c
X/* Prints out text along a sloping axis joining world coordinates */
X/* (wx1,wy1) to (wx2,wy2). Parameters are as for plmtext          */
X
X#include "plplot.h"
X#include <math.h>
X
Xvoid plxytx(wx1,wy1,wx2,wy2,disp,pos,just,text)
Xfloat wx1,wy1,wx2,wy2,disp,pos,just;
Xchar *text;
X{      
X      int refx, refy;
X      float shift, cc, ss, def, ht;
X      float xform[4], diag;
X      float xscl, xoff, yscl, yoff, wx, wy;
X   
X      gchr(&def,&ht);
X      gwm(&xscl,&xoff,&yscl,&yoff);
X      cc = xscl * (wx2-wx1);
X      ss = yscl * (wy2-wy1);
X      diag = sqrt(cc*cc + ss*ss);
X      cc = cc/diag;
X      ss = ss/diag;
X
X      xform[0] = cc;
X      xform[1] = 0.0;
X      xform[2] = ss;
X      xform[3] = 1.0;
X
X      shift = 0.0;
X      if (just != 0.0) shift = plstrl(text) * just;
X      wx = wx1 + pos * (wx2 - wx1);
X      wy = wy1 + pos * (wy2 - wy1);
X      
X      refx = mmpcx(wcmmx(wx) - shift * cc);
X      refy = mmpcy(wcmmy(wy) - shift * ss - disp * ht);
X      plstr(0,xform,refx,refy,text);
X}
SHAR_EOF
echo "extracting plytik.c"
sed 's/^X//' << \SHAR_EOF > plytik.c
X#include "plplot.h"
X
Xvoid plytik(x,y,left,right)
Xint x, y, left, right;
X{      
X      draphy(x,y);
X      if (left != 0) draphy(x-left,y);
X      if (right != 0) draphy(x+right,y);
X      draphy(x,y);
X}
SHAR_EOF
echo "extracting plzbx.c"
sed 's/^X//' << \SHAR_EOF > plzbx.c
X/* This draws a vertical line from (wx,wy1) to (wx,wy2)           */
X/*  which represents the vertical axis of a 3-d graph with data   */
X/*  values from "vmin" to "vmax". Depending on "opt", ticks and/or*/
X/*  subticks are placed on the line at major tick interval "tick" */
X/*  with "nsub" subticks between major ticks. If "tick" and/or    */
X/*  "nsub" is zero, automatic tick positions are computed         */
X
X/* B: Draws left-hand axis*/
X/* C: Draws right-hand axis*/
X/* I: Inverts tick marks (i.e. drawn to the left)  */
X/* L: Logarithmic axes, major ticks at decades, minor ticks at units*/
X/* M: Write numeric label on right axis*/
X/* N: Write numeric label on left axis*/
X/* S: Draw minor tick marks  */
X/* T: Draw major tick marks  */
X/* U: Writes left-hand label*/
X/* V: Writes right-hand label*/
X
X#include "plplot.h"
X#include <stdio.h>
X#include <math.h>
X
X#define betw(c,a,b) ((a <= c && c <= b) || (b <= c && c <= a))
X
Xstatic float xlog[8] =
X  {0.301030,0.477121,0.602060,0.698970,0.778151,0.845098,
X   0.903090,0.954243};
X
Xvoid plzbx(opt,label,right,dx,dy,wx,wy1,wy2,vmin,vmax,tick,nsub)
Xchar *opt, *label;
Xfloat dx, dy, wx, wy1, wy2, vmin, vmax, tick;
Xint nsub, right;
X{
X      char string[40];
X      int lb,lc,li,ll,lm,ln,ls,lt,lu,lv;
X      int i, mode, prec;
X      int nsub1;
X      float xpmm, ypmm, defmaj, defmin, tick1;
X      float pos, tn, tp, temp;
X      float dwy, lambda, diag, major, minor, xmajor, xminor;
X      float ymajor, yminor, dxm, dym, xscl, xoff, yscl, yoff;
X               
X      dwy = wy2 - wy1;
X
X/* Tick and subtick sizes in device coords */
X
X      gpixmm(&xpmm,&ypmm);
X      gmaj(&defmaj,&major);
X      gmin(&defmin,&minor);
X      
X      tick1=tick;
X      nsub1=nsub;
X
X      lb=strpos(opt,'B') != -1 || strpos(opt,'b') != -1;
X      lc=strpos(opt,'C') != -1 || strpos(opt,'c') != -1;
X      li=strpos(opt,'I') != -1 || strpos(opt,'i') != -1;
X      ll=strpos(opt,'L') != -1 || strpos(opt,'l') != -1;
X      lm=strpos(opt,'M') != -1 || strpos(opt,'m') != -1;
X      ln=strpos(opt,'N') != -1 || strpos(opt,'n') != -1;
X      ls=strpos(opt,'S') != -1 || strpos(opt,'s') != -1;
X      lt=strpos(opt,'T') != -1 || strpos(opt,'t') != -1;
X      lu=strpos(opt,'U') != -1 || strpos(opt,'u') != -1;
X      lv=strpos(opt,'V') != -1 || strpos(opt,'v') != -1;
X
X      if (lu && !right) plztx("h",dx,dy,wx,wy1,wy2,5.0,0.5,0.5,label);
X      if (lv && right) plztx("h",dx,dy,wx,wy1,wy2,-5.0,0.5,0.5,label);
X
X      if (right && !lc) return;
X      if (!right && !lb) return;
X
X      if (ll) tick1 = 1.0;
X      if (lt) pldtik(vmin,vmax,&tick1,&nsub1,&mode,&prec);
X
X      if ( (li && !right) || (!li && right) ) {
X        minor = -minor;
X        major = -major;
X      }  
X
X      gwm(&xscl,&xoff,&yscl,&yoff);
X      dxm = dx * xscl;
X      dym = dy * yscl;
X      diag = sqrt(dxm*dxm + dym*dym);
X
X      xminor = minor * dxm/diag;
X      xmajor = major * dxm/diag;
X      yminor = minor * dym/diag;
X      ymajor = major * dym/diag;
X
X/* Draw the line */
X
X      movwor(wx,wy1);
X      if (lt) {
X        tp=tick1*floor(vmin/tick1);
Xlab2:
X        tn=tp+tick1;
X        if (ls) {
X          if (ll) {
X            for (i=0; i <= 7; i++) {
X              temp=tp+xlog[i];
X              if (betw(temp,vmin,vmax)) {
X                lambda = (temp-vmin)/(vmax-vmin);
X                plstik(wcmmx(wx),wcmmy(wy1+lambda*dwy),xminor,yminor);
X              }
X            }
X          }
X          else  {
X            for (i=1; i<= nsub1-1; i++)  {
X              temp=tp+i*(tn-tp)/nsub1;
X              if (betw(temp,vmin,vmax)) {
X                lambda = (temp-vmin)/(vmax-vmin);
X                plstik(wcmmx(wx),wcmmy(wy1+lambda*dwy),xminor,yminor);
X              }
X            }
X          }
X        }
X        temp=tn;
X        if (betw(temp,vmin,vmax)) {
X          lambda = (temp-vmin)/(vmax-vmin);
X          plstik(wcmmx(wx),wcmmy(wy1+lambda*dwy),xmajor,ymajor);
X          tp=tn;
X          goto lab2;
X        }
X      }
X
X      drawor(wx,wy2);
X
X/* Label the line */
X
X      if (ln && lt) {
X        tp=tick1*floor(vmin/tick1);
Xlab82:
X        tn=tp+tick1;
X        if (betw(tn,vmin,vmax)) {
X          if (!ll) 
X            plform(tn,mode,prec,string);
X          else
X            sprintf(string,"10\\u%d",round(tn));
X          pos=(tn-vmin)/(vmax-vmin);
X          if (ln && !right) plztx("v",dx,dy,wx,wy1,wy2,0.5,pos,1.0,string);
X          if (lm && right) plztx("v",dx,dy,wx,wy1,wy2,-0.5,pos,0.0,string);
X          tp=tn;
X          goto lab82;
X        }
X      }
X}
SHAR_EOF
echo "extracting plztx.c"
sed 's/^X//' << \SHAR_EOF > plztx.c
X/* Prints out text along a vertical axis for a 3d plot joining         */
X/*  world coordinates (wx,wy1) to (wx,wy2).                            */
X
X#include "plplot.h"
X#include <math.h>
X
Xvoid plztx(opt,dx,dy,wx,wy1,wy2,disp,pos,just,text)
Xfloat dx,dy,wx,wy1,wy2,disp,pos,just;
Xchar *opt, *text;
X{      
X      int refx, refy;
X      int vert;
X      float shift, cc, ss, def, ht;
X      float xform[4], diag;
X      float xscl, xoff, yscl, yoff, wy;
X   
X      gchr(&def,&ht);
X      gwm(&xscl,&xoff,&yscl,&yoff);
X      cc = xscl * dx;
X      ss = yscl * dy;
X      diag = sqrt(cc*cc + ss*ss);
X      cc = cc/diag;
X      ss = ss/diag;
X      gmp(&xscl,&xoff,&yscl,&yoff);
X
X      shift = 0.0;
X      if (just != 0.0) shift = plstrl(text) * just;
X      wy = wy1 + pos * (wy2 - wy1);
X      
X      if (strpos(opt,'V') != -1 || strpos(opt,'v') != -1) {
X        vert = 0;
X        refx = mmpcx(wcmmx(wx) - (disp * ht + shift) * cc);
X        refy = mmpcy(wcmmy(wy) - (disp * ht + shift) * ss);
X      }
X      else if (strpos(opt,'H') != -1 || strpos(opt,'h') != -1) {
X        vert = 1;
X        refy = wcpcy(wy) - yscl*(disp*ht*ss+shift);
X        refx = mmpcx(wcmmx(wx) - disp*ht*cc);
X      }
X      if (vert) {
X        xform[0] = 0.0;
X        xform[1] = -cc;
X        xform[2] = 1.0;
X        xform[3] = -ss;
X      }
X      else {
X        xform[0] = cc;
X        xform[1] = 0.0;
X        xform[2] = ss;
X        xform[3] = 1.0;
X      }
X      plstr(0,xform,refx,refy,text);
X}
SHAR_EOF
echo "extracting round.c"
sed 's/^X//' << \SHAR_EOF > round.c
X/* round rounds a floating point value to an integer value. */
X
X#include "plplot.h"
X#include <math.h>
X
Xint round(flt)
Xfloat flt;
X{
X    double mant, frac;
X
X    frac = modf(flt,&mant);
X    if( fabs(frac) < .5 )
X        return((int)mant);
X    else if (frac > 0)
X        return((int)(++mant));
X    else 
X        return((int)(--mant));
X}
SHAR_EOF
echo "extracting scratch"
sed 's/^X//' << \SHAR_EOF > scratch
X; I had problems with the LMKFILE when I wanted to remake the library
X; from scratch.  It barfed if I tried to pass to many source files to
X; the compiler.  Normally you shouldn't need to execute this script.
X; If you've only changed a few routines use LMK instead.  But in
X; case of disaster try this.  After you start it, take a break and
X; go get a pizza. No, wait, sorry, that was a flashback to my IBM
X; PC days.  Pop open a new window and do something else :-):-)
Xdelete lib/plplot.lib      ; delete old library
Xcopy nil: lib/plplot.lib   ; create an empty new one
Xtouch src/plabv.c src/pladv.c src/plbeg.c src/plbin.c src/plbox.c
Xtouch src/plccal.c src/plclr.c src/plcntr.c src/plcol.c src/plcont.c
Xtouch src/plcvec.c src/pldeco.c src/pldtik.c src/plend.c src/plenv.c
Xlmk
Xtouch src/plerrx.c src/plerry.c src/plerx1.c src/plery1.c src/plfont.c
Xtouch src/plform.c src/plgra.c src/plgspa.c src/plhist.c src/plhrsh.c
Xtouch src/pljoin.c src/pllab.c src/pllclp.c src/plline.c src/plmtex.c
Xlmk
Xtouch src/plnxtv.c src/plpoi1.c src/plpoin.c src/plptex.c src/plr135.c
Xtouch src/plr45.c src/plschr.c src/plsmaj.c src/plsmin.c src/plssym.c
Xtouch src/plstar.c src/plstik.c src/plstr.c src/plstrl.c src/plstyl.c
Xlmk
Xtouch src/plsvpa.c src/plsym.c src/plsym1.c src/pltext.c src/plvpor.c
Xtouch src/plvsta.c src/plwind.c src/plxtik.c src/plxybx.c src/plxytx.c
Xtouch src/plytik.c src/plzbx.c src/plztx.c src/pl3cut.c src/plbox3.c
Xlmk
Xtouch src/plgrid3.c src/plot3d.c src/plside3.c src/plt3zz.c src/plw3d.c
Xtouch src/define.c src/fatal.c src/fcnvrt.c src/genlin.c src/global.c
Xtouch src/icnvrt.c src/movphy.c src/movwor.c src/round.c src/setphy.c
Xlmk
Xtouch src/setpxl.c src/setsub.c src/stindex.c src/strpos.c src/xform.c
Xtouch src/impress.c src/laserjetii.c src/tektronix.c src/Amiga.c
Xtouch src/font01.c src/font02.c src/font03.c src/font04.c src/font05.c
Xlmk
Xtouch src/font06.c src/font07.c src/font08.c src/font09.c src/font10.c
Xtouch src/font11.c
Xlmk
SHAR_EOF
echo "extracting setphy.c"
sed 's/^X//' << \SHAR_EOF > setphy.c
X/* Sets up physical limits of plotting device and the mapping between */
X/* normalized device coordinates and physical coordinates */
X
X#include "plplot.h"
X
Xvoid setphy(xmin,xmax,ymin,ymax)
Xint xmin,xmax,ymin,ymax;
X{
X    float xpmm, ypmm, mpxscl, mpyscl;
X
X    sphy(xmin,xmax,ymin,ymax);
X    sdp((double)(xmax-xmin),(double)(xmin),(double)(ymax-ymin),
X         (double)(ymin));
X
X    gpixmm(&xpmm,&ypmm);
X    mpxscl = xpmm;
X    if (xmax <= xmin) mpxscl = -xpmm;
X    mpyscl = ypmm;
X    if (ymax <= ymin) mpyscl = -ypmm;
X    smp(mpxscl,(double)(xmin), mpyscl,(double)(ymin));
X}
X
SHAR_EOF
echo "extracting setpxl.c"
sed 's/^X//' << \SHAR_EOF > setpxl.c
X/* Sets up pixel size from the number of pixels/mm in each direction */
X
X#include "plplot.h"
X#include "declare.h"
X
Xvoid setpxl(xpmm0,ypmm0)
Xfloat xpmm0,ypmm0;
X{
X    xpmm = xpmm0;
X    ypmm = ypmm0;
X    umx  = 1000.0/xpmm;
X    umy  = 1000.0/ypmm;
X}
SHAR_EOF
echo "extracting setsub.c"
sed 's/^X//' << \SHAR_EOF > setsub.c
X/* Sets up the subpage boundaries according to the current subpage  */
X/* selected */
X
X#include "plplot.h"
X
Xvoid setsub()
X{
X      int ix, iy;
X      int nsubx, nsuby, cursub;
X      float spdxmi, spdxma, spdymi, spdyma;
X      int sppxmi, sppxma, sppymi, sppyma;
X
X      gsub(&nsubx,&nsuby,&cursub);
X      ix = (cursub-1)%nsubx;
X      iy = nsuby - (cursub-1)/nsubx;
X
X      spdxmi = (float)(ix)/(float)(nsubx);
X      spdxma = (float)(ix+1)/(float)(nsubx);
X      spdymi = (float)(iy-1)/(float)(nsuby);
X      spdyma = (float)(iy)/(float)(nsuby);
X      sspd(spdxmi,spdxma,spdymi,spdyma);
X
X      sppxmi = dcpcx(spdxmi);
X      sppxma = dcpcx(spdxma);
X      sppymi = dcpcy(spdymi);
X      sppyma = dcpcy(spdyma);
X      sspp(sppxmi,sppxma,sppymi,sppyma);
X
X      sclp(sppxmi,sppxma,sppymi,sppyma);
X      
X}
SHAR_EOF
echo "extracting stindex.c"
sed 's/^X//' << \SHAR_EOF > stindex.c
X#include "plplot.h"
X
Xint stindex(str1,str2)
Xchar *str1,*str2;
X{
X    int base;
X    int str1ind;
X    int str2ind;
X
X    for(base=0; *(str1+base)!='\0'; base++) {
X        for(str1ind=base, str2ind=0; *(str2+str2ind)!='\0' &&
X            *(str2+str2ind) == *(str1+str1ind); str1ind++, str2ind++)
X            ;   /* no body */
X
X        if(*(str2+str2ind) == '\0')
X            return(base);
X    }
X    return(-1);    /* search failed */
X}
SHAR_EOF
echo "extracting strpos.c"
sed 's/^X//' << \SHAR_EOF > strpos.c
X/* Searches string str for first occurence of character chr.  If found */
X/* the position of the character in the string is returned (the first  */
X/* character has position 0).  If the character is not found a -1 is   */
X/* returned. */
X
X#include "plplot.h"
X#include <stdio.h>     /* Needed to define NULL */
X#include <string.h>
X
Xint strpos(str,chr)
Xchar *str,chr;
X{
X    char *temp;
X
X    if ( (temp = strchr(str,chr)) != NULL)
X        return(temp - str);
X    else
X        return(-1);
X}
SHAR_EOF
echo "extracting tektronix.c"
sed 's/^X//' << \SHAR_EOF > tektronix.c
X/* This file contains the tektronix dependent routines for use with plplot. */
X
X/* Define graphics control characters. */
X#define BS    8
X#define HT    9
X#define LF   10
X#define VT   11
X#define FF   12
X#define CR   13
X#define CAN  24
X#define EM   25
X#define ESC  27
X#define FS   28
X#define GS   29
X#define US   31
X
X#include <stdio.h>
X#include "plplot.h"
X
Xstatic FILE *OutFile;
Xstatic int FirstClear=1;
X
X/* Open file. */
Xvoid tekini()
X{
X      char FileName[80];
X
X      printf("Enter file to receive tektronix graphics commands. ");
X      scanf("%s",FileName);
X
X      if ((OutFile = fopen(FileName,"w")) == NULL)  {
X          printf("Error opening %s \n",FileName);
X          exit(1);
X      }
X}
X
X/* Sets the tektronix to text mode */
Xvoid tektex()
X{
X    fprintf(OutFile,"%c",US);
X}
X
X/* Sets the tektronix to graphics mode */
Xvoid tekgra()
X{
X    /* Nothing has to be done here */
X}
X
X/* Clears the tektronix screen */
Xvoid tekclr()
X{
X      if(FirstClear) 
X        FirstClear = 0;
X      else
X        fprintf(OutFile,"%c%c",ESC,FF);
X}
X
X/* Change color */
Xvoid tekcol(colour)
Xint colour;
X{
X}
X
X/* Draws a line in the current colour from (x1,y1) to (x2,y2) */
Xvoid teklin(x1,y1,x2,y2)
Xint x1,y1,x2,y2;
X{
X    int hy,ly,hx,lx;
X
X    fprintf(OutFile,"%c",GS);
X    hy = y1/32 + 32;
X    ly = y1 - (y1/32)*32 + 96;
X    hx = x1/32 + 32;
X    lx = x1 - (x1/32)*32 + 64;
X    fprintf(OutFile,"%c%c%c%c",hy,ly,hx,lx);
X    hy = y2/32 + 32;
X    ly = y2 - (y2/32)*32 + 96;
X    hx = x2/32 + 32;
X    lx = x2 - (x2/32)*32 + 64;
X    fprintf(OutFile,"%c%c%c%c",hy,ly,hx,lx);
X}
X
X/* Close file */
Xvoid tektid()
X{
X   fclose(OutFile);
X}
X
SHAR_EOF
echo "extracting xform.c"
sed 's/^X//' << \SHAR_EOF > xform.c
X#include "plplot.h"
X
Xvoid xform(x,y,tx,ty)
Xfloat x, y, *tx, *ty;
X{
X      extern float tr[];
X
X      *tx = tr[0]*x + tr[1]*y + tr[2];
X      *ty = tr[3]*x + tr[4]*y + tr[5];
X}
X
SHAR_EOF
echo "End of archive 7 (of 7)"
# if you want to concatenate archives, remove anything after this line
exit