v21i038: 2D graphic system with table beautifier, Part07/14

Rich Salz rsalz at uunet.uu.net
Sat Mar 24 06:20:41 AEST 1990


Submitted-by: Steve Grubb <uunet!lsr-vax!scg>
Posting-number: Volume 21, Issue 38
Archive-name: ipl/part07

# ipl part07
#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#---------------------- cut here -----------------------------
#!/bin/sh
# shar:	Shell Archiver
#	Run the following text with /bin/sh to create:
#		src/initialize.c
#		src/ipl.d
#		src/ipl.h
#		src/ipl.icon
#		src/ipl.x
#		src/iplps.c
#		src/legend.c
#		src/lib.c
#		src/lineplot.c
cat << \SHAR_EOF > src/initialize.c
/* IPL will be invoked by:   
			     tipl for postscript (to standard output)
			     sipl for sunview previewer
			     vipl for window-oriented composer
			     mipl for terminal-oriented composer
*/

#include "ipl.x"
#include "gdp.x"  /* for command line arguments */

static char fnm[PATHNAME_LEN];
static int filecount;

Initialize( )
{
int yr, mon, day, hr, min, sec, i;
char host[30];

sysdate( &mon, &day, &yr ); systime( &hr, &min, &sec );

strcpy( Templatepath, TEMPLATE_PATH );

sprintf( Tempfile, "%s/NTtmp%05d", INSTALL_TMP, getpid() );

Dev = Arg[0][ strlen( Arg[0] ) -4 ]; /* get output type */
Hold = 0;
if( !member( Dev, "tsvm" )) { fprintf( stderr, "Use tipl, sipl, vipl or mipl.\n" ); gdp_exit(); }

/* composers take off from here.. */
if( smember( Arg[0], "vipl" )) {
	if( Argc < 2 ) { fprintf( stderr, "A control file name argument must be given.\n" ); gdp_exit(); }
	NTinit( Dev );
	vipl_sequence( Arg[1] );
	gdp_exit();
	}

/* control file argument given.. */
if( Argc > 1 ) {
	filecount = 1;
	strcpy( fnm, Arg[1] );
	Sfp = fopen( fnm, "r" );
	}

if( Dev == 't' && Sfp == NULL ) { fprintf( stderr, "Control file not found.\n" ); exit(); }

else if( Sfp == NULL ) {
	NTinit( Dev );
	if( Dev == 's' )siplmenu( "Endoffile" );
	return( 1 );
	}

strcpy( Controlfile, fnm );	

NTinit( Dev );


DXlo = DXhi = 0; /* null out data dimensions */
DYlo = DYhi = 0;
sprintf( Buf, "%s %s (%02d%02d%02d %02d:%02d)", getlogin(), (Argc>1)?Arg[1]:"", yr, mon, day, hr, min );

strcpy( Stdfont, "/Helvetica" );
StdLw = 1.0;
NTfont( "/Helvetica" ); 
NTptsize( 6 );
NTmov( 0.1, 0.1 ); 
NTtext( Buf );

}


/* ============================================= */
/* start a new control file */
restart( s )
char s[];
{
FILE *fp;

if( Sfp != NULL ) fclose( Sfp );

if( strcmp( s, "" )==0 ) {
	filecount++;
	if( filecount >= Argc ) gdp_exit();
	strcpy( fnm, Arg[ filecount ] ); /* next file */
	}

else if( strlen( s ) > 0 ) strcpy( fnm, s );

Sfp = fopen( fnm, "r" );

if( Sfp == NULL ) {
	message( fnm, "File not found.", "", "" ); 
	return( 0 ); 
	}

strcpy( Controlfile, fnm );	
return( 1 );
}
SHAR_EOF
############################

cat << \SHAR_EOF > src/ipl.d
/* constants */
#include "../install.h"
#define FONTNAME_LEN	30	
#define TMPFILE_PATH	INSTALL_TMP
#define NSLOTS 24	/* number of slots in ASmax[] */

#define MOUSE_LEFT 1001
#define MOUSE_MIDDLE 1002
#define MOUSE_RIGHT 1003

extern char *getln();
extern FILE *popen();
SHAR_EOF
############################

cat << \SHAR_EOF > src/ipl.h
#include "graphic.x"
#include "ipl.d"

char Dev;				/* output device */
char D[ MAX_D_ROWS ][ MAX_D_COLS ][ DATAITEM_LEN ];	/* plot data */ 
int N_d_fields;					/* number of data fields per row */
int N_d_rows;					/* number of data rows */
char Buf[HBUFSIZ];				/* general purpose buffers */
char Buf2[512];

double Chsz;				/* character size */
double Chh;				/* height of a line of text */
double Chw;				/* character spacing */
double Chd;				/* character direction vector, x comp. */
int Paper = 0;				/* paper orientation */
double Lw;				/* current line width */
double StdLw = 1.0;			/* standard line width */
double Rgb;				/* color identifier */
double Rgbint;				/* color intensity identifier */

