rsalz@uunet.uu.net (Rich Salz) (03/24/90)
Submitted-by: Steve Grubb <uunet!lsr-vax!scg> Posting-number: Volume 21, Issue 40 Archive-name: ipl/part09 # ipl part09 # 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/page.c # src/pcode.c # src/pick.c # src/pie.c # src/point.c # src/polygon.c # src/proc_call.c # src/rangebar.c # src/rect.c cat << \SHAR_EOF > src/page.c #include "ipl.x" /* Page-wide things, page title, etc. Note that user does not have to execute this. */ Page( ) { int i = 1, c; char paper[20]; double ofs; FILE *fp; /* paper orientation */ gget( paper, "Paperway" ); if( strcmp( paper, "landscape" )==0 ) { NTpaper( 1 ); if( member( Dev, "sv" ))ab_rect( 0.0, 8.5, 11.0, 11.0, 0.5, 0 ); } else if( strcmp( paper, "portrait" )==0 ) { NTpaper( 0 ); if( member( Dev, "sv" ))ab_rect( 8.5, 0.0, 11.0, 11.0, 0.5, 0 ); } else NTpaper( 0 ); /* standard line width */ gget( Buf2, "Standard.linethick" ); if( atof( Buf2 ) > 0 ) StdLw = atof( Buf2 ); NTnormline(); gget( Buf2, "Standard.font" ); strcpy( Stdfont, Buf2 ); gget( Buf2, "Title.font" ); NTfont( Buf2 ); gget( Buf2, "Title.size" ); NTptsize( atof( Buf2 ) ); gget( Buf2, "Title.belowtop" ); ofs = atof( Buf2 ); gget( Buf, "Title.file" ); if( strlen( Buf ) > 0 ) { fp = fopen( Buf, "r" ); if( fp == NULL ) fp = popen( Buf, "r" ); if( fp == NULL ) { fprintf( stderr, "Can't open title file.\n" ); gdp_exit(); } while( fgets( Buf, 512, fp ) != NULL ) { strip_ws( Buf ); /* if( strlen( Buf ) < 1 ) continue; */ if( Paper == 0 ) NTmov( 0.0, 10.5-ofs ); else NTmov( 0.0, 8-ofs ); if( Paper == 0 && strlen( Buf ) >= 1 )NTcentext( Buf, 8 ); if( Paper == 1 && strlen( Buf ) >= 1 )NTcentext( Buf, 10.5 ); ofs += Chh; } fclose( fp ); } gget( Buf, "Title" ); if( strlen( Buf ) > 0 ) { getln( "" ); for( i = 0; i < countln( Buf ); i++ ) { if( Paper == 0 ) NTmov( 0.0, 10.5-ofs ); else NTmov( 0.0, 8-ofs ); if( Paper == 0 )NTcentext( getln( Buf ), 8 ); if( Paper == 1 )NTcentext( getln( Buf ), 10.5 ); ofs += Chh; } } } SHAR_EOF ############################ cat << \SHAR_EOF > src/pcode.c #include <stdio.h> /* ============================ */ /* IPL device interface (c) 1989 Steve Grubb */ /* This must be compiled either with or without flag NOSUNVIEW */ static char pdev; static int vertchar = 0; pcode( op, x, y, s ) char op; /* op code */ double x, y; /* coordinates */ char s[]; /* optional character string */ { int outx, outy, move; char ans[10], pbuf[400]; static double curx = 0, cury = 0; static int doclip = 0; double p1[2], p2[2]; double x1, y1, x2, y2; double width, realx, chh; static int new = 0, drawing = 0; /* interface to postscript driver */ if( pdev == 't' ) { if( op != 'L' ) { if( drawing ) PSstroke(); drawing = 0; } if( op == 'L' ) { if( new ) PSmoveto( curx, cury ); PSlineto( x, y ); new = 0; drawing = 1; } else if( op == 'M' ) { new = 1; curx = x; cury = y; } else if( op == 'P' ) { if( new ) PSmoveto( curx, cury ); PSpath( x, y ); new = 0; } else if( op == 'T' ) PStext( op, curx, cury, s, 0.0 ); else if( op == 'C' ) PStext( op, curx, cury, s, x ); else if( op == 'J' ) PStext( op, curx, cury, s, x ); else if( op == 'S' ) PSshade( x ); else if( op == 'O' ) PSpaper( (int)x ); else if( op == 'I' ) PSpointsize( (int)x ); else if( op == 'F' ) PSfont( s ); else if( op == 'D' ) PSchardir( (int)x ); else if( op == 'Y' ) PSlinetype( s, x, y ); else if( op == 'Z' ) PSshow(); else if( op == 'K' ) doclip = 1; else if( op == 'k' ) doclip = 0; } /* interface to sunview driver */ /* the routines SVtext, SVcentext, and SVrightjust return information for keeping a bounding box list. */ #ifndef NOSUNVIEW else if( pdev == 's' ) { if( op == 'L' ) SVlineto( x, y ); else if( op == 'P' ) SVpath( x, y ); else if( op == 'M' ) SVmoveto( x, y ); else if( op == 'T' && !vertchar ) SVtext( s, &width ); else if( op == 'B' ) SVbatch_on(); else if( op == 'b' ) SVbatch_off(); else if( op == 'Y' ) SVlinetype( s, x, y ); else if( op == 'S' ) SVshade( x ); else if( op == 'I' || op == 'F' ) { SVpointsize( (int)(x) ); chh = (x+2)/72.0; } else if( op == 'C' && !vertchar ) SVcentext( s, x, &curx, &width ); else if( op == 'J' && !vertchar ) SVrightjust( s, x, &curx, &width ); else if( op == 'W' ) SVwait(); else if( op == 'D' ) { if( x == 90 || x == 270 ) vertchar = 1; else vertchar = 0; } else if( op == 'Z' ) { SVclear(); } else if( op == 'K' ) doclip = 1; else if( op == 'k' ) doclip = 0; } #endif else if( pdev == 'm' ) return( 1 ); /* term-oriented composer-- no graphics */ else { fprintf( stderr, "pcode: %c: no such device\n", pdev ); exit(); } } /* ========================================================== */ /* initialize */ NTinit( dev ) char dev; { int yr, mon, day, hr, min, sec, i; char host[30]; sysdate( &mon, &day, &yr ); systime( &hr, &min, &sec ); fprintf( stderr, "IPL graphics system version 1.0 by Steve Grubb\n" ); /* initialize devices */ if( dev == 's' || dev == 'v' ) { SVsetup( 11.0, 11.0 ); SVclear(); pdev = 's'; } else if( dev == 't' ) { PSsetup( ); pdev = 't'; } else if( dev == 'm' ) { pdev = 'm'; return( 1 ); } else { fprintf( stderr, "NTinit: %c: no such device\n", dev ); exit(); } } SHAR_EOF ############################ cat << \SHAR_EOF > src/pick.c /* These routines are for getting user input. If Dev is 'v' (indicating sunview composer), window and mouse-oriented input is used. If Dev is 'm' (indicating terminal composer), terminal oriented input is used. */ #include "ipl.x" #define MAXBB 80 /* event modes */ #define PICK 1 /* getting a menu selection */ #define STRING 2 /* getting a \n terminated string */ #define EVENTS 3 /* getting any mouse-button or keyboard event */ static FILE *fp = NULL; static double bb[MAXBB][4]; static double bbxlo, bbylo, bbxhi, bbyhi; static char name[MAXBB][80]; static char selection[80]; static int nbb, menu_mode, event_mode; static double evx, evy; static int eid; static int getting_text; static double Y; int box_given = 0; int transparent = 0; double BX1, BY1, BX2, BY2; /* ======================================== */ /* getpick - draws a menu then gets user response and sends back the name of the menu box selected. Menu can be defined in a file or by a string of tokens. New is normally 1, but can be set to 0 to append to an existing bounding box list. Draw is normally 1 but can be set to 0 to "overlay" graphics. */ getpick( rtn, proc, new, draw ) char rtn[]; /* user's selection placed here */ char proc[]; /* name of menu def file */ int new; /* if yes, start a new bounding box list */ int draw; /* if yes, draw menu; if no, don't draw menu */ { int ix, fromstring, ixx, e; char coords[80], label[80], buf[200]; double x, y; fromstring = 0; if( strlen( proc ) < 1 ) goto SKIP; /* for null argument.. */ sprintf( buf, "%s/%s", Templatepath, proc ); fp = fopen( buf, "r" ); if( fp == NULL ) { fromstring = 1; y = 10; ixx = 0; } if( new ) { nbb = 0; bbxlo = 999; bbxhi = -999; bbylo = 999; bbyhi = -999; } if( draw ) { NTbatch_on(); NTfont( "/Helvetica-Oblique" ); NTptsize( 10 ); NTlinetype( "0", 3, 1 ); } if( Dev == 'm' ) fprintf( stderr, "=====================\n" ); while( 1 ) { if( fromstring ) { bb[nbb][0] = 8.0; bb[nbb][1] = y-0.4; bb[nbb][2] = 11.0; bb[nbb][3] = y; strcpy( name[nbb], getok( proc, &ixx )); if( strlen( name[nbb] ) < 1 ) break; strcpy( label, name[nbb] ); y -= 0.5; } else { /* from file */ if( fgets( buf, 200, fp ) == NULL ) break; ix = 0; getfld( coords, buf, &ix ); getfld( label, buf, &ix ); getfld( name[nbb], buf, &ix ); sscanf( coords, "%lf %lf %lf %lf", &bb[nbb][0], &bb[nbb][1], &bb[nbb][2], &bb[nbb][3] ); } if( draw ) { ab_rect( bb[nbb][0], bb[nbb][1], bb[nbb][2], bb[nbb][3], 1.0, 1 ); NTmov( bb[nbb][0], bb[nbb][1] + ((bb[nbb][3]-bb[nbb][1])/2.0) ); NTcentext( label, bb[nbb][2]-bb[nbb][0] ); } if( bb[nbb][0] < bbxlo ) bbxlo = bb[nbb][0]; if( bb[nbb][1] < bbylo ) bbylo = bb[nbb][1]; if( bb[nbb][2] > bbxhi ) bbxhi = bb[nbb][2]; if( bb[nbb][3] > bbyhi ) bbyhi = bb[nbb][3]; if( Dev == 'm' ) fprintf( stderr, "%-2d) %s\n", nbb+1, name[nbb] ); /* term menu */ nbb ++; } if( fp != NULL ) fclose( fp ); if( draw ) { NTnormline(); NTbatch_off(); } SKIP: event_mode = PICK; NTwait(); /* let user pick */ get_event( &x, &y, &e ); /* spurious event */ if( Dev == 'm' ) while( 1 ) { /* term menu */ fprintf( stderr, "Selection: " ); fgets( buf, 10, stdin ); if( atoi( buf ) > 0 && atoi( buf ) <= nbb ) { strcpy( selection, name[ atoi( buf ) -1 ] ); break; } } strcpy( rtn, selection ); } /* ================================ */ /* This gets called by the driver when 1) we are waiting for an event by calling NTwait(), and 2) a key or mouse event happens. */ /* NOTE: menu picking is in effect while getting a string */ handle_event( x, y, e ) double x, y; int e; { int i; /* for menus.. */ if( event_mode == PICK ) { /* look up (x,y) in bounding box list */ if( x > bbxlo && x < bbxhi && y > bbylo && y < bbyhi ) { for( i = nbb-1; i >= 0; i-- ) { if( x > bb[i][0] && y > bb[i][1] && x < bb[i][2] && y < bb[i][3] ) break; } if( i == nbb ) return( 0 ); /* not found */ strcpy( selection, name[i] ); return( 1 ); /* found */ } } /* for strings */ else if( event_mode == STRING && e > 0 && e < 128 ) { selection[0] = (char) e; selection[1] = '\0'; return( 1 ); } else if( event_mode == EVENTS ) { evx = x; evy = y; eid = e; return( 1 ); } return( 0 ); } /* ================================== */ message( s1, s2, s3, s4 ) char s1[], s2[], s3[], s4[]; { NTptsize( 10 ); ab_rect( 8.0, 10.0, 11.0, 11.0, 1.0, 1 ); NTmov( 8.1, 10.7 ); NTtext( s1 ); NTmov( 8.1, 10.5 ); NTtext( s2 ); NTmov( 8.1, 10.3 ); NTtext( s3 ); NTmov( 8.1, 10.1 ); NTtext( s4 ); if( Dev == 'm' ) fprintf( stderr, "\t\t* %s\n\t\t* %s\n\t\t* %s\n\t\t* %s\n", s1, s2, s3, s4 ); } /* ==================================== */ get_event( x, y, e ) double *x, *y; int *e; { char ans[20]; event_mode = EVENTS; NTwait(); *x = evx; *y = evy; *e = eid; } /* ==================================== */ /* prompts user for one line of text */ get_string( s, p ) char s[], p[]; { int i; double x, y; if( Dev == 'm' ) { /* terminal interface */ fprintf( stderr, "%s: ", p ); fgets( s, 100, stdin ); return( 1 ); } if( !box_given ) { BX1 = 0.3; BY1 = 0.1; BX2 = 9; BY2 = 0.5; } if( getting_text ) y = Y; /* Y set in get_text() */ else y = BY1; x = BX1 + 0.2 + ( strlen( p ) * Chh * 0.5 ); /* do box and prompt */ NTlinetype( "0", 3, 1 ); if( getting_text && !transparent ) ab_rect( BX1, y-0.1, BX2, y+Chh, 1.0, 0 ); else if( !transparent )ab_rect( BX1, y-0.1, BX2, y+0.4, 1.0, 1 ); NTnormline(); NTmov( BX1+0.1, y ); NTtext( p ); NTmov( x, y ); i = 0; while( 1 ) { NTmov( x, y ); event_mode = STRING; NTwait(); /* let user enter char */ if( selection[0] == '\b' || selection[0] == '\177' ) { if( i == 0 ) continue; i--; ab_rect( (x-(Chh*0.5)), y-(Chh*0.28), x, (y+(Chh*0.85)), 1.0, 0 ); x -= ( Chh * 0.5 ); continue; } else if( selection[0] == '\015' || selection[0] == '\012' ) break; else if( selection[0] == '\004' ) { /* control-D stops */ strcpy( s, "\004" ); return( 1 ); } else NTtext( selection ); s[i++] = selection[0]; x += (Chh * 0.5 ); } s[i] = '\0'; if( !getting_text && !transparent )ab_rect( BX1, y-0.1, BX2, y+0.4, 0.98, 0 ); } /* ========================================= */ /* gets multi-row text. */ get_text( buf, p ) char buf[], p[]; { int i, j, maxlen; double x; char uin[20]; if( Dev == 'm' ) { /* for terminal interface */ fprintf( stderr, "=======================\n" ); sprintf( buf, "%s Enter \".\" to stop..\n", p ); fprintf( stderr, "%s", buf ); i = 0; while( 1 ) { fgets( &buf[i], 100, stdin ); if( strcmp( &buf[i], ".\n" )==0 ) break; i += strlen( &buf[i] ); } buf[ i-1 ] = '\0'; return( 1 ); } sprintf( buf, "%s Press Control-D to stop..\n", p ); maxlen = 80; /* max length of any line */ if( !box_given ) { BX1 = 0.3; BY1 = 0.3; BX2 = 9; BY2 = 8.0; } x = BX1; Y = BY2; if( !transparent )ab_rect( x-0.1, BY1, BX2+0.1, Y+0.2, 1.0, 1 ); NTmov( x, Y ); if( !transparent) { NTcentext( buf, BX2-BX1 ); Y -= Chh; } getting_text = 1; nbb = 0; /* control D quits */ for( i = 0; i < MAXBB; i++ ) { bb[i][0] = BX1; bb[i][1] = Y-(Chh*1.6); bb[i][2] = BX2; bb[i][3] = Y; sprintf( name[i], "%d", i ); get_string( &(buf[i*maxlen]), "" ); if( buf[i*maxlen] == '\004' ) break; for( j = (i*maxlen)+ strlen( &buf[i*maxlen] ); j < ((i+1)*maxlen)-1; j++ ) buf[j] = ' '; buf[ ((i+1)*maxlen) -1 ] = '\n'; Y -= Chh; } buf[i*maxlen] = '\0'; bbxlo = 0; bbxhi = 11; bbylo = 0; bbyhi = 11; getting_text = 0; } /* =============================== */ get_string_box( s, p, x1, y1, x2, y2 ) char s[], p[]; double x1, y1, x2, y2; { box_given = 1; BX1 = x1; BY1 = y1; BX2 = x2; BY2 = y2; get_string( s, p ); box_given = 0; } /* =============================== */ get_text_box( s, p, x1, y1, x2, y2 ) char s[], p[]; double x1, y1, x2, y2; { box_given = 1; BX1 = x1; BY1 = y1; BX2 = x2; BY2 = y2; get_text( s, p ); box_given = 0; } /* =============================== */ get_text_box_tp( s, p, x1, y1, x2, y2 ) char s[], p[]; double x1, y1, x2, y2; { transparent = 1; get_text_box( s, p, x1, y1, x2, y2 ); transparent = 0; } SHAR_EOF ############################ cat << \SHAR_EOF > src/pie.c #include "ipl.x" Pie( ) { int i, f, first, ns, explode; double theta, val, stop; double hx, hy, x, y, r; double sh[20], lt; double u, ux, uy, adj; gget( Buf, "Field" ); f = atoi( Buf ); gget( Buf, "Center" ); sscanf( Buf, "%lf %lf", &hx, &hy ); gget( Buf, "Radius" ); r = atof( Buf ); gget( Buf, "Linethick" ); lt = atof( Buf ); NTlinetype( "0", lt, 1.0 ); gget( Buf, "Explode" ); u = atof( Buf ); gget( Buf, "Rotate" ); adj = atof( Buf ); gget( Buf, "Shade" ); ns = sscanf( Buf, "%lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %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], &sh[10],&sh[11],&sh[12],&sh[13],&sh[14],&sh[15],&sh[16],&sh[17],&sh[18],&sh[19] ); /* do shades */ theta = adj * (3.1415927/180.0) ; for( i = 0; i < N_d_rows; i++ ) { val = atof( D[i][f-1] ); /* convert val (percentage) to radians.. */ val = ( val/100.0 ) * 6.28319; stop = theta + val; ux = u * cos( theta+(val/2.0) ); uy = u * sin( theta+(val/2.0) ); first = 1; for( ; theta < (stop+0.001); theta += 0.02 ) { x = hx + (r * cos( theta )); y = hy + (r * sin( theta )); if( first ) { NTmov( hx+ux, hy+uy ); NTpath( x+ux, y+uy ); first = 0; } NTpath( x+ux, y+uy ); } if( i < ns )NTshade( sh[i] ); else NTshade( 1.0 ); theta = stop; } /* do lines */ theta = adj * (3.1415927/180.0); for( i = 0; i < N_d_rows; i++ ) { val = atof( D[i][f-1] ); /* convert val (percentage) to radians.. */ val = ( val/100.0 ) * 6.28319; stop = theta + val; ux = u * cos( theta+(val/2.0) ); uy = u * sin( theta+(val/2.0) ); first = 1; for( ; theta < (stop+0.001); theta += 0.02 ) { x = hx + (r * cos( theta )); y = hy + (r * sin( theta )); if( first ) { NTmov( hx+ux, hy+uy ); NTlin( x+ux, y+uy ); first = 0; } NTlin( x+ux, y+uy ); } NTlin( hx+ux, hy+uy ); theta = stop; } NTnormline(); } SHAR_EOF ############################ cat << \SHAR_EOF > src/point.c #include "ipl.x" /* draw a data point */ /* point styles are selected by the code string "symNSf.ff", where N is an integer 0-9 selecting the shape, S is a lower-case character selecting the style, and f.ff is an optional shade, which overrides that selected as part of the style. N and S are required. See point1.g in the examples. */ #define NVARIAT 18 #define NSHAPE 6 Point( ) { double x, y, r; char code[20]; gget( Buf, "Mark" ); strcpy( code, Buf ); gget( Buf, "Position" ); sscanf( Buf, "%lf %lf", &x, &y ); gget( Buf, "Size" ); sscanf( Buf, "%lf", &r ); NTptsize( r ); r = Chh * 0.4; point( x, y, code, r ); } point( x, y, code, r ) double x, y; /* point location in abs space */ char code[]; /* pre-set symbol name */ double r; /* radius of dot in absolute units */ { int i; double g, theta; static char prevcode[10] = ""; static double prev_r, shade; static int inc, ins; static int nc[] = { 3, 3, 4, 4, 5, 12 }; /* number of corners */ static int nt[] = { 90,270, 0, 45, 90, 90, 90 }; /* location (in deg) to start building point */ /* preset outline thicknesses.. */ static double ol[] = { .5, 1,1.5, 2, .5, .5, .5, .5, .5, 0, 0, 0, 0, 0, -0.5, -1, -1.5, -2 }; /* preset shades.. */ static double sh[] = { -1, -1, -1, -1, 1, .9, .7, .5, .3, .9, .7, .5, .3, 0, -1, -1, -1, -1 }; static double h[14][2]; /* the offsets */ /* no-op code */ if( strcmp( code, "sym00" ) == 0 ) return( 0 ); if( strcmp( code, prevcode ) != 0 || r != prev_r ) { strcpy( prevcode, code ); prev_r = r; inc = ((code[3] - '0') -1 ) % NSHAPE; if( code[4] == '\0' ) code[4] = 'a'; ins = (code[4] - 'a') % NVARIAT; if( strlen( code ) > 5 )shade = atof( &code[5] ); else shade = sh[ins]; theta = 360.0 / (double)nc[inc]; /* get offsets */ g = nt[inc]; for( i = 0; i < nc[inc]; i++ ) { h[i][0] = r * cos( (g*3.1415927)/180.0 ); h[i][1] = r * sin( (g*3.1415927)/180.0 ); g += theta; } } /* lock-on */ /* shade point */ if( shade >= 0 ) { NTmov( x+h[0][0], y+h[0][1] ); for( i = 1; i < nc[inc]; i++ ) NTpath( x+h[i][0], y+h[i][1] ); NTshade( shade ); } /* draw perimeter point */ if( ol[ins] > 0.0 ) { NTlinetype( "0", ol[ins], 1.0 ); NTmov( x+h[0][0], y+h[0][1] ); for( i = 1; i < nc[inc]; i++ ) NTlin( x+h[i][0], y+h[i][1] ); NTlin( x+h[0][0], y+h[0][1] ); NTnormline(); } /* draw spokes */ if( ol[ins] < 0.0 ) { double fabs(); NTlinetype( "0", fabs(ol[ins]), 1.0 ); for( i = 0; i < nc[inc]; i++ ) { NTmov( x, y ); NTlin( x+h[i][0], y+h[i][1] ); } NTnormline(); } /* lock-off */ } SHAR_EOF ############################ cat << \SHAR_EOF > src/polygon.c /* polygon - for creating polygons, optionally shaded and outlined */ #include "ipl.x" #define ABSOLUTE 0 #define DATA 1 Polygon( ) { int sys, n, i, p, outline; double mag, thick, x, y, fx, fy; char ltype[10], s1[12], s2[12], s3[12], s4[12]; gget( Buf, "System" ); if( strcmp( Buf, "absolute" )==0 ) sys = ABSOLUTE; else { sys = DATA; if( DXlo == 0 && DXhi == 0 ) { fprintf( stderr, "No graphics area.\n" ); gdp_exit(); } } gget( Buf, "Outline" ); if( Buf[0] == 'y' ) outline = 1; else outline = 0; /* get line style parameters */ gget( Buf, "Linetype" ); strcpy( ltype, Buf ); gget( Buf, "Linetype.magnify" ); if( goodnum( Buf, &p )) mag = atof( Buf ); else mag = 1; gget( Buf, "Linethick" ); thick = atof( Buf ); /* set line style */ NTlinetype( ltype, thick, mag ); /* get points */ gget( Buf2, "Rectangle" ); if( strlen( Buf2 ) > 0 ) { sscanf( Buf2, "%s %s %s %s", s1, s2, s3, s4 ); sprintf( Buf, "%s %s\n%s %s\n%s %s\n%s %s", s1, s2, s1, s4, s3, s4, s3, s2 ); } else gget( Buf, "Points" ); if( strlen( Buf ) < 1 ) { fprintf( stderr, "Points or Rectangle not specified.\n" ); gdp_exit(); } getln( "" ); for( i = 0; i < countln( Buf ); i++ ) { n = sscanf( getln( Buf ), "%lf %lf", &x, &y ); if( sys == DATA && i == 0 ) NTm( x, y ); else if( sys == ABSOLUTE && i == 0 ) NTmov( x, y ); else if( sys == DATA ) NTp( x, y ); else if( sys == ABSOLUTE ) NTpath( x, y ); else { fprintf( stderr, "Points should contain one coord pair per line.\n" ); gdp_exit(); } } gget( Buf2, "Shade" ); if( strlen( Buf2 ) > 0 ) NTshade( atof( Buf2 ) ); if( outline ) { getln( "" ); /* reset getln() */ for( i = 0; i < countln( Buf ); i++ ) { n = sscanf( getln( Buf ), "%lf %lf", &x, &y ); if( sys == DATA && i == 0 ) { NTm( x, y ); fx = x; fy = y; } else if( sys == ABSOLUTE && i == 0 ) { NTmov( x, y ); fx = x; fy = y; } else if( sys == DATA ) NTl( x, y ); else if( sys == ABSOLUTE ) NTlin( x, y ); else { fprintf( stderr, "Points should contain one coord pair per line.\n" ); gdp_exit(); } } if( sys == DATA ) NTl( fx, fy ); else if( sys == ABSOLUTE ) NTlin( fx, fy ); } NTnormline(); /* return line to normal */ } SHAR_EOF ############################ cat << \SHAR_EOF > src/proc_call.c /* proc_call() - calls the appropriate funtion, given the proc name. */ #include "ipl.h" proc_call( proc ) char proc[]; { char p1[30], p2[30]; /* make sure there's data if we're plotting */ if( smember( proc, "Distribution Bargraph Vbargraph Lineplot Rangebar Vrangebar Vector Boxplot Errorbars Map" ) ) { if( strcmp( proc, "Map" )!= 0 && N_d_rows <= 0 ) { fprintf( stderr, "No data yet, use Proc Getdata to read some.\n" ); gdp_exit(); } if( Xlo == 0 && Xhi == 0 ) { fprintf( stderr, "No graphics area, use Proc Areadef to define one.\n" ); gdp_exit(); } } if( Dev == 's' ) siplmenu( proc ); /* sipl menu at end of page */ if( strcmp( proc, "Initialize" )!= 0 )NTbatch_on(); if( strcmp( proc, "Initialize" )==0 ) Initialize( ); else if( strcmp( proc, "Exit" )==0 ); /* see below */ else if( strcmp( proc, "Page" )==0 ) Page( ); else if( strcmp( proc, "Areadef" )==0 ) Areadef( ); else if( strcmp( proc, "Getdata" )==0 ) Getdata( ); else if( strcmp( proc, "Distribution" )==0 ) Distribution( ); else if( strcmp( proc, "Bargraph" )==0 ) Bargraph( ); else if( strcmp( proc, "Vbargraph" )==0 ) Vbargraph( ); else if( strcmp( proc, "Lineplot" )==0 ) Lineplot( ); else if( strcmp( proc, "Legend" )==0 ) Legend( ); else if( strcmp( proc, "Map" )==0 ) Map( ); else if( strcmp( proc, "Rangebar" )==0 ) Rangebar(); else if( strcmp( proc, "Vrangebar" )==0 ) Vrangebar(); else if( strcmp( proc, "Vector" )==0 ) Vector(); else if( strcmp( proc, "Pie" )==0 ) Pie(); else if( strcmp( proc, "Errorbars" )==0 ) Errorbars(); else if( strcmp( proc, "Nicetab" )==0 ) Nicetab( ); else if( strcmp( proc, "Boxplot" )==0 ) Boxplot( ); else if( strcmp( proc, "Text" )==0 ) Text( ); else if( strcmp( proc, "Draw" )==0 ) Draw( ); else if( strcmp( proc, "Arrow" )==0 ) Arrow( ); else if( strcmp( proc, "Polygon" )==0 ) Polygon( ); else if( strcmp( proc, "Point" )==0 ) Point(); else if( strcmp( proc, "Pagebreak" )== 0 ) { NTshow(); } else if( strcmp( proc, "QuitAppend" )==0 ) { Hold = 1; } else if( strcmp( proc, "Endoffile" )==0 ) ; /* no op */ else fprintf( stderr, "proc_call: %s is unrecognized.. continuing\n", proc ); NTbatch_off(); if( strcmp( proc, "Exit" )==0 ) Exit(); } SHAR_EOF ############################ cat << \SHAR_EOF > src/rangebar.c #include "ipl.x" Rangebar( ) { int f[8], row, i, doends, nf, nv, ir, mlrightonly, label, xf; double val[8]; double w, x, shade, lblpos, mlw; gget( Buf, "Nval" ); nv = atoi( Buf ); gget( Buf, "Field" ); if( nv == 1 ) { nf = sscanf( Buf, "%d", &f[1] ); f[2] = f[3] = f[1]; f[4] = f[5] = f[1]; } else if( nv == 2 ) { nf = sscanf( Buf, "%d %d", &f[1], &f[4] ); f[2] = f[3] = f[1]; f[5] = f[4]; } else if( nv == 3 ) { nf = sscanf( Buf, "%d %d %d", &f[1], &f[3], &f[5] ); f[2] = f[1]; f[4] = f[5]; } else if( nv == 4 ) { nf = sscanf( Buf, "%d %d %d %d", &f[1], &f[2], &f[4], &f[5] ); f[3] = f[4]; } else if( nv == 5 ) { nf = sscanf( Buf, "%d %d %d %d %d", &f[1], &f[2], &f[3], &f[4], &f[5] ); } if( nf != nv ) { fprintf( stderr, "Expecting %d Field values.\n", nv ); gdp_exit(); } gget( Buf, "Width" ); w = atof( Buf ); gget( Buf, "Linethick" ); NTlinetype( "0", atof( Buf ), 1.0 ); label = 0; gget( Buf, "Idfield" ); f[0] = atoi( Buf ); if( f[0] > 0 ) { label = 1; gget( Buf, "Label.size" ); if( atoi( Buf ) > 0 ) NTptsize( atoi( Buf ) ); gget( Buf, "Label.position" ); lblpos = atof( Buf ); } doends = 0; if( nf == 4 || nf == 5 ) { gget( Buf, "Ends" ); if( Buf[0] == 'y' ) doends = 1; } mlw = w; mlrightonly = 0; if( nf == 3 || nf == 5 ) { gget( Buf, "Midlinewidth" ); if( atof( Buf ) > 0 )mlw = atof( Buf ); gget( Buf, "Midlineright" ); if( Buf[0] == 'y' ) mlrightonly = 1; } gget( Buf, "Shade" ); shade = atof( Buf ); gget( Buf, "Xfield" ); xf = atoi( Buf ); x = DXlo; for( ir = 0; ir < N_d_rows; ir++ ) { for( i = 1; i <= 5; i++ ) val[i] = atof( D[ ir ][ f[i]-1 ] ); if( nv == 1 ) { val[1] = val[2] = 0; } if( xf > 0 ) x = atof( D[ir][ xf-1 ] ); else x++; NTm( x-(w/2), val[2] ); /* lower edge of box */ NTp( x+(w/2), val[2] ); NTp( x+(w/2), val[4] ); NTp( x-(w/2), val[4] ); NTp( x-(w/2), val[2] ); /* upper edge */ NTshade( shade ); NTm( x, val[1] ); /* lower tail */ NTl( x, val[2] ); if( doends ) { NTm( x-(w/2.7), val[1] ); NTl( x+(w/2.7), val[1] ); } NTm( x-(w/2), val[2] ); /* lower edge of box */ NTl( x+(w/2), val[2] ); NTl( x+(w/2), val[4] ); NTl( x-(w/2), val[4] ); NTl( x-(w/2), val[2] ); /* upper edge */ NTm( x, val[4] ); NTl( x, val[5] ); /* upper tail */ if( doends ) { NTm( x-(w/2.7), val[5] ); NTl( x+(w/2.7), val[5] ); } if( mlrightonly )NTm( x-(w/2), val[3] ); /* median line */ else NTm( x-(mlw/2), val[3] ); NTl( x+(mlw/2), val[3] ); if( label ) { NTmov( da_x(x) -1, da_y(lblpos) ); /* print label */ sprintf( Buf, "%s", D[ir][f[0]-1 ] ); NTcentext( Buf, 2 ); } } NTnormline(); } SHAR_EOF ############################ cat << \SHAR_EOF > src/rect.c /* do a rectangle, with shading and/or outline */ /* only used internally, user proc is Polygon */ #include "ipl.x" /* rect() - all coords in data space */ rect( xlo, ylo, xhi, yhi, shade, outline ) double xlo, ylo, xhi, yhi, shade; int outline; { if( shade >= 0 ) { NTm( xlo, ylo ); NTp( xlo, yhi ); NTp( xhi, yhi ); NTp( xhi, ylo ); NTshade( shade ); } if( outline ) { NTm( xlo, ylo ); NTl( xlo, yhi ); NTl( xhi, yhi ); NTl( xhi, ylo ); NTl( xlo, ylo ); } } /* ab_rect() - all coords in absolute space */ ab_rect( xlo, ylo, xhi, yhi, shade, outline ) double xlo, ylo, xhi, yhi, shade; int outline; { if( shade >= 0 ) { NTmov( xlo, ylo ); NTpath( xlo, yhi ); NTpath( xhi, yhi ); NTpath( xhi, ylo ); NTshade( shade ); } if( outline ) { NTmov( xlo, ylo ); NTlin( xlo, yhi ); NTlin( xhi, yhi ); NTlin( xhi, ylo ); NTlin( xlo, ylo ); } } SHAR_EOF ############################ -- Please send comp.sources.unix-related mail to rsalz@uunet.uu.net. Use a domain-based address or give alternate paths, or you may lose out.