/* maxes for autoscaling -- currently not used */
double ASmaxes[30] = { 0.1, 0.5, 1, 5, 10, 20, 30, 50, 75, 100, 200, 300, 500, 750, 1000, 1250, 1500, 2000, 2500, 3000, 5000,
				10000, 20000, 30000, 50000, 100000 };

/* default tic increments */
double Incs[30]  = {  0.01, 0.05, 0.1, 1, 1, 2, 5, 5, 5, 10, 20, 20, 50, 50, 50, 50, 
				100, 100, 100, 200, 500, 500, 1000, 2000, 5000, 5000 };

/* default tic stub number formats */
char *Tformats[30]= { "%2.2f", "%2.2f", "%2.1f", "%2.1f", "%2.0f", "%2.0f", "%2.0f", "%2.0f", "%2.0f", "%3.0f", 
			"%3.0f", "%3.0f", "%3.0f", "%3.0f", "%4.0f", "%4.0f", "%4.0f", "%4.0f", "%4.0f", "%4.0f",
			"%4.0f", "%5.0f", "%5.0f", "%5.0f", "%5.0f", "%6.0f" };

double DXtic, DYtic;	/* tic increments */

char DXticfmt[12], DYticfmt[12];  /* printf format for numeric stubs */

char Tempfile[PATHNAME_LEN];	/* name of uniquely named temp file */

double Xmin, Xmax, Ymin, Ymax;	/* ranges of the input data, set by proc, before calling global()  */

int Hold;	/* TRUE if QuitAppend was called */

char Templatepath[PATHNAME_LEN];  /* location of templates and aux. files */

char Stdfont[FONTNAME_LEN];  /* page-wide default font */

char Controlfile[PATHNAME_LEN] = "";  /* name of control file */
SHAR_EOF
############################

cat << \SHAR_EOF > src/ipl.icon
/* Format_version=1, Width=64, Height=64, Depth=1, Valid_bits_per_item=16
 */
	0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
	0x0018,0x003C,0x0000,0x0000,0x0000,0x000C,0x0000,0x0000,
	0x3C78,0x6C0C,0x0000,0x0000,0x6618,0x760C,0x00FC,0x0000,
	0x6018,0x660C,0x00FC,0x0000,0x3C18,0x660C,0x00CC,0x7E00,
	0x0618,0x660C,0x00CC,0x7E00,0x6618,0x760C,0x00CC,0x6600,
	0x3C18,0x6C0C,0x00CC,0x6600,0x0000,0x6000,0x00CC,0x6600,
	0x0000,0x6000,0x00CC,0x6600,0x0000,0x6000,0x00CC,0x6600,
	0x0660,0x0000,0x00CC,0x6600,0x0660,0x0000,0x00CC,0x6600,
	0x0660,0x03F0,0x00CC,0x6600,0x0660,0x03F0,0x00CC,0x6600,
	0x0660,0x0330,0x00CC,0x6600,0x0660,0x0330,0x00CC,0x663F,
	0x0667,0xE330,0x00CC,0x663F,0x0667,0xE330,0x00CC,0x6633,
	0x0666,0x6330,0x00CC,0x6633,0x0666,0x6330,0x00CC,0x6633,
	0x0666,0x6331,0xF8CC,0x6633,0x0666,0x6331,0xF8CC,0x6633,
	0x0666,0x6331,0x98CC,0x6633,0x0666,0x6331,0x98CC,0x6633,
	0x0666,0x6331,0x98CC,0x6633,0x07E7,0xE3F1,0xF8FC,0x7E3F,
	0xFFFF,0xFFFF,0xFFFF,0xFFFF,0x8040,0x1004,0x0100,0x4010,
	0x8040,0x1004,0x0100,0x4010,0x8040,0x1004,0x0100,0x4010,
	0xAE40,0x1004,0x0100,0x4010,0xE1FE,0x1004,0x0100,0x5810,
	0xF801,0xFFFF,0xDFF7,0xE5FF,0xC800,0x000F,0xC100,0x6410,
	0xC000,0x0000,0x4100,0x4010,0xC000,0x0000,0xBD00,0x4410,
	0xC000,0x0000,0xA501,0xC410,0xC000,0x0000,0xC7F6,0x0DFF,
	0xC000,0x0000,0xC818,0x1810,0xC000,0x0001,0x49E0,0x0810,
	0x8000,0x0001,0xCE80,0x1C10,0x8000,0x0000,0x0000,0x6010,
	0x8000,0x0000,0x0000,0xC010,0x8000,0x0000,0x0000,0xFDFF,
	0x8000,0x0000,0x0001,0x4010,0x8000,0x0000,0x0001,0x4010,
	0xC000,0x0000,0x0002,0x4010,0xC000,0x0000,0x0002,0x43FF,
	0xE000,0x0000,0x0004,0x4201,0xA000,0x0000,0x0007,0xFE01,
	0x9000,0x0000,0x0008,0x427D,0x9000,0x0000,0x0000,0x4201,
	0x8800,0x0000,0x0010,0x427D,0x8600,0x0000,0x0020,0x4201,
	0xF7E0,0x0000,0x0077,0xFE7D,0x8050,0x00C7,0x1840,0x4201,
	0x8050,0x0134,0xE440,0x427D,0x8049,0x820C,0x2220,0x4201,
	0x804E,0x4208,0x2220,0x4201,0xFFFF,0xFFFF,0xFF3F,0xFFFF
SHAR_EOF
############################

cat << \SHAR_EOF > src/ipl.x
#include "graphic.x"
#include "ipl.d"

extern char Dev;
extern char D[ MAX_D_ROWS ][ MAX_D_COLS ][ DATAITEM_LEN ];	/* plot data */ 
extern int N_d_fields;					/* number of data fields per row */
extern int N_d_rows;					/* number of data rows */
extern char Buf[];					/* general purpose buffers */
extern char Buf2[];

extern double Chsz;				/* character size */
extern double Chw;				/* character spacing */
extern double Chh;				/* height of a line of text */
extern double Chd;				/* character direction vector, x comp. */
extern int Paper;				/* paper orientation */
extern double Lw;				/* current line width */
extern double StdLw;				/* standard line width */
extern double Rgb;				/* color identifier */
extern double Rgbint;				/* color intensity identifier */

extern double ASmaxes[];
extern double Incs[]; 
extern char *Tformats[];

extern double DXtic, DYtic;	
extern char DXticfmt[], DYticfmt[]; 
extern char Tempfile[];
extern double Xmin, Xmax, Ymin, Ymax;
extern int Hold;
extern char Templatepath[];
extern char Stdfont[];
extern char Controlfile[];
SHAR_EOF
############################

cat << \SHAR_EOF > src/iplps.c
/* Postscript driver for IPL.	
   (c) 1989 Steve Grubb
*/

#include <stdio.h>
#define YES 1
#define NO 0
#define PORTRAIT 0
#define LANDSCAPE 1
#define MARG_X 14 
#define MARG_Y 8 
#define PAGWIDTH 600;

static int orient;		/* paper orientation */
static int orgx, orgy;		/* location of origin on page */
static int theta;		/* current rotation for page orientation */
static char font[50];		/* current font name */
static int chdir;	 	/* char direction in degrees */
static int curpointsz;		/* current char size in points */
char *getok();
double atof();

/* ============================= */
PSsetup( )    /* initialize */
{  
/* set globals */
orient = -1;
strcpy( font, "/Helvetica" );
theta = 0;
chdir = 0;
curpointsz = 10;

/* print header */
printf(  
"%%!PS-Adobe-1.0\n%%%%Creator: IPL V1.0(c) 1989 Steve Grubb\n%%%%Pages: (atend)\n" );

	
/* set up macros (mainly to reduce output verbosity) */
printf(  "/sset\n" );
printf(  "{ translate rotate } def \n" );
printf(  "/sclr\n" );
printf(  "{ rotate translate } def \n" );
printf(  "/mv { moveto } def\n" );
printf(  "/np { newpath } def\n" );
printf(  "/ln { lineto } def\n" );
printf(  "/st { stroke } def\n" );
printf(  "/sh { show } def\n" );
printf(  "/cent { stringwidth pop sub 2 div 0 rmoveto } def\n" );
printf(  "/rjust { stringwidth pop sub 0 rmoveto } def\n" );

/* load default font */
printf(  "%s findfont\n", font );
printf(  "%d scalefont setfont\n", (int) curpointsz );

/* set up standard line width */
printf(  "1 setlinewidth\n" );

printf(  "%%%%EndProlog\n%%%%Page: ? 1\nsave\n" ); /* begin first page */
}


/* ============================= */
PSmoveto( x, y )
double x, y;
{

/* convert to p.s. units (1/72 inch) */
x = ( x * 72.0 ) +MARG_X; y = ( y * 72.0 ) + MARG_Y; 
printf(  "np\n%-5.2f %-5.2f mv\n", x, y ); 
}


/* ============================= */
PSlineto( x, y )
double x, y;
{
/* convert to p.s. units */
x = ( x * 72 ) +MARG_X; 
y = ( y * 72 ) +MARG_Y; 
printf(  "%-5.2f %-5.2f ln\n", x, y );
}

/* ============================== */
PSstroke( )
{
printf( "st\n" );
}


/* ============================= */
PSpath( x, y )
double x, y;
{
/* convert to p.s. units */
x = ( x * 72 ) +MARG_X; y = ( y * 72 ) + MARG_Y; 
printf(  "%-5.2f %-5.2f ln\n",  x, y );
}


/* ============================= */
PSshade( s )
double s;
{
printf(  "closepath\n%3.2f setgray\nfill\n0 setgray\n", s );
}

/* ============================== */
PSpaper( i )
int i;
{
if( orient != -1 ) return( 1 );		/* paper orientation - can only be done once per page */
if( i == 1 ) { /* handle landscape mode-- it's put into portrait mode before beginning each page */
	orgx = PAGWIDTH; 
	orgy = 0; 
	theta = 90; 
	printf(  "%d %d %d sset\n", theta, orgx, orgy );
	} 
orient = (int) i;
}


/* ================================= */
PStext( com, x, y, s, w )
char com;
double x, y;
char s[];
double w;
{
char str[400];
int i, j, k;

x = (x*72)+MARG_X;  y = (y*72)+MARG_Y; w *= 72;

/* if text direction is not normal do a rotate then move.. */
if( chdir != 0 ) printf(  "%d %-5.2f %-5.2f sset 0 0 mv\n", chdir, x, y ); 
/* normal direction-- do a move.. */
else printf(  "%-5.2f %-5.2f mv ", x, y );

if( member( com, "CJ" )) strip_ws( s );

/* escape out parens */
for( i = 0, j = 0; i < strlen( s ); i++ ) {
	if( s[i] == '(' || s[i] == ')' ) { str[j++] = '\\'; str[j++] = s[i]; }
	else str[j++] = s[i];
	}
str[j] = '\0';

/* centered text */
if( com == 'C' ) printf(  "%-5.2f (%s) cent ", w, str ); 
else if( com == 'J' ) printf(  "%-5.2f (%s) rjust ", w, str );

/* do the string */
printf(  "(%s) sh\n", str );

if( chdir != 0 ) printf(  "%-5.2f %-5.2f %d sclr\n", -x, -y, -chdir ); /* restore */
}


/* ================================= */
PSpointsize( p )
int p;
{
if( p != curpointsz ) { 	/* char size (specified in points) */
	curpointsz = p;
	printf(  "%s findfont\n", font );
	printf(  "%d scalefont\nsetfont\n", p );
	}
}


/* ================================== */
PSfont( f )
char f[];
{
if( strcmp( f, font ) != 0 ) {
	strcpy( font, f );
	printf(  "%s findfont\n", font );
	printf(  "%d scalefont setfont\n", curpointsz );
	}
}

/* ================================== */
PSchardir( t )
int t;
{
chdir = t;
}


/* ================================== */
PSlinetype( s, x, y )
char s[];
double x, y;
{
/* X = line width;  Y = dash pattern magnification (0.1 to 10)
 *  S indicates dash pattern.  If S is "0", an unbroken (normal) line is produced.
 *  If S is "1" through "8", a preset dash pattern is used.  Otherwise, S is
 *  assumed to hold the dash pattern string "[ n1 n2 n3.. ]".	
 */
static int dash[10][6]= { {0,0,0,0,0,0}, {1,1}, {3,1}, {5,1}, {2,1,1,1}, {4,1,1,1}, {6,1,1,1}, 
			  {2,1,1,1,1,1}, {4,1,1,1,1,1}, {6,1,1,1,1,1} };
int ltype, i;

printf(  "%3.1f setlinewidth\n", x );
if( strlen( s ) < 1 || strcmp( s, "0" )==0 ) printf(  "[] 0 setdash\n" );
else 	{
	if( strlen( s ) > 1 ) { 
		ltype = 0; 
		sscanf( s, "%d %d %d %d %d %d", &dash[0][0], &dash[0][1], &dash[0][2], 
			&dash[0][3], &dash[0][4], &dash[0][5] );
		}
	else ltype = atoi( s );
	printf(  "[" );
	for( i = 0; i < 6; i++ ) 
		if( dash[ ltype ][ i ] > 0 ) printf(  "%3.1f ", dash[ ltype ][ i ] * y );
	printf(  "] 0 setdash\n" );
	}
}
	

/* =================================== */

PSshow()
{
if( orient == 1 )printf(  "%d %d %d sclr\n", -orgx, -orgy, -theta ); /* restore rotation */
orient = -1; 
printf( "showpage\nrestore\nsave\n" );
}

/* =================================== */
SHAR_EOF
############################

cat << \SHAR_EOF > src/legend.c
/* legend() - creates legend for line and bar graphs */
#include "ipl.x"
#define SHADE	1
#define MARK	4	
#define LINE	8	
#define MAXENTRIES 10

Legend( )
{
double	val[MAXENTRIES],
	locx, locy,
	margin,
	piclen,
	lablen,
	depth,
	x, ylo, yhi,
	lx, ly, cx, cy, bxw, ty,
	mrksize,
	stdsize,
	pm[MAXENTRIES],
	ms[MAXENTRIES],
	th[MAXENTRIES],
	thick = 1,
	magnify;
int 	i, 
	n,
	format,
	lenmax, 
	outline,
	nms,
	nlt,
	npm,
	nth,
	nmf,
	nent;
char 	ent[MAXENTRIES][100],
	poscode[4],
	stdfont[FONTNAME_LEN],
	mrkfont[FONTNAME_LEN],
	lt[MAXENTRIES][3],
	mrk[MAXENTRIES][10],
	mf[MAXENTRIES][20],
	linetype[3];



gget( Buf, "Entry.font" );
strcpy( stdfont, Buf ); NTfont( Buf ); /* go to standard font */

strcpy( mrkfont, Stdfont ); /* default mark font */

/* position of legend can either be specified using a corner A,B,C,D or by giving an
   x,y location for the upper left corner of the legend.
*/
gget( poscode, "Corner" );
gget( Buf, "Location" ); 
if( strlen( Buf ) > 0 ) sscanf( Buf, "%lf %lf", &locx, &locy );
else { locx = 0; locy = 0; }

gget( Buf, "Location.system" );
if( strcmp( Buf, "data" )==0 ) { locx = da_x( locx ); locy = da_y( locy ); }



/* get entries and find longest one */
gget( Buf, "Entry" );
lenmax = 0;
nent = countln( Buf );
if( nent > MAXENTRIES ) { fprintf( stderr, "Maximum of 10 legend entries" ); nent = 10; }
getln( "" );
for( i = 0; i < nent; i++ ) {
	strcpy( ent[i], getln( Buf ) );
	if( strlen( ent[i] ) > lenmax ) lenmax = strlen( ent[i] ); 
	}

/* figure if we're doing lines or shades, and get 'em */
format = 0;
gget( Buf, "Shade" ); 
if( strlen( Buf ) > 0 ) { 
	format = SHADE; 
	n = sscanf( Buf, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", 
		&val[0],&val[1],&val[2],&val[3],&val[4],&val[5],&val[6],&val[7],&val[8],&val[9] );
	if( n < nent ) { fprintf( stderr, "need %d shades.\n", nent ); gdp_exit(); }
	}
gget( Buf, "Linetype" );
if( strlen( Buf ) > 0 ) {
	format = LINE;
	nlt = sscanf( Buf, "%s %s %s %s %s %s %s %s %s %s", 
		lt[0],lt[1],lt[2],lt[3],lt[4],lt[5],lt[6],lt[7],lt[8],lt[9] );
	gget( Buf, "Linetype.magnify" );
	npm = sscanf( Buf, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", 
		&pm[0],&pm[1],&pm[2],&pm[3],&pm[4],&pm[5],&pm[6],&pm[7],&pm[8],&pm[9] );
	gget( Buf, "Linethick" );
	nth = sscanf( Buf, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", 
		&th[0],&th[1],&th[2],&th[3],&th[4],&th[5],&th[6],&th[7],&th[8],&th[9] );
	}


gget( Buf, "Mark" );
if( strlen( Buf ) > 0 ) {
	format += MARK;
	n = sscanf( Buf, "%s %s %s %s %s %s %s %s %s %s", 
		mrk[0],mrk[1],mrk[2],mrk[3],mrk[4],mrk[5],mrk[6],mrk[7],mrk[8],mrk[9] );
	if( n < nent ) { fprintf( stderr, "need %d marks\n", nent ); gdp_exit(); }

	gget( Buf, "Mark.font" );
	nmf = sscanf( Buf, "%s %s %s %s %s %s %s %s %s %s",
		mf[0], mf[1], mf[2], mf[3], mf[4], mf[5], mf[6], mf[7], mf[8], mf[9] );

	gget( Buf, "Mark.size" ); 
	nms = sscanf( Buf, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", 
		&ms[0],&ms[1],&ms[2], &ms[3], &ms[4], &ms[5], &ms[6], &ms[7], &ms[8], &ms[9] );
	}


margin = .20;
lablen = lenmax * (Chh*0.6); /* lenmax = space in plot units of longest label */

if( format == SHADE || format == MARK ) piclen = .20;  /* piclen = size in x of line or swatch */
else piclen = 1.10;

depth = (Chh*1.2) * (nent+1);
if( format == SHADE ) depth *= 1.65;

/* generate legend */
if( locx != 0 || locy != 0 ) { lx = locx; ly = locy; }
else if( poscode[0] == 'A' ) { lx = Xlo + 0.1; ly = Yhi - 0.1; }
else if( poscode[0] == 'B' ) { lx = Xhi - (lablen+piclen+margin); ly = Yhi - 0.1; }
else if( poscode[0] == 'C' ) { lx = Xhi - (lablen+piclen+margin); ly = Ylo + depth; }
else if( poscode[0] == 'D' ) { lx = Xlo + 0.1; ly = Ylo + depth ; }
else { fprintf( stderr, "Legend location must be given. Use either Corner or Location parameter." ); gdp_exit(); }

/* do a legend title */
gget( Buf, "Title.size" );
NTptsize( atof( Buf ) );
gget( Buf, "Title" );
ty = ly + (countln( Buf ) * Chh);
getln( "" );
for( i = 0; i < countln( Buf ); i++ ) {
	NTmov( lx, ty );
	NTcentext( getln( Buf ), (lablen+piclen) );
	ty -= Chh;
	}

gget( Buf, "Entry.size" ); stdsize = atof( Buf ); NTptsize( stdsize );

gget( Buf, "Backshade" );
if( strlen( Buf ) > 0 ) {
	ab_rect( lx-.08, ly - (depth)+0.02, lx+(lablen+piclen), ly+.08, atof( Buf ), 0 );
	}
gget( Buf, "Outlinebars" );
if( Buf[0] == 'y' ) outline = YES;
else outline = NO;

cx = lx; cy = ly;
for( i = 0; i < nent; i++ ) {

	if( format >= MARK && i < nms ) mrksize = ms[i];
	if( format >= LINE && i < nlt ) strcpy( linetype, lt[i] );
	if( format >= LINE && i < npm ) magnify = pm[i];
	if( format >= LINE && i < nth ) thick = th[i];
	if( format >= MARK && i < nmf ) strcpy( mrkfont, mf[i] );

	/* trap */ if( format >= LINE && ( thick < 0.01 || thick > 20 )) { 
		fprintf( stderr, "Internal error. Try again.\n" ); gdp_exit(); 
		}

	if( format == SHADE || format == MARK ) {
		if( format == SHADE ) {
			cy -= 0.1; x = cx; bxw =  0.2; ylo = cy - 0.1; yhi = cy + 0.1;
			if( outline || val[i] == 1.0 )ab_rect( x, ylo, x+bxw, yhi, val[i], 1 );
			else ab_rect( x, ylo, x+bxw, yhi, val[i], 0 );
			}
		else if( format == MARK ) { 
			NTfont( mrkfont ); NTptsize( mrksize );
			if( strncmp( mrk[i], "sym", 3 )==0 ) point( cx, cy, mrk[i], Chh*0.4 );
			else {
				NTmov( cx, cy-0.06 ); 
				NTtext( mrk[i] ); 
				NTfont( stdfont ); 
				}
			NTmov( cx, cy ); 
			NTfont( stdfont ); NTptsize( stdsize );
			}
		NTmov( cx+0.4, cy-0.06 );
		NTtext( ent[i] );
		}
	else if( format >= LINE ) {
		NTlinetype( linetype, thick, magnify );
		NTmov( cx, cy );
		NTlin( cx+1.0, cy );
		if( format == LINE + MARK ) {
			NTfont( mrkfont ); NTptsize( mrksize );
			if( strncmp( mrk[i], "sym", 3 )==0 ) {
				point( cx+0.2, cy, mrk[i], Chh*0.4 );
				point( cx+0.8, cy, mrk[i], Chh*0.4 );
				}
			else {
				NTfont( mrkfont ); NTptsize( mrksize ); 
				NTmov( cx+0.2, cy-0.03 ); NTtext( mrk[i] );
				NTmov( cx+0.8, cy-0.03 ); NTtext( mrk[i] ); 
				NTfont( stdfont ); NTptsize( stdsize );
				}
			NTfont( stdfont ); NTptsize( stdsize );
			}
		NTmov( cx+1.1, cy-0.06 );
		NTtext( ent[i] );
		NTnormline();
		}
	cy -= (Chh*1.2); 
	}
}
SHAR_EOF
############################

cat << \SHAR_EOF > src/lib.c
#include <stdio.h>
#include <ctype.h>


/* ================================ */
/* getfld()
/* Gets fields which are separated by ":". */
/* Natural ":" which appear in text must be prefixed by a backslash. */
/* Deletes the ':' and all leading and trailing white space. */
/* Leaves index pointing at next char. */

getfld( out, line, index )
char out[], line[];
int *index;
{
int i, j, esc;

j = 0;
for( i = *index; i < strlen( line ); i++ ) {
	if( line[i] == ' ' || line[i] == '\t' ) continue;
	else break;
	}
for( ; i < strlen( line ); i++ ) {
	if( line[i] == '\\' ) { esc = 1; continue; }
	if( line[i] == ':' && ! esc ) { i++; esc = 0; break; }
	else out[j++] = line[i];
	esc = 0;
	}
j--;
for( ; j > 0; j-- ) {
	if( out[j] == ':' || out[j] == ' ' || out[j] == '\t' || out[j] == '\n' || out[j] == '\0' ) continue;
	else break;
	}
out[ j+1 ] = '\0';
*index = i;
}


/* ==========================================
 * getok( )
*/
#define GETOKMAX	100
char *getok( string, index )
	char	string[];	/* array to obtain token from */
	int	*index;
	{
		static char	tok[GETOKMAX+1];
		register	n;
		while( member( string[(*index)], " \t\n" ) ) (*index)++; 
		/* EAT( SPACE, TAB, EOR, string, (*index) ); */
		for( n=0;
			n <= GETOKMAX &&
			string[*index] != ' '  &&
			string[*index] != '\t'  &&
			string[*index] != '\n'  &&
			string[*index] != '\0'  ;
				tok[n++] = string[(*index)++] )  ;
		tok[n] = '\0' ;
		if( n > GETOKMAX ) fprintf( stderr, "token %s too long\n", tok );
		return(tok);
	}

/* ================================== */
/* goodnum() - checks a token to see if it is a legal number,
	either float or integer, returns 1 if so, 0 if not a
	legal number.  2nd arg is precision, ie the position of
	the decimal point 
*/
#include <ctype.h>
#define YES 1
#define NO 0
goodnum( str, prec )
char str[];
int *prec;
{
int l, p, bad, point;
l = strlen( str );
if( l < 1 ) return( 0 );
bad = NO; *prec = -1;
for( p = 0; p < l; p++ ) { 
	if( str[p] == '.' ) { if( *prec == -1 ) *prec = p; else bad=YES; }
	else if( p == 0 && l > 1 && ( str[p] == '-' || str[p] == '+' ) );
	else if( ! isdigit( str[p]) ) bad=YES;
	}
if( bad ) return( 0 );
else return( 1 );
}


/* =================================== */
/* member() - returns char position if character c is a member of string s, 
		0 otherwise. Char positions start with 1 for this purpose. */
member( c, s )
char c, s[];
{
int i;
for( i = 0; i < strlen( s ); i++ ) if( s[i] == c ) return( i+1 );
return( 0 );
}



/* =================================== */
/* smember() - returns 1 if string s is present as a token in string t,
		0 otherwise. */
smember( s, t )
char s[], t[];
{
char tok[100], *getok();
int i;
i = 0;
while( 1 ) {
	strcpy( tok, getok( t, &i ) );
	if( tok[0] == '\0' ) break;
	if( strcmp( tok, s ) == 0 ) return( 1 );
	}
return( 0 );
}


/* =================================== */
/* strip white-space off of front and end of string s */
strip_ws( s )
char s[];
{
int i, j;
/* find last significant char and put a null after it */
for( j = strlen( s ) -1; j >= 0; j-- )
	if( !member( s[j], " \t\n" )) break;
s[j+1] = '\0';
/* find 1st significant char at position i */
for( i = 0; i < strlen( s ); i++ ) 
	if( !member( s[i], " \t\n" )) break; 
strcpy( s, &s[i] );
}

/* ================= */
sysdate( mon, day, yr )
int	*mon, *day, *yr ;
{
	int	tvec[2], *dtime ;

	time( tvec );
	dtime = (int *)(localtime( tvec ));
	*mon = *(dtime+4) + 1 ;
	*day = *(dtime+3)  ;
	*yr = *(dtime+5)  ;
}
/* ================= */
systime( hour, min, sec )
int	*hour, *min, *sec ;
{
	int	tvec[2], *dtime ;

	time( tvec );
	dtime = (int *)localtime( tvec );
	*hour = *(dtime+2) ;
	*min = *(dtime+1)  ;
	*sec = *(dtime)  ;
}


SHAR_EOF
############################

cat << \SHAR_EOF > src/lineplot.c
#include "ipl.x"

Lineplot( )
{
int 	i, j, p,
	ncurves,
	xfield, yf[10],
	nlab,
	nmrk,
	nsh,
	number,
	nums,
	accum,
	stair,
	x0or1,
	stairbars;
	
double 	prvx, prvy,
	x, y,
	cx, cy,
	lblsiz,
	mrksiz,
	size,
	nofs,
	zer,
	pm[10],
	th[10],
	sh[10];

char 	lt[10][3],
	lb[10][20],
	str[12],
	mk[10][10];


/* get data fields */
gget( Buf, "Xfield" ); 
xfield = atoi( Buf );

gget( Buf, "Xstart.0or1" );
x0or1 = atoi( Buf );

gget( Buf, "Yfield" ); 
ncurves = sscanf( Buf, "%d %d %d %d %d %d %d %d %d %d", 
	&yf[0], &yf[1], &yf[2], &yf[3], &yf[4], &yf[5], &yf[6], &yf[7], &yf[8], &yf[9]  );
for( i = 0; i < ncurves; i++ ) if( yf[i] < 1 || yf[i] > N_d_fields ) { fprintf( stderr, "Yfield bad.\n" ); gdp_exit(); }
if( ncurves < 1 ) { fprintf( stderr, "Yfield must be specified.\n" ); gdp_exit(); }

gget( Buf, "Accum" ); if( Buf[0] == 'y' ) accum = YES; else accum = NO;


/* get line parameters for curves */
gget( Buf, "Linetype" );
sscanf( Buf, "%s %s %s %s %s %s %s %s %s %s", 
	lt[0],lt[1],lt[2],lt[3],lt[4],lt[5],lt[6],lt[7],lt[8],lt[9] );
gget( Buf, "Linetype.magnify" );
sscanf( Buf, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", 
	&pm[0],&pm[1],&pm[2],&pm[3],&pm[4],&pm[5],&pm[6],&pm[7],&pm[8],&pm[9] );
gget( Buf, "Linethick" );
sscanf( Buf, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", 
	&th[0],&th[1],&th[2],&th[3],&th[4],&th[5],&th[6],&th[7],&th[8],&th[9] );
gget( Buf, "Mark" );
nmrk = sscanf( Buf, "%s %s %s %s %s %s %s %s %s %s", 
	mk[0],mk[1],mk[2],mk[3],mk[4],mk[5],mk[6],mk[7],mk[8],mk[9] );
gget( Buf, "Mark.size" ); mrksiz = atof( Buf );
NTptsize( mrksiz );
size = Chh * 0.4;

gget( Buf, "Shade" );
nsh = sscanf( Buf, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf", 
	&sh[0],&sh[1],&sh[2],&sh[3],&sh[4],&sh[5],&sh[6],&sh[7],&sh[8],&sh[9] );
gget( Buf, "Zeroat" ); zer = atof( Buf );

gget( Buf, "Label" );
nlab = countln( Buf );
getln( "" );
for( i = 0; i < nlab; i++ ) {
	strcpy( lb[i], getln( Buf ) );
	}

gget( Buf, "Stairstep" ); if( Buf[0] == 'y' ) stair = YES; else stair = NO;
gget( Buf, "Stairstep.bars" ); 
if( Buf[0] == 'y' ) { stairbars = YES; stair = YES; }
else stairbars = NO; /* for steps over bars */

gget( Buf, "Label.size" ); lblsiz = atof( Buf );

gget( Buf, "Numberfinal" ); if( Buf[0] == 'y' ) number = YES; else number = NO;
gget( Buf, "Numbers" ); if( Buf[0] == 'y' ) nums = YES; else nums = NO;
gget( Buf, "Numbers.offset" ); nofs = atof( Buf );

NTptsize( lblsiz );

/* do shading */
for( j = 0; j < ncurves; j ++ ) {
	if( nsh >= j ) {
		if( stair ) fprintf( stderr, "warning, stairstep can't be combined with shading\n" ); 
		y = atof( D[0][yf[j]-1] );
		if( x0or1 ) x = 1;
		else x = atof( D[0][xfield-1] );
		NTm( x, zer );
		NTp( x, y );
		for( i = 0; i < N_d_rows-1; i++ ) {
			/* get current x, y */
			if( xfield < 1 ) x = i + 2;
			else x = atof( D[i+1][xfield-1] );
			if( accum ) y += atof( D[i+1][yf[j]-1] );
			else y = atof( D[i+1][yf[j]-1] );
			NTp( x, y );
			}
		NTp( x, zer );
		NTshade( sh[j] );
		}
	}

/* do the curves */
for( j = 0; j < ncurves; j ++ ) {


	NTlinetype( lt[j], th[j], pm[j] );

	/* find 1st y */
	y = atof( D[0][yf[j]-1] );
	/* find 1st x */
	if( x0or1 ) {
		if( stairbars ) x = 0.5;
		else x = 1;
		}
	else x = atof( D[0][xfield-1] );
	prvx = x;
	prvy = y;
	
	/* move to beginning of line */
	NTm( x, y );

	for( i = 0; i < N_d_rows-1; i++ ) {

		/* skip bad values.. */
		if( ! goodnum( D[i+1][yf[j]-1], &p ) ) {
			fprintf( stderr, "Warning, row %d field %d is bad (%s)\n", i+2, yf[j], D[i+1][yf[j]-1] );
			continue;
			}
		

		/* get current x, y */
		if( xfield < 1 ) {
			if( stairbars ) x = i+1.5;
			else x = i+2;
			}
		else 	x = atof( D[i+1][xfield-1] );
		if( accum ) y += atof( D[i+1][yf[j]-1] );
		else y = atof( D[i+1][yf[j]-1] );

		/* if doing stairsteps, get last x and y */
		if( stair ) { 
			if( xfield < 1 ) {
				if( stairbars ) prvx = i + .5 ;
				else prvx = i+1;
				}
			else prvx = atof( D[i][xfield-1] );
			if( accum ) prvy += atof( D[i][yf[j]-1] );
			else prvy = atof( D[i][yf[j]-1] );
			
			NTl( x, prvy );
			if( nums ) { 
				NTmov( da_x(prvx), da_y(prvy)+nofs );
				sprintf( str, DYticfmt, prvy );
				NTcentext( str, da_x(x)-da_x(prvx) ); 
				NTm( x, prvy ); 
				}
			}
		NTl( x, y );
		if( nums && ! stair ) { 
			sprintf( str, DYticfmt, y );
			NTmov( da_x(x)-1, da_y(y)+nofs );
			NTcentext( str, 2 ); NTm( x, y ); 
			}
		}
	
	if( stair ) { /* give line a tail */
		if( nums ) { sprintf( str, DYticfmt, y ); NTmov( da_x( x ), da_y( y )+nofs ); NTtext( str ); }
		NTm( x, y );
		x += (DXtic*.7);
		NTl( x, y );
		}
	if( nlab > 0 ) {
		NTmov( da_x( x )+ 0.05, da_y( y ) - (Chh/2) );
		NTtext( lb[j] );
		}
	if( number ) {
		sprintf( str, DYticfmt, y );
		NTmov( da_x( x )+ 0.05, da_y( y ) + (Chh/1.8) );
		NTtext( str );
		}
	/* put marks on lines */
	if( nmrk >= j ) {
		if( stair )fprintf( stderr, "warning, stairstep can't be combined with point marks\n"); 
		y = atof( D[0][yf[j]-1] );
		if( x0or1 ) x = 1;
		else x = atof( D[0][xfield-1] );
		if( strncmp( mk[j], "sym", 3 )==0 ) point( da_x( x ), da_y( y ), mk[j], size );
		for( i = 0; i < N_d_rows-1; i++ ) {
			/* get current x, y */
			if( xfield < 1 ) x = i + 2;
			else x = atof( D[i+1][xfield-1] );
			if( accum ) y += atof( D[i+1][yf[j]-1] );
			else y = atof( D[i+1][yf[j]-1] );
			if( strncmp( mk[j], "sym", 3 )==0 ) point( da_x( x ), da_y( y ), mk[j], size );
			}
		}
	}
NTnormline();
}
SHAR_EOF
############################


-- 
Please send comp.sources.unix-related mail to rsalz at uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.



More information about the Comp.sources.unix mailing list