ploticus-2.42/ 0000755 0001750 0001750 00000000000 12147470246 012304 5 ustar colin colin ploticus-2.42/man/ 0000755 0001750 0001750 00000000000 10437352267 013061 5 ustar colin colin ploticus-2.42/man/man1/ 0000755 0001750 0001750 00000000000 11765717536 013726 5 ustar colin colin ploticus-2.42/man/man1/pl.1 0000644 0001750 0001750 00000066510 11765717536 014433 0 ustar colin colin .ig >>
|
.>> .TH ploticus 1 "11-MAR-2009 PLOTICUS ploticus.sourceforge.net" .SH Name ploticus \- data display package .SH Synopsis \fCploticus \-prefab \fIprefabname\fC \fIparm=value\fC .. [\fI-options\fR] .br \0.. OR .. .br \fCploticus \fIscriptfile\fC [\fI-options\fC] .ig >> .>> .ig >> .>> .ig >> .>> .SH Description \fBploticus\fR is the primary component of the .ig >> .>> \0'ploticus' data display package .ig >> .>> .LP \fBploticus\fR is a program that produces plots and charts from data, and produces results that can be viewed on web pages, paper, slides, or interactively on the screen. Standard types of plots may be done using .ig >> .>> \0prefab plot templates .ig >> .>> , or a user-developed .ig >> .>> \0script file .ig >> .>> may be supplied for greater flexibility and customization. \fBploticus\fR may be executed from the command line or .ig >> .>> \0as a CGI program. .ig >> .>> .LP For complete online docs and downloads see .ig >> .>> \0http://ploticus.sourceforge.net .ig >> .>> .ig >> .>> .ig >> .>> .SH Where to find examples See the various .ig >> .>> \0prefab examples .ig >> .>> \0. A large number of .ig >> .>> \0script examples .ig >> .>> are also available. Some .ig >> .>> \0usage examples .ig >> .>> are also shown below. .ig >> .>> .ig >> .>> .SH Command line arguments .LP Command line arguments may generally be given in any order. If there are arguments that you want to always have in effect, you can invoke them from a .ig >> .>> \0config file. .ig >> .>> Many settings can also be made dynamically from scripts via .ig >> .>> \0proc settings .ig >> .>> or .ig >> .>> \0proc page. .ig >> .>> Processing occurs in this order: first the config file is read; then command line args are processed (left to right); then .ig >> .>> \0proc page .ig >> .>> and/or .ig >> .>> \0proc settings. .ig >> .>> Later settings override earlier ones. .ig >> .>> .ig >> .>> .SH Basic command line options .LP \fB-prefab\fR .ig >> .>> \fIprefabname\fR .IP \0 Produce a plot using a .ig >> .>> \0prefab .ig >> .>> plot template. \fIprefabname\fR identifies the template, eg. \fCcron\fR or \fCvbars\fR. Necessary parameters are supplied on the command line using the form \fIparm=value\fR. .ig >> .>> .LP \fIscriptfile\fR .br \fB-f \fIscriptfile\fR .IP \0 names a .ig >> .>> \0script file .ig >> .>> that will be interpreted to produce results. Alternatively, \fB-stdin\fR may be used to indicate that script will be available on standard input. .ig >> .>> .ig >> .>> .LP \fIvariable\fC=\fIvalue\fR .IP \0 Declares the named \fIvariable\fR and sets it to the given \fIvalue\fR. This is a convenient way to pass information to prefabs and scripts. Variable names are case-sensitive. .br Example: \fCCUTDATE=10-31-98\fR .br sets the variable \fCCUTDATE\fR to \fC10-31-98\fR. .ig >> .>> .LP \fB-o .ig >> .>> \fIoutfile\fC | stdout\fR .IP \0 Specify a filename where the result will be written. No processing is applied to this name.. so the ending should be appropriate for the selected output format, eg. use \fC.png\fR for PNG files. If \fC-o stdout\fR is used, result will be sent to standard output. If \fB-o\fR is not specified, a .ig >> .>> \0default output filename .ig >> .>> will be used. .br Example: \fC-o fp001.png\fR .ig >> .>> .LP \fB-dir .ig >> .>> \fIdirname\fR .IP \0 Set ploticus' working directory to \fIdirname\fR. If used, this argument should be specified leftmost on the command line, since it affects evaluation of other args. .ig >> .>> .ig >> .>> .SH Result format options .LP (Availability depends on your ploticus configuration/build) .LP \fB-png \fR .ig >> .>> PNG image .LP \fB-gif \fR .ig >> .>> pseudo-GIF image .LP \fB-jpeg\fR .ig >> .>> JPEG image .LP \fB-svg\fR or \fB-svgz\fR .ig >> .>> .ig >> .>> \0SVG .ig >> .>> graphic. See also SVG / XML options below. .LP \fB-swf\fR .ig >> .>> .ig >> .>> \0SWF .ig >> .>> (flash) result. .LP \fB-wbmp\fR .ig >> .>> WBMP image .LP \fB-eps \fR .ig >> .>> EPS (encapsulated PostScript) .LP \fB-ps \fR .ig >> .>> paginated PostScript to stdout .LP \fB-x11 \fR .ig >> .>> display on X11 screen .LP \fB-drawdump\fR \fIfilename\fR .ig >> .>> produce no visible graphic; save a generic representation of the graphic result to a file. By using \fC-drawdump\fR and \fC-drawdumpa\fR you can easily .ig >> .>> \0overlay or combine results from separate ploticus runs. .ig >> .>> The drawdump file can be rendered later in any desired format, using this command: \fCploticus \-prefab draw dumpfile=\fIfilename\fR .ig >> .>> or by using .ig >> .>> \0proc drawcommands. .ig >> .>> Drawdump capability is available in all builds. (2.30+) .LP \fB-drawdumpa\fR \fIfilename\fR .ig >> .>> same as \fC-drawdump\fR but result is \fBappended\fR to file. .ig >> .>> .ig >> .>> .SH Clickable image maps and mouseover options .LP \fB-csmap\fR .IP \0 produce a .ig >> .>> \0client-side clickable imagemap .ig >> .>> to accompany a png, gif, or jpeg. These can be used for hyperlinks, and also for providing pop-up text labels that appear when the mouse passes over a region. By default, client-side map content is written to stdout. .ig >> .>> .LP \fB-csmapdemo\fR .IP \0 Same as \fB-csmap\fR but all mapped regions are shown outlined in green, and a complete HTML chunk is produced which involves the output image name. .ig >> .>> .LP \fB-mapfile\fR .ig >> .>> \fIfilename\fC | stdout | stderr\fR .IP \0 explicitly name the output file containing the map info. The name may also be set in .ig >> .>> \0proc page. .ig >> .>> If a name is not specified, client-side image map info will be written to stdout; For SVG this parameter is not needed, since image map info is embedded in the SVG file. .ig >> .>> .LP \fB-map\fR .IP \0 produce a .ig >> .>> \0server-side clickable imagemap file .ig >> .>> to accompany a png, gif, jpeg, or SVG. \fBNote: server-side maps are deprecated.\fR .ig >> .>> .ig >> .>> .SH Result sizing options .LP \fB-scale\fR .ig >> .>> \fIsx\fR[,\fIsy\fR] .IP \0 Scale the final result. If one value is given, the result is scaled by this amount in both x and y. If two values are given, scaling in x and scaling in y may be done independently. A scale value of less than 1.0 reduces the size; an scale value of greater than 1.0 enlarges. Scaling is done relative to the origin (0,0) which is at the lower left. .br Example: \fC-scale 0.7\fR .ig >> .>> .LP \fB-pagesize\fR .ig >> .>> \fIwidth,height\fR .IP \0 Sets the pre-crop size of the result image for GIF/PNG/JPEG, or sets the display window size when drawing to X11. On other output devices this option does nothing. \fIwidth\fR and \fIheight\fR are in .ig >> .>> \0absolute units. .ig >> .>> 0,0 is the lower left corner. If \-pagesize is not specified, the default size will be 8" x 8". Size is set before any drawing takes place and is unaffected by the \-scale option. .IP When rendering PNG/GIF/JPEG images, this option determines amount of internal memory allocation for accommodating the image. The result can never be bigger than this size, and any drawing outsize the bounds will not be visible. \fBTo create PNG/GIF/JPEG images larger than 8" x 8", this option MUST be specified to set a bigger size.\fR Cropping options (below) can be used along with \-pagesize as long as they result in a smaller rectangle than the pagesize; they take effect after all drawing has been completed. .IP \fB-pagesize\fR has no effect with EPS or paginated PostScript results (the PostScript BoundingBox will be determined by the extent of the graphic). .IP Example: \fC\-pagesize 7,3\fR .ig >> .>> .LP \fB-tightcrop\fR .IP \0 For image or EPS output, crop the result tightly to the extent of the design. Normally a small margin is allowed on all four sides. This option sometimes crops a bit too tight; if so try \fB-croprel\fR. .ig >> .>> .LP \fB-crop\fR .ig >> .>> \fIx1,y1,x2,y2\fR .IP \0 Crop image or EPS result to the box specified by \fIx1,y1\fR and \fIx2,y2\fR, in .ig >> .>> \0absolute units. .ig >> .>> Note that there may be no spaces in the coordinates specification. Cropping takes place after design is rendered and does not affect coordinate locations. .br Example: \fC-crop 1.2,0.8,4.4,5.2\fR .ig >> .>> .LP \fB-croprel\fR .ig >> .>> \fIleft,bottom,right,top\fR .IP \0 Crop image or EPS result tightly to the extent of the design (like \fB-tightcrop\fR), but then adjust the cropping outward or inward on one or more sides. \fIleft\fR is the amount to adjust the left side, in .ig >> .>> \0absolute units. .ig >> .>> Similarly for \fIbottom\fR, \fIright\fR, and \fItop\fR. Positive values always adjust outward from center; negative values adjust inward (tighter). There may be no spaces in the \fIleft,bottom,right,top\fR specification. Cropping takes place after design is rendered and does not affect coordinate locations. .br Example: \fC-croprel 0,\-0.1,0,0.1\fR .ig >> .>> .LP \fB-pixsize\fR .ig >> .>> \fIwidth,height\fR .IP \0 If specified, result PNG/GIF/JPG image will be created at exactly this width and height in pixels. Does not interact with scaling or cropping... user is responsible for ensuring that content fits appropriately into the specified size. User is also responsible for setting \-pagesize appropriately for larger images. New in 2.40 .ig >> .>> .ig >> .>> .SH Graphics environment options .LP \fB-font\fR .ig >> .>> \fIfont\fR .IP \0 sets the overall font to \fIfont\fR. See .ig >> .>> \0fonts .ig >> .>> for more info. .ig >> .>> .LP \fB-textsize\fR .ig >> .>> \fIpointsize\fR .IP \0 sets the overall default textsize to \fIpointsize\fR. All embedded size specifications will be rendered relative to this. .ig >> .>> .LP \fB-linewidth\fR .ig >> .>> \fIw\fR .IP \0 sets the overall default linewidth to \fIw\fR. All embedded line width specifications will be rendered relative to this. See linedetails(pli) for more on line width. .ig >> .>> .LP \fB-color\fR .ig >> .>> .ig >> .>> \0color .ig >> .>> .IP \0 sets the overall default text and line drawing color to \fIcolor\fR. .ig >> .>> .LP \fB-backcolor\fR .ig >> .>> .ig >> .>> \0color .ig >> .>> .IP \0 sets the background color to \fIcolor\fR. .ig >> .>> .ig >> .>> .LP \fB-cm\fR .ig >> .>> .IP \0 Use centimeters as your absolute units, instead of inches. On the command line this must appear to the left of any arguments dealing with absolute unit values, such as \-pagesize. Centimeter absolute units can also be set via .ig >> .>> \0proc settings. .ig >> .>> If cm will always be the desired absolute units, the preferred way to achieve this is by using \fCunits: cm\fR in a .ig >> .>> \0ploticus config file. .ig >> .>> .ig >> .>> .LP \fB-inches\fR .IP \0 Use inches as your absolute units. This is the default. .ig >> .>> .LP \fB-outlabel\fR .ig >> .>> \fIlabel\fR .IP \0 Set the label or title for the output. For X11 this sets the window title; for PostScript and SVG it sets the \fC%%Title\fR attribute. .ig >> .>> .ig >> .>> .SH Capacity setting options These options (new with version 2.10) allow capacities to be raised for accomodation of very large data sets, or lowered to minimize memory usage. The defaults in this section are defined in \fCpl.h\fR. .LP \fB-maxrows .ig >> .>> \fInrows\fR .IP \0 Set the capacity for data rows to \fInrows\fR. Default \fInrows\fR is 10,000. Ploticus will allocate one pointer for each row. .ig >> .>> .LP \fB-maxfields .ig >> .>> \fInfields\fR .IP \0 Set the capacity for data fields to \fInfields\fR. Default \fInfields\fR is 200,000. Ploticus will allocate one pointer for each field. .ig >> .>> .LP \fB-maxproclines .ig >> .>> \fInlines\fR .IP \0 Set the capacity for script lines for active procs to \fInlines\fR. Default \fInlines\fR is 5000. Active procs are the current proc, all \fC#save\fRd procs, and all proc getdata procs that contain embedded \fCdata\fR. Ploticus will allocate one pointer for each line in each active proc. .ig >> .>> .LP \fB-maxvector .ig >> .>> \fIncells\fR .IP \0 Set the capacity for the data plotting vector to \fIncells\fR. Default \fIncells\fR is 100,000. The data plotting vector is an array which holds plottable values for situations where the values must be sorted or pre-screened for bad values. Ploticus will allocate one \fCdouble\fR value for each cell. .ig >> .>> .LP \fB-maxdrawpoints .ig >> .>> \fIn\fR .IP \0 Use this if you need to render a polygon having more than 500 points in PNG/GIF/JPEG, X11, or SWF, or any continuous line having more than 500 points in SWF. .ig >> .>> .LP Note: raising the maximum number of categories may be done using .ig >> .>> \0proc categories .ig >> .>> from within the script. .ig >> .>> .LP \fB-cpulimit\fR #Include nbsp2 \fIs\fR .IP \0 Set unix resource limit on cpu time to \fIs\fR seconds. Default is 30 seconds. New in 2.40 .ig >> .>> .ig >> .>> .SH SVG / XML options: .LP \fB-svg_tagparms\fR .ig >> .>> \fIstring\fR .IP \0 This allows arbitrary \fCtext\fR to be inserted into the opening \fC |
![]() data display engine Copyright Steve Grubb
|
| Ploticus is hosted at http://ploticus.sourceforge.net |
|
|
.>> .TH libploticus 3 "11-MAR-2009 PLOTICUS ploticus.sourceforge.net" .SH Name Libploticus \- C language API library for ploticus .SH Description .LP This simple C language API has all of the funcionality of the .ig >> .>> \0ploticus program .ig >> .>> and is similarly covered by the General Public License. .LP \fBlibploticus\fR is built using \fCMakefile\fR. .LP .nf \0 make clean \0 make FPIC=\-fPIC libploticus-so .fi .LP Applications linking to \fBlibploticus\fR may need additional libraries such as \fCzlib\fR, but this depends on exactly how \fBlibploticus\fR was built. The specifics are noted in \fCMakefile\fR. The externally visible symbols in \fBlibploticus\fR begin with these prefixes: \fCploticus\fR, \fCPL\fR, \fCTDH\fR, \fCDT\fR, and \fCGL\fR. .LP The header file libploticus.h is required to avoid compiler warnings. .LP All functions return 0 when successful, or a non-zero error code. .LP As of version 2.11 multiple sequential plot "jobs" can be performed by a single OS process. Each plot job should begin with a \fCploticus_init()\fR call and terminate with a \fCploticus_end()\fR call. .LP No attempt has been made to write libploticus as thread-safe. .LP As of version 2.40 script lines can no longer be passed as string constants. .ig >> .>> .SH Examples Here's a simple example (it may be found in \fC./pltestsuite/api_examp.c\fR) .nf \0 main() \0 { \0 int stat; \0 char sln[80]; \0 stat = ploticus_init( "png", "hello.png" ); \0 stat += ploticus_arg( "\-scale", "0.8" ); \0 if( stat != 0 ) { \0 printf( "error in ploticus setup\\n" ); \0 exit(1); \0 } \0 strcpy( sln, "#proc annotate" ); ploticus_execline( sln ); \0 strcpy( sln, "location: 2 2" ); ploticus_execline( sln ); \0 strcpy( sln, "text: hello" ); ploticus_execline( sln ); \0 strcpy( sln, " world." ); ploticus_execline( sln ); \0 ploticus_end(); \0 } .fi .ig >> .>> .SH Multi-job example Another included example, which invokes a series of 25+ plot jobs, is in \fC./src/api_test.c To build: .LP .nf \0 make clean \0 make \-f Makefile_api \0 make api_test \-f Makefile_api .fi Then, go to the \fCpltestsuite\fR directory and type: \fC../src/api_test\fR .ig >> .>> .SH libploticus API .LP \fCploticus_init( char *device, char *outfilename )\fR .IP \0 Initialize, read your .ig >> .>> \0ploticus config file .ig >> .>> if any, and set the output \fCdevice\fR to one of \fCpng\fR, \fCgif\fR, \fCx11\fR, \fCsvg\fR, \fCjpeg\fR, \fCeps\fR, or \fCswf\fR. (Not all devices may be available, depending on the build.) \fCoutfilename\fR is the pathname of the file where the result will be written. Example: .nf \0 stat = ploticus_init( "png", "bargraph.png" ); \0 if( stat != 0 ) \fIerror\fR .fi .ig >> .>> .LP \fCploticus_arg( name, value )\fR .IP \0 Specify a .ig >> .>> \0pl command line argument. .ig >> .>> \fCname\fR specifies the argument name and \fCvalue\fR an argument value. If there is no argument value, \fCvalue\fR should be passed as \fC""\fR. All arguments are supported except \fC-f\fR, \fC-prefab\fR, and \fC-ver\fR. If needed, this function should be called after \fCploticus_init()\fR but before any other ploticus function. It may be called as many times as necessary. Example: .nf \0 stat = ploticus_arg( "\-debug", "" ); \0 stat += ploticus_arg( "\-diagfile", "stdout" ); \0 stat += ploticus_arg( "\-scale", "0.8" ); \0 if( stat != 0 ) \fIerror\fR .fi .ig >> .>> .LP \fCploticus_begin( )\fR .IP \0 This function is no longer necessary. Old code that uses it will still be OK. .ig >> .>> .LP \fCploticus_execline( char *line )\fR .IP \0 Interpret one "raw" .ig >> .>> \0ploticus script .ig >> .>> line. Typically called multiple times, allowing ploticus scripts to be generated programatically. Script lines can contain only these directives: \fC #proc\fR, \fC #procdef\fR, \fC #endproc\fR, \fC #clone\fR and \fC #saveas\fR. You can't use set, if/else, loops, or other flow-of-control directives (but these types of things can be handled by your host application). Further, these script lines do not undergo a variable-evaluation pass, so variables cannot be referenced, and \fCselect\fR statements (etc.) that reference data field names should use one at sign (@) instead of two (@@). If your program needs to access a variable that has been set by the ploticus engine, use \fCploticus_getvar()\fR, described below. The script line may include a trailing newline or not. .IP An alternative is to use \fCploticus_execscript()\fR (described below) to execute an entire script file. You can't use both \fCploticus_execline()\fR and \fCploticus_execscript()\fR in the same application. .IP \fBCaution\fR As of ploticus version 2.40 string constants cannot be passed in this function. See the example in the page intro above. .ig >> .>> .LP \fCploticus_execscript( char *scriptfile, int prefabflag )\fR .IP \0 Interpret an entire .ig >> .>> \0ploticus script file .ig >> .>> or .ig >> .>> \0prefab. .ig >> .>> \fCscriptfile\fR is the name of the ploticus script file. There are no syntax limitations as with \fCploticus_execline()\fR. \fCprefabflag\fR is \fC1\fR, then \fCscriptfile\fR is taken to be a .ig >> .>> \0ploticus prefab .ig >> .>> name such as \fCvbars\fR. If \fCprefabflag\fR is \fC0\fR, then \fCscriptfile\fR should be a pathname. .IP An alternative is to use \fCploticus_execline()\fR (described above) to execute program-generated "raw" script lines one at a time. You can't use both \fCploticus_execscript()\fR and \fCploticus_execline()\fR in the same application. .IP Example: \fCstat = ploticus_execscript( "vbars", 1 );\fR .br Example: \fCstat = ploticus_execscript( "/home/steve/plfiles/myscript.pl", 0 );\fR .ig >> .>> .LP \fCploticus_end()\fR .IP \0 Finish up the graphic result, write it to the output file, and free up allocated memory. .ig >> .>> .SH These functions are also available: .LP \fCploticus_getvar( char *name, char *value )\fR .IP \0 Get the contents of ploticus variable \fCname\fR. Result is copied into \fCvalue\fR. .br Example: \fCstat = ploticus_getvar( "XFINAL", xf );\fR .ig >> .>> .LP \fCploticus_setvar( char *name, char *value )\fR .IP \0 Set ploticus variable \fCname\fR to \fCvalue\fR. .ig >> .>> .LP \fCgdImagePtr PLGG_getimg( int *width, int *height )\fR .IP \0 Returns a pointer to the working GD image, for situations where the host application wants to directly issue gd drawing calls. The \fCwidth\fR and \fCheight\fR of the working image (in pixels) are also provided. Note that the result image is generally cropped based on the extent of ploticus drawing actions, before being written out. Only valid in applications built with GD, when ploticus was initialized with one of the GD image devices (eg. \fCpng\fR or \fCjpeg\fR). .ig >> |
![]() data display engine Copyright Steve Grubb
|
| Ploticus is hosted at http://ploticus.sourceforge.net |
|

// Usage: pl -gif legends232.htm
//
// Demonstrate some new legend features available with ploticus 2.32
// set up some legend entries...
#proc legendentry
sampletype: color
label: this is a test
details: red
#proc legendentry
sampletype: color
label: this is another test
details: blue
#proc legendentry
sampletype: color
label: this is \n another test
details: green
#proc legendentry
sampletype: color
label: this is another test
details: orange
#proc legendentry
sampletype: color
label: this is another test
details: lavender
#proc legendentry
sampletype: color
label: this is another test
details: dullyellow
// render the bottom legend using the above entries..
#proc legend
#saveas L
textdetails: size=6
location: 1.4 6.5
format: down
extent: 1.4
separation: 0.1
wraplen: 15
frame: bevel
title: Multi-column legends now supported
noclear: yes // this just allows us to show the same set of entries again..
// render the middle legend using the above entries..
#proc legend
#clone L
location 1.4 4.3
frame: no
backcolor: dullyellow
title: You can add legend title \n and do wordwrap on legend entries
// render the top legend using the above entries..
#proc legend
#clone L
format: across
extent: 4.0
location 1 2.3
frame: yes
title: This legend uses the 'across' format
ploticus-2.42/pltestsuite/run_all_scripts 0000644 0001750 0001750 00000000144 10715111161 020001 0 ustar colin colin DEV=
echo "bigcsv.pl ----"; pl bigcsv.pl $DEV
echo "windbarbs.pl ----"; pl windbarbs.pl $DEV
ploticus-2.42/pltestsuite/testpf_scat 0000755 0001750 0001750 00000001331 11147045370 017127 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=$3
if [ "$DEV" = "" ]; then
DEV=x11
fi
echo scat1..
pl -prefab scat data=data1 x=2 y=3 \
-$DEV -o ${OUTDIR}scat1.$DEV $ARGS
echo scat2..
pl -prefab scat data=data1 x=2 y=3 id=1 xlbl="Total Ch" ylbl="White Blood Cell Count" corr=yes ptstyle=outline \
-$DEV -o ${OUTDIR}scat2.$DEV $ARGS
echo scat3..
pl -prefab scat data=data3 x=2 y=6 err=3 xerr=7 corr=yes "select=@2 < 0.6" \
ptshape=triangle ptsize=0.08 ptcolor=red "errcolor=gray(0.8)" autow=yes \
-$DEV -o ${OUTDIR}scat3.$DEV $ARGS
echo scat4..
pl -prefab scat data=data25 delim=tab x=3 y=4 err=5 ptselect="@2 = A" xerr=6 \
x2=3 y2=4 err2=5 ptselect2="@2 = B" xerr2=6 \
-$DEV -o ${OUTDIR}scat4.$DEV $ARGS
ploticus-2.42/pltestsuite/colorgrid2.htm 0000644 0001750 0001750 00000003750 10743160357 017455 0 ustar colin colin colorgrid2

How to download and try this example
Usage: pl -gif [-map] colorgrid2.htm
This color grid involves processing raw data by
counting occurances within ranges, then mapping counts to colors by range.
Uses data file snpmap.dat .
For brevity, only chromosomes 1-7 and X are represented in this example.
#set SYM = "radius=0.08 shape=square style=filled"
#setifnotgiven CGI = "http://ploticus.sourceforge.net/cgi-bin/showcgiargs"
#proc page
backgroundcolor: black
color: white
// read in the SNP map data file..
#proc getdata
file: snpmap.dat
fieldnameheader: yes
// group into bins 10 cM wide..
filter:
##set A = $numgroup( @@2, 10, mid )
@@1 @@A
// set up the plotting area
#proc areadef
rectangle: 1 1 6 3
yscaletype: categories
clickmapurl: @CGI?chrom=@@YVAL&cM=@@XVAL
ycategories:
1
2
3
4
5
6
7
X
yaxis.stubs: usecategories
yaxis.stubdetails: adjust=0.2,0
//yaxis.stubslide: 0.08
yaxis.label: chromosome
yaxis.axisline: no
yaxis.tics: no
yaxis.clickmap: xygrid
xrange: -3 120
xaxis.label: position (cM)
xaxis.axisline: no
xaxis.tics: no
xaxis.clickmap: xygrid
xaxis.stubs: inc 10
xaxis.stubrange: 0
xaxis.stubdetails: adjust=0,0.15
// set up legend for color gradients..
#proc legendentry
sampletype: symbol
details: fillcolor=yellow @SYM
label: >40
tag: 41
#proc legendentry
sampletype: symbol
details: fillcolor=orange @SYM
label: 31-40
tag: 31
#proc legendentry
sampletype: symbol
details: fillcolor=red @SYM
label: 21-30
tag: 21
#proc legendentry
sampletype: symbol
details: fillcolor=lightpurple @SYM
label: 11-20
tag: 11
#proc legendentry
sampletype: symbol
details: fillcolor=blue @SYM
label: 1 - 10
tag: 1
// use proc scatterplot to count # of instances and pick appropriate color from legend..
#proc scatterplot
yfield: chr
xfield: cM
cluster: yes
dupsleg: yes
// display legend..
#proc legend
location: max-0.7 min+0.8
textdetails: size=6
ploticus-2.42/pltestsuite/curve1.dat 0000644 0001750 0001750 00000002437 06654367734 016613 0 ustar colin colin 331 75
331.624 83.5518
332.105 88.7758
332.492 91.8638
332.818 93.6546
333.103 94.7003
333.361 95.3329
333.6 95.7299
333.822 95.9802
334.031 96.1365
334.229 96.2329
334.417 96.2892
334.597 96.3146
334.77 96.3119
334.937 96.2806
335.099 96.2213
335.256 96.138
335.409 96.0381
335.559 95.9312
335.707 95.828
335.853 95.7389
335.998 95.6729
336.142 95.6363
336.285 95.6322
336.428 95.6601
336.571 95.7173
336.714 95.7988
336.857 95.8982
337 96.0083
337.143 96.1219
337.286 96.2319
337.429 96.3313
337.571 96.4136
337.714 96.4722
337.857 96.5005
338 96.4917
338.143 96.4386
338.286 96.334
338.429 96.1716
338.571 95.9468
338.714 95.6584
338.857 95.3094
339 94.9083
339.143 94.4705
339.286 94.0179
339.429 93.5772
339.571 93.1761
339.714 92.8401
339.857 92.5889
340 92.4333
340.143 92.3717
340.286 92.3882
340.429 92.4546
340.571 92.5335
340.714 92.582
340.857 92.555
341 92.4083
341.143 92.1024
341.286 91.6051
341.429 90.8933
341.572 89.9539
341.715 88.7855
341.858 87.3989
342.002 85.8187
342.147 84.0842
342.293 82.2492
342.441 80.3788
342.591 78.5446
342.744 76.8201
342.901 75.2761
343.063 73.9759
343.23 72.9706
343.403 72.2959
343.583 71.9712
343.771 72.0006
343.969 72.3734
344.178 73.0645
344.4 74.0359
344.639 75.2362
344.897 76.5988
345.182 78.0319
345.508 79.4048
345.895 80.5352
346.376 81.1755
347 81
ploticus-2.42/pltestsuite/distrib.htm 0000644 0001750 0001750 00000011463 07423345664 017056 0 ustar colin colin distrib

How to download and try this example
Usage: pl -gif distrib.htm
or for postscript output: pl -ps distrib.htm | lp
This is a more elaborate example that involves variables, a loop,
automatically calculated distributions for the histograms, etc.
// set landscape mode and do page title using proc page
#proc page
landscape: yes
pagesize: 11 8.5
#if @DEVICE in gif,png
scale: 0.5
#endif
title: Distribution of Scores Over Time
Protocol 7 vs. Protocol B
06-30-99
// read file vf.dat using proc getdata
#proc getdata
file: vf.dat
// set some variables..
// I will be our loop counter..
#set I = 1
// make a list of the data fields to use for each left member of pair ..
// (rt member will be +1)
#set FIELDLIST = 7,9,11,13
// make a list of X left locations for each pair in inches..
#set XPOSLIST = 1,3.5,6,8.5
// make a list of labels for each pair
#set LABELLIST = "Baseline,1_yr_visit,2_yr,3_yr"
// loop, once for each pair..
#loop
// get parameters from lists..
#set FLD = $nmember(@I,@FIELDLIST)
#if $strlen(@FLD) < 1
#break
#endif
#set XPOS = $nmember(@I,@XPOSLIST)
#set LABEL = $nmember(@I,@LABELLIST)
#set LABEL = $change( "_", " ", @LABEL )
//////////////////////////
// first do left of pair..
//////////////////////////
// set up plotting area for histogram (left member of pair) using proc areadef
#proc areadef
box: 1 2.5
location: @XPOS 4
xrange: 0 40
yrange: 0 100
#saveas A
// if the leftmost pair, do a Y axis using proc yaxis
#if @I = 1
#proc yaxis
stubs: inc 10
label: Score
labeldistance: 0.7
stubslide: -2.5(s)
ticlen: 0 0
#endif
// if the rightmost pair, do a Y axis using proc yaxis
#if @I = 4
#proc yaxis
location: 10.2
label: Score
labeldistance: -0.7
stubs: inc 10
stubdetails: adjust=0.5,0
stubslide: -2.5(s)
ticlen: 0 0
#endif
// render label above pair using proc annotate
#proc annotate
location: max-0.2 max+0.2
textdetails: align=C
text: @LABEL
// compute distribution for histogram using proc tabulate
#proc tabulate
axis1: y
datafield1: @FLD
rangespec1: 0 5 95
percents: yes
select: @@4 = B
showrangelowonly: yes
#saveas: T
// we cannot do a histogram if N is too low.. find N using proc processdata
// (the variable TOTALS will be set)..
#proc processdata
action: total
fields: 2
#endproc
// only do the histogram if we have > 10 cases..
#if @TOTALS > 10
// render histogram using proc bars
#proc bars
horizontalbars: yes
locfield: 1
lenfield: 3
barwidth: 0.08
#saveas B
#endif
// now set up plotting area for rangebars using proc areadef
#proc areadef
box: 1 2
location: @XPOS 1
xrange: 0 1
yrange: 0 100
#saveas A2
// if leftmost pair do a Y axis using proc yaxis
#if @I = 1
#proc yaxis
stubs: inc 10
label: Score
labeldistance: 0.7
#endif
// if rightmost pair do a Y axis using proc yaxis
#if @I = 4
#proc yaxis
location: 10.2
label: Score
labeldistance: -0.7
stubs: inc 10
stubdetails: adjust=0.5,0
ticlen: -0.1
#endif
// get back to original set of data (proc originaldata)
#proc originaldata
// render rangebar using proc rangebar
#proc rangebar
select: @@4 = B
datafield: @FLD
barloc: 0.25
mediansym: shape=circle style=filled fillcolor=0.3
nlocation: -10(s)
color: 0.9
#saveas R
////////////////////////////
// now do right of pair..
// (repeat of procedure above)
////////////////////////////
#set XPOS = $arith(@XPOS+1.0)
// do histogram..
#proc areadef
#clone A
location: @XPOS 4
#proc tabulate
#clone: T
select: @@4 = 7
// see if total is high enough to display histogram..
#proc processdata
action: total
fields: 2
#endproc
// only do the histogram if we have > 10 cases..
#if @TOTALS > 10
#proc bars
#clone B
#endif
// do rangebar..
#proc areadef
#clone: A2
location: @XPOS 1
// get back to data set originally read..
#proc originaldata
#proc rangebar
#clone R
select: @@4 = 7
barloc: 0.15
datafield: @FLD
#set I = $arith(@I+1)
#endloop
ploticus-2.42/pltestsuite/data13 0000644 0001750 0001750 00000007106 07350153572 015675 0 ustar colin colin 01/09/05.09:43:35
01/09/05.09:43:40
01/09/05.13:15:00
01/09/05.13:15:11
01/09/05.13:15:17
01/09/05.13:15:47
01/09/05.13:16:51
01/09/05.13:16:56
01/09/06.07:47:49
01/09/06.07:47:52
01/09/06.07:47:54
01/09/06.07:48:02
01/09/06.07:48:09
01/09/06.07:48:18
01/09/06.07:48:32
01/09/06.08:58:21
01/09/06.08:58:24
01/09/06.08:58:28
01/09/06.08:58:59
01/09/06.09:07:56
01/09/06.09:08:00
01/09/06.10:31:43
01/09/06.10:31:47
01/09/06.10:31:55
01/09/06.10:32:04
01/09/06.10:34:09
01/09/06.10:36:16
01/09/06.10:36:18
01/09/06.10:37:49
01/09/06.10:39:00
01/09/06.10:39:04
01/09/06.10:39:19
01/09/06.10:39:51
01/09/06.10:40:20
01/09/06.10:40:23
01/09/06.10:40:53
01/09/06.10:41:15
01/09/06.10:41:35
01/09/06.10:41:52
01/09/06.10:42:02
01/09/06.10:42:18
01/09/06.10:42:42
01/09/06.10:44:18
01/09/06.10:44:45
01/09/06.10:45:14
01/09/06.10:45:32
01/09/06.10:46:35
01/09/06.10:47:00
01/09/06.10:48:07
01/09/06.10:48:12
01/09/06.10:48:25
01/09/06.10:49:29
01/09/06.10:49:53
01/09/06.10:49:59
01/09/06.10:50:36
01/09/06.10:50:40
01/09/06.10:50:58
01/09/06.10:53:21
01/09/06.10:54:08
01/09/06.10:54:13
01/09/06.10:54:17
01/09/06.10:54:27
01/09/06.10:54:51
01/09/06.10:55:01
01/09/06.10:55:55
01/09/06.10:55:57
01/09/06.10:56:12
01/09/06.10:57:34
01/09/06.10:57:59
01/09/06.10:58:01
01/09/06.10:58:31
01/09/06.11:00:17
01/09/06.11:00:26
01/09/06.11:00:45
01/09/06.11:00:50
01/09/06.11:01:07
01/09/06.11:01:08
01/09/06.11:01:24
01/09/06.11:02:10
01/09/06.11:02:38
01/09/06.11:02:49
01/09/06.11:03:13
01/09/06.11:04:16
01/09/06.11:04:57
01/09/06.11:05:05
01/09/06.11:05:32
01/09/06.11:06:05
01/09/06.11:06:07
01/09/06.11:06:15
01/09/06.11:06:21
01/09/06.11:06:33
01/09/06.11:09:17
01/09/06.11:09:48
01/09/06.11:10:33
01/09/06.11:10:53
01/09/06.11:11:11
01/09/06.11:11:48
01/09/06.11:13:29
01/09/06.11:13:43
01/09/06.11:14:20
01/09/06.11:15:36
01/09/06.11:16:27
01/09/06.11:16:32
01/09/06.11:16:43
01/09/06.11:16:48
01/09/06.11:16:59
01/09/06.11:17:16
01/09/06.11:17:20
01/09/06.11:17:50
01/09/06.11:18:01
01/09/06.11:18:12
01/09/06.11:18:25
01/09/06.11:18:50
01/09/06.11:19:34
01/09/06.11:20:17
01/09/06.11:20:43
01/09/06.11:21:55
01/09/06.11:21:59
01/09/06.11:22:03
01/09/06.11:22:05
01/09/06.11:24:40
01/09/06.11:29:00
01/09/06.11:30:04
01/09/06.11:30:36
01/09/06.11:31:36
01/09/06.11:36:04
01/09/06.11:36:05
01/09/06.11:37:06
01/09/06.11:38:14
01/09/06.11:39:08
01/09/06.11:41:38
01/09/06.11:41:47
01/09/06.11:41:51
01/09/06.11:41:56
01/09/06.11:42:00
01/09/06.11:42:20
01/09/06.11:42:30
01/09/06.11:43:36
01/09/06.11:44:00
01/09/06.11:44:04
01/09/06.11:44:10
01/09/06.11:44:14
01/09/06.11:44:29
01/09/06.11:45:02
01/09/06.11:47:46
01/09/06.11:47:48
01/09/06.14:54:43
01/09/06.14:55:00
01/09/06.14:55:19
01/09/06.14:55:36
01/09/06.15:03:27
01/09/06.15:03:52
01/09/06.15:04:06
01/09/06.15:20:31
01/09/06.15:20:43
01/09/06.15:21:34
01/09/06.15:22:39
01/09/06.15:23:40
01/09/07.10:41:47
01/09/07.10:41:49
01/09/07.10:41:53
01/09/07.10:41:55
01/09/07.10:42:10
01/09/07.10:42:31
01/09/07.10:44:09
01/09/07.10:44:10
01/09/07.10:44:11
01/09/07.10:44:18
01/09/07.10:44:23
01/09/07.10:44:27
01/09/07.10:44:29
01/09/07.10:44:55
01/09/07.10:44:56
01/09/07.10:45:33
01/09/07.10:45:37
01/09/07.10:45:54
01/09/07.10:46:06
01/09/07.10:46:32
01/09/07.10:46:41
01/09/07.10:46:59
01/09/07.10:48:04
01/09/07.10:48:37
01/09/07.13:25:33
01/09/07.13:25:40
01/09/07.13:25:45
01/09/07.13:26:02
01/09/07.13:26:06
01/09/07.13:26:56
01/09/07.13:28:45
01/09/07.13:29:45
01/09/07.13:30:05
01/09/07.13:30:15
01/09/07.13:32:19
01/09/07.13:34:02
01/09/07.13:36:13
01/09/07.13:37:04
01/09/07.13:37:21
01/09/07.13:37:53
01/09/07.13:38:15
01/09/07.13:38:33
01/09/07.13:38:48
01/09/07.13:39:16
01/09/07.13:39:33
ploticus-2.42/pltestsuite/testpf_multidist 0000755 0001750 0001750 00000000337 07745255252 020233 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=
if [ "$DEV" = "" ]; then
DEV=x11
fi
echo multidist1..
pl -prefab multidist overlay=yes data=data21 rotate=yes xrange="0 2000" yrange="0 20" \
-$DEV -o ${OUTDIR}multidist1.$DEV $ARGS
ploticus-2.42/pltestsuite/pie1.htm 0000644 0001750 0001750 00000001301 07377505262 016242 0 ustar colin colin pie1

How to download and try this example
Usage: pl -gif pie1.htm
#proc page
#if @DEVICE in gif,png
scale: 0.7
#endif
// specify data using proc getdata
#proc getdata
data: Brazil 22
Columbia 17
"Costa Rica" 22
Guatemala 3
Honduras 12
Mexico 14
Nicaragua 28
Belize 9
United\nStates 21
Canada 8
// render the pie graph using proc pie
#proc pie
firstslice: 90
explode: .2 0 0 0 0 .2 0
datafield: 2
labelfield: 1
labelmode: line+label
center: 4 4
radius: 2
colors: yellow pink pink pink pink yellow pink
labelfarout: 1.05
ploticus-2.42/pltestsuite/annot2.htm 0000644 0001750 0001750 00000002151 10714344352 016577 0 ustar colin colin annot2

How to download and try this example
Usage: pl -gif annot2.htm
// #proc page
// pagesize: 6 5
#proc annotate
location: 3 4.6
textdetails: size=14
text: Annotation examples
#proc annotate
location: 3 4
arrowhead: 3.2 4.5
text: Example
one
#proc annotate
location: 3 3.5
arrowhead: 2 4
arrowhead2: 4 4
box: no
backcolor: yellow
text: Example two,
with two arrows
#proc annotate
location: 3 3
arrowhead: 1.8 3
box: no
bevelsize: 0.07
backcolor: lightorange
text: Example three
#proc annotate
location: 3 2.5
arrowhead: 4.1 2.6
box: width=2 color=blue
arrowdetails: width=2 color=blue
arrowheadsize: 0.3
backcolor: pink
text: Example four,
with fat lines
#proc annotate
location: 3 2
arrowhead: 2 1
arrowhead2: 4 1.3
textdetails: size=8
box: yes
text: Example five,
with two arrows
again
#proc annotate
location: 3 1.1
arrowhead: 3.2 0.5
box: yes
backcolor: limegreen
//bevelsize: 0.05
shadowsize: 0.05
boxmargin: 0.2
text: Example six
ploticus-2.42/pltestsuite/sar-cpu.htm 0000644 0001750 0001750 00000002170 10743167700 016753 0 ustar colin colin sar-cpu

How to download and try this example
// Plot CPU utilization data as produced by sar(1) utility.
// Contributed by Pablo Marques (pmarques@herald.com)
// Usage: pl -gif sar-cpu.htm
// Uses the data file sar-cpu.dat
#proc page
#if @DEVICE in png,gif
scale: 0.6
#endif
#proc getdata
file: sar-cpu.dat
fieldnames: time usr sys wio idle
#proc areadef
title: % CPU Utilization
titledetails: size=14 align=C
rectangle: 1 1 8 4
xscaletype: time hh:mm:ss
xrange: 00:00:00 23:59:59
yrange: 0 100
#proc xaxis
stubs: inc 2 hours
minorticinc: 30 minutes
stubformat: hhA
#proc yaxis
stubs: inc 10
// grid: color=orange
gridskip: min
ticincrement: 100 1000
#proc curvefit
xfield: time
yfield: wio
linedetails: color=blue width=.5
legendlabel: wio
#proc curvefit
xfield: time
yfield: sys
linedetails: color=red width=.5
legendlabel: sys
#proc curvefit
xfield: time
yfield: usr
linedetails: color=green width=.5
legendlabel: usr
#proc legend
location: max-1 max
seglen: 0.2
ploticus-2.42/pltestsuite/bigcsv.pl 0000644 0001750 0001750 00000300503 10715067502 016500 0 ustar colin colin // graphic Performance.DiskIO.HBA.Instances
#proc settings
numbernotation: standard
cpulimit: 3600
#proc getdata
delim: comma
nfields: 57
data:
20070905.00:02:30,0.0,0.0,0.6,1.4,0.3,0.0,1.3,0.0,0.0,0.7,1.5,0.0,0.5,0.0,1.3,0.0,0.0,0.1,0.0,0.3,0.8,30.4,0.8,26.0,0.0,0.8,0.0,1.5,0.4,0.0,0.0,1.3,0.0,0.8,0.0,0.2,13.0,0.4,0.8,16.3,0.2,0.0,0.0,0.9,0.0,1.3,0.0,0.6,0.0,1.4,0.7,0.0,0.3,0.0,1.2,0.0
20070905.00:07:30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
20070905.00:12:30,0.0,0.0,0.6,8.7,0.3,0.0,7.8,0.0,0.0,0.7,8.9,0.0,0.5,0.0,8.4,0.0,0.0,0.1,0.0,4.0,0.8,37.5,0.2,10.0,0.0,0.8,0.0,9.2,0.4,0.0,0.0,8.2,0.0,4.2,0.0,0.2,5.0,0.1,0.8,23.5,0.2,0.0,0.0,4.2,0.0,8.7,0.0,0.6,0.0,8.9,0.7,0.0,0.3,0.0,7.8,0.0
20070905.00:17:30,0.0,0.0,2.3,1.9,1.1,0.0,1.6,0.0,0.0,2.8,2.0,0.0,1.9,0.0,1.8,0.0,0.0,0.3,0.0,1.0,3.2,28.6,0.4,25.0,0.0,3.2,0.0,2.1,1.5,0.0,0.0,1.7,0.0,1.5,0.0,0.7,13.0,0.2,3.2,15.5,0.7,0.0,0.0,1.5,0.0,1.9,0.0,2.3,0.0,2.0,2.8,0.0,1.1,0.0,1.6,0.0
20070905.00:22:30,0.0,0.0,0.6,0.9,0.3,0.0,0.5,0.0,0.0,0.7,1.0,0.0,0.5,0.0,0.7,0.0,0.0,0.1,0.0,0.1,0.8,29.1,0.4,15.0,0.0,0.8,0.0,1.1,0.4,0.0,0.0,0.6,0.0,0.2,0.0,0.2,8.0,0.2,0.8,15.3,0.2,0.0,0.0,0.3,0.0,0.8,0.0,0.6,0.0,1.,0.7,0.0,0.3,0.0,0.4,0.0
20070905.00:27:30,0.0,0.0,0.0,9.2,0.0,0.0,4.9,0.0,0.0,0.0,9.5,0.0,0.0,0.0,8.9,0.0,0.0,0.0,0.0,0.2,0.0,38.3,0.2,10.0,0.0,0.0,0.0,9.9,0.0,0.0,0.0,8.7,0.0,0.4,0.0,0.0,5.0,0.1,0.0,24.5,0.0,0.0,0.0,0.4,0.0,9.2,0.0,0.0,0.0,9.5,0.0,0.0,0.0,0.0,4.9,0.0
20070905.00:32:30,0.0,0.0,0.6,0.6,0.3,0.0,0.5,0.0,0.0,0.7,0.6,0.0,0.5,0.0,0.5,0.0,0.0,0.1,0.0,0.3,0.8,26.3,0.6,24.0,0.0,0.8,0.0,0.6,0.4,0.0,0.0,0.5,0.0,0.4,0.0,0.2,12.0,0.3,0.8,13.7,0.2,0.0,0.0,0.4,0.0,0.5,0.0,0.6,0.0,0.6,0.7,0.0,0.3,0.0,0.4,0.0
20070905.00:37:30,0.0,0.0,0.0,2.2,0.0,0.0,0.3,0.0,0.0,0.0,3.3,0.0,0.0,0.0,2.1,0.0,0.0,0.0,0.0,0.1,0.0,29.3,0.2,14.0,0.0,0.0,0.0,3.3,0.0,0.0,0.0,0.3,0.0,0.2,0.0,0.0,7.0,0.1,0.0,16.4,0.0,0.0,0.0,0.2,0.0,2.2,0.0,0.0,0.0,3.3,0.0,0.0,0.0,0.0,0.3,0.0
20070905.00:42:30,0.0,0.0,0.5,10.6,0.3,0.0,4.0,0.0,0.0,0.6,10.8,0.0,0.4,0.0,10.3,0.0,0.0,0.1,0.0,0.2,0.7,43.9,0.2,10.0,0.0,0.7,0.0,11.2,0.4,0.0,0.0,7.7,0.0,0.4,0.0,0.2,5.0,0.1,0.7,27.6,0.2,0.0,0.0,0.4,0.0,10.6,0.0,0.5,0.0,10.8,0.6,0.0,0.3,0.0,4.0,0.0
20070905.00:47:30,0.0,0.0,0.0,1.0,0.0,0.0,0.9,0.0,0.0,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.0,0.0,28.1,0.4,24.0,0.0,0.0,0.0,1.6,0.0,0.0,0.0,0.9,0.0,0.3,0.0,0.0,12.0,0.2,0.0,15.1,0.0,0.0,0.0,0.3,0.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.9,0.0
20070905.00:52:30,0.0,0.0,0.4,9.2,0.3,0.0,3.0,0.0,0.0,0.5,9.3,0.0,0.4,0.0,7.3,0.0,0.0,0.1,0.0,0.1,0.6,35.2,0.4,16.0,0.0,0.6,0.0,9.4,0.4,0.0,0.0,4.2,0.0,0.2,0.0,0.2,8.0,0.2,0.6,22.6,0.2,0.0,0.0,0.3,0.0,9.1,0.0,0.4,0.0,9.3,0.5,0.0,0.3,0.0,2.9,0.0
20070905.00:57:30,0.0,0.0,0.0,46.3,0.0,0.0,45.3,0.0,0.0,0.0,46.6,0.0,0.0,0.0,45.9,0.0,0.0,0.0,0.0,24.3,0.0,75.8,0.2,9.0,0.0,0.0,0.0,46.9,0.0,0.0,0.0,45.6,0.0,28.8,0.0,0.0,5.0,0.1,0.0,61.6,0.0,0.0,0.0,28.8,0.0,46.3,0.0,0.0,0.0,46.6,0.0,0.0,0.0,0.0,45.3,0.0
20070905.01:02:30,0.0,0.0,0.6,1.1,0.3,0.0,0.9,0.0,0.0,0.7,1.2,0.0,0.5,0.0,1.0,0.0,0.0,0.1,0.0,0.3,0.8,30.3,0.6,25.0,0.0,0.8,0.0,1.2,0.4,0.0,0.0,1.0,0.0,0.3,0.0,0.2,13.0,0.3,0.8,15.9,0.2,0.0,0.0,0.4,0.0,1.0,0.0,0.6,0.0,1.1,0.7,0.0,0.3,0.0,0.8,0.0
20070905.01:07:30,0.0,0.0,0.0,4.7,0.0,0.0,2.5,0.0,0.0,0.0,5.2,0.0,0.0,0.0,3.8,0.0,0.0,0.0,0.0,0.9,0.0,35.0,0.4,14.0,0.0,0.0,0.0,5.3,0.0,0.0,0.0,2.6,0.0,2.4,0.0,0.0,7.0,0.2,0.0,20.4,0.0,0.0,0.0,2.4,0.0,4.5,0.0,0.0,0.0,5.2,0.0,0.0,0.0,0.0,2.5,0.0
20070905.01:12:30,0.0,0.0,0.5,6.6,0.2,0.0,5.2,0.0,0.0,0.6,6.9,0.0,0.4,0.0,6.4,0.0,0.0,0.0,0.0,4.6,0.7,34.4,0.2,10.0,0.0,0.7,0.0,7.3,0.3,0.0,0.0,5.5,0.0,4.9,0.0,0.1,5.0,0.1,0.7,21.1,0.1,0.0,0.0,4.9,0.0,6.6,0.0,0.5,0.0,6.9,0.6,0.0,0.2,0.0,5.2,0.0
20070905.01:17:30,0.0,0.0,2.4,1.2,1.2,0.0,0.6,0.0,0.0,2.8,1.3,0.0,2.0,0.0,1.1,0.0,0.0,0.4,0.0,0.1,3.2,29.8,0.4,24.0,0.0,3.2,0.0,1.4,1.6,0.0,0.0,1.0,0.0,0.2,0.0,0.8,12.0,0.2,3.2,15.8,0.8,0.0,0.0,0.2,0.0,1.2,0.0,2.4,0.0,1.3,2.8,0.0,1.2,0.0,0.6,0.0
20070905.01:22:30,0.0,0.0,0.5,5.2,0.2,0.0,3.7,0.0,0.0,0.5,6.4,0.0,0.4,0.0,4.9,0.0,0.0,0.0,0.0,2.2,0.6,35.3,0.4,16.0,0.0,0.6,0.0,6.4,0.3,0.0,0.0,3.7,0.0,2.3,0.0,0.1,8.0,0.2,0.6,21.0,0.1,0.0,0.0,2.4,0.0,4.999999,0.0,0.5,0.0,6.3999996,0.5,0.0,0.2,0.0,3.6,0.0
20070905.01:27:30,0.0,0.0,0.0,6.7,0.0,0.0,1.0,0.0,0.0,0.0,7.1,0.0,0.0,0.0,1.5,0.0,0.0,0.0,0.0,0.3,0.0,36.6,0.2,10.0,0.0,0.0,0.0,7.4,0.0,0.0,0.0,1.2,0.0,0.6,0.0,0.0,5.0,0.1,0.0,22.3,0.0,0.0,0.0,0.6,0.0,6.7,0.0,0.0,0.0,7.1,0.0,0.0,0.0,0.0,1.0,0.0
20070905.01:32:30,0.0,0.0,0.6,0.6,0.3,0.0,0.3,0.0,0.0,0.7,0.6,0.0,0.5,0.0,0.5,0.0,0.0,0.1,0.0,0.0,0.8,26.2,0.6,24.0,0.0,0.8,0.0,0.6,0.4,0.0,0.0,0.5,0.0,0.0,0.0,0.2,12.0,0.3,0.800000,13.700001,0.2,0.0,0.0,0.1,0.0,0.5,0.0,0.6,0.0,0.6,0.7,0.0,0.3,0.0,0.2,0.0
20070905.01:37:30,0.0,0.0,0.0,4.4,0.0,0.0,4.2,0.0,0.0,0.0,4.5,0.0,0.0,0.0,4.4,0.0,0.0,0.0,0.0,1.3,0.0,35.8,0.2,15.0,0.0,0.0,0.0,4.5,0.0,0.0,0.0,4.3,0.0,4.1,0.0,0.0,8.0,0.1,0.0,20.5,0.0,0.0,0.0,4.1,0.0,4.4,0.0,0.0,0.0,4.5,0.0,0.0,0.0,0.0,4.2,0.0
20070905.01:42:30,0.0,0.0,0.4,15.0,0.2,0.0,11.5,0.0,0.0,0.5,15.3,0.0,0.3,0.0,14.7,0.0,0.0,0.0,0.0,4.1,0.6,45.2,0.2,8.0,0.0,0.6,0.0,15.5,0.3,0.0,0.0,11.7,0.0,4.4,0.0,0.1,4.0,0.1,0.6,30.6,0.1,0.0,0.0,4.4,0.0,15.0,0.0,0.4,0.0,15.3,0.5,0.0,0.2,0.0,11.5,0.0
20070905.01:47:30,0.0,0.0,0.0,0.70000005,0.0,0.0,0.4,0.0,0.0,0.0,0.70000005,0.0,0.0,0.0,0.70000005,0.0,0.0,0.0,0.0,0.0,0.0,26.5,0.4,24.0,0.0,0.0,0.0,0.70000005,0.0,0.0,0.0,0.4,0.0,0.4,0.0,0.0,12.0,0.2,0.0,13.8,0.0,0.0,0.0,0.4,0.0,0.70000005,0.0,0.0,0.0,0.70000005,0.0,0.0,0.0,0.0,0.4,0.0
20070905.01:52:30,0.0,0.0,0.5,4.5999994,0.2,0.0,2.2999997,0.0,0.0,0.6,4.6999993,0.0,0.4,0.0,3.3999996,0.0,0.0,0.0,0.0,1.9,0.70000005,34.0,0.4,16.0,0.0,0.70000005,0.0,4.6999993,0.3,0.0,0.0,3.2999997,0.0,2.0,0.0,0.1,8.0,0.2,0.70000005,19.5,0.1,0.0,0.0,2.1,0.0,4.4999995,0.0,0.5,0.0,4.6999993,0.6,0.0,0.2,0.0,2.1999998,0.0
20070905.01:57:30,0.0,0.0,0.0,12.0,0.0,0.0,11.099999,0.0,0.0,0.0,12.3,0.0,0.0,0.0,11.7,0.0,0.0,0.0,0.0,6.2,0.0,39.2,0.2,9.0,0.0,0.0,0.0,12.7,0.0,0.0,0.0,11.4,0.0,10.9,0.0,0.0,5.0,0.1,0.0,26.2,0.0,0.0,0.0,10.9,0.0,12.0,0.0,0.0,0.0,12.3,0.0,0.0,0.0,0.0,11.099999,0.0
20070905.02:02:30,0.0,0.0,0.6,0.8000001,0.3,0.0,0.3,0.0,0.0,0.70000005,1.0000001,0.0,0.5,0.0,0.3,0.0,0.0,0.1,0.0,0.0,0.8000001,28.099998,0.6,28.0,0.0,0.8000001,0.0,1.0000001,0.4,0.0,0.0,0.3,0.0,0.1,0.0,0.2,14.0,0.3,0.8000001,14.7,0.2,0.0,0.0,0.2,0.0,0.70000005,0.0,0.6,0.0,0.8000001,0.70000005,0.0,0.3,0.0,0.2,0.0
20070905.02:07:30,0.0,0.0,0.0,7.7000003,0.0,0.0,1.0,0.0,0.0,0.0,7.7000003,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.5,0.0,31.1,0.6,20.0,0.0,0.0,0.0,7.7000003,0.0,0.0,0.0,1.0,0.0,0.5,0.0,0.0,10.0,0.3,0.0,19.6,0.0,0.0,0.0,0.5,0.0,1.4,0.0,0.0,0.0,7.7000003,0.0,0.0,0.0,0.0,1.0,0.0
20070905.02:12:30,0.0,0.0,0.6,9.400001,0.3,0.0,8.6,0.0,0.0,0.70000005,9.700001,0.0,0.5,0.0,9.200001,0.0,0.0,0.1,0.0,3.2,0.8000001,38.0,0.2,9.0,0.0,0.8000001,0.0,10.1,0.4,0.0,0.0,8.900001,0.0,8.3,0.0,0.2,5.0,0.1,0.8000001,24.2,0.2,0.0,0.0,8.3,0.0,9.400001,0.0,0.6,0.0,9.700001,0.70000005,0.0,0.3,0.0,8.6,0.0
20070905.02:17:30,0.0,0.0,2.4,0.9000001,1.2,0.0,0.6,0.0,0.0,2.8000002,1.0000001,0.0,2.0,0.0,0.8000001,0.0,0.0,0.4,0.0,0.4,3.2000003,28.2,0.4,24.0,0.0,3.2000003,0.0,1.1000001,1.6,0.0,0.0,0.70000005,0.0,0.5,0.0,0.8,12.0,0.2,3.2000003,15.0,0.8,0.0,0.0,0.5,0.0,0.9000001,0.0,2.4,0.0,1.0000001,2.8000002,0.0,1.2,0.0,0.6,0.0
20070905.02:22:30,0.0,0.6,0.6,4.3999996,0.3,0.3,3.6,0.0,0.0,0.70000005,4.6999993,0.70000005,0.5,0.0,4.1,0.5,0.1,0.1,0.0,1.0,0.8000001,32.5,1.2000002,16.0,0.8000001,0.8000001,0.0,4.799999,0.4,0.4,0.0,3.8,0.0,3.2,0.2,0.2,8.0,1.0000001,0.8000001,18.699999,0.2,0.2,0.0,3.3,0.0,4.2999997,0.6,0.6,0.70000005,4.5999994,0.70000005,0.0,0.3,0.0,3.5,0.3
20070905.02:27:30,0.0,0.0,0.0,21.4,0.0,0.0,0.8,0.0,0.0,0.0,21.8,0.0,0.0,0.0,11.0,0.0,0.0,0.0,0.0,0.3,0.0,50.5,0.2,9.0,0.0,0.0,0.0,22.099998,0.0,0.0,0.0,1.1,0.0,0.5,0.0,0.0,5.0,0.1,0.0,36.399998,0.0,0.0,0.0,0.5,0.0,21.4,0.0,0.0,0.0,21.8,0.0,0.0,0.0,0.0,0.8,0.0
20070905.02:32:30,0.0,0.0,0.6,1.0,0.3,0.0,0.5,0.0,0.0,0.70000005,1.0,0.0,0.5,0.0,0.9,0.0,0.0,0.1,0.0,0.0,0.8000001,27.6,0.4,25.0,0.0,0.8000001,0.0,1.0,0.4,0.0,0.0,0.5,0.0,0.3,0.0,0.2,13.0,0.2,0.8000001,14.5,0.2,0.0,0.0,0.4,0.0,0.9,0.0,0.6,0.0,1.0,0.70000005,0.0,0.3,0.0,0.4,0.0
20070905.02:37:30,0.0,0.0,0.0,4.0,0.0,0.0,1.6,0.0,0.0,0.0,4.0,0.0,0.0,0.0,4.0,0.0,0.0,0.0,0.0,0.1,0.0,29.1,0.2,14.0,0.0,0.0,0.0,4.0,0.0,0.0,0.0,2.5,0.0,1.5,0.0,0.0,7.0,0.1,0.0,16.7,0.0,0.0,0.0,1.5,0.0,4.0,0.0,0.0,0.0,4.0,0.0,0.0,0.0,0.0,1.6,0.0
20070905.02:42:30,0.0,0.0,0.5,19.1,0.2,0.0,14.900001,0.0,0.0,0.6,19.4,0.0,0.4,0.0,18.800001,0.0,0.0,0.1,0.0,0.3,0.70000005,50.3,0.2,10.0,0.0,0.70000005,0.0,19.8,0.3,0.0,0.0,15.200001,0.0,11.400001,0.0,0.1,5.0,0.1,0.70000005,35.1,0.1,0.0,0.0,11.400001,0.0,19.1,0.0,0.5,0.0,19.4,0.6,0.0,0.2,0.0,14.900001,0.0
20070905.02:47:30,0.0,0.0,0.0,2.3999999,0.0,0.0,1.3,0.0,0.0,0.0,2.3999999,0.0,0.0,0.0,2.3999999,0.0,0.0,0.0,0.0,0.7,0.0,30.1,0.4,23.0,0.0,0.0,0.0,2.3999999,0.0,0.0,0.0,1.6999999,0.0,0.9,0.0,0.0,12.0,0.2,0.0,16.6,0.0,0.0,0.0,0.9,0.0,2.3999999,0.0,0.0,0.0,2.3999999,0.0,0.0,0.0,0.0,1.3,0.0
20070905.02:52:30,0.0,0.0,0.6,2.5999997,0.3,0.0,2.1999998,0.0,0.0,0.70000005,2.7999995,0.0,0.5,0.0,2.4999998,0.0,0.0,0.1,0.0,0.1,0.8000001,32.9,0.4,16.0,0.0,0.8000001,0.0,2.8999994,0.4,0.0,0.0,2.3999999,0.0,0.2,0.0,0.2,8.0,0.2,0.8000001,17.9,0.2,0.0,0.0,0.3,0.0,2.4999998,0.0,0.6,0.0,2.6999996,0.70000005,0.0,0.3,0.0,2.1,0.0
20070905.02:57:30,0.0,0.0,0.0,16.0,0.0,0.0,10.700001,0.0,0.0,0.0,16.2,0.0,0.0,0.0,11.1,0.0,0.0,0.0,0.0,10.1,0.0,45.3,0.2,8.0,0.0,0.0,0.0,16.5,0.0,0.0,0.0,10.900001,0.0,10.400001,0.0,0.0,4.0,0.1,0.0,31.1,0.0,0.0,0.0,10.400001,0.0,16.0,0.0,0.0,0.0,16.2,0.0,0.0,0.0,0.0,10.700001,0.0
20070905.03:02:30,0.0,0.0,0.6,1.4000002,0.3,0.0,0.8000001,0.0,0.0,0.70000005,1.6000003,0.0,0.5,0.0,1.1000001,0.0,0.0,0.1,0.0,0.0,0.8000001,28.900002,0.6,25.0,0.0,0.8000001,0.0,1.6000003,0.4,0.0,0.0,1.1000001,0.0,0.6,0.0,0.2,13.0,0.3,0.8000001,15.6,0.2,0.0,0.0,0.70000005,0.0,1.3000002,0.0,0.6,0.0,1.5000002,0.70000005,0.0,0.3,0.0,0.70000005,0.0
20070905.03:07:30,0.0,0.0,0.0,0.5,0.0,0.0,0.3,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.4,0.0,0.0,0.0,0.0,0.1,0.0,23.400002,0.2,14.0,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.3,0.0,0.2,0.0,0.0,7.0,0.1,0.0,12.1,0.0,0.0,0.0,0.2,0.0,0.5,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.0,0.3,0.0
20070905.03:12:30,0.0,0.0,0.6,12.199999,0.3,0.0,11.599999,0.0,0.0,0.70000005,12.599998,0.0,0.5,0.0,11.999999,0.0,0.0,0.1,0.0,7.8,0.8000001,46.1,0.4,10.0,0.0,0.8000001,0.0,12.899999,0.4,0.0,0.0,11.799999,0.0,11.4,0.0,0.2,5.0,0.2,0.8000001,30.0,0.2,0.0,0.0,11.4,0.0,12.199999,0.0,0.6,0.0,12.599998,0.70000005,0.0,0.3,0.0,11.599999,0.0
20070905.03:17:30,0.0,0.0,2.4,2.1000001,1.2,0.0,1.3000001,0.0,0.0,2.8000002,2.2,0.0,2.0,0.0,1.5000001,0.0,0.0,0.4,0.0,0.1,3.2000003,31.5,0.4,25.0,0.0,3.2000003,0.0,2.3,1.6,0.0,0.0,1.4000001,0.0,0.70000005,0.0,0.8,13.0,0.2,3.2000003,17.199999,0.8,0.0,0.0,0.70000005,0.0,2.1000001,0.0,2.4,0.0,2.2,2.8000002,0.0,1.2,0.0,1.3000001,0.0
20070905.03:22:30,0.0,0.0,0.6,2.6,0.3,0.0,0.8000001,0.0,0.0,0.70000005,2.7999997,0.0,0.5,0.0,2.4,0.0,0.0,0.1,0.0,0.1,0.8000001,29.599998,0.4,14.0,0.0,0.8000001,0.0,2.7999997,0.4,0.0,0.0,0.9000001,0.0,0.2,0.0,0.2,7.0,0.2,0.8000001,16.4,0.2,0.0,0.0,0.3,0.0,2.5,0.0,0.6,0.0,2.6999998,0.70000005,0.0,0.3,0.0,0.70000005,0.0
20070905.03:27:30,0.0,0.0,0.0,21.1,0.0,0.0,0.9,0.0,0.0,0.0,21.4,0.0,0.0,0.0,6.0,0.0,0.0,0.0,0.0,0.3,0.0,49.5,0.2,10.0,0.0,0.0,0.0,21.6,0.0,0.0,0.0,1.2,0.0,0.5,0.0,0.0,5.0,0.1,0.0,35.8,0.0,0.0,0.0,0.5,0.0,21.1,0.0,0.0,0.0,21.4,0.0,0.0,0.0,0.0,0.9,0.0
20070905.03:32:30,0.0,0.0,0.6,1.6000001,0.3,0.0,1.5000001,0.0,0.0,0.70000005,1.6000001,0.0,0.5,0.0,1.5000001,0.0,0.0,0.1,0.0,0.7,0.8000001,29.5,0.4,24.0,0.0,0.8000001,0.0,1.6000001,0.4,0.0,0.0,1.5000001,0.0,1.0,0.0,0.2,12.0,0.2,0.8000001,15.700001,0.2,0.0,0.0,1.1,0.0,1.5000001,0.0,0.6,0.0,1.6000001,0.70000005,0.0,0.3,0.0,1.4000001,0.0
20070905.03:37:30,0.0,0.0,0.0,9.9,0.0,0.0,6.5999994,0.0,0.0,0.0,10.0,0.0,0.0,0.0,9.799999,0.0,0.0,0.0,0.0,3.3,0.0,39.0,0.2,15.0,0.0,0.0,0.0,10.6,0.0,0.0,0.0,6.6999993,0.0,5.3999996,0.0,0.0,8.0,0.1,0.0,25.0,0.0,0.0,0.0,5.3999996,0.0,9.9,0.0,0.0,0.0,10.0,0.0,0.0,0.0,0.0,6.5999994,0.0
20070905.03:42:30,0.0,0.0,0.6,11.7,0.3,0.0,11.1,0.0,0.0,0.70000005,15.5,0.0,0.5,0.0,11.5,0.0,0.0,0.1,0.0,3.6,0.8000001,43.899998,0.2,9.0,0.0,0.8000001,0.0,15.7,0.4,0.0,0.0,11.3,0.0,3.8,0.0,0.2,5.0,0.1,0.8000001,30.099998,0.2,0.0,0.0,3.8,0.0,11.7,0.0,0.6,0.0,15.5,0.70000005,0.0,0.3,0.0,11.1,0.0
20070905.03:47:30,0.0,0.0,0.0,1.6000001,0.0,0.0,1.3000001,0.0,0.0,0.0,1.6000001,0.0,0.0,0.0,1.6000001,0.0,0.0,0.0,0.0,0.6,0.0,30.3,0.4,25.0,0.0,0.0,0.0,1.6000001,0.0,0.0,0.0,1.6000001,0.0,0.70000005,0.0,0.0,13.0,0.2,0.0,16.0,0.0,0.0,0.0,0.70000005,0.0,1.6000001,0.0,0.0,0.0,1.6000001,0.0,0.0,0.0,0.0,1.3000001,0.0
20070905.03:52:30,0.0,0.0,0.1,2.8999996,0.1,0.0,2.6,0.0,0.0,0.1,2.9999995,0.0,0.1,0.0,2.7999997,0.0,0.0,0.0,0.0,1.0,0.1,32.9,0.4,16.0,0.0,0.1,0.0,3.5999994,0.1,0.0,0.0,2.6999998,0.0,1.1,0.0,0.0,8.0,0.2,0.1,18.4,0.0,0.0,0.0,1.2,0.0,2.7999997,0.0,0.1,0.0,2.9999995,0.1,0.0,0.1,0.0,2.5,0.0
20070905.03:57:30,0.0,0.0,0.0,10.599999,0.0,0.0,9.9,0.0,0.0,0.0,10.9,0.0,0.0,0.0,10.4,0.0,0.0,0.0,0.0,7.2,0.0,39.699997,0.2,8.0,0.0,0.0,0.0,11.299999,0.0,0.0,0.0,10.099999,0.0,7.5,0.0,0.0,4.0,0.1,0.0,25.699999,0.0,0.0,0.0,7.5,0.0,10.599999,0.0,0.0,0.0,10.9,0.0,0.0,0.0,0.0,9.9,0.0
20070905.04:02:30,0.0,0.0,0.6,0.7,0.3,0.0,0.5,0.0,0.0,0.70000005,0.8,0.0,0.5,0.0,0.5,0.0,0.0,0.1,0.0,0.0,0.8000001,28.0,0.4,26.0,0.0,0.8000001,0.0,0.8,0.4,0.0,0.0,0.5,0.0,0.0,0.0,0.2,13.0,0.2,0.8000001,14.7,0.2,0.0,0.0,0.1,0.0,0.5,0.0,0.6,0.0,0.7,0.70000005,0.0,0.3,0.0,0.4,0.0
20070905.04:07:30,0.0,0.0,0.0,5.5999994,0.0,0.0,4.3999996,0.0,0.0,0.0,5.6999993,0.0,0.0,0.0,5.4999995,0.0,0.0,0.0,0.0,1.6,0.0,27.999998,0.2,14.0,0.0,0.0,0.0,5.799999,0.0,0.0,0.0,5.3999996,0.0,4.1,0.0,0.0,7.0,0.1,0.0,17.099998,0.0,0.0,0.0,4.1,0.0,5.5999994,0.0,0.0,0.0,5.6999993,0.0,0.0,0.0,0.0,4.2999997,0.0
20070905.04:12:30,0.0,0.0,0.6,1.3000001,0.3,0.0,0.7,0.0,0.0,0.70000005,1.6000001,0.0,0.5,0.0,1.1,0.0,0.0,0.1,0.0,0.3,0.8000001,33.199997,0.4,10.0,0.0,0.8000001,0.0,1.9000001,0.4,0.0,0.0,0.9,0.0,0.5,0.0,0.2,5.0,0.2,0.8000001,17.8,0.2,0.0,0.0,0.5,0.0,1.3000001,0.0,0.6,0.0,1.6000001,0.70000005,0.0,0.3,0.0,0.7,0.0
20070905.04:17:30,0.0,0.0,2.5,1.3000001,1.3,0.0,0.9,0.0,0.0,2.9,1.4000001,0.0,2.1,0.0,1.1,0.0,0.0,0.4,0.0,0.1,3.3000002,29.8,0.4,26.0,0.0,3.3000002,0.0,1.5000001,1.6999999,0.0,0.0,1.0,0.0,0.2,0.0,0.8,13.0,0.2,3.3000002,15.9,0.8,0.0,0.0,0.2,0.0,1.3000001,0.0,2.5,0.0,1.4000001,2.9,0.0,1.3,0.0,0.9,0.0
20070905.04:22:30,0.0,0.0,0.6,2.8999996,0.3,0.0,2.6999998,0.0,0.0,0.70000005,2.9999995,0.0,0.5,0.0,2.7999997,0.0,0.0,0.1,0.0,0.1,0.8000001,30.199999,0.4,17.0,0.0,0.8000001,0.0,2.9999995,0.4,0.0,0.0,2.6999998,0.0,1.4,0.0,0.2,9.0,0.2,0.8000001,16.699999,0.2,0.0,0.0,1.5,0.0,2.7999997,0.0,0.6,0.0,2.9999995,0.70000005,0.0,0.3,0.0,2.6,0.0
20070905.04:27:30,0.0,0.0,0.0,14.8,0.0,0.0,4.9,0.0,0.0,0.0,15.1,0.0,0.0,0.0,14.5,0.0,0.0,0.0,0.0,0.2,0.0,43.1,0.2,10.0,0.0,0.0,0.0,15.400001,0.0,0.0,0.0,10.0,0.0,4.6,0.0,0.0,5.0,0.1,0.0,29.5,0.0,0.0,0.0,4.6,0.0,14.8,0.0,0.0,0.0,15.1,0.0,0.0,0.0,0.0,4.9,0.0
20070905.04:32:30,0.0,0.0,0.6,1.0,0.3,0.0,0.6,0.0,0.0,0.70000005,1.0,0.0,0.5,0.0,0.90000004,0.0,0.0,0.1,0.0,0.0,0.8000001,29.8,0.4,26.0,0.0,0.8000001,0.0,1.0,0.4,0.0,0.0,0.90000004,0.0,0.0,0.0,0.2,13.0,0.2,0.8000001,15.6,0.2,0.0,0.0,0.1,0.0,0.90000004,0.0,0.6,0.0,1.0,0.70000005,0.0,0.3,0.0,0.5,0.0
20070905.04:37:30,0.0,0.0,0.0,5.7,0.0,0.0,4.9,0.0,0.0,0.0,5.7,0.0,0.0,0.0,5.6,0.0,0.0,0.0,0.0,3.4,0.0,29.199999,0.2,14.0,0.0,0.0,0.0,6.2999997,0.0,0.0,0.0,5.5,0.0,4.8,0.0,0.0,7.0,0.1,0.0,17.8,0.0,0.0,0.0,4.8,0.0,5.7,0.0,0.0,0.0,5.7,0.0,0.0,0.0,0.0,4.9,0.0
20070905.04:42:30,0.0,0.0,0.2,5.2,0.0,0.0,4.2999997,0.0,0.0,0.3,5.5,0.0,0.2,0.0,5.0,0.0,0.0,0.0,0.0,3.9,0.3,33.5,0.2,8.0,0.0,0.3,0.0,5.7,0.1,0.0,0.0,4.7,0.0,4.1,0.0,0.0,4.0,0.1,0.3,19.7,0.0,0.0,0.0,4.1,0.0,5.2,0.0,0.2,0.0,5.5,0.3,0.0,0.0,0.0,4.2999997,0.0
20070905.04:47:30,0.0,0.0,0.0,0.8,0.0,0.0,0.4,0.0,0.0,0.0,0.8,0.0,0.0,0.0,0.4,0.0,0.0,0.0,0.0,0.4,0.0,27.8,0.4,24.0,0.0,0.0,0.0,0.8,0.0,0.0,0.0,0.4,0.0,0.4,0.0,0.0,12.0,0.2,0.0,14.5,0.0,0.0,0.0,0.4,0.0,0.8,0.0,0.0,0.0,0.8,0.0,0.0,0.0,0.0,0.4,0.0
20070905.04:52:30,0.0,0.0,0.6,5.0999994,0.3,0.0,3.5999997,0.0,0.0,0.70000005,5.1999993,0.0,0.5,0.0,4.8999996,0.0,0.0,0.1,0.0,0.1,0.8000001,34.3,0.4,14.0,0.0,0.8000001,0.0,5.1999993,0.4,0.0,0.0,3.6999996,0.0,3.3,0.0,0.2,7.0,0.2,0.8000001,19.9,0.2,0.0,0.0,3.3999999,0.0,4.9999995,0.0,0.6,0.0,5.1999993,0.70000005,0.0,0.3,0.0,3.4999998,0.0
20070905.04:57:30,0.0,0.0,0.0,23.0,0.0,0.0,13.4,0.0,0.0,0.0,23.2,0.0,0.0,0.0,22.8,0.0,0.0,0.0,0.0,8.5,0.0,49.199997,0.2,8.0,0.0,0.0,0.0,23.5,0.0,0.0,0.0,13.7,0.0,8.8,0.0,0.0,4.0,0.1,0.0,36.8,0.0,0.0,0.0,8.8,0.0,23.0,0.0,0.0,0.0,23.2,0.0,0.0,0.0,0.0,13.4,0.0
20070905.05:02:30,6.0,0.0,5.3,1.7000002,2.6,0.0,1.0,3.0,7.0,6.2000003,2.0000002,0.0,4.4,5.0,1.4000001,0.0,0.0,0.9,1.0,0.2,7.1000004,29.099998,0.6,31.0,0.0,7.1000004,7.0,2.2000003,3.5,0.0,4.0,1.2,2.0,0.5,0.0,1.8,19.0,0.3,7.1000004,15.9,1.8,0.0,2.0,0.6,6.0,1.6000001,0.0,5.3,0.0,1.9000002,6.2000003,7.0,2.6,3.0,0.90000004,0.0
20070905.05:07:30,0.0,0.0,0.0,4.9999995,0.0,0.0,4.7,0.0,0.0,0.0,5.0999994,0.0,0.0,0.0,4.8999996,0.0,0.0,0.0,0.0,0.4,0.0,27.4,0.2,15.0,0.0,0.0,0.0,5.1999993,0.0,0.0,0.0,4.7999997,0.0,4.2,0.0,0.0,8.0,0.1,0.0,16.5,0.0,0.0,0.0,4.2,0.0,4.9999995,0.0,0.0,0.0,5.0999994,0.0,0.0,0.0,0.0,4.7,0.0
20070905.05:12:30,0.0,0.0,0.5,8.3,0.3,0.0,4.0,0.0,0.0,0.6,8.6,0.0,0.5,0.0,4.5,0.0,0.0,0.1,0.0,0.2,0.70000005,41.8,0.4,10.0,0.0,0.70000005,0.0,8.900001,0.4,0.0,0.0,4.2,0.0,3.6000001,0.0,0.2,5.0,0.2,0.70000005,25.5,0.2,0.0,0.0,3.6000001,0.0,8.3,0.0,0.5,0.0,8.6,0.6,0.0,0.3,0.0,4.0,0.0
20070905.05:17:30,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,26.2,0.4,24.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,12.0,0.2,0.0,13.3,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
20070905.05:22:30,0.0,0.0,2.6000001,2.7,1.2,0.0,1.9000001,0.0,0.0,3.0000002,3.3,0.0,2.2,0.0,2.4,0.0,0.0,0.4,0.0,1.2,3.4000003,34.3,0.4,16.0,0.0,3.4000003,0.0,3.5,1.7,0.0,0.0,2.1000001,0.0,1.5,0.0,0.8,8.0,0.2,3.4000003,18.9,0.8,0.0,0.0,1.6,0.0,2.6000001,0.0,2.6000001,0.0,3.2,3.0000002,0.0,1.2,0.0,1.8000001,0.0
20070905.05:27:30,0.0,0.0,0.0,6.3999996,0.0,0.0,0.9,0.0,0.0,0.0,6.7999997,0.0,0.0,0.0,6.2,0.0,0.0,0.0,0.0,0.3,0.0,33.4,0.2,10.0,0.0,0.0,0.0,6.9999995,0.0,0.0,0.0,6.0,0.0,0.5,0.0,0.0,5.0,0.1,0.0,20.5,0.0,0.0,0.0,0.5,0.0,6.3999996,0.0,0.0,0.0,6.7999997,0.0,0.0,0.0,0.0,0.9,0.0
20070905.05:32:30,0.0,0.0,0.6,1.1,0.3,0.0,0.70000005,0.0,0.0,0.70000005,1.2,0.0,0.5,0.0,1.0,0.0,0.0,0.1,0.0,0.0,0.8000001,28.3,0.4,24.0,0.0,0.8000001,0.0,1.2,0.4,0.0,0.0,0.70000005,0.0,0.2,0.0,0.2,12.0,0.2,0.8000001,15.099999,0.2,0.0,0.0,0.3,0.0,1.0,0.0,0.6,0.0,1.1,0.70000005,0.0,0.3,0.0,0.6,0.0
20070905.05:37:30,0.0,0.0,0.0,4.2,0.0,0.0,4.1,0.0,0.0,0.0,4.2,0.0,0.0,0.0,4.2,0.0,0.0,0.0,0.0,0.3,0.0,34.8,0.2,15.0,0.0,0.0,0.0,4.2999997,0.0,0.0,0.0,4.1,0.0,3.8,0.0,0.0,8.0,0.1,0.0,19.6,0.0,0.0,0.0,3.8,0.0,4.2,0.0,0.0,0.0,4.2,0.0,0.0,0.0,0.0,4.1,0.0
20070905.05:42:30,0.0,0.0,0.6,8.400001,0.3,0.0,4.0,0.0,0.0,0.70000005,12.900001,0.0,0.5,0.0,8.1,0.0,0.0,0.1,0.0,0.3,0.8000001,47.4,0.2,10.0,0.0,0.8000001,0.0,18.900002,0.4,0.0,0.0,4.3,0.0,3.6,0.0,0.2,5.0,0.1,0.8000001,33.4,0.2,0.0,0.0,3.6,0.0,8.400001,0.0,0.6,0.0,12.900001,0.70000005,0.0,0.3,0.0,4.0,0.0
20070905.05:47:30,0.0,0.0,0.0,0.4,0.0,0.0,0.4,0.0,0.0,0.0,0.4,0.0,0.0,0.0,0.4,0.0,0.0,0.0,0.0,0.4,0.0,26.599998,0.4,23.0,0.0,0.0,0.0,0.4,0.0,0.0,0.0,0.4,0.0,0.4,0.0,0.0,12.0,0.2,0.0,13.799999,0.0,0.0,0.0,0.4,0.0,0.4,0.0,0.0,0.0,0.4,0.0,0.0,0.0,0.0,0.4,0.0
20070905.05:52:30,0.0,0.0,0.6,2.1999998,0.3,0.0,1.3000001,0.0,0.0,0.70000005,2.2999997,0.0,0.5,0.0,2.0,0.0,0.0,0.1,0.0,0.1,2.0,23.5,0.4,22.0,0.0,0.8000001,0.0,2.2999997,0.4,0.0,0.0,1.9000001,0.0,1.0,0.0,0.2,11.0,0.2,1.4000001,13.0,0.2,0.0,0.0,1.1,0.0,2.1,0.0,0.6,0.0,2.2999997,0.70000005,0.0,0.3,0.0,1.2,0.0
20070905.05:57:30,0.0,0.0,0.0,8.1,0.0,0.0,7.4,0.0,0.0,0.0,8.400001,0.0,0.0,0.0,7.9,0.0,0.0,0.0,0.0,0.2,0.0,39.8,0.2,10.0,0.0,0.0,0.0,8.700001,0.0,0.0,0.0,7.6,0.0,7.1,0.0,0.0,5.0,0.1,0.0,24.5,0.0,0.0,0.0,7.1,0.0,8.1,0.0,0.0,0.0,8.400001,0.0,0.0,0.0,0.0,7.4,0.0
20070905.06:02:30,0.0,0.0,3.1,2.1,1.5,0.0,1.2,0.0,0.0,3.6999998,2.3999999,0.0,2.6,0.0,1.5000001,0.0,0.0,0.5,0.0,0.2,4.2999997,29.0,0.6,24.0,0.0,4.2999997,0.0,2.4999998,2.1,0.0,0.0,1.4000001,0.0,0.7,0.0,1.0,12.0,0.3,4.2999997,16.0,1.0,0.0,0.0,0.9,0.0,2.0,0.0,3.1,0.0,2.3,3.6999998,0.0,1.5,0.0,1.1,0.0
20070905.06:07:30,0.0,0.0,0.0,5.3999996,0.0,0.0,2.6999998,0.0,0.0,0.0,5.4999995,0.0,0.0,0.0,4.2,0.0,0.0,0.0,0.0,1.1,0.0,33.7,0.4,16.0,0.0,0.0,0.0,5.5999994,0.0,0.0,0.0,3.1999998,0.0,2.6,0.0,0.0,8.0,0.2,0.0,19.9,0.0,0.0,0.0,2.6,0.0,5.3999996,0.0,0.0,0.0,5.4999995,0.0,0.0,0.0,0.0,2.6999998,0.0
20070905.06:12:30,0.0,0.0,0.6,10.599999,0.3,0.0,6.2,0.0,0.0,0.70000005,10.9,0.0,0.5,0.0,6.5999994,0.0,0.0,0.1,0.0,0.3,0.8000001,44.5,0.4,10.0,0.0,0.8000001,0.0,11.2,0.4,0.0,0.0,6.3999996,0.0,1.1,0.0,0.2,5.0,0.2,0.8000001,28.099998,0.2,0.0,0.0,1.1,0.0,10.599999,0.0,0.6,0.0,10.9,0.70000005,0.0,0.3,0.0,6.2,0.0
20070905.06:17:30,0.0,0.0,0.0,0.4,0.0,0.0,0.1,0.0,0.0,0.0,0.4,0.0,0.0,0.0,0.4,0.0,0.0,0.0,0.0,0.0,0.0,27.3,0.4,24.0,0.0,0.0,0.0,0.4,0.0,0.0,0.0,0.4,0.0,0.1,0.0,0.0,12.0,0.2,0.0,14.0,0.0,0.0,0.0,0.1,0.0,0.4,0.0,0.0,0.0,0.4,0.0,0.0,0.0,0.0,0.1,0.0
20070905.06:22:30,0.0,0.0,2.4,4.2999997,1.2,0.0,3.1,0.0,0.0,2.8000002,4.5999994,0.0,2.0,0.0,4.0,0.0,0.0,0.4,0.0,0.2,3.2000003,34.5,0.4,14.0,0.0,3.2000003,0.0,4.6999993,1.6,0.0,0.0,3.3,0.0,2.7,0.0,0.8,7.0,0.2,3.2000003,19.599998,0.8,0.0,0.0,2.8,0.0,4.2,0.0,2.4,0.0,4.4999995,2.8000002,0.0,1.2,0.0,3.0,0.0
20070905.06:27:30,0.0,0.0,0.0,20.6,0.0,0.0,14.9,0.0,0.0,0.0,20.9,0.0,0.0,0.0,20.4,0.0,0.0,0.0,0.0,8.7,0.0,48.699997,0.2,12.0,0.0,0.0,0.0,21.199999,0.0,0.0,0.0,15.2,0.0,9.0,0.0,0.0,6.0,0.1,0.0,35.199997,0.0,0.0,0.0,9.0,0.0,20.6,0.0,0.0,0.0,20.9,0.0,0.0,0.0,0.0,14.9,0.0
20070905.06:32:30,0.0,0.0,0.6,1.8,0.3,0.0,1.0,0.0,0.0,0.70000005,1.8,0.0,0.5,0.0,1.3,0.0,0.0,0.1,0.0,0.5,0.8000001,27.7,0.4,24.0,0.0,0.8000001,0.0,1.8,0.4,0.0,0.0,1.0,0.0,0.8,0.0,0.2,12.0,0.2,0.8000001,14.8,0.2,0.0,0.0,0.90000004,0.0,1.6999999,0.0,0.6,0.0,1.8,0.70000005,0.0,0.3,0.0,0.90000004,0.0
20070905.06:37:30,0.0,0.0,0.6,9.1,0.3,0.0,4.2000003,0.0,0.0,0.70000005,9.6,0.0,0.5,0.0,8.6,0.0,0.0,0.1,0.0,0.7,0.8000001,38.300003,0.2,15.0,0.0,0.8000001,0.0,10.0,0.4,0.0,0.0,5.5,0.0,3.6000001,0.0,0.2,8.0,0.1,0.8000001,24.2,0.2,0.0,0.0,3.6000001,0.0,9.1,0.0,0.6,0.0,9.6,0.70000005,0.0,0.3,0.0,4.2000003,0.0
20070905.06:42:30,0.0,0.0,0.5,17.9,0.3,0.0,7.7,0.0,0.0,0.6,22.099998,0.0,0.4,0.0,17.6,0.0,0.0,0.1,0.0,4.1,0.70000005,51.0,0.2,8.0,0.0,0.70000005,0.0,22.3,0.3,0.0,0.0,17.4,0.0,4.2999997,0.0,0.2,4.0,0.1,0.70000005,36.9,0.2,0.0,0.0,4.2999997,0.0,17.9,0.0,0.5,0.0,22.099998,0.6,0.0,0.3,0.0,7.7,0.0
20070905.06:47:30,0.0,0.0,0.90000004,2.6000001,0.5,0.0,1.4,0.0,0.0,1.0,3.1000001,0.0,0.8,0.0,2.4,0.0,0.0,0.1,0.0,0.2,1.1,29.0,0.4,24.0,0.0,1.1,0.0,3.3000002,0.6,0.0,0.0,1.9,0.0,1.0,0.0,0.3,12.0,0.2,1.1,16.3,0.3,0.0,0.0,1.0,0.0,2.6000001,0.0,0.90000004,0.0,3.1000001,1.0,0.0,0.5,0.0,1.4,0.0
20070905.06:52:30,0.0,0.0,0.6,3.9999993,0.3,0.0,3.6999996,0.0,0.0,0.70000005,4.0999994,0.0,0.5,0.0,3.8999994,0.0,0.0,0.1,0.0,0.1,0.8000001,33.899998,0.4,15.0,0.0,0.8000001,0.0,4.1999993,0.4,0.0,0.0,3.7999995,0.0,3.3999999,0.0,0.2,8.0,0.2,0.8000001,19.099998,0.2,0.0,0.0,3.4999998,0.0,3.8999994,0.0,0.6,0.0,4.0999994,0.70000005,0.0,0.3,0.0,3.5999997,0.0
20070905.06:57:30,0.0,0.0,0.0,15.700001,0.0,0.0,10.900001,0.0,0.0,0.0,20.1,0.0,0.0,0.0,15.400001,0.0,0.0,0.0,0.0,1.5,0.0,48.300003,0.2,11.0,0.0,0.0,0.0,20.7,0.0,0.0,0.0,11.1,0.0,10.6,0.0,0.0,6.0,0.1,0.0,34.800003,0.0,0.0,0.0,10.6,0.0,15.700001,0.0,0.0,0.0,20.1,0.0,0.0,0.0,0.0,10.900001,0.0
20070905.07:02:30,0.0,0.0,0.6,1.5,0.3,0.0,0.5,0.0,0.0,0.70000005,1.7,0.0,0.5,0.0,0.9,0.0,0.0,0.1,0.0,0.0,0.8000001,28.099998,0.4,25.0,0.0,0.8000001,0.0,1.7,0.4,0.0,0.0,0.9,0.0,0.0,0.0,0.2,13.0,0.2,0.8000001,15.2,0.2,0.0,0.0,0.1,0.0,1.4,0.0,0.6,0.0,1.6,0.70000005,0.0,0.3,0.0,0.4,0.0
20070905.07:07:30,0.0,0.90000004,1.4000001,28.0,0.8,0.6,15.5,0.0,0.0,1.6000001,32.3,1.2,1.2,0.0,16.6,0.6,0.0,0.2,0.0,1.6,1.8000002,55.0,1.4000001,14.0,1.2,1.8000002,0.0,32.8,1.0,0.6,0.0,16.0,0.0,2.4,0.0,0.4,7.0,1.3000001,1.8000002,44.1,0.5,0.3,0.0,7.9,0.0,18.1,0.6,1.3000001,0.90000004,28.5,1.5000001,0.0,0.7,0.0,8.6,0.3
20070905.07:12:30,0.0,4.7,4.5,77.299995,2.5,3.1,46.3,0.0,0.0,5.5,96.899994,6.2,3.5,0.0,57.199997,3.1,0.0,0.5,0.0,5.8,5.9,129.79999,6.3999996,10.0,6.2,5.9,0.0,102.49999,3.0,3.1,0.0,52.6,0.0,10.9,0.0,1.0,5.0,6.2999997,5.9,116.09999,1.5,1.5,0.0,25.7,0.0,62.199997,3.1,4.0,4.7,81.799995,5.0,0.0,2.0,0.0,31.5,1.5
20070905.07:17:30,0.0,5.7,4.7999997,36.9,2.8,3.7,24.3,0.0,0.0,5.8999996,46.0,7.5,3.7,0.0,26.5,3.8999999,0.1,0.4,0.0,0.8,6.2999997,76.0,8.2,24.0,7.6,6.2999997,0.0,46.9,3.3,3.8,0.0,25.4,0.0,1.8,0.2,0.9,12.0,7.9,6.2999997,61.7,1.5999999,1.9000001,0.0,13.1,0.0,27.4,3.9999998,4.1,5.7999997,37.7,5.2,0.0,1.9999999,0.0,14.3,2.0
20070905.07:22:30,3.0,61.600002,44.8,47.3,24.2,31.600002,27.8,3.0,4.0,54.399998,57.9,73.1,35.4,3.0,36.1,50.300003,8.5,4.8,1.0,5.6,59.699997,91.5,81.99999,21.0,81.6,59.699997,4.0,62.4,29.7,40.9,3.0,31.8,1.0,10.299999,17.7,10.4,13.0,81.799995,59.699997,77.0,14.799999,20.300001,1.0,16.3,3.0,41.0,58.9,40.5,70.4,52.0,50.1,3.0,19.9,2.0,21.599998,28.900002
20070905.07:27:30,6.0,60.1,64.3,65.200005,35.800003,32.899998,38.300003,4.0,8.0,79.3,82.100006,73.0,49.300003,4.0,49.000004,47.3,7.0,6.5,0.0,5.9,86.100006,115.600006,80.2,17.0,80.0,86.100006,8.0,87.90001,42.600002,40.1,4.0,43.500004,0.0,11.8,14.2,12.9,13.0,80.1,86.100006,101.90001,21.2,19.8,2.0,22.2,4.0,54.800003,54.399998,56.100002,67.2,71.50001,71.100006,6.0,27.7,2.0,28.2,26.8
20070905.07:32:30,3.0,14.3,26.5,24.899998,15.099999,8.1,15.0,2.0,4.0,32.8,31.699997,17.6,20.3,2.0,17.9,11.0,1.3,2.5,0.0,1.3,35.3,58.199997,19.300001,28.0,18.9,35.3,4.0,32.899998,17.699999,9.6,2.0,16.5,0.0,2.4,2.6999998,5.2,16.0,19.1,35.3,45.799995,8.799999,4.6,1.0,8.0,2.0,19.199999,12.3,22.8,15.6,26.299997,29.1,3.0,11.4,1.0,9.6,6.1
20070905.07:37:30,3.0,42.7,30.5,31.8,17.699999,24.5,20.099998,2.0,4.0,38.0,40.0,52.7,23.099998,2.0,23.3,32.6,4.0,2.5,0.0,1.9,40.5,69.8,56.199997,20.0,56.0,40.5,4.0,41.5,20.499998,28.5,2.0,21.599998,0.0,3.9,8.1,5.2,12.0,56.1,40.5,55.8,10.2,14.700001,1.0,10.4,2.0,25.0,36.0,25.699999,46.2,33.8,33.1,3.0,12.799999,1.0,12.9,18.1
20070905.07:42:30,0.0,4.5,3.9,19.5,2.1999998,2.5,13.400001,0.0,0.0,4.8,23.5,5.5,3.0,0.0,16.2,3.5,0.5,0.4,0.0,3.0,5.2000003,52.4,6.2,10.0,6.0,5.2000003,0.0,24.5,2.6,3.0,0.0,14.3,0.0,6.3,1.0,0.8,5.0,6.1,5.2000003,38.7,1.3,1.5,0.0,8.700001,0.0,17.1,4.0,3.4,5.0,20.4,4.3,0.0,1.6999999,0.0,11.1,2.0
20070905.07:47:30,0.0,0.0,0.0,1.1,0.0,0.0,1.0,0.0,0.0,0.0,1.3000001,0.0,0.0,0.0,1.0,0.0,0.0,0.0,0.0,0.4,0.0,28.2,0.4,24.0,0.0,0.0,0.0,1.3000001,0.0,0.0,0.0,1.0,0.0,0.8,0.0,0.0,12.0,0.2,0.0,15.0,0.0,0.0,0.0,0.8,0.0,1.0,0.0,0.0,0.0,1.2,0.0,0.0,0.0,0.0,0.90000004,0.0
20070905.07:52:30,18.0,46.6,100.9,92.0,58.0,26.8,54.9,11.0,23.0,125.299995,115.7,57.5,76.8,13.0,67.5,35.6,4.4,9.4,1.0,6.4,134.4,152.1,61.800003,40.0,61.4,134.4,24.0,122.1,67.4,31.199999,12.0,60.9,2.0,12.9,8.8,18.8,32.0,61.600002,134.4,137.1,33.8,15.9,6.0,30.3,14.0,74.3,39.6,85.9,50.6,98.5,110.1,19.0,43.0,7.0,37.0,19.9
20070905.07:57:30,0.0,1.9,1.8000002,63.9,1.0,1.3,42.4,0.0,0.0,2.2000003,81.8,2.6,1.4000001,0.0,46.3,1.3,0.0,0.2,0.0,1.5,2.4000003,110.1,2.7999997,10.0,2.6,2.4000003,0.0,83.3,1.2,1.3,0.0,45.2,0.0,6.3,0.0,0.4,5.0,2.6999998,2.4000003,97.0,0.6,0.7,0.0,24.400002,0.0,47.3,1.3,1.6000001,1.9,64.9,2.0000002,0.0,0.8,0.0,25.400002,0.7
20070905.08:02:30,0.0,3.8,3.2,26.000004,1.9,2.5,17.400002,0.0,0.0,3.9,32.300003,5.1,2.5,0.0,18.700003,2.5,0.0,0.3,0.0,0.8,4.2000003,60.0,5.4999995,25.0,5.1,4.2000003,0.0,32.800003,2.2,2.5,0.0,18.100002,0.0,1.6,0.0,0.70000005,13.0,5.2999997,4.2000003,46.600002,1.1,1.2,0.0,9.6,0.0,19.300003,2.5,2.8,3.8,26.600004,3.5,0.0,1.5,0.0,10.200001,1.2
20070905.08:07:30,0.0,3.8,3.0,50.4,1.6999999,2.5,30.2,0.0,0.0,3.7,59.500004,5.1,2.3,0.0,33.4,2.5,0.0,0.3,0.0,1.1,4.0,82.40001,5.2999997,14.0,5.1,4.0,0.0,60.300003,2.0,2.5,0.0,31.900002,0.0,4.6,0.0,0.6,7.0,5.2,4.0,71.600006,1.0,1.3,0.0,15.700001,0.0,34.5,2.5,2.6,3.8,51.300003,3.3,0.0,1.3,0.0,17.5,1.3
20070905.08:12:30,0.0,3.8999999,3.6000004,61.9,2.0,2.6,39.9,0.0,0.0,4.4000006,79.0,5.2,2.8000002,0.0,44.9,2.6,0.0,0.4,0.0,4.1,4.8000007,111.0,5.3999996,9.0,5.2,4.8000007,0.0,81.2,2.4,2.6,0.0,42.7,0.0,8.0,0.0,0.8,5.0,5.2999997,4.8000007,96.6,1.2,1.3,0.0,23.0,0.0,47.0,2.6,3.2000003,3.8999999,63.9,4.0000005,0.0,1.6,0.0,24.9,1.3
20070905.08:17:30,0.0,6.2,8.199999,21.699999,5.3999996,3.5,14.5,0.0,0.0,10.9,28.8,7.6,5.5999994,0.0,15.099999,4.7,0.5,0.1,0.0,0.2,11.0,56.1,8.9,24.0,8.1,11.0,0.0,29.0,5.4999995,4.1,0.0,14.7,0.0,0.6,1.1,0.2,12.0,8.5,11.0,42.7,2.8,2.0,0.0,7.7,0.0,15.299999,5.2999997,5.6999993,6.7,22.4,8.299999,0.0,2.8999999,0.0,7.8999996,2.6
20070905.08:22:30,0.0,8.3,9.8,28.0,6.2,4.5,17.3,0.0,0.0,12.7,35.0,10.0,6.9,0.0,19.3,6.6,1.0,0.4,0.0,1.3,13.099999,65.1,11.4,15.0,11.0,13.099999,0.0,35.6,6.5,5.6,0.0,18.4,0.0,2.5,2.0,0.8,8.0,11.2,13.099999,50.6,3.3,2.7,0.0,9.3,0.0,20.3,7.6,7.3,9.3,28.7,10.2,0.0,3.7,0.0,10.0,3.8000002
20070905.08:27:30,0.0,4.6,5.1,65.600006,2.8000002,2.4,43.0,0.0,0.0,6.2,85.100006,5.2999997,4.0,0.0,46.0,3.9,0.8,0.6,0.0,1.9,6.7999997,111.10001,6.1999993,10.0,5.9999995,6.7999997,0.0,86.00001,3.4,3.2,0.0,44.0,0.0,2.9,1.6,1.2,5.0,6.0999994,6.7999997,98.80001,1.7,1.6,0.0,22.4,0.0,46.9,4.6,4.6,5.2999997,66.50001,5.7,0.0,2.3000002,0.0,24.4,2.4
20070905.08:32:30,0.0,4.4,4.2000003,24.499998,2.4,2.2,17.0,0.0,0.0,5.1000004,30.099998,5.1,3.3000002,0.0,17.699999,3.7,0.7,0.4,0.0,0.5,5.5000005,59.7,6.1999993,26.0,5.7999997,5.5000005,0.0,30.399998,2.8000002,3.0,0.0,17.4,0.0,1.1,1.4,0.9,13.0,5.9999995,5.5000005,45.5,1.4,1.4,0.0,9.200001,0.0,17.999998,4.4,3.7000003,5.1,24.799997,4.6000004,0.0,1.9,0.0,9.900001,2.2
20070905.08:37:30,0.0,8.400001,7.600001,49.600002,4.3,4.7,32.0,0.0,0.0,9.3,60.100002,10.500001,6.0000005,0.0,35.300003,6.3,0.7,0.8,0.0,1.9,10.1,86.600006,11.500002,14.0,11.300001,10.1,0.0,61.4,5.2000003,5.5,0.0,33.4,0.0,6.5,1.4,1.7,7.0,11.400002,10.1,74.3,2.5,2.6,0.0,17.6,0.0,36.800003,7.1000004,6.8000007,9.200001,51.100002,8.400001,0.0,3.4,0.0,19.9,3.3999999
20070905.08:42:30,0.0,11.5,12.0,24.0,6.3,6.9,13.5,0.0,0.0,14.3,29.8,14.7,9.8,0.0,18.300001,8.3,0.7,1.8,0.0,2.1,16.0,62.6,15.6,9.0,15.4,16.0,0.0,32.2,8.0,7.6,0.0,16.1,0.0,4.3999996,1.4,3.5,5.0,15.5,16.0,47.5,4.0,3.8000002,0.0,7.7,0.0,20.6,9.0,11.5,12.2,26.4,13.8,0.0,5.8,0.0,9.9,4.5
20070905.08:47:30,0.0,10.5,10.1,18.2,5.4,6.3999996,11.1,0.0,0.0,12.1,23.000002,13.400001,8.3,0.0,13.300001,7.5999994,0.6,1.5,0.0,1.0,13.400001,51.2,14.400001,24.0,14.000001,13.400001,0.0,24.000002,6.8,6.9999995,0.0,12.200001,0.0,2.0,1.2,2.9,12.0,14.200001,13.400001,37.9,3.4,3.5,0.0,6.0,0.0,14.300001,8.2,9.6,11.1,19.400002,11.6,0.0,4.9,0.0,7.2,4.1
20070905.08:52:30,0.0,10.099999,10.400001,28.5,6.5,5.7,17.0,0.0,0.0,13.5,34.8,12.599999,7.3,0.0,21.3,7.7999997,1.0,0.4,0.0,1.6,13.9,64.2,13.999999,17.0,13.599999,13.9,0.0,36.399998,6.9,6.7999997,0.0,18.4,0.0,4.0,2.1,0.8,9.0,13.799999,13.9,50.299995,3.3999999,3.3999999,0.0,9.4,0.0,22.8,8.799999,7.7000003,11.2,29.8,10.8,0.0,3.8,0.0,11.599999,4.3999996
20070905.08:57:30,0.0,13.099999,12.299999,36.300003,7.7,7.1000004,20.7,0.0,0.0,15.9,44.800003,15.699999,8.7,0.0,27.300001,10.5,1.7,0.5,0.0,3.3,16.4,77.200005,17.6,8.0,17.4,16.4,0.0,48.800003,8.2,8.8,0.0,23.900002,0.0,6.2,3.5,1.0,4.0,17.5,16.4,63.300003,4.1,4.4,0.0,11.6,0.0,30.800001,12.2,9.2,14.799999,39.4,12.799999,0.0,4.6,0.0,15.400001,6.1000004
20070905.09:02:30,0.0,7.1000004,5.4,34.6,3.1000001,3.5000002,22.2,0.0,0.0,6.6,43.1,8.200001,4.2000003,0.0,24.800001,5.9000006,1.1,0.5,0.0,1.1,7.1,69.899994,9.700001,24.0,9.300001,7.1,0.0,44.199997,3.7000003,4.7000003,0.0,23.6,0.0,2.3000002,2.3000002,1.1,12.0,9.500001,7.1,57.499996,1.8,2.3000002,0.0,11.900001,0.0,26.1,7.1000004,4.7000003,8.200001,35.8,5.9,0.0,2.4,0.0,13.200001,3.5000002
20070905.09:07:30,0.0,11.8,11.9,26.399998,6.5999994,6.5,15.599998,0.0,0.0,14.4,32.199997,14.400001,9.4,0.0,19.699999,9.1,1.3,1.3,0.0,2.1,15.7,56.199997,15.900002,14.0,15.700001,15.7,0.0,33.699997,7.9999995,7.8,0.0,17.599998,0.0,4.2,2.6,2.6999998,7.0,15.800001,15.7,45.199997,3.8999999,3.8999999,0.0,8.799999,0.0,21.499998,10.400001,10.7,13.1,27.999998,13.2,0.0,5.2999997,0.0,10.699999,5.2
20070905.09:12:30,0.0,13.799999,15.4,20.199999,8.2,8.0,11.3,0.0,0.0,18.4,25.0,17.199999,12.4,0.0,15.2,10.4,1.2,2.1,0.0,1.9,20.5,53.5,18.6,10.0,18.4,20.5,0.0,27.3,10.299999,9.2,0.0,13.3,0.0,3.8,2.4,4.2,5.0,18.5,20.5,40.5,5.2,4.6000004,0.0,6.5,0.0,17.4,11.599999,14.4,14.999999,22.3,17.5,0.0,7.2999997,0.0,8.6,5.8
20070905.09:17:30,0.0,10.9,11.3,11.800001,6.0,6.2,7.0000005,0.0,0.0,13.599999,14.900002,13.599999,9.0,0.0,8.6,8.2,0.9,1.4,0.0,0.7,14.9,42.700005,14.899999,25.0,14.499999,14.9,0.0,15.600001,7.5,7.2,0.0,7.8000007,0.0,1.4,1.9,2.9,13.0,14.699999,14.9,29.600002,3.7,3.5,0.0,3.8000002,0.0,9.400001,9.2,10.5,11.9,12.600001,12.7,0.0,5.2,0.0,4.6000004,4.5
20070905.09:22:30,0.0,8.400001,9.1,19.4,5.2,4.8,11.6,0.0,0.0,11.3,24.1,10.400001,7.0,0.0,14.400001,6.4000006,0.8,0.9,0.0,1.0,12.2,57.6,11.800001,17.0,11.200001,12.2,0.0,24.9,6.1,5.6000004,0.0,12.8,0.0,2.7,1.6,1.7,9.0,11.500001,12.2,41.6,3.0,2.8000002,0.0,6.6000004,0.0,15.3,7.200001,7.8,9.200001,20.5,10.0,0.0,3.9,0.0,7.6000004,3.6000001
20070905.09:27:30,0.0,9.4,11.1,24.300001,6.3,5.3999996,13.6,0.0,0.0,13.700001,29.800001,11.599999,8.5,0.0,18.7,7.2,1.0,1.1,0.0,2.0,14.900001,61.3,12.7,10.0,12.499999,14.900001,0.0,31.400002,7.4,6.2999997,0.0,15.400001,0.0,4.0,2.0,2.2,5.0,12.599999,14.900001,46.5,3.7,3.2,0.0,8.0,0.0,20.300001,8.2,9.6,10.4,25.900002,12.200001,0.0,4.8,0.0,9.6,4.2
20070905.09:32:30,0.0,0.0,0.6,0.70000005,0.3,0.0,0.2,0.0,0.0,0.70000005,0.8000001,0.0,0.5,0.0,0.3,0.0,0.0,0.1,0.0,0.0,0.8000001,28.6,0.4,24.0,0.0,0.8000001,0.0,0.8000001,0.4,0.0,0.0,0.3,0.0,0.0,0.0,0.2,12.0,0.2,0.8000001,15.0,0.2,0.0,0.0,0.1,0.0,0.6,0.0,0.6,0.0,0.70000005,0.70000005,0.0,0.3,0.0,0.1,0.0
20070905.09:37:30,0.0,4.2,5.2,39.6,2.9,2.5,23.9,0.0,0.0,6.5,49.999996,5.3,3.9,0.0,28.8,3.1,0.3,0.5,0.0,2.6,7.0,79.8,5.8,16.0,5.6000004,7.0,0.0,51.399998,3.4,2.8,0.0,26.4,0.0,4.7,0.6,1.0,8.0,5.7000003,7.0,66.0,1.7,1.4000001,0.0,12.9,0.0,31.099998,3.3999999,4.5,4.5,42.699997,5.7,0.0,2.2,0.0,15.599999,1.7
20070905.09:42:30,0.0,5.1,4.4000006,32.100002,2.7000003,3.1,16.5,0.0,0.0,5.6000004,37.7,6.5,3.1000004,0.0,20.9,3.6999998,0.3,0.2,0.0,2.1,5.8,68.0,7.0,10.0,6.8,5.8,0.0,39.0,2.9000003,3.3999999,0.0,19.1,0.0,3.6,0.6,0.3,5.0,6.9,5.8,53.5,1.4000001,1.7,0.0,8.1,0.0,27.7,3.9999998,3.3000004,5.4,33.2,4.5000005,0.0,1.6000001,0.0,12.0,2.0
20070905.09:47:30,0.0,5.6000004,8.2,11.1,5.0,3.3000002,6.7,0.0,0.0,10.2,13.800001,7.200001,6.2,0.0,7.8999996,4.1000004,0.3,0.6,0.0,0.8,10.8,40.4,7.9000006,24.0,7.500001,10.8,0.0,14.300001,5.6,3.7000003,0.0,7.3999996,0.0,1.0,0.6,1.3,12.0,7.700001,10.8,27.800001,2.8,1.8000001,0.0,3.7,0.0,8.5,4.4000006,6.7999997,6.0000005,11.400001,8.8,0.0,3.5,0.0,4.0,2.1000001
20070905.09:52:30,0.0,5.7000003,7.5,16.599998,4.3,3.4,10.4,0.0,0.0,9.3,19.999998,7.3,5.6,0.0,12.499999,4.2000003,0.4,0.6,0.0,1.2,9.900001,48.199997,8.1,15.0,7.7000003,9.900001,0.0,20.399998,4.9,3.8000002,0.0,10.799999,0.0,2.6,0.8,1.2,8.0,7.9,9.900001,34.399998,2.4,1.9000001,0.0,5.5,0.0,13.499999,4.6000004,6.2999997,6.1000004,17.499998,8.1,0.0,3.1000001,0.0,6.6,2.3000002
20070905.09:57:30,0.0,1.2,0.90000004,33.4,0.6,0.7,20.199999,0.0,0.0,1.2,36.2,1.5000001,0.6,0.0,24.0,0.90000004,0.1,0.0,0.0,6.0,1.2,65.1,1.8000002,10.0,1.6000001,1.2,0.0,36.7,0.6,0.8,0.0,21.4,0.0,11.5,0.2,0.0,5.0,1.7000002,1.2,51.1,0.3,0.4,0.0,15.4,0.0,27.2,1.0,0.6,1.3000001,34.0,0.90000004,0.0,0.3,0.0,18.699999,0.5
20070905.10:02:30,0.0,0.0,0.6,1.5000001,0.3,0.0,1.1,0.0,0.0,0.70000005,1.7000002,0.0,0.5,0.0,1.3000001,0.0,0.0,0.1,0.0,0.6,0.8000001,28.1,0.4,25.0,0.0,0.8000001,0.0,1.8000002,0.4,0.0,0.0,1.2,0.0,0.70000005,0.0,0.2,13.0,0.2,0.8000001,15.3,0.2,0.0,0.0,0.90000004,0.0,1.4000001,0.0,0.6,0.0,1.6000001,0.70000005,0.0,0.3,0.0,1.0,0.0
20070905.10:07:30,0.0,2.1,2.6000001,15.6,1.5,1.4,10.5,0.0,0.0,3.3000002,17.300001,2.8,1.9000001,0.0,13.2,1.4,0.0,0.2,0.0,1.4,3.5000002,40.4,2.9999998,14.0,2.8,3.5000002,0.0,17.400002,1.7,1.4,0.0,13.0,0.0,3.5,0.0,0.3,7.0,2.8999999,3.5000002,29.100002,0.8,0.7,0.0,5.4,0.0,13.3,1.4,2.1000001,2.1,15.700001,2.8000002,0.0,1.0,0.0,8.4,0.7
20070905.10:12:30,0.0,0.0,0.6,8.7,0.3,0.0,7.2,0.0,0.0,0.70000005,9.2,0.0,0.5,0.0,8.2,0.0,0.0,0.1,0.0,1.8,0.8000001,38.5,0.2,10.0,0.0,0.8000001,0.0,9.599999,0.4,0.0,0.0,7.7,0.0,2.3,0.0,0.2,5.0,0.1,0.8000001,24.2,0.2,0.0,0.0,2.3,0.0,8.7,0.0,0.6,0.0,9.2,0.70000005,0.0,0.3,0.0,7.2,0.0
20070905.10:17:30,3.0,0.0,12.7,63.399998,7.0,0.0,39.8,2.0,4.0,15.8,79.2,0.0,9.7,2.0,46.699997,0.0,0.0,1.3,0.0,3.7,17.1,110.2,0.4,29.0,0.0,17.1,4.0,82.5,8.3,0.0,2.0,43.399998,0.0,7.1000004,0.0,2.3,17.0,0.2,17.1,96.6,4.0,0.0,1.0,21.5,2.0,50.399998,0.0,11.0,0.0,67.2,14.0,3.0,5.3,1.0,25.4,0.0
20070905.10:22:30,0.0,0.0,11.9,17.000002,6.7,0.0,10.1,0.0,0.0,14.7,20.000002,0.0,9.099999,0.0,12.200001,0.0,0.0,1.2,0.0,2.0,15.8,53.000004,0.4,17.0,0.0,15.8,0.0,20.400002,7.8999996,0.0,0.0,11.700001,0.0,2.9,0.0,2.4,9.0,0.2,15.8,37.300003,4.0,0.0,0.0,5.9,0.0,13.300001,0.0,10.299999,0.0,17.400002,13.099999,0.0,5.1,0.0,6.8,0.0
20070905.10:27:30,0.0,0.0,10.7,108.899994,6.0,0.0,67.3,0.0,0.0,13.1,138.7,0.0,8.3,0.0,79.0,0.0,0.0,1.2,0.0,5.3,14.3,171.0,0.2,9.0,0.0,14.3,0.0,144.2,7.1,0.0,0.0,74.0,0.0,11.0,0.0,2.4,5.0,0.1,14.3,157.9,3.6000001,0.0,0.0,36.3,0.0,84.2,0.0,9.5,0.0,114.09999,11.8,0.0,4.8,0.0,42.5,0.0
20070905.10:32:30,0.0,0.0,27.800001,10.6,15.9,0.0,6.7999997,0.0,0.0,34.100002,13.6,0.0,21.4,0.0,7.6,0.0,0.0,2.8,0.0,0.4,36.7,39.5,0.4,26.0,0.0,36.7,0.0,14.1,18.6,0.0,0.0,7.2,0.0,1.1,0.0,5.7,13.0,0.2,36.7,27.2,9.4,0.0,0.0,3.6999998,0.0,8.1,0.0,24.1,0.0,11.3,30.400002,0.0,12.2,0.0,4.2,0.0
20070905.10:37:30,0.0,0.0,9.000001,38.4,5.1000004,0.0,22.1,0.0,0.0,11.1,45.800003,0.0,6.9000006,0.0,26.7,0.0,0.0,0.9,0.0,1.8,12.0,73.4,0.2,14.0,0.0,12.0,0.0,47.000004,6.0000005,0.0,0.0,24.800001,0.0,3.6,0.0,1.8,7.0,0.1,12.0,60.4,3.0,0.0,0.0,11.6,0.0,28.900002,0.0,7.8000007,0.0,39.800003,9.900001,0.0,3.9,0.0,13.1,0.0
20070905.10:42:30,0.0,0.0,12.9,17.3,7.299999,0.0,9.3,0.0,0.0,16.0,21.099998,0.0,9.9,0.0,13.3,0.0,0.0,1.3,0.0,1.5,17.3,53.199997,0.2,10.0,0.0,17.3,0.0,22.699999,8.599999,0.0,0.0,12.0,0.0,2.7,0.0,2.6,5.0,0.1,17.3,38.3,4.3999996,0.0,0.0,5.3,0.0,14.7,0.0,11.2,0.0,18.599998,14.2,0.0,5.5999994,0.0,6.8,0.0
20070905.10:47:30,3.0,0.0,33.3,24.5,19.099998,0.0,14.4,2.0,4.0,41.1,30.6,0.0,25.5,2.0,18.3,0.0,0.0,3.3,0.0,1.8,44.199997,58.600002,0.4,28.0,0.0,44.199997,4.0,32.4,22.3,0.0,2.0,16.5,0.0,3.8,0.0,6.6,16.0,0.2,44.199997,45.9,11.2,0.0,1.0,8.2,2.0,20.3,0.0,28.7,0.0,26.5,36.5,3.0,14.4,1.0,10.2,0.0
20070905.10:52:30,13.0,4.8,34.4,23.4,19.7,2.8,13.4,8.0,17.0,42.7,28.4,6.0000005,26.000002,10.0,18.3,3.6000001,0.4,3.0,1.0,2.8,45.8,60.7,6.8,35.0,6.4000006,45.8,18.0,30.8,22.800001,3.2,9.0,15.799999,2.0,5.3,0.8,6.2,27.0,6.6000004,45.8,45.9,11.4,1.6,5.0,8.0,11.0,20.8,4.0,29.200003,5.2000003,25.8,37.600002,14.0,14.5,6.0,10.8,2.0
20070905.10:57:30,0.0,1.1000001,12.6,32.2,7.1,0.6,21.600002,0.0,0.0,15.500001,37.9,1.3000002,9.7,0.0,26.400002,0.8000001,0.1,1.3,0.0,4.3,16.800001,68.100006,1.5000002,8.0,1.3000002,16.800001,0.0,39.800003,8.4,0.70000005,0.0,24.900002,0.0,11.3,0.1,2.6,4.0,1.4000002,16.800001,54.300003,4.2,0.3,0.0,14.200001,0.0,29.500002,0.9000001,11.0,1.1000001,35.7,13.900001,0.0,5.5,0.0,18.400002,0.4
20070905.11:02:30,6.0,0.9000001,41.600002,62.7,20.9,0.5,34.3,3.0,7.0,48.7,75.899994,1.1000001,34.7,5.0,49.3,0.70000005,0.1,6.7,1.0,7.3,55.2,110.19999,1.8000002,33.0,1.2000002,55.2,8.0,83.09999,27.8,0.6,4.0,42.1,2.0,14.200001,0.2,13.4,21.0,1.5000002,55.2,96.99999,13.799999,0.3,2.0,20.800001,6.0,57.2,0.8000001,41.2,1.0000001,71.2,48.2,7.0,20.4,3.0,28.5,0.4
20070905.11:07:30,27.0,13.199999,138.6,95.7,78.9,6.8,55.0,16.0,34.0,170.9,118.7,15.499998,106.50001,20.0,72.1,10.9,2.0,13.7,2.0,8.9,184.09999,149.4,17.599998,50.0,17.399998,184.09999,36.0,127.899994,92.700005,8.8,18.0,63.4,4.0,17.9,4.1,27.4,43.0,17.499998,184.09999,138.9,46.4,4.5,9.0,31.7,22.0,82.0,12.799999,119.600006,15.099998,105.2,152.0,29.0,59.800003,11.0,41.4,6.4
20070905.11:12:30,36.0,10.9,217.30002,137.4,125.200005,6.7,78.2,22.0,46.0,270.5,169.4,13.9,164.20001,26.0,105.299995,8.099999,0.6,19.2,2.0,13.9,289.2,212.99998,14.8,58.0,14.599999,289.2,48.0,183.79999,144.6,7.3999996,24.0,91.899994,4.0,27.8,1.3,38.5,53.0,14.7,289.2,198.79999,72.3,3.7,12.0,46.1,28.0,119.2,8.7,183.20001,11.599999,151.29999,236.50002,38.0,91.3,14.0,60.1,4.4
20070905.11:17:30,21.0,14.400001,133.20001,80.7,78.100006,9.6,46.300003,13.0,27.0,166.80002,100.3,19.2,99.600006,15.0,61.000004,9.6,0.0,10.6,1.0,7.3,177.10002,134.1,19.600002,53.0,19.2,177.10002,28.0,107.8,88.8,9.6,14.0,53.800003,2.0,14.5,0.0,21.2,41.0,19.400002,177.10002,121.200005,44.4,4.8,7.0,26.7,16.0,69.0,9.6,110.00001,14.400001,88.5,143.70001,22.0,54.800003,8.0,34.4,4.8
20070905.11:22:30,52.0,6.7999997,380.09995,67.7,217.79999,4.1,39.8,32.0,67.0,470.39993,84.2,8.299999,289.99997,37.0,50.899998,5.2999997,0.6,35.8,3.0,5.6,503.99994,121.4,9.4,88.0,8.799999,503.99994,70.0,90.0,253.69998,4.7,34.0,45.3,5.0,11.299999,1.2,71.6,79.0,9.099999,503.99994,105.8,127.899994,2.1,17.0,22.099998,40.0,56.899998,5.7999997,323.79996,7.2999997,73.399994,414.09995,55.0,161.59999,20.0,28.999998,3.1999998
20070905.11:27:30,35.0,3.9999998,249.9,117.9,143.5,2.6999998,65.6,21.0,44.0,310.0,144.0,5.3999996,189.7,25.0,91.9,2.6999998,0.0,23.0,2.0,13.3,332.8,184.09999,5.5999994,56.0,5.3999996,332.8,46.0,157.7,166.9,2.6999998,23.0,78.6,5.0,26.8,0.0,46.3,51.0,5.4999995,332.8,171.09999,83.5,1.3,12.0,39.3,28.0,105.5,2.6999998,212.7,3.9999998,131.4,273.0,37.0,106.4,14.0,53.0,1.3
20070905.11:32:30,39.0,11.2,301.8,87.299995,176.2,7.5,50.5,24.0,50.0,377.19998,109.2,14.799999,227.09999,28.0,65.299995,7.5,0.0,25.2,2.0,7.5,400.69998,144.5,15.199999,76.0,14.799999,400.69998,52.0,116.799995,201.9,7.5,26.0,58.1,4.0,14.6,0.0,50.7,64.0,14.999999,400.69998,131.0,101.4,3.8,13.0,28.6,30.0,73.1,7.5,251.09999,11.2,95.299995,326.59998,41.0,125.7,15.0,36.3,3.8
20070905.11:37:30,44.0,0.90000004,309.4,112.7,178.8,0.6,65.399994,28.0,57.0,385.69998,139.4,1.2,233.4,32.0,85.7,0.6,0.0,26.7,2.0,10.7,411.8,177.29999,1.4000001,75.0,1.2,411.8,59.0,149.29999,206.2,0.6,30.0,75.2,4.0,21.3,0.0,53.800003,67.0,1.3000001,411.8,163.59999,103.0,0.3,15.0,38.1,34.0,96.0,0.6,259.9,0.90000004,122.899994,336.3,46.0,129.5,17.0,48.6,0.3
20070905.11:42:30,30.0,3.2,189.99998,109.6,110.4,2.0,61.799995,18.0,38.0,237.09999,134.7,4.3,142.7,22.0,84.6,2.0,0.0,16.0,2.0,11.7,252.79999,176.4,4.5,48.0,4.3,252.79999,40.0,146.59999,126.5,2.0,20.0,73.299995,4.0,23.3,0.0,32.2,44.0,4.4,252.79999,161.59999,63.6,1.0,10.0,36.3,24.0,96.6,2.0,158.59999,3.2,121.6,205.49998,32.0,78.9,12.0,48.699997,1.0
20070905.11:47:30,22.0,17.3,190.39998,73.5,108.799995,9.5,41.499996,14.0,28.0,235.69997,91.1,20.8,145.29999,17.0,55.899998,13.799999,2.1,17.8,2.0,7.3,252.59996,125.6,23.0,53.0,22.599998,252.59996,29.0,99.299995,127.09999,11.7,16.0,48.899998,4.0,14.5,4.2,35.8,41.0,22.8,252.59996,112.799995,63.699997,5.7999997,8.0,23.8,18.0,64.1,15.699999,162.49998,19.199999,81.9,207.79997,24.0,80.899994,10.0,32.199997,7.7999997
20070905.11:52:30,12.0,9.4,84.3,57.399998,48.8,5.6,32.9,7.0,15.0,104.700005,69.899994,11.799999,64.0,9.0,44.1,6.9999995,0.7,7.7,1.0,5.6,111.9,103.399994,12.899999,32.0,12.499999,111.9,15.0,74.899994,56.5,6.2999997,8.0,38.0,2.0,11.6,1.4,15.299999,24.0,12.699999,111.9,89.49999,28.3,3.1,4.0,19.0,10.0,49.899998,7.6999993,71.3,10.099999,62.699997,91.8,13.0,35.8,5.0,25.5,3.8
20070905.11:57:30,3.0,11.5,69.5,36.7,39.0,5.7999997,21.2,2.0,4.0,85.2,45.9,13.3,53.800003,2.0,27.8,9.7,1.9,7.3,0.0,3.4,92.2,77.700005,15.200001,12.0,15.0,92.2,4.0,50.2,46.4,7.7,2.0,24.5,0.0,6.8,3.8,14.8,8.0,15.1,92.2,64.3,23.3,3.8999999,1.0,11.700001,2.0,31.8,11.4,61.000004,13.2,41.0,76.7,3.0,30.5,1.0,16.400002,5.7
20070905.12:02:30,6.0,14.400001,110.3,21.5,61.199997,7.2,12.7,4.0,8.0,134.2,26.900002,16.7,86.6,4.0,16.0,12.1,2.4,12.7,0.0,1.6,145.9,54.6,19.599998,34.0,19.0,145.9,8.0,28.600002,73.799995,9.6,4.0,14.4,0.0,3.2,4.9,25.4,21.0,19.3,145.9,42.0,37.3,4.9,2.0,7.0,4.0,17.8,14.400001,98.5,16.7,23.2,122.5,6.0,49.3,2.0,8.9,7.2
20070905.12:07:30,32.0,21.5,185.2,72.5,94.899994,10.700001,38.600002,16.0,37.0,215.2,88.3,24.0,155.2,27.0,56.0,19.0,4.1,30.0,5.0,8.8,240.5,121.2,26.5,56.0,26.3,240.5,42.0,99.5,125.09999,14.900001,21.0,47.0,11.0,17.7,8.2,60.2,49.0,26.4,240.5,110.6,64.7,8.3,11.0,22.300001,32.0,67.7,21.4,180.7,23.9,83.9,210.7,37.0,90.399994,16.0,33.9,10.6
20070905.12:12:30,18.0,8.5,97.4,48.0,49.100002,4.2999997,25.9,9.0,21.0,112.6,57.7,9.6,82.1,15.0,38.1,7.3999996,1.5,16.5,3.0,6.4,126.799995,92.5,10.900002,34.0,10.700001,126.799995,24.0,65.1,65.5,5.8999996,12.0,32.0,6.0,13.200001,3.1,32.9,29.0,10.800001,126.799995,79.0,33.9,3.1999998,6.0,15.700001,18.0,45.5,8.4,96.4,9.5,55.4,111.6,21.0,48.100002,9.0,23.5,4.2
20070905.12:17:30,3.0,24.599998,129.7,24.0,73.2,13.299999,14.1,2.0,4.0,159.4,29.9,29.599998,100.2,2.0,18.2,19.199999,2.8,13.3,0.0,2.4,171.7,60.6,32.7,28.0,32.3,171.7,4.0,32.3,86.899994,16.199999,2.0,16.300001,0.0,4.5,5.7,26.6,16.0,32.5,171.7,46.8,43.5,8.2,1.0,8.0,2.0,20.6,21.999998,112.799995,27.099998,26.5,142.5,3.0,56.3,1.0,10.7,10.799999
20070905.12:22:30,12.0,12.599999,185.90001,55.800003,94.899994,6.6,34.3,6.0,14.0,217.1,70.200005,15.199999,155.2,10.0,40.2,10.0,1.5,29.6,2.0,3.0,243.40001,101.8,17.2,34.0,16.8,243.40001,16.0,73.3,125.399994,8.3,8.0,37.3,4.0,5.8,3.2,59.6,25.0,17.0,243.40001,88.100006,63.6,4.1,4.0,17.8,12.0,43.4,11.7,181.8,14.299999,59.000004,213.1,14.0,90.899994,6.0,21.3,5.7
20070905.12:27:30,6.0,10.1,129.8,50.2,73.0,5.5,28.7,4.0,8.0,159.09999,62.4,11.900001,100.5,4.0,37.7,8.3,1.4,13.7,0.0,5.0,171.59999,100.9,13.3,18.0,12.900001,171.59999,8.0,67.9,86.7,6.9,4.0,33.2,0.0,9.6,2.8,27.099998,13.0,13.1,171.59999,84.5,43.5,3.6999998,2.0,16.400002,4.0,43.4,9.3,113.4,11.1,55.600002,142.7,6.0,56.6,2.0,21.900002,4.7
20070905.12:32:30,0.0,0.0,34.500004,17.5,19.400002,0.0,10.9,0.0,0.0,42.300003,22.1,0.0,26.600002,0.0,12.599999,0.0,0.0,3.6,0.0,0.9,45.600002,46.0,0.6,30.0,0.0,45.600002,0.0,22.9,23.000002,0.0,0.0,11.799999,0.0,1.8,0.0,7.3,15.0,0.3,45.600002,35.1,11.6,0.0,0.0,6.0,0.0,13.499999,0.0,30.100002,0.0,18.4,38.000004,0.0,15.1,0.0,6.8,0.0
20070905.12:37:30,0.0,0.0,3.6000004,41.5,2.0,0.0,23.5,0.0,0.0,4.4000006,48.5,0.0,2.8000002,0.0,27.7,0.0,0.0,0.4,0.0,2.0,4.8000007,76.5,0.2,14.0,0.0,4.8000007,0.0,49.7,2.4,0.0,0.0,25.6,0.0,4.6,0.0,0.8,7.0,0.1,4.8000007,63.4,1.2,0.0,0.0,12.700001,0.0,29.2,0.0,3.2000003,0.0,42.9,4.0000005,0.0,1.6,0.0,14.300001,0.0
20070905.12:42:30,12.0,2.4,2.6999998,20.699999,1.5,1.2,12.0,6.0,14.0,3.2999997,25.4,2.8000002,2.1,10.0,15.9,2.0,0.4,0.3,2.0,1.2,3.5999997,54.6,3.3,26.0,3.1000001,3.5999997,16.0,26.3,1.8,1.6,8.0,13.9,4.0,3.0,0.8,0.6,21.0,3.2,3.5999997,40.699997,0.90000004,0.8,4.0,6.8,12.0,17.199999,2.4,2.3999999,2.8000002,21.699999,2.9999998,14.0,1.2,6.0,8.1,1.2
20070905.12:47:30,61.0,9.599999,1.8000002,9.6,1.0,4.7,5.6000004,31.0,68.0,2.2000003,11.000001,11.099999,1.4000001,51.0,7.7000003,7.8999996,1.5,0.2,10.0,1.2,2.4000003,37.9,13.199999,98.0,12.799999,2.4000003,75.0,11.800001,1.2,6.3999996,41.0,6.7000003,20.0,2.3000002,3.2,0.4,87.0,12.999999,2.4000003,25.300001,0.6,3.2,20.0,3.4,61.0,8.8,9.599999,1.6000001,11.099999,10.400001,2.0000002,68.0,0.8,31.0,4.6000004,4.7
20070905.12:52:30,73.0,9.700001,0.9000001,21.3,0.5,4.9,10.3,37.0,81.0,1.1000001,23.9,11.400001,0.70000005,61.0,13.099999,8.1,1.6,0.1,13.0,1.7,1.2000002,54.5,13.400001,105.0,13.000001,1.2000002,89.0,24.8,0.6,6.4,48.0,11.7,25.0,3.2,3.2,0.2,97.0,13.200001,1.2000002,39.8,0.3,3.2,25.0,5.9,73.0,14.4,9.700001,0.8000001,11.400001,22.199999,1.0000001,81.0,0.4,37.0,7.3,4.9
20070905.12:57:30,83.0,9.6,0.0,9.299999,0.0,4.8,4.7,42.0,93.0,0.0,10.499999,11.200001,0.0,69.0,7.7999997,8.0,1.6,0.0,14.0,1.5,0.0,40.699997,13.000002,113.0,12.800001,0.0,103.0,11.599999,0.0,6.4,55.0,6.2,28.0,3.1,3.2,0.0,108.0,12.900002,0.0,26.3,0.0,3.2,28.0,3.1,83.0,9.299999,9.6,0.0,11.200001,10.499999,0.0,93.0,0.0,42.0,4.7,4.8
20070905.13:02:30,39.0,23.199999,71.799995,37.5,36.5,11.5,20.7,19.0,45.0,83.299995,45.7,26.599998,60.6,32.0,29.0,19.9,4.0,11.9,6.0,4.4,93.2,76.600006,30.3,73.0,29.899998,93.2,51.0,50.2,48.8,15.7,26.0,25.0,12.0,8.5,8.1,23.8,62.0,30.099998,93.2,63.800003,25.0,8.1,12.0,12.1,39.0,33.8,23.199999,70.6,26.599998,42.3,82.1,45.0,35.3,19.0,17.0,11.5
20070905.13:07:30,53.0,11.0,32.8,11.4,16.3,5.3,6.2,26.0,60.0,37.8,12.9,12.9,27.8,44.0,9.7,9.1,1.7,5.7,9.0,2.0,42.8,36.2,15.0,81.0,14.799999,42.8,67.0,14.299999,22.099998,7.3,35.0,7.8999996,18.0,3.9,3.6,11.4,74.0,14.9,42.8,25.4,11.4,3.6,18.0,3.9,53.0,11.4,11.0,32.8,12.9,12.9,37.8,60.0,16.3,26.0,6.2,5.3
20070905.13:12:30,55.0,13.900001,19.6,8.5,9.9,7.0,4.4,28.0,61.0,22.800001,9.6,16.300001,16.5,46.0,7.2000003,11.6,2.4,3.4,9.0,1.3,26.000002,37.300003,18.800001,75.0,18.6,26.000002,67.0,10.700001,13.2,9.2,37.0,5.8,19.0,2.9,4.7,6.7,71.0,18.7,26.000002,24.2,6.7,4.7,19.0,2.9,55.0,8.5,13.900001,19.6,16.300001,9.6,22.800001,61.0,9.9,28.0,4.4,7.0
20070905.13:17:30,49.0,47.8,234.20001,91.7,125.1,24.800001,52.199997,26.0,59.0,278.80002,115.2,55.399998,190.1,38.0,70.2,40.4,7.5,32.4,6.0,7.0,306.7,152.29999,61.399998,88.0,60.999996,306.7,65.0,123.7,157.8,32.9,32.0,63.1,12.0,14.4,15.1,64.600006,77.0,61.199997,306.7,138.4,80.700005,16.7,16.0,27.8,45.0,78.5,46.2,218.1,53.8,101.6,262.7,55.0,109.0,22.0,38.699997,23.2
20070905.13:22:30,31.0,22.2,157.7,18.7,87.4,11.500001,10.6,17.0,36.0,192.0,22.800001,26.1,124.0,25.0,14.400001,18.400002,3.3,18.1,4.0,1.9,208.8,53.4,29.700003,56.0,29.300001,208.8,39.0,24.6,105.8,14.900002,21.0,12.400001,8.0,3.8,6.8,36.300003,48.0,29.500002,208.8,39.3,53.500004,7.6000004,10.0,6.1,29.0,16.400002,21.400002,140.5,25.300001,20.6,174.8,34.0,70.3,15.0,8.3,10.700001
20070905.13:27:30,41.0,16.7,27.499998,13.099999,14.299999,8.6,7.2000003,20.0,46.0,32.699997,15.599999,19.7,22.199999,35.0,10.2,13.900001,2.9,4.0,6.0,1.4,36.6,51.4,23.000002,61.0,22.6,36.6,51.0,16.699999,18.199999,11.200001,28.0,8.8,13.0,2.9,5.7,7.9,56.0,22.800001,36.6,34.5,9.3,5.7,13.0,4.3,41.0,11.7,16.7,26.099998,19.7,14.2,31.299997,46.0,12.9,20.0,5.8,8.6
20070905.13:32:30,35.0,22.900002,15.4,12.3,7.7,11.400001,7.4,17.0,39.0,18.2,14.5,26.900002,12.9,28.0,9.4,19.000002,3.7,2.5,5.0,1.1,20.800001,45.0,31.100002,68.0,30.7,20.800001,43.0,15.3,10.299999,15.300001,22.0,8.4,11.0,2.1,7.6000004,5.0,56.0,30.900002,20.800001,30.5,5.1,7.6000004,11.0,4.3,35.0,10.5,22.900002,15.299999,26.900002,13.1,18.1,39.0,7.6,17.0,5.3,11.400001
20070905.13:37:30,60.0,18.1,27.499998,49.6,15.5,10.1,29.7,31.0,68.0,33.899998,62.199997,22.1,21.199999,49.0,36.4,14.0,2.0,2.8,9.0,3.4,36.699997,92.1,24.2,89.0,24.0,36.699997,75.0,65.1,18.4,12.0,40.0,33.0,18.0,6.7,3.9,5.7,82.0,24.1,36.699997,78.799995,9.2,6.1000004,20.0,16.4,58.0,39.7,15.9,23.999998,20.0,52.699997,30.399998,66.0,12.0,29.0,19.9,8.0
20070905.13:42:30,79.0,17.1,0.6,35.899998,0.3,9.700001,22.8,40.0,89.0,0.70000005,46.1,21.1,0.5,66.0,25.699999,13.000001,1.6,0.1,13.0,2.1,0.8000001,75.6,23.000002,108.0,22.800001,0.8000001,98.0,47.199997,0.4,11.400001,53.0,24.199999,27.0,3.8,3.3000002,0.2,103.0,22.900002,0.8000001,61.6,0.2,5.7000003,27.0,12.6,79.0,27.199999,14.700001,0.6,18.7,37.199997,0.70000005,89.0,0.3,40.0,14.1,7.3
20070905.13:47:30,59.0,17.3,0.0,24.400002,0.0,9.799999,15.700001,29.0,67.0,0.1,29.400002,21.4,0.0,49.0,17.900002,13.099999,1.6,0.0,10.0,1.0,0.1,60.200005,23.500002,97.0,23.1,0.1,74.0,30.2,0.0,11.499999,40.0,16.900002,19.0,2.2,3.2,0.0,86.0,23.300001,0.1,45.800003,0.0,5.7,19.0,8.6,59.0,19.000002,14.799999,0.0,18.9,25.2,0.1,67.0,0.0,29.0,9.700001,7.2999997
20070905.13:52:30,69.0,18.3,29.4,70.59999,16.9,10.4,44.699997,35.0,78.0,36.5,89.899994,22.599998,22.4,57.0,49.099995,14.0,1.8,2.7,11.0,2.4,39.0,116.2,24.8,100.0,24.399998,39.0,85.0,91.7,19.699999,12.2,46.0,46.799995,22.0,4.9,3.5,5.4,93.0,24.599998,39.0,104.2,9.8,6.1,23.0,23.4,68.0,51.399994,15.8,25.0,20.099998,72.59999,32.1,77.0,12.5,34.0,25.9,7.8999996
20070905.13:57:30,81.0,16.800001,0.0,53.2,0.0,9.6,34.100002,39.0,91.0,0.0,68.7,20.900002,0.0,67.0,37.2,12.800001,1.6,0.0,13.0,1.7,0.0,97.5,22.700003,109.0,22.500002,0.0,101.0,69.799995,0.0,11.200001,53.0,35.7,26.0,3.2,3.2,0.0,105.0,22.600002,0.0,84.2,0.0,5.6000004,26.0,17.800001,81.0,38.7,14.400002,0.0,18.500002,54.2,0.0,91.0,0.0,39.0,19.400002,7.2000003
20070905.14:02:30,57.0,16.900002,0.6,18.900002,0.3,9.6,11.6,27.0,64.0,0.70000005,23.1,20.900002,0.5,47.0,13.800001,12.900001,1.6,0.1,9.0,1.0,3.6,36.8,23.1,116.0,22.500002,0.8000001,70.0,23.800001,0.4,11.3,37.0,12.700001,18.0,2.0,3.2,0.2,94.0,22.800001,2.2,30.7,0.2,5.6000004,18.0,6.4,57.0,15.000001,14.500001,0.6,18.500002,19.7,0.70000005,64.0,0.3,27.0,7.5,7.2000003
20070905.14:07:30,74.0,17.2,0.0,39.1,0.0,9.9,23.599998,37.0,82.0,0.0,45.6,21.300001,0.0,62.0,26.399998,13.1,1.6,0.0,12.0,1.3,13.2,57.3,23.300003,197.0,22.900002,0.0,90.0,46.5,0.0,11.5,49.0,24.999998,25.0,2.6999998,3.2,0.0,144.0,23.100002,6.6,52.0,0.0,5.7,25.0,11.8,74.0,27.699997,14.700001,0.0,18.800001,40.0,0.0,82.0,0.0,37.0,13.2,7.2999997
20070905.14:12:30,79.0,10.6,4.0,61.899998,2.4,5.3,39.8,39.0,88.0,5.0,80.9,12.500001,3.0,66.0,43.1,8.6,1.5,0.4,13.0,1.9,32.8,103.00001,14.400002,239.0,14.200001,5.4,97.0,82.200005,2.7,7.0,52.0,41.399998,26.0,3.5,3.1,0.70000005,168.0,14.300001,19.1,92.600006,1.4000001,3.3999999,26.0,21.0,79.0,44.699997,10.3,3.3,12.200001,63.3,4.3,88.0,1.7,39.0,22.9,5.0
20070905.14:17:30,59.0,9.9,0.1,6.7999997,0.0,4.9,3.3,28.0,66.0,0.1,7.4999995,11.599999,0.1,48.0,5.7,8.2,1.7,0.0,10.0,1.0,25.2,36.199997,13.8,246.0,13.2,0.1,73.0,8.2,0.0,6.5,38.0,4.5,19.0,2.0,3.3000002,0.0,160.0,13.5,12.6,22.599998,0.0,3.3000002,19.0,2.0,59.0,6.7999997,9.9,0.1,11.599999,7.4999995,0.1,66.0,0.0,28.0,3.3,4.9
20070905.14:22:30,71.0,9.900001,0.6,8.2,0.3,5.0,4.2,37.0,79.0,0.70000005,9.0,11.6,0.5,60.0,6.8999996,8.3,1.7,0.1,12.0,1.3,11.2,22.8,13.6,211.0,13.200001,0.8000001,87.0,9.9,0.4,6.6,48.0,5.6,24.0,2.6,3.3000002,0.2,150.0,13.400001,6.0,16.599998,0.2,3.3000002,24.0,2.6999998,71.0,8.099999,9.900001,0.6,11.6,9.0,0.70000005,79.0,0.3,37.0,4.1,5.0
20070905.14:27:30,71.0,9.6,33.1,78.2,18.4,4.8,50.699997,36.0,81.0,40.8,101.899994,11.200001,25.5,59.0,53.899998,8.0,1.6,3.5,11.0,1.8,67.1,117.79999,13.200001,220.0,12.800001,44.3,89.0,103.09999,22.0,6.4,47.0,52.199997,22.0,3.3,3.2,7.1,155.0,13.000001,55.699997,110.59999,11.299999,3.2,23.0,25.8,70.0,55.399998,9.6,28.9,11.200001,79.399994,36.6,80.0,14.299999,35.0,27.699999,4.8
20070905.14:32:30,52.0,29.199997,39.2,37.000004,22.2,17.099998,23.7,27.0,59.0,48.4,47.400005,36.699997,30.0,43.0,26.000002,21.699997,2.1,3.9,8.0,1.1,52.0,95.100006,39.499996,97.0,38.899998,52.0,65.0,48.300007,26.1,19.399998,35.0,24.900002,17.0,2.3000002,4.3999996,7.7,81.0,39.199997,52.0,73.3,13.1,9.599999,18.0,12.6,51.0,27.200003,23.999996,33.7,31.499996,37.900005,43.0,58.0,16.7,26.0,13.900001,11.9
20070905.14:37:30,69.0,34.3,0.0,9.6,0.0,17.099998,5.0,35.0,77.0,0.0,10.8,40.0,0.0,58.0,8.1,28.599998,5.6,0.0,12.0,1.8,0.0,39.3,45.799995,100.0,45.6,0.0,84.0,12.0,0.0,22.899998,46.0,6.5,24.0,3.4,11.299999,0.0,92.0,45.699997,0.0,25.8,0.0,11.299999,24.0,3.4,69.0,9.6,34.3,0.0,40.0,10.8,0.0,77.0,0.0,35.0,5.0,17.099998
20070905.14:42:30,80.0,33.5,0.5,10.7,0.2,16.7,5.6,41.0,88.0,0.6,12.2,39.1,0.4,67.0,9.0,28.0,5.5,0.0,15.0,2.1,12.9,31.3,45.0,217.0,44.6,0.70000005,97.0,13.599999,0.3,22.300001,54.0,7.3,28.0,3.8,11.0,0.1,158.0,44.8,6.8,23.099998,0.1,11.0,28.0,3.8,80.0,10.7,33.5,0.5,39.1,12.2,0.6,88.0,0.2,41.0,5.6,16.7
20070905.14:47:30,40.0,31.399998,0.6,36.0,0.3,19.099998,23.5,21.0,46.0,0.70000005,44.600002,40.199997,0.5,33.0,25.800001,22.599998,1.7,0.1,6.0,1.0,8.3,61.5,42.499996,87.0,41.899998,0.8000001,50.0,45.4,0.4,20.899998,27.0,24.6,13.0,2.1,3.5,0.2,69.0,42.199997,4.5,53.7,0.2,10.4,14.0,12.4,39.0,26.800001,24.399998,0.6,33.199997,36.9,0.70000005,45.0,0.3,20.0,13.7,12.099999
20070905.14:52:30,5.0,24.0,0.5,41.7,0.2,16.0,26.5,3.0,6.0,0.6,51.100002,31.9,0.4,3.0,26.7,16.0,0.0,0.1,0.0,0.1,0.70000005,74.3,32.3,20.0,31.9,0.70000005,6.0,51.2,0.3,16.0,3.0,26.6,0.0,3.1,0.0,0.2,13.0,32.1,0.70000005,63.0,0.2,8.0,1.0,14.200001,3.0,27.900002,16.0,0.5,24.0,42.100002,0.6,5.0,0.2,1.0,14.300001,8.0
20070905.14:57:30,3.0,24.5,0.0,75.100006,0.0,14.799999,49.800003,2.0,4.0,0.0,92.4,31.3,0.0,2.0,58.4,17.8,1.5,0.0,0.0,5.9,0.0,122.8,32.999996,12.0,32.8,0.0,4.0,96.200005,0.0,16.199999,2.0,55.300003,0.0,14.1,3.0,0.0,8.0,32.899998,0.0,109.600006,0.0,8.2,1.0,27.900002,2.0,61.300003,19.3,0.0,26.1,78.700005,0.0,3.0,0.0,1.0,36.2,9.7
20070905.15:02:30,2.0,24.1,45.6,21.800001,25.9,14.1,13.800001,1.0,3.0,56.0,27.900002,30.2,35.2,1.0,15.700001,18.1,1.9,4.7,0.0,0.9,60.2,57.6,32.7,27.0,32.100002,60.2,3.0,28.900002,30.5,16.1,1.0,14.800001,0.0,1.8,3.9,9.4,15.0,32.4,60.2,43.5,15.5,7.9,0.0,7.1000004,1.0,16.7,20.1,39.5,26.1,22.900002,50.0,2.0,19.8,0.0,8.400001,10.0
20070905.15:07:30,15.0,42.4,75.399994,95.1,45.199997,25.800001,61.9,10.0,20.0,95.09999,125.2,54.0,55.799995,10.0,64.8,30.900002,2.6,5.7,0.0,1.5,100.29999,150.4,56.799995,34.0,56.6,100.29999,20.0,126.399994,50.199997,28.400002,10.0,63.4,0.0,3.0,5.3,11.4,27.0,56.699997,100.29999,138.5,25.599998,14.1,5.0,31.5,10.0,66.0,33.5,61.299995,45.100002,96.299995,80.899994,15.0,31.099998,5.0,33.2,16.800001
20070905.15:12:30,21.0,51.0,90.7,91.8,55.199997,28.4,59.0,14.0,28.0,115.7,120.5,62.300003,65.799995,14.0,62.6,39.899998,5.9,5.1,0.0,1.8,120.6,151.40001,68.3,36.0,68.100006,120.6,28.0,122.6,60.499996,34.1,14.0,60.8,0.0,3.5,11.8,10.299999,32.0,68.200005,120.6,137.3,30.099998,17.2,7.0,30.4,14.0,65.0,45.6,70.799995,56.9,93.700005,95.799995,21.0,35.3,7.0,32.3,23.0
20070905.15:17:30,3.0,44.600002,18.4,53.0,10.5,24.1,32.399998,2.0,4.0,22.7,67.0,53.600002,14.1,2.0,38.8,35.7,6.1,1.8,0.0,2.8,24.400002,96.1,59.700005,27.0,59.300003,24.400002,4.0,70.0,12.3,29.900002,2.0,35.899998,0.0,5.3999996,12.1,3.6,16.0,59.500004,24.400002,83.5,6.2,15.1,1.0,17.599998,2.0,41.7,41.600002,15.8,50.600002,56.2,20.1,3.0,7.8999996,1.0,20.499998,21.1
20070905.15:22:30,3.0,36.0,33.2,28.099998,18.9,23.9,17.9,2.0,4.0,40.9,35.699997,47.9,25.699999,2.0,19.8,23.9,0.0,3.3,0.0,1.0,43.9,68.5,48.300003,20.0,47.9,43.9,4.0,36.6,22.3,23.9,2.0,18.699999,0.0,2.6,0.0,6.6,12.0,48.100002,43.9,52.8,11.2,11.9,1.0,9.7,2.0,20.8,23.9,28.8,36.0,28.999998,36.4,3.0,14.4,1.0,10.8,11.9
20070905.15:27:30,3.0,26.099998,15.2,34.2,8.599999,17.4,21.400002,2.0,4.0,18.7,43.2,34.8,11.7,2.0,24.800001,17.4,0.0,1.6,0.0,1.3,20.2,70.5,34.999996,12.0,34.8,20.2,4.0,44.100002,10.099999,17.4,2.0,24.000002,0.0,3.1,0.0,3.2,8.0,34.899998,20.2,57.4,5.2,8.7,1.0,11.200001,2.0,26.2,17.4,13.2,26.099998,35.0,16.7,3.0,6.7,1.0,13.300001,8.7
20070905.15:32:30,3.0,24.1,0.5,27.900002,0.2,16.0,19.0,2.0,4.0,0.6,35.7,32.2,0.4,2.0,19.6,16.0,0.0,0.1,0.0,0.1,0.70000005,67.9,32.8,28.0,32.2,0.70000005,4.0,35.7,0.3,16.0,2.0,19.5,0.0,0.1,0.0,0.2,16.0,32.5,0.70000005,52.300003,0.2,7.9,1.0,9.900001,2.0,19.6,16.0,0.5,24.1,27.900002,0.6,3.0,0.2,1.0,9.900001,7.9
20070905.15:37:30,3.0,23.9,1.8,43.1,0.90000004,14.700001,26.699999,2.0,4.0,2.1,52.299995,30.599998,1.5,2.0,28.699999,17.2,1.3,0.3,0.0,1.7,2.3999999,80.799995,32.1,18.0,31.899998,2.3999999,4.0,53.199997,1.2,16.0,2.0,27.599998,0.0,2.4,2.6,0.6,11.0,31.999998,2.3999999,67.399994,0.6,8.0,1.0,13.799999,2.0,29.3,18.5,1.8,25.199999,43.699997,2.1,3.0,0.90000004,1.0,14.499999,9.3
20070905.15:42:30,27.0,50.999996,55.800003,117.600006,28.7,25.5,64.100006,14.0,32.0,64.8,148.50002,57.899998,46.7,22.0,87.70001,44.199997,9.3,9.0,4.0,11.9,72.3,198.1,64.799995,46.0,64.6,72.3,36.0,167.70001,37.7,34.8,18.0,75.90001,8.0,23.7,18.6,18.0,41.0,64.7,72.3,183.20001,19.6,18.6,9.0,34.800003,26.0,106.90001,50.999996,54.100002,57.899998,136.70001,63.200005,31.0,27.0,13.0,53.800003,25.5
20070905.15:47:30,0.0,24.1,0.0,22.499998,0.0,13.099999,14.7,0.0,0.0,0.1,27.399998,29.5,0.0,0.0,16.3,18.8,2.6,0.0,0.0,0.7,0.1,54.9,32.7,22.0,32.3,0.1,0.0,27.999998,0.0,16.099998,0.0,15.4,0.0,1.4,5.3999996,0.0,11.0,32.5,0.1,41.8,0.0,7.7999997,0.0,8.0,0.0,17.099998,21.5,0.0,27.0,23.299997,0.1,0.0,0.0,0.0,8.5,10.599999
20070905.15:52:30,0.0,24.4,11.3,28.3,6.4,13.999999,17.5,0.0,0.0,13.7,34.9,30.300001,8.8,0.0,19.9,18.4,2.2,1.2,0.0,1.3,14.8,67.6,32.9,17.0,32.5,14.8,0.0,36.0,7.6000004,16.199999,0.0,18.5,0.0,2.6999998,4.4,2.4,9.0,32.7,14.8,52.3,3.8000002,8.2,0.0,8.9,0.0,21.1,20.6,9.900001,26.6,29.5,12.3,0.0,5.0,0.0,10.799999,10.299999
20070905.15:57:30,0.0,26.799997,22.300001,38.9,12.700001,15.4,25.5,0.0,0.0,27.500002,47.500004,33.6,17.1,0.0,30.4,19.999998,2.3,2.2,0.0,3.6,29.500002,77.600006,36.099995,8.0,35.899998,29.500002,0.0,50.600002,14.900001,17.699999,0.0,28.0,0.0,8.1,4.3999996,4.4,4.0,35.999996,29.500002,64.100006,7.5,8.9,0.0,13.900001,0.0,33.0,22.299997,19.2,29.099997,41.600002,24.400002,0.0,9.6,0.0,19.6,11.0
20070905.16:02:30,3.0,24.2,55.9,21.0,31.6,14.200001,13.1,2.0,4.0,68.7,27.1,30.2,43.2,2.0,15.200001,18.1,1.9,5.7,0.0,1.2,73.799995,55.9,32.600002,28.0,32.2,73.799995,4.0,28.2,37.4,16.2,2.0,14.200001,0.0,2.2,3.9,11.4,16.0,32.4,73.799995,42.5,18.9,8.1,1.0,7.1000004,2.0,16.300001,20.0,48.5,26.1,22.5,61.2,3.0,24.2,1.0,8.200001,10.1
20070905.16:07:30,3.0,36.6,66.1,27.400002,37.6,21.3,16.5,2.0,4.0,81.299995,34.100002,45.799995,51.1,2.0,20.300001,27.5,2.9,6.6,0.0,2.3,87.299995,59.900005,48.899994,18.0,48.699997,87.299995,4.0,36.000004,44.399998,24.5,2.0,18.1,0.0,4.5,5.9,13.4,11.0,48.799995,87.299995,48.100006,22.4,12.0,1.0,9.4,2.0,22.300001,30.5,57.199997,39.699997,29.300001,72.299995,3.0,28.7,1.0,11.5,15.1
20070905.16:12:30,0.0,36.7,33.199997,36.6,19.0,21.2,20.9,0.0,0.0,40.899998,44.899998,45.7,25.599998,0.0,27.5,27.7,3.1,3.4,0.0,3.6,43.899998,75.799995,49.1,10.0,48.9,43.899998,0.0,47.999996,22.3,24.400002,0.0,25.0,0.0,6.6,6.3,6.8,5.0,49.0,43.899998,62.199997,11.3,12.200001,0.0,12.2,0.0,30.9,30.900002,28.699999,39.8,39.3,36.399998,0.0,14.5,0.0,15.2,15.400001
20070905.16:17:30,3.0,30.8,0.0,28.900002,0.0,18.2,19.5,2.0,4.0,0.0,36.0,38.8,0.0,2.0,20.6,22.8,2.1,0.0,0.0,0.8,0.0,65.399994,41.4,27.0,41.0,0.0,4.0,36.6,0.0,20.5,2.0,20.1,0.0,1.3,4.3,0.0,16.0,41.2,0.0,51.399998,0.0,10.200001,1.0,10.3,2.0,21.1,25.0,0.0,33.0,29.500002,0.0,3.0,0.0,1.0,10.8,12.400001
20070905.16:22:30,3.0,24.1,76.200005,33.9,43.2,14.200001,20.6,2.0,4.0,93.100006,42.800003,30.1,58.6,2.0,24.800001,18.1,2.1,7.7,0.0,1.8,100.100006,74.9,32.4,20.0,32.0,100.100006,4.0,44.9,51.0,16.2,2.0,22.300001,0.0,4.2,4.1,15.5,12.0,32.2,100.100006,60.2,25.7,8.1,1.0,11.5,2.0,26.7,20.2,65.9,26.1,35.9,82.8,3.0,33.0,1.0,13.5,10.200001
20070905.16:27:30,4.0,11.2,19.300001,63.5,10.3,6.5,41.6,1.0,4.0,23.100002,83.6,13.9,15.5,3.0,43.0,8.5,1.0,2.7,1.0,0.6,25.800003,111.49999,15.1,12.0,14.9,25.800003,4.0,84.299995,12.9,7.5,2.0,42.3,1.0,1.2,2.0,5.4,8.0,15.0,25.800003,98.299995,6.5,3.8,1.0,20.7,4.0,43.7,9.5,18.2,12.2,64.2,22.000002,4.0,9.2,1.0,21.5,4.8
20070905.16:32:30,3.0,6.1,81.4,23.900002,46.200005,3.5,15.0,2.0,4.0,100.4,30.800001,7.5,62.600006,2.0,17.2,4.7,0.6,8.1,0.0,1.2,107.9,62.200005,8.6,28.0,8.0,107.9,4.0,31.900002,54.400005,4.1,2.0,16.2,0.0,2.3000002,1.2,16.0,16.0,8.3,107.9,47.600002,27.2,2.1,1.0,8.0,2.0,18.400002,5.2,70.3,6.6,25.300001,89.3,3.0,35.100002,1.0,9.3,2.6
20070905.16:37:30,3.0,4.4,54.9,51.799995,31.0,2.2,30.6,2.0,4.0,67.6,63.199997,5.0,42.3,2.0,39.199997,3.8,0.8,5.6,0.0,5.0,72.799995,97.399994,5.7999997,20.0,5.6,72.799995,4.0,67.299995,36.6,3.0,2.0,34.6,0.0,10.5,1.6,11.1,12.0,5.7,72.799995,82.799995,18.3,1.6,1.0,18.0,2.0,43.999996,4.4,47.7,5.0,55.999996,60.4,3.0,23.8,1.0,23.1,2.2
20070905.16:42:30,15.0,13.299999,167.7,66.6,95.4,7.8999996,37.9,9.0,19.0,206.90001,82.1,16.9,128.5,11.0,51.0,9.799999,0.9,16.7,1.0,6.6,222.3,118.5,18.0,30.0,17.8,222.3,20.0,89.799995,111.9,8.799999,10.0,44.5,2.0,13.299999,1.8,33.2,25.0,17.9,222.3,104.6,56.300003,4.3999996,5.0,22.0,12.0,57.9,10.699999,144.5,14.299999,73.4,183.8,16.0,72.3,6.0,29.2,5.2999997
20070905.16:47:30,9.0,12.400001,223.09999,35.6,127.7,7.0,21.5,6.0,12.0,275.1,45.5,15.300001,171.3,6.0,25.199999,9.5,1.2,22.0,0.0,1.6,294.80002,74.600006,16.800003,35.0,16.400002,294.80002,12.0,47.4,149.5,8.3,6.0,23.4,0.0,3.3000002,2.5,44.0,24.0,16.600002,294.80002,61.600002,75.5,4.2,3.0,11.400001,6.0,27.499998,10.6,191.7,13.500001,37.5,243.7,9.0,96.2,3.0,13.3,5.2999997
20070905.16:52:30,0.0,0.0,0.4,3.8999996,0.2,0.0,3.5,0.0,0.0,0.5,3.9999995,0.0,0.4,0.0,3.6999998,0.0,0.0,0.0,0.0,1.2,0.6,32.199997,0.4,17.0,0.0,0.6,0.0,3.9999995,0.3,0.0,0.0,3.6,0.0,2.3000002,0.0,0.1,9.0,0.2,0.6,18.8,0.1,0.0,0.0,2.4,0.0,3.7999997,0.0,0.4,0.0,3.8999996,0.5,0.0,0.2,0.0,3.4,0.0
20070905.16:57:30,3.0,0.0,102.299995,28.3,58.399998,0.0,17.199999,2.0,4.0,126.19999,35.6,0.0,78.4,2.0,21.0,0.0,0.0,10.2,0.0,1.8,135.59999,64.4,0.2,13.0,0.0,135.59999,4.0,37.699997,68.5,0.0,2.0,18.9,0.0,4.5,0.0,20.099998,9.0,0.1,135.59999,51.6,34.3,0.0,1.0,9.9,2.0,22.9,0.0,88.1,0.0,30.199999,111.99999,3.0,44.199997,1.0,11.799999,0.0
20070905.17:02:30,6.0,18.899998,137.20001,35.7,78.0,10.599999,21.400002,4.0,8.0,169.20001,45.2,22.999996,105.600006,4.0,26.2,14.799999,2.0,13.5,0.0,2.7,181.6,75.5,25.199997,30.0,24.799995,181.6,8.0,47.9,91.8,12.699999,4.0,23.900002,0.0,5.1000004,4.1,27.3,19.0,24.999996,181.6,62.0,46.1,6.3999996,2.0,11.8,4.0,29.0,16.599998,118.40001,20.699997,38.5,150.30002,6.0,59.1,2.0,14.700001,8.299999
20070905.17:07:30,0.0,11.599999,68.9,24.0,38.4,6.2999997,14.2,0.0,0.0,84.4,29.6,13.799999,53.4,0.0,18.0,9.299999,1.5,7.4,0.0,2.1,91.4,59.699997,15.2,15.0,14.999999,91.4,0.0,31.5,45.800003,7.7999997,0.0,16.0,0.0,4.0,3.0,14.8,8.0,15.099999,91.4,46.1,23.0,4.0,0.0,8.2,0.0,20.0,10.499999,60.7,12.799999,25.9,76.200005,0.0,30.2,0.0,10.2,5.2
20070905.17:12:30,6.0,16.0,154.0,39.800003,87.3,9.0,23.900002,4.0,8.0,189.29999,50.500004,19.2,118.8,4.0,28.800001,12.799999,2.0,15.6,0.0,2.8,203.79999,80.9,21.000002,17.0,20.800001,203.79999,8.0,53.500004,103.0,10.9,4.0,26.300001,0.0,5.2,4.0,31.3,13.0,20.900002,203.79999,67.700005,51.8,5.7,2.0,13.1,4.0,31.7,14.4,133.6,17.6,42.500004,168.9,6.0,66.8,2.0,15.900001,7.2999997
20070905.17:17:30,3.0,19.8,138.2,27.0,77.6,11.5,16.2,2.0,4.0,169.7,33.8,24.4,106.9,2.0,20.1,15.2,1.9,14.2,0.0,2.2,182.8,64.3,26.300001,27.0,25.9,182.8,4.0,35.899998,92.0,13.3,2.0,18.2,0.0,4.0,3.8,28.599998,16.0,26.1,182.8,50.5,46.399998,6.8999996,1.0,9.0,2.0,22.2,16.8,120.4,21.4,29.1,151.9,3.0,59.899998,1.0,11.4,8.4
20070905.17:22:30,3.0,11.799999,131.70001,28.6,75.8,6.9,17.5,2.0,4.0,162.90001,35.9,14.599998,100.600006,2.0,20.7,9.0,1.0,12.3,0.0,1.7,174.1,66.5,15.999998,20.0,15.599998,174.1,4.0,37.7,88.200005,7.9,2.0,19.0,0.0,3.9,2.1,24.5,12.0,15.799998,174.1,52.5,43.9,4.0,1.0,9.700001,2.0,22.7,9.9,112.50001,12.699999,30.2,143.6,3.0,56.300003,1.0,11.6,5.0
20070905.17:27:30,17.0,1.5000001,8.2,56.1,4.4,0.8,32.3,8.0,20.0,9.9,67.6,1.8000002,6.5,14.0,45.6,1.2,0.2,1.0,2.0,5.8,10.9,100.299995,2.2,31.0,2.0000002,10.9,23.0,73.1,5.4,1.0,11.0,39.399998,5.0,14.0,0.4,2.0,27.0,2.1000001,10.9,87.2,2.7,0.5,5.0,19.9,17.0,50.699997,1.4000001,7.5,1.7000002,61.899998,9.2,20.0,3.7,8.0,25.099998,0.7
20070905.17:32:30,118.0,0.6,108.200005,62.5,54.199997,0.3,32.3,58.0,138.0,125.50001,74.3,0.6,90.9,98.0,50.899998,0.5,0.1,18.4,19.0,8.8,142.3,115.299995,1.3,181.0,0.70000005,142.3,157.0,83.9,72.5,0.4,79.0,42.199997,38.0,17.6,0.2,36.8,169.0,1.0,142.3,100.2,37.1,0.2,38.0,19.5,118.0,61.1,0.6,107.9,0.6,73.0,125.200005,138.0,53.899998,58.0,29.6,0.3
20070905.17:37:30,0.0,0.0,15.0,40.1,8.3,0.0,24.599998,0.0,0.0,18.2,49.199997,0.0,11.8,0.0,28.899998,0.0,0.0,1.8,0.0,2.4,19.800001,80.99999,0.2,15.0,0.0,19.800001,0.0,51.199997,10.1,0.0,0.0,26.499998,0.0,4.8,0.0,3.6,8.0,0.1,19.800001,66.399994,5.1,0.0,0.0,13.2,0.0,30.599998,0.0,13.5,0.0,42.199997,16.7,0.0,6.8,0.0,15.9,0.0
20070905.17:42:30,15.0,0.0,171.6,63.000004,97.40001,0.0,39.4,10.0,20.0,210.7,81.6,0.0,132.70001,10.0,44.4,0.0,0.0,17.6,0.0,2.7,226.0,113.49999,0.2,30.0,0.0,226.0,20.0,84.799995,115.100006,0.0,10.0,41.9,0.0,5.2,0.0,35.2,25.0,0.1,226.0,99.799995,58.4,0.0,5.0,20.8,10.0,47.300003,0.0,148.40001,0.0,65.9,187.5,15.0,74.200005,5.0,23.8,0.0
20070905.17:47:30,0.0,0.0,7.9,7.3,4.5,0.0,4.5,0.0,0.0,9.8,8.900001,0.0,6.0,0.0,5.5,0.0,0.0,0.8,0.0,0.4,10.5,36.3,0.4,22.0,0.0,10.5,0.0,9.1,5.3,0.0,0.0,5.0,0.0,0.8,0.0,1.6,11.0,0.2,10.5,23.3,2.7,0.0,0.0,2.4,0.0,5.8,0.0,6.8,0.0,7.7000003,8.7,0.0,3.4,0.0,2.9,0.0
20070905.17:52:30,0.0,22.599998,36.3,19.9,18.8,11.1,11.4,0.0,0.0,43.2,23.8,26.399998,29.3,0.0,15.799999,18.8,3.7,5.0,0.0,2.4,48.2,54.699997,30.5,15.0,30.099998,48.2,0.0,25.699999,24.099998,15.0,0.0,13.299999,0.0,4.9,7.3,10.0,8.0,30.3,48.2,40.399998,11.8,7.3,0.0,6.8,0.0,17.9,22.599998,34.399998,26.399998,22.199999,41.3,0.0,16.9,0.0,9.4,11.1
20070905.17:57:30,6.0,18.8,18.9,24.8,9.3,9.4,13.4,3.0,7.0,21.8,28.8,21.8,15.7,5.0,20.5,15.7,3.2,3.0,1.0,3.2,24.8,63.7,25.1,18.0,24.9,24.8,8.0,32.8,12.5,12.5,4.0,17.3,2.0,7.8,6.3,6.1,13.0,25.0,24.8,48.5,6.1,6.3,2.0,8.6,6.0,23.9,18.8,18.9,21.8,28.0,21.8,7.0,9.3,3.0,12.5,9.4
20070905.18:02:30,0.0,0.1,0.9000001,6.5999994,0.5,0.1,4.2,0.0,0.0,1.1000001,7.5999994,0.1,0.70000005,0.0,5.7,0.1,0.0,0.1,0.0,0.8,1.2000002,37.0,0.70000005,25.0,0.1,1.2000002,0.0,7.799999,0.6,0.1,0.0,5.2,0.0,1.6,0.0,0.2,13.0,0.4,1.2000002,23.0,0.3,0.0,0.0,2.4,0.0,5.8999996,0.1,0.8000001,0.1,7.0999994,1.0000001,0.0,0.4,0.0,3.5,0.1
20070905.18:07:30,0.0,0.0,0.0,3.1999998,0.0,0.0,2.9,0.0,0.0,0.0,3.2999997,0.0,0.0,0.0,3.1,0.0,0.0,0.0,0.0,0.1,0.0,26.1,0.2,14.0,0.0,0.0,0.0,3.2999997,0.0,0.0,0.0,3.0,0.0,1.3000001,0.0,0.0,7.0,0.1,0.0,15.0,0.0,0.0,0.0,1.4000001,0.0,3.1999998,0.0,0.0,0.0,3.2999997,0.0,0.0,0.0,0.0,2.9,0.0
20070905.18:12:30,33.0,0.0,93.2,40.399998,53.5,0.0,22.5,20.0,42.0,115.299995,49.6,0.0,71.2,24.0,31.3,0.0,0.0,8.9,2.0,4.4,123.7,84.09999,0.2,52.0,0.0,123.7,44.0,54.199997,62.3,0.0,22.0,26.9,4.0,8.8,0.0,17.8,48.0,0.1,123.7,69.399994,31.4,0.0,11.0,13.4,26.0,35.8,0.0,79.6,0.0,44.899998,101.7,35.0,39.9,13.0,17.9,0.0
20070905.18:17:30,0.0,0.0,1.2,2.6999998,0.6,0.0,1.5999999,0.0,0.0,1.4000001,3.4999998,0.0,1.0,0.0,2.1999998,0.0,0.0,0.2,0.0,0.3,1.6000001,32.3,0.4,24.0,0.0,1.6000001,0.0,3.7999997,0.8,0.0,0.0,1.8999999,0.0,0.6,0.0,0.4,12.0,0.2,1.6000001,18.6,0.4,0.0,0.0,1.0,0.0,2.4999998,0.0,1.2,0.0,3.2999997,1.4000001,0.0,0.6,0.0,1.3,0.0
20070905.18:22:30,0.0,0.0,0.6,6.1,0.3,0.0,4.2999997,0.0,0.0,0.70000005,6.2999997,0.0,0.5,0.0,5.6,0.0,0.0,0.1,0.0,1.4,0.8000001,37.199997,0.4,15.0,0.0,0.8000001,0.0,6.3999996,0.4,0.0,0.0,5.5,0.0,2.5,0.0,0.2,8.0,0.2,0.8000001,22.099998,0.2,0.0,0.0,2.7,0.0,5.7,0.0,0.6,0.0,6.2,0.70000005,0.0,0.3,0.0,4.1,0.0
20070905.18:27:30,0.0,0.0,0.0,11.2,0.0,0.0,10.3,0.0,0.0,0.0,11.4,0.0,0.0,0.0,10.8,0.0,0.0,0.0,0.0,9.6,0.0,38.1,0.2,9.0,0.0,0.0,0.0,11.599999,0.0,0.0,0.0,10.6,0.0,10.0,0.0,0.0,5.0,0.1,0.0,25.099998,0.0,0.0,0.0,10.0,0.0,11.2,0.0,0.0,0.0,11.4,0.0,0.0,0.0,0.0,10.3,0.0
20070905.18:32:30,0.0,0.0,0.6,1.4,0.3,0.0,1.0,0.0,0.0,0.70000005,1.5,0.0,0.5,0.0,1.3,0.0,0.0,0.1,0.0,0.0,0.8000001,30.5,0.4,23.0,0.0,0.8000001,0.0,1.5,0.4,0.0,0.0,1.0,0.0,0.4,0.0,0.2,12.0,0.2,0.8000001,16.5,0.2,0.0,0.0,0.5,0.0,1.3,0.0,0.6,0.0,1.5,0.70000005,0.0,0.3,0.0,0.9,0.0
20070905.18:37:30,0.0,0.0,2.4,7.8,1.2,0.0,6.4,0.0,0.0,2.8000002,8.1,0.0,2.0,0.0,7.2000003,0.0,0.0,0.4,0.0,1.7,3.2000003,37.5,0.4,14.0,0.0,3.2000003,0.0,8.400001,1.6,0.0,0.0,6.7000003,0.0,3.7,0.0,0.8,7.0,0.2,3.2000003,23.1,0.8,0.0,0.0,3.7,0.0,7.8,0.0,2.4,0.0,8.1,2.8000002,0.0,1.2,0.0,6.4,0.0
20070905.18:42:30,0.0,0.0,0.4,14.999999,0.1,0.0,4.4,0.0,0.0,0.4,19.3,0.0,0.3,0.0,14.599999,0.0,0.0,0.0,0.0,0.2,0.4,54.600002,0.2,11.0,0.0,0.4,0.0,19.5,0.2,0.0,0.0,12.4,0.0,4.1,0.0,0.0,6.0,0.1,0.4,37.4,0.0,0.0,0.0,4.1,0.0,14.999999,0.0,0.4,0.0,19.3,0.4,0.0,0.1,0.0,4.4,0.0
20070905.18:47:30,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,27.2,0.4,22.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,11.0,0.2,0.0,14.1,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
20070905.18:52:30,0.0,0.0,0.5,7.299999,0.2,0.0,5.4999995,0.0,0.0,0.6,7.499999,0.0,0.4,0.0,5.6999993,0.0,0.0,0.1,0.0,1.7,0.70000005,34.3,0.4,14.0,0.0,0.70000005,0.0,7.599999,0.3,0.0,0.0,5.5999994,0.0,2.6,0.0,0.1,7.0,0.2,0.70000005,21.199999,0.1,0.0,0.0,2.6999998,0.0,7.0999994,0.0,0.5,0.0,7.399999,0.6,0.0,0.2,0.0,5.3999996,0.0
20070905.18:57:30,0.0,0.0,0.0,6.9,0.0,0.0,0.8,0.0,0.0,0.0,7.1,0.0,0.0,0.0,6.3,0.0,0.0,0.0,0.0,0.3,0.0,39.8,0.2,8.0,0.0,0.0,0.0,7.2999997,0.0,0.0,0.0,6.0,0.0,0.6,0.0,0.0,4.0,0.1,0.0,23.8,0.0,0.0,0.0,0.6,0.0,6.9,0.0,0.0,0.0,7.1,0.0,0.0,0.0,0.0,0.8,0.0
20070905.19:02:30,0.0,0.0,0.6,2.9,0.3,0.0,1.6000001,0.0,0.0,0.70000005,3.1,0.0,0.5,0.0,2.3000002,0.0,0.0,0.1,0.0,0.5,0.8000001,32.199997,0.6,24.0,0.0,0.8000001,0.0,3.1999998,0.4,0.0,0.0,2.2000003,0.0,0.6,0.0,0.2,12.0,0.3,0.8000001,18.3,0.2,0.0,0.0,0.8,0.0,2.8000002,0.0,0.6,0.0,3.0,0.70000005,0.0,0.3,0.0,1.4000001,0.0
20070905.19:07:30,0.0,0.0,0.0,8.700001,0.0,0.0,7.0,0.0,0.0,0.0,8.800001,0.0,0.0,0.0,8.6,0.0,0.0,0.0,0.0,1.1,0.0,33.0,0.2,12.0,0.0,0.0,0.0,9.900002,0.0,0.0,0.0,7.1,0.0,5.2,0.0,0.0,6.0,0.1,0.0,21.500002,0.0,0.0,0.0,5.2999997,0.0,8.700001,0.0,0.0,0.0,8.800001,0.0,0.0,0.0,0.0,7.0,0.0
20070905.19:12:30,0.0,0.0,0.5,23.500002,0.2,0.0,12.5,0.0,0.0,0.6,23.800001,0.0,0.4,0.0,19.400002,0.0,0.0,0.1,0.0,7.7,0.70000005,52.0,0.2,9.0,0.0,0.70000005,0.0,24.000002,0.3,0.0,0.0,19.2,0.0,12.2,0.0,0.1,5.0,0.1,0.70000005,38.4,0.1,0.0,0.0,12.2,0.0,23.500002,0.0,0.5,0.0,23.800001,0.6,0.0,0.2,0.0,12.5,0.0
20070905.19:17:30,0.0,0.0,0.0,0.6,0.0,0.0,0.5,0.0,0.0,0.0,0.6,0.0,0.0,0.0,0.6,0.0,0.0,0.0,0.0,0.4,0.0,29.7,0.4,23.0,0.0,0.0,0.0,0.6,0.0,0.0,0.0,0.6,0.0,0.5,0.0,0.0,12.0,0.2,0.0,15.400001,0.0,0.0,0.0,0.5,0.0,0.6,0.0,0.0,0.0,0.6,0.0,0.0,0.0,0.0,0.5,0.0
20070905.19:22:30,0.0,0.0,0.3,9.8,0.2,0.0,7.9999995,0.0,0.0,0.3,9.900001,0.0,0.2,0.0,9.599999,0.0,0.0,0.0,0.0,6.5,0.3,38.9,0.4,15.0,0.0,0.3,0.0,9.900001,0.2,0.0,0.0,8.099999,0.0,7.7,0.0,0.1,8.0,0.2,0.3,24.8,0.1,0.0,0.0,7.7999997,0.0,9.7,0.0,0.3,0.0,9.900001,0.3,0.0,0.2,0.0,7.8999996,0.0
20070905.19:27:30,0.0,0.0,0.0,12.6,0.0,0.0,8.1,0.0,0.0,0.0,12.900001,0.0,0.0,0.0,12.3,0.0,0.0,0.0,0.0,0.3,0.0,42.699997,0.2,8.0,0.0,0.0,0.0,13.3,0.0,0.0,0.0,12.0,0.0,3.5,0.0,0.0,4.0,0.1,0.0,28.3,0.0,0.0,0.0,3.5,0.0,12.6,0.0,0.0,0.0,12.900001,0.0,0.0,0.0,0.0,8.1,0.0
20070905.19:32:30,0.0,0.0,0.6,1.0,0.3,0.0,0.6,0.0,0.0,0.70000005,1.0,0.0,0.5,0.0,0.90000004,0.0,0.0,0.1,0.0,0.0,0.8000001,30.1,0.4,23.0,0.0,0.8000001,0.0,1.0,0.4,0.0,0.0,0.6,0.0,0.4,0.0,0.2,12.0,0.2,0.8000001,16.0,0.2,0.0,0.0,0.5,0.0,0.90000004,0.0,0.6,0.0,1.0,0.70000005,0.0,0.3,0.0,0.5,0.0
20070905.19:37:30,0.0,0.0,2.9,3.9,1.4,0.0,2.2,0.0,0.0,3.3000002,4.2000003,0.0,2.4,0.0,3.5,0.0,0.0,0.4,0.0,0.4,3.8000002,34.4,0.4,14.0,0.0,3.8000002,0.0,4.4,1.9,0.0,0.0,3.0,0.0,1.8,0.0,0.9,7.0,0.2,3.8000002,19.7,0.9,0.0,0.0,1.8,0.0,3.9,0.0,2.9,0.0,4.2000003,3.3000002,0.0,1.4,0.0,2.2,0.0
20070905.19:42:30,0.0,0.0,0.1,9.599999,0.0,0.0,4.8999996,0.0,0.0,0.2,9.999999,0.0,0.1,0.0,9.4,0.0,0.0,0.0,0.0,4.5,0.2,43.6,0.2,8.0,0.0,0.2,0.0,10.299999,0.1,0.0,0.0,9.2,0.0,4.7,0.0,0.0,4.0,0.1,0.2,27.099998,0.0,0.0,0.0,4.7,0.0,9.599999,0.0,0.1,0.0,9.999999,0.2,0.0,0.0,0.0,4.8999996,0.0
20070905.19:47:30,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.0,0.0,0.0,29.1,0.4,23.0,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.0,12.0,0.2,0.0,15.3,0.0,0.0,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.0,0.0,0.0
20070905.19:52:30,0.0,0.0,0.6,5.6,0.3,0.0,3.4,0.0,0.0,0.70000005,5.7,0.0,0.5,0.0,5.5,0.0,0.0,0.1,0.0,0.1,0.8000001,29.1,0.4,13.0,0.0,0.8000001,0.0,5.7999997,0.4,0.0,0.0,4.5,0.0,1.7,0.0,0.2,7.0,0.2,0.8000001,17.5,0.2,0.0,0.0,1.8000001,0.0,5.6,0.0,0.6,0.0,5.7,0.70000005,0.0,0.3,0.0,3.3000002,0.0
20070905.19:57:30,0.0,0.0,0.0,18.599998,0.0,0.0,13.799999,0.0,0.0,0.0,18.8,0.0,0.0,0.0,18.3,0.0,0.0,0.0,0.0,4.5,0.0,46.0,0.2,9.0,0.0,0.0,0.0,19.099998,0.0,0.0,0.0,18.099998,0.0,13.4,0.0,0.0,5.0,0.1,0.0,32.6,0.0,0.0,0.0,13.4,0.0,18.599998,0.0,0.0,0.0,18.8,0.0,0.0,0.0,0.0,13.799999,0.0
20070905.20:02:30,0.0,0.0,0.6,1.7,0.3,0.0,1.0,0.0,0.0,0.70000005,1.9000001,0.0,0.5,0.0,1.5,0.0,0.0,0.1,0.0,0.0,0.8000001,29.3,0.4,22.0,0.0,0.8000001,0.0,1.9000001,0.4,0.0,0.0,1.5,0.0,0.4,0.0,0.2,11.0,0.2,0.8000001,15.9,0.2,0.0,0.0,0.5,0.0,1.6,0.0,0.6,0.0,1.8000001,0.70000005,0.0,0.3,0.0,0.9,0.0
20070905.20:07:30,0.0,0.0,0.0,9.000001,0.0,0.0,5.1,0.0,0.0,0.0,9.000001,0.0,0.0,0.0,8.8,0.0,0.0,0.0,0.0,0.1,0.0,33.4,0.4,13.0,0.0,0.0,0.0,9.100001,0.0,0.0,0.0,7.8,0.0,0.90000004,0.0,0.0,7.0,0.2,0.0,21.5,0.0,0.0,0.0,0.90000004,0.0,8.900001,0.0,0.0,0.0,9.000001,0.0,0.0,0.0,0.0,5.1,0.0
20070905.20:12:30,0.0,0.0,0.6,7.1999993,0.3,0.0,4.5999994,0.0,0.0,0.70000005,7.399999,0.0,0.5,0.0,6.9999995,0.0,0.0,0.1,0.0,0.2,0.8000001,36.199997,0.2,8.0,0.0,0.8000001,0.0,7.799999,0.4,0.0,0.0,6.6999993,0.0,4.3999996,0.0,0.2,4.0,0.1,0.8000001,21.8,0.2,0.0,0.0,4.3999996,0.0,7.1999993,0.0,0.6,0.0,7.399999,0.70000005,0.0,0.3,0.0,4.5999994,0.0
20070905.20:17:30,0.0,0.0,0.0,0.2,0.0,0.0,0.1,0.0,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.0,0.0,0.0,0.0,0.0,29.099998,0.4,25.0,0.0,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.0,0.0,0.0,13.0,0.2,0.0,15.2,0.0,0.0,0.0,0.0,0.0,0.2,0.0,0.0,0.0,0.2,0.0,0.0,0.0,0.0,0.1,0.0
20070905.20:22:30,0.0,0.0,0.5,8.0,0.3,0.0,2.9,0.0,0.0,0.6,8.200001,0.0,0.4,0.0,7.8,0.0,0.0,0.1,0.0,0.1,0.70000005,37.1,0.4,13.0,0.0,0.70000005,0.0,8.300001,0.4,0.0,0.0,3.8000002,0.0,1.6,0.0,0.2,7.0,0.2,0.70000005,22.7,0.2,0.0,0.0,1.7,0.0,7.9,0.0,0.5,0.0,8.1,0.6,0.0,0.3,0.0,2.8000002,0.0
20070905.20:27:30,0.0,0.0,0.0,6.0,0.0,0.0,5.2,0.0,0.0,0.0,6.8,0.0,0.0,0.0,5.7,0.0,0.0,0.0,0.0,0.3,0.0,34.4,0.2,9.0,0.0,0.0,0.0,7.1000004,0.0,0.0,0.0,5.3999996,0.0,0.70000005,0.0,0.0,5.0,0.1,0.0,20.8,0.0,0.0,0.0,0.70000005,0.0,6.0,0.0,0.0,0.0,6.8,0.0,0.0,0.0,0.0,5.2,0.0
20070905.20:32:30,0.0,0.0,0.6,1.7,0.3,0.0,0.6,0.0,0.0,0.70000005,1.7,0.0,0.5,0.0,1.6,0.0,0.0,0.1,0.0,0.1,0.8000001,30.5,0.4,23.0,0.0,0.8000001,0.0,1.7,0.4,0.0,0.0,1.2,0.0,0.1,0.0,0.2,12.0,0.2,0.8000001,16.5,0.2,0.0,0.0,0.2,0.0,1.6,0.0,0.6,0.0,1.7,0.70000005,0.0,0.3,0.0,0.5,0.0
20070905.20:37:30,0.0,0.0,2.4,4.5,1.2,0.0,0.90000004,0.0,0.0,2.8000002,4.7,0.0,2.0,0.0,4.2,0.0,0.0,0.4,0.0,0.3,3.2000003,35.199997,0.4,13.0,0.0,3.2000003,0.0,4.8999996,1.6,0.0,0.0,1.8,0.0,0.6,0.0,0.8,7.0,0.2,3.2000003,20.099998,0.8,0.0,0.0,0.6,0.0,4.5,0.0,2.4,0.0,4.7,2.8000002,0.0,1.2,0.0,0.90000004,0.0
20070905.20:42:30,0.0,0.0,0.6,7.2,0.3,0.0,3.4,0.0,0.0,0.70000005,7.5,0.0,0.5,0.0,7.0,0.0,0.0,0.1,0.0,3.0,0.8000001,39.8,0.2,10.0,0.0,0.8000001,0.0,7.7,0.4,0.0,0.0,3.6000001,0.0,3.2,0.0,0.2,5.0,0.1,0.8000001,23.8,0.2,0.0,0.0,3.2,0.0,7.2,0.0,0.6,0.0,7.5,0.70000005,0.0,0.3,0.0,3.4,0.0
20070905.20:47:30,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,26.2,0.4,22.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,11.0,0.2,0.0,13.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0
20070905.20:52:30,0.0,0.0,0.6,3.7999997,0.3,0.0,3.0,0.0,0.0,0.70000005,3.8999996,0.0,0.5,0.0,3.6,0.0,0.0,0.1,0.0,0.1,0.8000001,34.199997,0.4,16.0,0.0,0.8000001,0.0,3.9999995,0.4,0.0,0.0,3.5,0.0,1.6,0.0,0.2,8.0,0.2,0.8000001,19.3,0.2,0.0,0.0,1.7,0.0,3.6999998,0.0,0.6,0.0,3.8999996,0.70000005,0.0,0.3,0.0,2.9,0.0
20070905.20:57:30,0.0,0.0,0.0,8.1,0.0,0.0,7.2000003,0.0,0.0,0.0,8.400001,0.0,0.0,0.0,7.8000007,0.0,0.0,0.0,0.0,6.6,0.0,35.0,0.2,8.0,0.0,0.0,0.0,8.700001,0.0,0.0,0.0,7.5000005,0.0,6.9,0.0,0.0,4.0,0.1,0.0,21.900002,0.0,0.0,0.0,6.9,0.0,8.1,0.0,0.0,0.0,8.400001,0.0,0.0,0.0,0.0,7.2000003,0.0
20070905.21:02:30,0.0,0.0,0.6,2.6999998,0.3,0.0,1.9,0.0,0.0,0.70000005,3.1999998,0.0,0.5,0.0,2.1,0.0,0.0,0.1,0.0,0.7,0.8000001,31.0,0.6,24.0,0.0,0.8000001,0.0,3.1999998,0.4,0.0,0.0,2.0,0.0,0.8,0.0,0.2,12.0,0.3,0.8000001,17.5,0.2,0.0,0.0,1.0,0.0,2.6,0.0,0.6,0.0,3.1,0.70000005,0.0,0.3,0.0,1.8,0.0
20070905.21:07:30,0.0,0.0,0.0,7.1,0.0,0.0,6.6,0.0,0.0,0.0,7.1,0.0,0.0,0.0,6.7,0.0,0.0,0.0,0.0,1.1,0.0,30.1,0.2,12.0,0.0,0.0,0.0,7.1,0.0,0.0,0.0,6.6,0.0,1.3000001,0.0,0.0,6.0,0.1,0.0,18.7,0.0,0.0,0.0,5.5,0.0,7.0,0.0,0.0,0.0,7.1,0.0,0.0,0.0,0.0,6.6,0.0
20070905.21:12:30,0.0,0.0,0.6,1.7,0.3,0.0,0.90000004,0.0,0.0,0.70000005,2.1000001,0.0,0.5,0.0,1.5,0.0,0.0,0.1,0.0,0.3,0.8000001,29.2,0.2,9.0,0.0,0.8000001,0.0,2.5000002,0.4,0.0,0.0,1.2,0.0,0.6,0.0,0.2,5.0,0.1,0.8000001,15.8,0.2,0.0,0.0,0.6,0.0,1.7,0.0,0.6,0.0,2.1000001,0.70000005,0.0,0.3,0.0,0.90000004,0.0
20070905.21:17:30,0.0,0.0,0.0,1.3,0.0,0.0,0.0,0.0,0.0,0.0,1.3,0.0,0.0,0.0,1.3,0.0,0.0,0.0,0.0,0.0,0.0,29.0,0.4,23.0,0.0,0.0,0.0,1.3,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.0,12.0,0.2,0.0,15.6,0.0,0.0,0.0,0.0,0.0,1.3,0.0,0.0,0.0,1.3,0.0,0.0,0.0,0.0,0.0,0.0
20070905.21:22:30,0.0,0.0,0.3,2.8999996,0.1,0.0,2.3999999,0.0,0.0,0.3,3.9999995,0.0,0.2,0.0,2.6999998,0.0,0.0,0.0,0.0,0.2,0.3,35.4,0.4,15.0,0.0,0.3,0.0,4.0999994,0.1,0.0,0.0,2.6,0.0,2.0,0.0,0.1,8.0,0.2,0.3,19.9,0.1,0.0,0.0,2.1,0.0,2.7999997,0.0,0.3,0.0,3.8999996,0.3,0.0,0.1,0.0,2.3,0.0
20070905.21:27:30,0.0,0.0,0.0,11.4,0.0,0.0,5.4,0.0,0.0,0.0,11.7,0.0,0.0,0.0,11.2,0.0,0.0,0.0,0.0,0.2,0.0,38.4,0.2,9.0,0.0,0.0,0.0,12.099999,0.0,0.0,0.0,10.9,0.0,0.5,0.0,0.0,5.0,0.1,0.0,25.3,0.0,0.0,0.0,0.5,0.0,11.4,0.0,0.0,0.0,11.7,0.0,0.0,0.0,0.0,5.4,0.0
20070905.21:32:30,0.0,0.0,0.6,1.4000001,0.3,0.0,0.9000001,0.0,0.0,0.70000005,1.4000001,0.0,0.5,0.0,0.9000001,0.0,0.0,0.1,0.0,0.3,0.8000001,29.0,0.4,23.0,0.0,0.8000001,0.0,1.4000001,0.4,0.0,0.0,0.9000001,0.0,0.70000005,0.0,0.2,12.0,0.2,0.8000001,15.700001,0.2,0.0,0.0,0.8000001,0.0,1.3000001,0.0,0.6,0.0,1.4000001,0.70000005,0.0,0.3,0.0,0.8000001,0.0
20070905.21:37:30,0.0,0.0,2.4,6.0000005,1.2,0.0,3.8,0.0,0.0,2.8000002,7.0000005,0.0,2.0,0.0,5.7000003,0.0,0.0,0.4,0.0,2.5,3.2000003,37.0,0.2,15.0,0.0,3.2000003,0.0,7.2000003,1.6,0.0,0.0,5.4,0.0,3.5,0.0,0.8,8.0,0.1,3.2000003,22.6,0.8,0.0,0.0,3.5,0.0,6.0000005,0.0,2.4,0.0,7.0000005,2.8000002,0.0,1.2,0.0,3.8,0.0
20070905.21:42:30,0.0,0.0,0.4,30.8,0.2,0.0,24.5,0.0,0.0,0.4,31.099998,0.0,0.3,0.0,25.0,0.0,0.0,0.0,0.0,16.1,0.5,66.7,0.4,9.0,0.0,0.5,0.0,31.399998,0.2,0.0,0.0,24.7,0.0,24.2,0.0,0.1,5.0,0.2,0.5,49.299995,0.1,0.0,0.0,24.2,0.0,30.8,0.0,0.4,0.0,31.099998,0.4,0.0,0.2,0.0,24.5,0.0
20070905.21:47:30,0.0,0.0,0.0,0.8,0.0,0.0,0.8,0.0,0.0,0.0,0.8,0.0,0.0,0.0,0.8,0.0,0.0,0.0,0.0,0.5,0.0,27.1,0.4,22.0,0.0,0.0,0.0,0.8,0.0,0.0,0.0,0.8,0.0,0.8,0.0,0.0,11.0,0.2,0.0,14.3,0.0,0.0,0.0,0.8,0.0,0.8,0.0,0.0,0.0,0.8,0.0,0.0,0.0,0.0,0.8,0.0
20070905.21:52:30,0.0,0.0,0.6,6.299999,0.3,0.0,4.1999993,0.0,0.0,0.70000005,6.399999,0.0,0.5,0.0,5.5999994,0.0,0.0,0.1,0.0,2.1,0.8000001,38.0,0.4,16.0,0.0,0.8000001,0.0,6.499999,0.4,0.0,0.0,5.3999996,0.0,2.1999998,0.0,0.2,8.0,0.2,0.8000001,22.7,0.2,0.0,0.0,2.2999997,0.0,6.1999993,0.0,0.6,0.0,6.399999,0.70000005,0.0,0.3,0.0,4.0999994,0.0
20070905.21:57:30,0.0,0.0,0.0,6.1000004,0.0,0.0,5.2,0.0,0.0,0.0,6.4000006,0.0,0.0,0.0,5.8,0.0,0.0,0.0,0.0,0.3,0.0,33.2,0.2,9.0,0.0,0.0,0.0,7.5000005,0.0,0.0,0.0,5.5,0.0,0.6,0.0,0.0,5.0,0.1,0.0,20.800001,0.0,0.0,0.0,0.6,0.0,6.1000004,0.0,0.0,0.0,6.4000006,0.0,0.0,0.0,0.0,5.2,0.0
20070905.22:02:30,0.0,0.0,0.6,2.0,0.3,0.0,1.2,0.0,0.0,0.70000005,2.5,0.0,0.5,0.0,1.7,0.0,0.0,0.1,0.0,0.5,0.9000001,30.7,0.8,26.0,0.0,0.8000001,0.0,2.7,0.4,0.0,0.0,1.5,0.0,0.7,0.0,0.2,13.0,0.4,0.8000001,16.300001,0.2,0.0,0.0,0.8,0.0,1.9000001,0.0,0.6,0.0,2.4,0.70000005,0.0,0.3,0.0,1.1,0.0
20070905.22:07:30,0.0,0.0,0.0,4.7,0.0,0.0,2.5,0.0,0.0,0.0,4.7999997,0.0,0.0,0.0,4.5,0.0,0.0,0.0,0.0,0.1,0.0,28.499998,0.4,13.0,0.0,0.0,0.0,5.2,0.0,0.0,0.0,2.6,0.0,2.0,0.0,0.0,7.0,0.2,0.0,17.099998,0.0,0.0,0.0,2.0,0.0,4.6,0.0,0.0,0.0,4.7999997,0.0,0.0,0.0,0.0,2.5,0.0
20070905.22:12:30,0.0,0.0,0.6,19.9,0.3,0.0,14.6,0.0,0.0,0.70000005,23.1,0.0,0.5,0.0,16.9,0.0,0.0,0.1,0.0,4.8,0.8000001,54.199997,0.2,9.0,0.0,0.8000001,0.0,25.4,0.4,0.0,0.0,15.8,0.0,8.0,0.0,0.2,5.0,0.1,0.8000001,40.1,0.2,0.0,0.0,9.7,0.0,18.1,0.0,0.6,0.0,21.1,0.70000005,0.0,0.3,0.0,12.6,0.0
20070905.22:17:30,1.0,0.0,7.2000003,10.1,3.7,0.0,6.0,0.0,1.0,8.7,12.0,0.0,5.8,0.0,8.0,0.0,0.0,1.0,0.0,1.3,9.7,41.9,0.4,24.0,0.0,9.7,1.0,12.9,4.8,0.0,0.0,7.0,0.0,2.6999998,0.0,1.9,13.0,0.2,9.7,27.7,2.3,0.0,0.0,3.6999998,0.0,9.1,0.0,6.8,0.0,11.1,8.3,1.0,3.3,0.0,5.0,0.0
20070905.22:22:30,3.0,0.0,9.599999,9.099999,5.5,0.0,5.0,2.0,4.0,11.899999,10.999999,0.0,7.3,2.0,7.1,0.0,0.0,0.9,0.0,0.9,12.799998,42.5,0.4,21.0,0.0,12.799998,4.0,11.799999,6.4,0.0,2.0,6.1,0.0,2.3,0.0,1.8,13.0,0.2,12.799998,27.4,3.1999998,0.0,1.0,3.1999998,2.0,8.2,0.0,8.2,0.0,10.099999,10.499999,3.0,4.1,1.0,4.1,0.0
20070905.22:27:30,0.0,0.0,0.0,8.499999,0.0,0.0,7.7,0.0,0.0,0.0,8.699999,0.0,0.0,0.0,8.299999,0.0,0.0,0.0,0.0,0.2,0.0,36.4,0.2,11.0,0.0,0.0,0.0,8.899999,0.0,0.0,0.0,7.8999996,0.0,4.7,0.0,0.0,6.0,0.1,0.0,23.0,0.0,0.0,0.0,4.7,0.0,8.499999,0.0,0.0,0.0,8.699999,0.0,0.0,0.0,0.0,7.7,0.0
20070905.22:32:30,0.0,0.0,0.6,2.6,0.3,0.0,1.4,0.0,0.0,0.70000005,2.6999998,0.0,0.5,0.0,2.2,0.0,0.0,0.1,0.0,0.1,0.8000001,32.699997,0.6,23.0,0.0,0.8000001,0.0,2.6999998,0.4,0.0,0.0,1.8,0.0,0.5,0.0,0.2,12.0,0.3,0.8000001,18.099998,0.2,0.0,0.0,0.6,0.0,2.5,0.0,0.6,0.0,2.6,0.70000005,0.0,0.3,0.0,1.3,0.0
20070905.22:37:30,0.0,0.0,2.4,6.0,1.2,0.0,3.6,0.0,0.0,2.8000002,6.2,0.0,2.0,0.0,5.8,0.0,0.0,0.4,0.0,0.3,3.2000003,36.6,0.2,15.0,0.0,3.2000003,0.0,6.3999996,1.6,0.0,0.0,3.8,0.0,2.8999999,0.0,0.8,8.0,0.1,3.2000003,21.8,0.8,0.0,0.0,2.8999999,0.0,6.0,0.0,2.4,0.0,6.2,2.8000002,0.0,1.2,0.0,3.6,0.0
20070905.22:42:30,0.0,0.0,0.6,4.8999996,0.3,0.0,0.70000005,0.0,0.0,0.70000005,7.8999996,0.0,0.5,0.0,4.7,0.0,0.0,0.1,0.0,0.2,0.8000001,41.800003,0.4,10.0,0.0,0.8000001,0.0,8.2,0.4,0.0,0.0,4.5,0.0,0.4,0.0,0.2,5.0,0.2,0.8000001,25.7,0.2,0.0,0.0,0.4,0.0,4.8999996,0.0,0.6,0.0,7.8999996,0.70000005,0.0,0.3,0.0,0.70000005,0.0
20070905.22:47:30,0.0,0.0,0.0,0.3,0.0,0.0,0.3,0.0,0.0,0.0,0.70000005,0.0,0.0,0.0,0.3,0.0,0.0,0.0,0.0,0.3,0.0,29.4,0.4,24.0,0.0,0.0,0.0,0.70000005,0.0,0.0,0.0,0.3,0.0,0.3,0.0,0.0,12.0,0.2,0.0,15.4,0.0,0.0,0.0,0.3,0.0,0.3,0.0,0.0,0.0,0.70000005,0.0,0.0,0.0,0.0,0.3,0.0
20070905.22:52:30,0.0,0.0,0.6,4.6999993,0.3,0.0,4.2,0.0,0.0,0.70000005,4.899999,0.0,0.5,0.0,4.3999996,0.0,0.0,0.1,0.0,1.6,0.8000001,36.0,0.4,16.0,0.0,0.8000001,0.0,4.899999,0.4,0.0,0.0,4.2999997,0.0,2.4,0.0,0.2,8.0,0.2,0.8000001,20.8,0.2,0.0,0.0,2.5,0.0,4.4999995,0.0,0.6,0.0,4.799999,0.70000005,0.0,0.3,0.0,4.1,0.0
20070905.22:57:30,0.0,0.0,0.0,22.400002,0.0,0.0,14.700001,0.0,0.0,0.0,26.800001,0.0,0.0,0.0,22.100002,0.0,0.0,0.0,0.0,0.3,0.0,54.6,0.2,9.0,0.0,0.0,0.0,27.1,0.0,0.0,0.0,17.800001,0.0,4.1,0.0,0.0,5.0,0.1,0.0,41.3,0.0,0.0,0.0,4.1,0.0,22.400002,0.0,0.0,0.0,26.800001,0.0,0.0,0.0,0.0,14.700001,0.0
20070905.23:02:30,0.0,0.0,0.6,1.6,0.3,0.0,0.6,0.0,0.0,0.70000005,1.7,0.0,0.5,0.0,1.4,0.0,0.0,0.1,0.0,0.0,0.8000001,33.300003,0.6,24.0,0.0,0.8000001,0.0,1.7,0.4,0.0,0.0,1.0,0.0,0.4,0.0,0.2,12.0,0.3,0.8000001,17.800001,0.2,0.0,0.0,0.5,0.0,1.5,0.0,0.6,0.0,1.6,0.70000005,0.0,0.3,0.0,0.5,0.0
20070905.23:07:30,0.0,0.0,0.0,5.5999994,0.0,0.0,2.1,0.0,0.0,0.0,5.6999993,0.0,0.0,0.0,5.3999996,0.0,0.0,0.0,0.0,0.1,0.0,28.899998,0.2,14.0,0.0,0.0,0.0,5.799999,0.0,0.0,0.0,4.1,0.0,0.2,0.0,0.0,7.0,0.1,0.0,17.599998,0.0,0.0,0.0,0.2,0.0,5.4999995,0.0,0.0,0.0,5.6999993,0.0,0.0,0.0,0.0,2.1,0.0
20070905.23:12:30,0.0,0.0,0.3,11.4,0.1,0.0,6.0,0.0,0.0,0.4,11.7,0.0,0.2,0.0,10.9,0.0,0.0,0.0,0.0,0.2,0.4,41.0,0.6,19.0,0.0,0.4,0.0,12.0,0.2,0.0,0.0,6.3,0.0,0.6,0.0,0.1,10.0,0.3,0.4,25.0,0.1,0.0,0.0,0.6,0.0,11.4,0.0,0.3,0.0,11.7,0.4,0.0,0.1,0.0,6.0,0.0
20070905.23:17:30,0.0,0.0,0.0,0.8,0.0,0.0,0.4,0.0,0.0,0.0,0.8,0.0,0.0,0.0,0.8,0.0,0.0,0.0,0.0,0.1,0.0,25.3,0.6,22.0,0.0,0.0,0.0,1.2,0.0,0.0,0.0,0.4,0.0,0.1,0.0,0.0,11.0,0.3,0.0,13.5,0.0,0.0,0.0,0.1,0.0,0.8,0.0,0.0,0.0,0.8,0.0,0.0,0.0,0.0,0.4,0.0
20070905.23:22:30,0.0,0.0,0.6,4.4999995,0.3,0.0,3.1,0.0,0.0,0.70000005,4.6999993,0.0,0.5,0.0,4.1,0.0,0.0,0.1,0.0,0.2,0.8000001,37.3,0.4,15.0,0.0,0.8000001,0.0,4.799999,0.4,0.0,0.0,3.1999998,0.0,2.7,0.0,0.2,8.0,0.2,0.8000001,21.4,0.2,0.0,0.0,2.8,0.0,4.2999997,0.0,0.6,0.0,4.5999994,0.70000005,0.0,0.3,0.0,3.0,0.0
20070905.23:27:30,0.0,0.0,0.0,5.6000004,0.0,0.0,0.90000004,0.0,0.0,0.0,10.1,0.0,0.0,0.0,5.3,0.0,0.0,0.0,0.0,0.3,0.0,38.4,0.2,10.0,0.0,0.0,0.0,10.400001,0.0,0.0,0.0,5.0,0.0,0.6,0.0,0.0,5.0,0.1,0.0,24.7,0.0,0.0,0.0,0.6,0.0,5.6000004,0.0,0.0,0.0,10.1,0.0,0.0,0.0,0.0,0.90000004,0.0
20070905.23:32:30,0.0,0.0,0.6,1.6000001,0.3,0.0,0.8000001,0.0,0.0,0.70000005,1.6000001,0.0,0.5,0.0,1.5000001,0.0,0.0,0.1,0.0,0.0,0.8000001,29.8,0.4,24.0,0.0,0.8000001,0.0,1.6000001,0.4,0.0,0.0,1.3000001,0.0,0.0,0.0,0.2,12.0,0.2,0.8000001,15.900001,0.2,0.0,0.0,0.1,0.0,1.5000001,0.0,0.6,0.0,1.6000001,0.70000005,0.0,0.3,0.0,0.70000005,0.0
20070905.23:37:30,0.0,0.0,2.4,7.0999994,1.2,0.0,3.1,0.0,0.0,2.8000002,7.299999,0.0,2.0,0.0,5.8999996,0.0,0.0,0.4,0.0,2.6,3.2000003,37.399998,0.2,15.0,0.0,3.2000003,0.0,7.399999,1.6,0.0,0.0,4.8999996,0.0,2.8999999,0.0,0.8,8.0,0.1,3.2000003,22.699999,0.8,0.0,0.0,2.8999999,0.0,7.0999994,0.0,2.4,0.0,7.299999,2.8000002,0.0,1.2,0.0,3.1,0.0
20070905.23:42:30,0.0,0.0,0.6,8.299999,0.3,0.0,4.2,0.0,0.0,0.70000005,11.9,0.0,0.5,0.0,7.9999995,0.0,0.0,0.1,0.0,3.6,0.8000001,43.2,0.2,10.0,0.0,0.8000001,0.0,12.2,0.4,0.0,0.0,4.3999996,0.0,3.8999999,0.0,0.2,5.0,0.1,0.8000001,28.0,0.2,0.0,0.0,3.8999999,0.0,8.299999,0.0,0.6,0.0,11.9,0.70000005,0.0,0.3,0.0,4.2,0.0
20070905.23:47:30,0.0,0.0,0.0,0.5,0.0,0.0,0.4,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.0,0.0,0.0,27.5,0.4,22.0,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.4,0.0,0.4,0.0,0.0,11.0,0.2,0.0,14.3,0.0,0.0,0.0,0.4,0.0,0.5,0.0,0.0,0.0,0.5,0.0,0.0,0.0,0.0,0.4,0.0
20070905.23:52:30,0.0,0.0,0.6,4.9999995,0.3,0.0,4.6,0.0,0.0,0.70000005,5.1999993,0.0,0.5,0.0,4.7999997,0.0,0.0,0.1,0.0,0.1,0.8000001,38.0,0.4,17.0,0.0,0.8000001,0.0,5.299999,0.4,0.0,0.0,4.7,0.0,2.8,0.0,0.2,9.0,0.2,0.8000001,22.099998,0.2,0.0,0.0,2.8999999,0.0,4.8999996,0.0,0.6,0.0,5.0999994,0.70000005,0.0,0.3,0.0,4.5,0.0
20070905.23:57:30,0.0,0.0,0.0,11.4,0.0,0.0,6.2000003,0.0,0.0,0.0,11.9,0.0,0.0,0.0,11.2,0.0,0.0,0.0,0.0,5.6,0.0,40.0,0.2,8.0,0.0,0.0,0.0,12.099999,0.0,0.0,0.0,10.9,0.0,5.9,0.0,0.0,4.0,0.1,0.0,26.3,0.0,0.0,0.0,5.9,0.0,11.4,0.0,0.0,0.0,11.9,0.0,0.0,0.0,0.0,6.2000003,0.0
20070906.00:02:30,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
#proc page
pagesize: 16.9 12.0
landscape: yes
scale: 0.741765
color: rgb(0.0,0.0,0.0)
titledetails: adjust=0,0.2
title: Performance DiskIO HBA Instances (c0,c1,c10,c14,c15,c18,c19,c20,c21,c3,c4,c7,c8,c9) for svgnu32
#proc annotate
textdetails: size=9.0 align=C
location: 8.45 0.48
text: Generated by IWmon, (c) 2002 - 2007 In&Work AG, www.inwork.ch
Plot generated by Ploticus, ploticus.sourceforge.net
#proc annotate
textdetails: size=9.0 align=C
location: 14.872 11.4
text: CI = 5min.
#proc rect
outline: width=0.5 color=black
color: gray(0.9)
rectangle: 1.6899999 8.49 14.365 10.799999
#proc areadef
rectangle: 1.6899999 8.49 14.365 10.799999
xscaletype: datetime yyyymmdd.hh:mm:ss
xrange: 20070905.00:00:00 20070906.00:00:00
yrange: 0.0 600.0
#proc yaxis
label: Read throughput [MB/s]
stubs: inc
grid: style=1
stubdetails: size=10.0
labeldistance: 0.7
#proc lineplot
xfield: 1
yfield: 22
gapmissing: small
fill: rgb(0.0000,1.0000,0.3200)
legendlabel: c0
#proc lineplot
xfield: 1
yfield: 40
gapmissing: small
fill: rgb(0.0900,0.0000,0.5300)
legendlabel: c1
#proc lineplot
xfield: 1
yfield: 27
gapmissing: small
fill: rgb(0.2700,0.1300,0.7800)
legendlabel: c10
#proc lineplot
xfield: 1
yfield: 11
gapmissing: small
fill: rgb(0.6200,0.4300,1.0000)
legendlabel: c14
#proc lineplot
xfield: 1
yfield: 52
gapmissing: small
fill: rgb(0.6600,0.9300,1.0000)
legendlabel: c15
#proc lineplot
xfield: 1
yfield: 4
gapmissing: small
fill: rgb(0.9700,1.0000,0.0000)
legendlabel: c18
#proc lineplot
xfield: 1
yfield: 49
gapmissing: small
fill: rgb(1.0000,0.1900,0.1500)
legendlabel: c19
#proc lineplot
xfield: 1
yfield: 14
gapmissing: small
fill: rgb(0.8900,0.0000,0.4000)
legendlabel: c20
#proc lineplot
xfield: 1
yfield: 30
gapmissing: small
fill: rgb(0.9300,0.0000,0.0000)
legendlabel: c21
#proc lineplot
xfield: 1
yfield: 6
gapmissing: small
fill: rgb(0.0000,0.4600,0.0000)
legendlabel: c3
#proc lineplot
xfield: 1
yfield: 54
gapmissing: small
fill: rgb(0.0000,1.0000,0.3200)
legendlabel: c4
#proc lineplot
xfield: 1
yfield: 42
gapmissing: small
fill: rgb(0.0900,0.0000,0.5300)
legendlabel: c7
#proc lineplot
xfield: 1
yfield: 37
gapmissing: small
fill: rgb(0.2700,0.1300,0.7800)
legendlabel: c8
#proc lineplot
xfield: 1
yfield: 19
gapmissing: small
fill: rgb(0.6200,0.4300,1.0000)
legendlabel: c9
#proc legend
seglen: 0.15
location: 14.872 10.799999
#proc rect
outline: width=0.5 color=black
color: gray(0.9)
rectangle: 1.6899999 6.06 14.365 8.37
#proc areadef
rectangle: 1.6899999 6.06 14.365 8.37
xscaletype: datetime yyyymmdd.hh:mm:ss
xrange: 20070905.00:00:00 20070906.00:00:00
yrange: 0.0 90.0
#proc yaxis
label: Write throughput [MB/s]
stubs: inc
grid: style=1
stubdetails: size=10.0
labeldistance: 0.7
#proc lineplot
xfield: 1
yfield: 24
gapmissing: small
fill: rgb(0.0000,1.0000,0.3200)
#proc lineplot
xfield: 1
yfield: 39
gapmissing: small
fill: rgb(0.0900,0.0000,0.5300)
#proc lineplot
xfield: 1
yfield: 26
gapmissing: small
fill: rgb(0.2700,0.1300,0.7800)
#proc lineplot
xfield: 1
yfield: 13
gapmissing: small
fill: rgb(0.6200,0.4300,1.0000)
#proc lineplot
xfield: 1
yfield: 50
gapmissing: small
fill: rgb(0.6600,0.9300,1.0000)
#proc lineplot
xfield: 1
yfield: 3
gapmissing: small
fill: rgb(0.9700,1.0000,0.0000)
#proc lineplot
xfield: 1
yfield: 48
gapmissing: small
fill: rgb(1.0000,0.1900,0.1500)
#proc lineplot
xfield: 1
yfield: 17
gapmissing: small
fill: rgb(0.8900,0.0000,0.4000)
#proc lineplot
xfield: 1
yfield: 31
gapmissing: small
fill: rgb(0.9300,0.0000,0.0000)
#proc lineplot
xfield: 1
yfield: 7
gapmissing: small
fill: rgb(0.0000,0.4600,0.0000)
#proc lineplot
xfield: 1
yfield: 57
gapmissing: small
fill: rgb(0.0000,1.0000,0.3200)
#proc lineplot
xfield: 1
yfield: 43
gapmissing: small
fill: rgb(0.0900,0.0000,0.5300)
#proc lineplot
xfield: 1
yfield: 36
gapmissing: small
fill: rgb(0.2700,0.1300,0.7800)
#proc lineplot
xfield: 1
yfield: 18
gapmissing: small
fill: rgb(0.6200,0.4300,1.0000)
#proc legend
seglen: 0.15
location: 14.872 8.37
#proc rect
outline: width=0.5 color=black
color: gray(0.9)
rectangle: 1.6899999 3.6299994 14.365 5.9399996
#proc areadef
rectangle: 1.6899999 3.6299994 14.365 5.9399996
xscaletype: datetime yyyymmdd.hh:mm:ss
xrange: 20070905.00:00:00 20070906.00:00:00
yrange: 0.0 300.0
#proc yaxis
label: Disk busy [%time]
stubs: inc
grid: style=1
stubdetails: size=10.0
labeldistance: 0.7
#proc lineplot
xfield: 1
yfield: 25
gapmissing: small
linedetails: color=rgb(0.0000,1.0000,0.3200) width=1.0
#proc lineplot
xfield: 1
yfield: 38
gapmissing: small
linedetails: color=rgb(0.0900,0.0000,0.5300) width=1.0
#proc lineplot
xfield: 1
yfield: 28
gapmissing: small
linedetails: color=rgb(0.2700,0.1300,0.7800) width=1.0
#proc lineplot
xfield: 1
yfield: 10
gapmissing: small
linedetails: color=rgb(0.6200,0.4300,1.0000) width=1.0
#proc lineplot
xfield: 1
yfield: 53
gapmissing: small
linedetails: color=rgb(0.6600,0.9300,1.0000) width=1.0
#proc lineplot
xfield: 1
yfield: 2
gapmissing: small
linedetails: color=rgb(0.9700,1.0000,0.0000) width=1.0
#proc lineplot
xfield: 1
yfield: 46
gapmissing: small
linedetails: color=rgb(1.0000,0.1900,0.1500) width=1.0
#proc lineplot
xfield: 1
yfield: 15
gapmissing: small
linedetails: color=rgb(0.8900,0.0000,0.4000) width=1.0
#proc lineplot
xfield: 1
yfield: 32
gapmissing: small
linedetails: color=rgb(0.9300,0.0000,0.0000) width=1.0
#proc lineplot
xfield: 1
yfield: 9
gapmissing: small
linedetails: color=rgb(0.0000,0.4600,0.0000) width=1.0
#proc lineplot
xfield: 1
yfield: 55
gapmissing: small
linedetails: color=rgb(0.0000,1.0000,0.3200) width=1.0
#proc lineplot
xfield: 1
yfield: 44
gapmissing: small
linedetails: color=rgb(0.0900,0.0000,0.5300) width=1.0
#proc lineplot
xfield: 1
yfield: 34
gapmissing: small
linedetails: color=rgb(0.2700,0.1300,0.7800) width=1.0
#proc lineplot
xfield: 1
yfield: 20
gapmissing: small
linedetails: color=rgb(0.6200,0.4300,1.0000) width=1.0
#proc legend
seglen: 0.15
location: 14.872 5.9399996
#proc rect
outline: width=0.5 color=black
color: gray(0.9)
rectangle: 1.6899999 1.1999993 14.365 3.5099995
#proc areadef
rectangle: 1.6899999 1.1999993 14.365 3.5099995
xscaletype: datetime yyyymmdd.hh:mm:ss
xrange: 20070905.00:00:00 20070906.00:00:00
yrange: 0.0 300.0
#proc yaxis
label: Service time [ms]
stubs: inc
grid: style=1
stubdetails: size=10.0
labeldistance: 0.7
#proc lineplot
xfield: 1
yfield: 23
gapmissing: small
linedetails: color=rgb(0.0000,1.0000,0.3200) width=1.0
#proc lineplot
xfield: 1
yfield: 41
gapmissing: small
linedetails: color=rgb(0.0900,0.0000,0.5300) width=1.0
#proc lineplot
xfield: 1
yfield: 29
gapmissing: small
linedetails: color=rgb(0.2700,0.1300,0.7800) width=1.0
#proc lineplot
xfield: 1
yfield: 12
gapmissing: small
linedetails: color=rgb(0.6200,0.4300,1.0000) width=1.0
#proc lineplot
xfield: 1
yfield: 51
gapmissing: small
linedetails: color=rgb(0.6600,0.9300,1.0000) width=1.0
#proc lineplot
xfield: 1
yfield: 5
gapmissing: small
linedetails: color=rgb(0.9700,1.0000,0.0000) width=1.0
#proc lineplot
xfield: 1
yfield: 47
gapmissing: small
linedetails: color=rgb(1.0000,0.1900,0.1500) width=1.0
#proc lineplot
xfield: 1
yfield: 16
gapmissing: small
linedetails: color=rgb(0.8900,0.0000,0.4000) width=1.0
#proc lineplot
xfield: 1
yfield: 33
gapmissing: small
linedetails: color=rgb(0.9300,0.0000,0.0000) width=1.0
#proc lineplot
xfield: 1
yfield: 8
gapmissing: small
linedetails: color=rgb(0.0000,0.4600,0.0000) width=1.0
#proc lineplot
xfield: 1
yfield: 56
gapmissing: small
linedetails: color=rgb(0.0000,1.0000,0.3200) width=1.0
#proc lineplot
xfield: 1
yfield: 45
gapmissing: small
linedetails: color=rgb(0.0900,0.0000,0.5300) width=1.0
#proc lineplot
xfield: 1
yfield: 35
gapmissing: small
linedetails: color=rgb(0.2700,0.1300,0.7800) width=1.0
#proc lineplot
xfield: 1
yfield: 21
gapmissing: small
linedetails: color=rgb(0.6200,0.4300,1.0000) width=1.0
#proc legend
seglen: 0.15
location: 14.872 3.5099995
#proc areadef
rectangle: 1.6899999 1.2 14.365 10.799999
xscaletype: datetime yyyymmdd.hh:mm:ss
yrange: 0 1
xrange: 20070905.00:00:00 20070906.00:00:00
#proc xaxis
grid: style=1
stubdetails: size=10.0
stubs: inc 1 hour
stubformat: HH
#proc xaxis
grid: style=1
stubdetails: size=10.0 adjust=0,-0.18
stubs: inc 1 day
stubformat dd-Mmm-yy
ploticus-2.42/pltestsuite/testpf_pie 0000755 0001750 0001750 00000001343 10301132606 016743 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=$3
if [ "$DEV" = "" ]; then
DEV=x11
fi
echo pie1..
pl -prefab pie values=3 labels=1 data=data9 delim=tab title="Student enrollment" \
-$DEV -o ${OUTDIR}pie1.$DEV $ARGS
echo pie2..
pl -prefab pie values=3 labels=1 data=data9 delim=tab title="Legend option" legend=yes colors=auto \
-$DEV -o ${OUTDIR}pie2.$DEV $ARGS
echo pie3..
pl -prefab pie data=data23 delim=tab values=2 labels=1 colorfld=3 title="Colors from data field" legend=yes \
-$DEV -o ${OUTDIR}pie3.$DEV $ARGS
echo pie4..
pl -prefab pie data=data23 delim=tab values=2 "labelfmtstring= @1\n(@PCT%)" colorfld=3 labelback=dullyellow firstslice=90 \
center="4 3" radius=1.5 \
-$DEV -o ${OUTDIR}pie4.$DEV $ARGS
ploticus-2.42/pltestsuite/testpf_lines 0000755 0001750 0001750 00000002723 10406034475 017316 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=$3
if [ "$DEV" = "" ]; then
DEV=x11
fi
echo lines1..
pl -prefab lines data=data17 x=1 y=2 pointsym=none \
-$DEV -o ${OUTDIR}lines1.$DEV $ARGS
echo lines2..
pl -prefab lines data=data10 delim=tab x=1 y=2 y2=4 step=yes \
yrange=0 name="Group A" name2="Group B" xlbl=Months legendfmt=across \
-$DEV -o ${OUTDIR}lines2.$DEV $ARGS
echo lines3..
pl -prefab lines data=data10 delim=tab x=1 y=2 err=3 y2=4 err2=5 \
y3=6 err3=7 y4=8 err4=9 yrange=0 xlbl=Months \
name="Group A" name2="Group B" name3="Group C" name4="Group D" legendfmt=across \
-$DEV -o ${OUTDIR}lines3.$DEV $ARGS
echo lines3a..
pl -prefab lines data=data10h delim=tab x=1 y=2 err=3 y2=4 err2=5 legendfmt=across \
y3=6 err3=7 y4=8 err4=9 yrange=0 xlbl=Months \
header=yes \
-$DEV -o ${OUTDIR}lines3a.$DEV $ARGS
echo lines4..
pl -prefab lines data=data20 x=1 y=2 \
-$DEV -o ${OUTDIR}lines4.$DEV $ARGS
echo lines5..
pl -prefab lines data=data20 x=1 y=2 fill=redorange pointsym=none y2=2 pointsym2=none \
-$DEV -o ${OUTDIR}lines5.$DEV $ARGS
echo lines6..
pl -prefab lines data=data20 x=1 y=2 gapmissing=yes \
-$DEV -o ${OUTDIR}lines6.$DEV $ARGS
echo lines7..
pl -prefab lines data=data20 x=1 y=2 fill=tan1 pointsym=none y2=2 pointsym2=none \
y3=3 pointsym3=none linedet3=color=black yrange="0 25" name="background" name3="interior" \
legendfmt=across legendsep=1.2 \
-$DEV -o ${OUTDIR}lines7.$DEV $ARGS
ploticus-2.42/pltestsuite/data18 0000644 0001750 0001750 00000000123 07350367651 015677 0 ustar colin colin 1992 -47
1993 -63
1994 -24
1995 12
1996 18
1997 24
1998 31
1999 38
2000 46
2001 44
ploticus-2.42/pltestsuite/data16 0000644 0001750 0001750 00000007106 07350202377 015676 0 ustar colin colin 01/09/05 09:43:35
01/09/05 09:43:40
01/09/05 13:15:00
01/09/05 13:15:11
01/09/05 13:15:17
01/09/05 13:15:47
01/09/05 13:16:51
01/09/05 13:16:56
01/09/06 07:47:49
01/09/06 07:47:52
01/09/06 07:47:54
01/09/06 07:48:02
01/09/06 07:48:09
01/09/06 07:48:18
01/09/06 07:48:32
01/09/06 08:58:21
01/09/06 08:58:24
01/09/06 08:58:28
01/09/06 08:58:59
01/09/06 09:07:56
01/09/06 09:08:00
01/09/06 10:31:43
01/09/06 10:31:47
01/09/06 10:31:55
01/09/06 10:32:04
01/09/06 10:34:09
01/09/06 10:36:16
01/09/06 10:36:18
01/09/06 10:37:49
01/09/06 10:39:00
01/09/06 10:39:04
01/09/06 10:39:19
01/09/06 10:39:51
01/09/06 10:40:20
01/09/06 10:40:23
01/09/06 10:40:53
01/09/06 10:41:15
01/09/06 10:41:35
01/09/06 10:41:52
01/09/06 10:42:02
01/09/06 10:42:18
01/09/06 10:42:42
01/09/06 10:44:18
01/09/06 10:44:45
01/09/06 10:45:14
01/09/06 10:45:32
01/09/06 10:46:35
01/09/06 10:47:00
01/09/06 10:48:07
01/09/06 10:48:12
01/09/06 10:48:25
01/09/06 10:49:29
01/09/06 10:49:53
01/09/06 10:49:59
01/09/06 10:50:36
01/09/06 10:50:40
01/09/06 10:50:58
01/09/06 10:53:21
01/09/06 10:54:08
01/09/06 10:54:13
01/09/06 10:54:17
01/09/06 10:54:27
01/09/06 10:54:51
01/09/06 10:55:01
01/09/06 10:55:55
01/09/06 10:55:57
01/09/06 10:56:12
01/09/06 10:57:34
01/09/06 10:57:59
01/09/06 10:58:01
01/09/06 10:58:31
01/09/06 11:00:17
01/09/06 11:00:26
01/09/06 11:00:45
01/09/06 11:00:50
01/09/06 11:01:07
01/09/06 11:01:08
01/09/06 11:01:24
01/09/06 11:02:10
01/09/06 11:02:38
01/09/06 11:02:49
01/09/06 11:03:13
01/09/06 11:04:16
01/09/06 11:04:57
01/09/06 11:05:05
01/09/06 11:05:32
01/09/06 11:06:05
01/09/06 11:06:07
01/09/06 11:06:15
01/09/06 11:06:21
01/09/06 11:06:33
01/09/06 11:09:17
01/09/06 11:09:48
01/09/06 11:10:33
01/09/06 11:10:53
01/09/06 11:11:11
01/09/06 11:11:48
01/09/06 11:13:29
01/09/06 11:13:43
01/09/06 11:14:20
01/09/06 11:15:36
01/09/06 11:16:27
01/09/06 11:16:32
01/09/06 11:16:43
01/09/06 11:16:48
01/09/06 11:16:59
01/09/06 11:17:16
01/09/06 11:17:20
01/09/06 11:17:50
01/09/06 11:18:01
01/09/06 11:18:12
01/09/06 11:18:25
01/09/06 11:18:50
01/09/06 11:19:34
01/09/06 11:20:17
01/09/06 11:20:43
01/09/06 11:21:55
01/09/06 11:21:59
01/09/06 11:22:03
01/09/06 11:22:05
01/09/06 11:24:40
01/09/06 11:29:00
01/09/06 11:30:04
01/09/06 11:30:36
01/09/06 11:31:36
01/09/06 11:36:04
01/09/06 11:36:05
01/09/06 11:37:06
01/09/06 11:38:14
01/09/06 11:39:08
01/09/06 11:41:38
01/09/06 11:41:47
01/09/06 11:41:51
01/09/06 11:41:56
01/09/06 11:42:00
01/09/06 11:42:20
01/09/06 11:42:30
01/09/06 11:43:36
01/09/06 11:44:00
01/09/06 11:44:04
01/09/06 11:44:10
01/09/06 11:44:14
01/09/06 11:44:29
01/09/06 11:45:02
01/09/06 11:47:46
01/09/06 11:47:48
01/09/06 14:54:43
01/09/06 14:55:00
01/09/06 14:55:19
01/09/06 14:55:36
01/09/06 15:03:27
01/09/06 15:03:52
01/09/06 15:04:06
01/09/06 15:20:31
01/09/06 15:20:43
01/09/06 15:21:34
01/09/06 15:22:39
01/09/06 15:23:40
01/09/07 10:41:47
01/09/07 10:41:49
01/09/07 10:41:53
01/09/07 10:41:55
01/09/07 10:42:10
01/09/07 10:42:31
01/09/07 10:44:09
01/09/07 10:44:10
01/09/07 10:44:11
01/09/07 10:44:18
01/09/07 10:44:23
01/09/07 10:44:27
01/09/07 10:44:29
01/09/07 10:44:55
01/09/07 10:44:56
01/09/07 10:45:33
01/09/07 10:45:37
01/09/07 10:45:54
01/09/07 10:46:06
01/09/07 10:46:32
01/09/07 10:46:41
01/09/07 10:46:59
01/09/07 10:48:04
01/09/07 10:48:37
01/09/07 13:25:33
01/09/07 13:25:40
01/09/07 13:25:45
01/09/07 13:26:02
01/09/07 13:26:06
01/09/07 13:26:56
01/09/07 13:28:45
01/09/07 13:29:45
01/09/07 13:30:05
01/09/07 13:30:15
01/09/07 13:32:19
01/09/07 13:34:02
01/09/07 13:36:13
01/09/07 13:37:04
01/09/07 13:37:21
01/09/07 13:37:53
01/09/07 13:38:15
01/09/07 13:38:33
01/09/07 13:38:48
01/09/07 13:39:16
01/09/07 13:39:33
ploticus-2.42/pltestsuite/testpf_vbars 0000755 0001750 0001750 00000001704 07745255304 017327 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=$3
if [ "$DEV" = "" ]; then
DEV=x11
fi
echo vbars1..
pl -prefab vbars data=data4 delim=tab x=1 y=2 vals=yes yrange=0 yinc=20 ygrid=yes barwidth=0.3 \
-$DEV -o ${OUTDIR}vbars1.$DEV $ARGS
echo vbars2..
pl -prefab vbars data=data5 delim=tab x=1 y=2 err=3 y2=4 err2=5 errunder=yes ygrid=yes \
barwidth=0.1 name=Treatment name2=Control stubvert=yes \
-$DEV -o ${OUTDIR}vbars2.$DEV $ARGS
echo vbars3..
pl -prefab vbars data=data5 delim=tab x=1 y=2 err=3 y2=4 err2=5 erronly=yes name=Treatment \
name2=Control stubvert=yes errcolor=red errcolor2=blue sep=0.08 xgrid=yes ylog=log \
-$DEV -o ${OUTDIR}vbars3.$DEV $ARGS
echo vbars4..
pl -prefab vbars data=data18 x=1 y=2 crossover=0 color=blue vals=yes \
-$DEV -o ${OUTDIR}vbars4.$DEV $ARGS
echo vbars5
pl -prefab vbars data=data10h x=1 y=2 y2=4 color=green color2=red header=yes barwidth=0.1 \
-$DEV -o ${OUTDIR}vbars5.$DEV $ARGS
ploticus-2.42/pltestsuite/hitcount.dat 0000644 0001750 0001750 00000065520 07000417061 017214 0 ustar colin colin Sun Sep 26 09:33:34 EDT 1999 33601
Sun Sep 26 09:33:38 EDT 1999 23595
Sun Sep 26 09:33:43 EDT 1999 40600
Sun Sep 26 10:28:40 EDT 1999 16245
Sun Sep 26 10:28:44 EDT 1999 32615
Sun Sep 26 10:28:49 EDT 1999 16726
Sun Sep 26 10:28:54 EDT 1999 38696
Sun Sep 26 12:13:41 EDT 1999 45027
Sun Sep 26 12:13:45 EDT 1999 22712
Sun Sep 26 12:13:50 EDT 1999 32867
Sun Sep 26 12:13:54 EDT 1999 2757
Sun Sep 26 12:13:59 EDT 1999 18918
Sun Sep 26 12:14:04 EDT 1999 34555
Sun Sep 26 12:14:09 EDT 1999 25721
Sun Sep 26 12:14:14 EDT 1999 15905
Sun Sep 26 12:14:18 EDT 1999 19941
Sun Sep 26 12:14:23 EDT 1999 48079
Sun Sep 26 12:14:28 EDT 1999 47763
Sun Sep 26 12:14:33 EDT 1999 14907
Sun Sep 26 12:14:38 EDT 1999 1538
Sun Sep 26 12:14:42 EDT 1999 5126
Sun Sep 26 12:14:47 EDT 1999 31175
Sun Sep 26 12:14:52 EDT 1999 1798
Sun Sep 26 12:14:56 EDT 1999 32751
Sun Sep 26 12:19:46 EDT 1999 38403
Sun Sep 26 17:08:12 EDT 1999 46405
Sun Sep 26 17:08:17 EDT 1999 17891
Sun Sep 26 17:39:26 EDT 1999 44217
Sun Sep 26 17:39:30 EDT 1999 2667
Sun Sep 26 17:39:35 EDT 1999 5554
Mon Sep 27 08:18:38 EDT 1999 3644
Mon Sep 27 14:47:11 EDT 1999 30738
Mon Sep 27 14:47:15 EDT 1999 19114
Mon Sep 27 14:47:20 EDT 1999 2782
Mon Sep 27 14:47:25 EDT 1999 42784
Mon Sep 27 14:47:30 EDT 1999 40069
Mon Sep 27 14:47:35 EDT 1999 18865
Mon Sep 27 14:47:40 EDT 1999 8895
Mon Sep 27 14:47:45 EDT 1999 14159
Mon Sep 27 14:47:49 EDT 1999 2611
Mon Sep 27 14:47:55 EDT 1999 46539
Mon Sep 27 14:48:00 EDT 1999 12340
Mon Sep 27 14:48:04 EDT 1999 49748
Mon Sep 27 14:48:09 EDT 1999 31742
Mon Sep 27 14:48:14 EDT 1999 9798
Mon Sep 27 14:48:19 EDT 1999 23759
Mon Sep 27 14:48:24 EDT 1999 22240
Mon Sep 27 14:48:28 EDT 1999 49402
Mon Sep 27 15:01:32 EDT 1999 35841
Mon Sep 27 15:01:37 EDT 1999 36312
Mon Sep 27 15:01:41 EDT 1999 10665
Mon Sep 27 15:06:47 EDT 1999 16689
Mon Sep 27 15:11:02 EDT 1999 20756
Mon Sep 27 15:13:57 EDT 1999 8948
Mon Sep 27 15:14:01 EDT 1999 17466
Mon Sep 27 15:14:05 EDT 1999 24110
Mon Sep 27 15:14:10 EDT 1999 32691
Mon Sep 27 15:14:14 EDT 1999 14809
Mon Sep 27 15:14:19 EDT 1999 35495
Mon Sep 27 15:14:24 EDT 1999 21186
Mon Sep 27 15:14:29 EDT 1999 4775
Mon Sep 27 15:14:34 EDT 1999 21966
Mon Sep 27 15:14:39 EDT 1999 38331
Mon Sep 27 15:14:44 EDT 1999 40107
Mon Sep 27 15:25:38 EDT 1999 28704
Mon Sep 27 15:25:40 EDT 1999 48654
Mon Sep 27 15:25:45 EDT 1999 42392
Mon Sep 27 15:25:49 EDT 1999 43112
Mon Sep 27 15:25:53 EDT 1999 34965
Mon Sep 27 15:25:57 EDT 1999 10222
Mon Sep 27 15:26:03 EDT 1999 14243
Mon Sep 27 15:26:08 EDT 1999 48286
Mon Sep 27 15:26:12 EDT 1999 20612
Mon Sep 27 15:26:17 EDT 1999 49962
Mon Sep 27 15:26:22 EDT 1999 21578
Mon Sep 27 15:26:28 EDT 1999 13468
Mon Sep 27 16:16:03 EDT 1999 10544
Mon Sep 27 16:16:09 EDT 1999 21003
Mon Sep 27 16:16:13 EDT 1999 1267
Mon Sep 27 16:16:18 EDT 1999 32951
Mon Sep 27 16:16:23 EDT 1999 13202
Mon Sep 27 16:16:29 EDT 1999 11487
Mon Sep 27 16:16:34 EDT 1999 42955
Mon Sep 27 16:16:39 EDT 1999 26653
Mon Sep 27 16:16:45 EDT 1999 6658
Mon Sep 27 16:16:51 EDT 1999 30177
Mon Sep 27 16:16:56 EDT 1999 11608
Mon Sep 27 16:28:02 EDT 1999 26475
Mon Sep 27 16:30:24 EDT 1999 15990
Mon Sep 27 16:30:26 EDT 1999 44705
Mon Sep 27 16:30:31 EDT 1999 7471
Mon Sep 27 16:30:35 EDT 1999 39489
Mon Sep 27 16:30:40 EDT 1999 17925
Mon Sep 27 16:30:44 EDT 1999 39653
Mon Sep 27 16:30:50 EDT 1999 36863
Mon Sep 27 16:30:55 EDT 1999 42694
Mon Sep 27 16:31:00 EDT 1999 33650
Mon Sep 27 16:31:05 EDT 1999 36637
Mon Sep 27 16:31:10 EDT 1999 42247
Mon Sep 27 16:31:15 EDT 1999 38987
Mon Sep 27 16:47:19 EDT 1999 45747
Mon Sep 27 16:47:21 EDT 1999 43596
Mon Sep 27 16:47:26 EDT 1999 15012
Mon Sep 27 16:47:30 EDT 1999 29055
Mon Sep 27 16:47:34 EDT 1999 194
Mon Sep 27 16:47:39 EDT 1999 25457
Mon Sep 27 16:47:44 EDT 1999 39427
Mon Sep 27 16:47:49 EDT 1999 28880
Mon Sep 27 16:47:54 EDT 1999 29357
Mon Sep 27 16:47:59 EDT 1999 13388
Mon Sep 27 16:48:04 EDT 1999 41154
Mon Sep 27 16:48:09 EDT 1999 37518
Mon Sep 27 17:16:18 EDT 1999 6909
Mon Sep 27 17:16:23 EDT 1999 44810
Mon Sep 27 17:16:27 EDT 1999 38813
Mon Sep 27 17:16:32 EDT 1999 34889
Mon Sep 27 17:35:00 EDT 1999 20635
Mon Sep 27 17:35:05 EDT 1999 1338
Mon Sep 27 17:35:09 EDT 1999 22002
Mon Sep 27 19:12:25 EDT 1999 14199
Tue Sep 28 09:04:07 EDT 1999 24029
Tue Sep 28 09:30:42 EDT 1999 36903
Tue Sep 28 09:30:44 EDT 1999 4221
Tue Sep 28 09:30:49 EDT 1999 28751
Tue Sep 28 09:30:53 EDT 1999 2651
Tue Sep 28 09:30:58 EDT 1999 13141
Tue Sep 28 09:31:02 EDT 1999 24131
Tue Sep 28 09:31:08 EDT 1999 7772
Tue Sep 28 09:31:13 EDT 1999 16163
Tue Sep 28 09:31:17 EDT 1999 34349
Tue Sep 28 09:31:22 EDT 1999 43603
Tue Sep 28 09:31:27 EDT 1999 20991
Tue Sep 28 09:31:32 EDT 1999 1978
Tue Sep 28 10:28:32 EDT 1999 49092
Tue Sep 28 10:28:35 EDT 1999 15963
Tue Sep 28 10:28:39 EDT 1999 46620
Tue Sep 28 10:28:43 EDT 1999 1482
Tue Sep 28 10:28:47 EDT 1999 10736
Tue Sep 28 10:28:52 EDT 1999 22910
Tue Sep 28 10:28:57 EDT 1999 22446
Tue Sep 28 10:29:02 EDT 1999 44742
Tue Sep 28 10:29:07 EDT 1999 14039
Tue Sep 28 10:29:12 EDT 1999 3510
Tue Sep 28 10:29:17 EDT 1999 34724
Tue Sep 28 10:29:22 EDT 1999 4643
Tue Sep 28 11:26:22 EDT 1999 49986
Tue Sep 28 11:26:27 EDT 1999 23717
Tue Sep 28 11:26:32 EDT 1999 24535
Tue Sep 28 11:26:37 EDT 1999 6423
Tue Sep 28 11:26:42 EDT 1999 46107
Tue Sep 28 11:26:46 EDT 1999 9868
Tue Sep 28 11:26:51 EDT 1999 16323
Tue Sep 28 11:26:56 EDT 1999 3475
Tue Sep 28 11:27:00 EDT 1999 34414
Tue Sep 28 11:27:05 EDT 1999 44580
Tue Sep 28 11:27:09 EDT 1999 48288
Tue Sep 28 11:27:14 EDT 1999 5426
Tue Sep 28 11:27:19 EDT 1999 14153
Tue Sep 28 11:27:23 EDT 1999 48465
Tue Sep 28 11:27:28 EDT 1999 9307
Tue Sep 28 11:27:33 EDT 1999 19398
Tue Sep 28 11:27:37 EDT 1999 1587
Tue Sep 28 11:27:42 EDT 1999 46158
Tue Sep 28 11:27:47 EDT 1999 12113
Tue Sep 28 11:27:51 EDT 1999 40367
Tue Sep 28 11:27:56 EDT 1999 33972
Tue Sep 28 13:33:11 EDT 1999 40034
Tue Sep 28 13:33:16 EDT 1999 7361
Tue Sep 28 13:33:20 EDT 1999 1611
Tue Sep 28 14:55:04 EDT 1999 19901
Tue Sep 28 14:55:09 EDT 1999 40086
Tue Sep 28 14:55:14 EDT 1999 18326
Tue Sep 28 15:05:37 EDT 1999 21134
Tue Sep 28 15:05:42 EDT 1999 3261
Tue Sep 28 15:05:47 EDT 1999 23383
Tue Sep 28 15:07:37 EDT 1999 873
Tue Sep 28 15:07:39 EDT 1999 5025
Tue Sep 28 15:07:44 EDT 1999 32911
Tue Sep 28 15:07:49 EDT 1999 21580
Tue Sep 28 15:07:53 EDT 1999 8423
Tue Sep 28 15:07:57 EDT 1999 43699
Tue Sep 28 15:08:03 EDT 1999 5336
Tue Sep 28 15:08:08 EDT 1999 9864
Tue Sep 28 15:08:12 EDT 1999 16576
Tue Sep 28 15:08:18 EDT 1999 11933
Tue Sep 28 15:08:23 EDT 1999 22428
Tue Sep 28 15:08:27 EDT 1999 45817
Tue Sep 28 15:37:07 EDT 1999 37098
Tue Sep 28 15:37:10 EDT 1999 8660
Tue Sep 28 15:37:14 EDT 1999 31588
Tue Sep 28 15:37:19 EDT 1999 31625
Tue Sep 28 15:37:23 EDT 1999 25945
Tue Sep 28 15:37:28 EDT 1999 47443
Tue Sep 28 15:37:33 EDT 1999 40347
Tue Sep 28 15:37:38 EDT 1999 48042
Tue Sep 28 15:37:43 EDT 1999 15023
Tue Sep 28 15:37:48 EDT 1999 33557
Tue Sep 28 15:37:54 EDT 1999 22686
Tue Sep 28 15:37:58 EDT 1999 33601
Tue Sep 28 15:49:20 EDT 1999 22353
Tue Sep 28 15:49:22 EDT 1999 38659
Tue Sep 28 15:49:26 EDT 1999 9235
Tue Sep 28 15:49:31 EDT 1999 7440
Tue Sep 28 15:49:35 EDT 1999 20367
Tue Sep 28 15:49:39 EDT 1999 8919
Tue Sep 28 15:49:44 EDT 1999 28555
Tue Sep 28 15:49:49 EDT 1999 9256
Tue Sep 28 15:49:54 EDT 1999 16961
Tue Sep 28 15:49:59 EDT 1999 17614
Tue Sep 28 15:50:03 EDT 1999 41673
Tue Sep 28 15:50:09 EDT 1999 4753
Tue Sep 28 15:50:14 EDT 1999 29070
Tue Sep 28 15:50:18 EDT 1999 48074
Tue Sep 28 15:50:23 EDT 1999 37074
Tue Sep 28 15:50:27 EDT 1999 30079
Tue Sep 28 15:50:32 EDT 1999 3372
Tue Sep 28 15:50:36 EDT 1999 17945
Tue Sep 28 15:50:41 EDT 1999 28327
Tue Sep 28 15:51:53 EDT 1999 23647
Tue Sep 28 15:51:58 EDT 1999 13874
Tue Sep 28 15:52:03 EDT 1999 30700
Tue Sep 28 15:52:07 EDT 1999 21537
Tue Sep 28 15:52:12 EDT 1999 18815
Tue Sep 28 15:52:16 EDT 1999 41028
Tue Sep 28 15:52:22 EDT 1999 15322
Tue Sep 28 15:52:27 EDT 1999 44803
Tue Sep 28 15:52:31 EDT 1999 45828
Tue Sep 28 15:52:37 EDT 1999 12082
Tue Sep 28 16:20:15 EDT 1999 40130
Tue Sep 28 16:25:21 EDT 1999 6876
Tue Sep 28 16:25:25 EDT 1999 16472
Tue Sep 28 16:25:30 EDT 1999 7355
Tue Sep 28 16:25:35 EDT 1999 11632
Tue Sep 28 16:25:40 EDT 1999 27216
Tue Sep 28 16:25:44 EDT 1999 39908
Tue Sep 28 16:25:50 EDT 1999 12096
Tue Sep 28 16:25:55 EDT 1999 44411
Tue Sep 28 16:26:00 EDT 1999 4605
Tue Sep 28 16:26:05 EDT 1999 43052
Tue Sep 28 16:26:10 EDT 1999 18668
Tue Sep 28 16:26:15 EDT 1999 12903
Tue Sep 28 16:26:19 EDT 1999 16538
Tue Sep 28 16:26:24 EDT 1999 44026
Tue Sep 28 16:26:28 EDT 1999 8681
Tue Sep 28 16:26:33 EDT 1999 21099
Tue Sep 28 16:26:38 EDT 1999 16547
Tue Sep 28 16:27:16 EDT 1999 2045
Tue Sep 28 17:01:58 EDT 1999 19816
Tue Sep 28 17:02:03 EDT 1999 992
Tue Sep 28 17:02:08 EDT 1999 21679
Tue Sep 28 17:02:12 EDT 1999 42216
Tue Sep 28 17:02:17 EDT 1999 26991
Tue Sep 28 17:02:22 EDT 1999 25829
Tue Sep 28 17:02:32 EDT 1999 7282
Tue Sep 28 17:02:36 EDT 1999 28678
Tue Sep 28 17:02:42 EDT 1999 42576
Tue Sep 28 17:02:47 EDT 1999 49005
Tue Sep 28 17:02:52 EDT 1999 1318
Tue Sep 28 17:02:56 EDT 1999 34519
Tue Sep 28 17:03:01 EDT 1999 15342
Tue Sep 28 17:03:05 EDT 1999 4604
Tue Sep 28 17:03:11 EDT 1999 45366
Tue Sep 28 17:03:15 EDT 1999 31901
Tue Sep 28 20:38:09 EDT 1999 32812
Wed Sep 29 11:37:33 EDT 1999 30482
Wed Sep 29 11:37:38 EDT 1999 14502
Wed Sep 29 11:37:42 EDT 1999 850
Wed Sep 29 11:37:47 EDT 1999 6738
Wed Sep 29 11:37:51 EDT 1999 49860
Wed Sep 29 11:37:57 EDT 1999 13285
Wed Sep 29 11:38:02 EDT 1999 30128
Wed Sep 29 11:38:06 EDT 1999 46362
Wed Sep 29 11:38:12 EDT 1999 22329
Wed Sep 29 11:38:17 EDT 1999 39969
Wed Sep 29 11:38:22 EDT 1999 8623
Wed Sep 29 13:30:57 EDT 1999 49147
Wed Sep 29 13:31:02 EDT 1999 261
Wed Sep 29 13:31:06 EDT 1999 36180
Wed Sep 29 14:20:09 EDT 1999 30732
Wed Sep 29 14:20:19 EDT 1999 13695
Wed Sep 29 14:20:23 EDT 1999 1491
Wed Sep 29 14:36:21 EDT 1999 14237
Wed Sep 29 14:53:21 EDT 1999 14110
Wed Sep 29 14:53:26 EDT 1999 4511
Wed Sep 29 14:53:30 EDT 1999 34271
Wed Sep 29 14:53:34 EDT 1999 29287
Wed Sep 29 14:53:39 EDT 1999 3290
Wed Sep 29 14:53:44 EDT 1999 23304
Wed Sep 29 14:53:49 EDT 1999 35391
Wed Sep 29 14:53:54 EDT 1999 38449
Wed Sep 29 14:53:58 EDT 1999 7562
Wed Sep 29 14:54:03 EDT 1999 16533
Wed Sep 29 14:54:08 EDT 1999 7436
Wed Sep 29 14:58:53 EDT 1999 14165
Wed Sep 29 14:58:55 EDT 1999 46573
Wed Sep 29 14:59:00 EDT 1999 23859
Wed Sep 29 14:59:04 EDT 1999 16094
Wed Sep 29 14:59:09 EDT 1999 3943
Wed Sep 29 14:59:14 EDT 1999 2075
Wed Sep 29 14:59:19 EDT 1999 47201
Wed Sep 29 14:59:25 EDT 1999 33457
Wed Sep 29 14:59:30 EDT 1999 3653
Wed Sep 29 14:59:35 EDT 1999 49280
Wed Sep 29 14:59:40 EDT 1999 45100
Wed Sep 29 14:59:45 EDT 1999 38260
Wed Sep 29 14:59:50 EDT 1999 36607
Wed Sep 29 14:59:55 EDT 1999 16208
Wed Sep 29 14:59:59 EDT 1999 32047
Wed Sep 29 15:00:01 EDT 1999 8986
Wed Sep 29 15:00:07 EDT 1999 5574
Wed Sep 29 15:00:11 EDT 1999 44545
Wed Sep 29 15:01:32 EDT 1999 37490
Wed Sep 29 15:01:35 EDT 1999 20798
Wed Sep 29 15:01:39 EDT 1999 9946
Wed Sep 29 15:01:44 EDT 1999 351
Wed Sep 29 15:01:48 EDT 1999 4187
Wed Sep 29 15:01:52 EDT 1999 32185
Wed Sep 29 15:01:58 EDT 1999 45206
Wed Sep 29 15:02:03 EDT 1999 8167
Wed Sep 29 15:02:07 EDT 1999 30613
Wed Sep 29 15:02:13 EDT 1999 22318
Wed Sep 29 15:02:18 EDT 1999 26931
Wed Sep 29 15:02:23 EDT 1999 6841
Wed Sep 29 16:02:48 EDT 1999 37085
Wed Sep 29 16:02:52 EDT 1999 15021
Wed Sep 29 17:13:24 EDT 1999 6481
Wed Sep 29 17:13:26 EDT 1999 610
Wed Sep 29 17:13:31 EDT 1999 10318
Wed Sep 29 17:13:36 EDT 1999 293
Wed Sep 29 17:13:40 EDT 1999 20577
Wed Sep 29 17:13:45 EDT 1999 3824
Wed Sep 29 17:13:50 EDT 1999 6076
Wed Sep 29 17:13:55 EDT 1999 39335
Wed Sep 29 17:14:00 EDT 1999 41960
Wed Sep 29 17:14:05 EDT 1999 2742
Wed Sep 29 17:14:10 EDT 1999 14624
Wed Sep 29 17:14:15 EDT 1999 14003
Wed Sep 29 17:14:20 EDT 1999 23290
Wed Sep 29 17:14:24 EDT 1999 32885
Wed Sep 29 17:14:29 EDT 1999 18650
Wed Sep 29 17:14:34 EDT 1999 6638
Wed Sep 29 17:14:39 EDT 1999 1531
Wed Sep 29 17:14:43 EDT 1999 45326
Wed Sep 29 17:33:45 EDT 1999 48367
Wed Sep 29 18:22:36 EDT 1999 21204
Wed Sep 29 18:22:40 EDT 1999 4935
Wed Sep 29 18:22:45 EDT 1999 10402
Thu Sep 30 07:40:04 EDT 1999 13459
Thu Sep 30 07:40:09 EDT 1999 31668
Thu Sep 30 07:40:14 EDT 1999 29881
Thu Sep 30 07:40:18 EDT 1999 32261
Thu Sep 30 10:19:55 EDT 1999 16587
Thu Sep 30 10:19:57 EDT 1999 18564
Thu Sep 30 10:20:39 EDT 1999 29693
Thu Sep 30 10:20:43 EDT 1999 22672
Thu Sep 30 10:20:48 EDT 1999 28104
Thu Sep 30 10:20:52 EDT 1999 29690
Thu Sep 30 10:20:58 EDT 1999 32698
Thu Sep 30 10:21:03 EDT 1999 7579
Thu Sep 30 10:21:07 EDT 1999 26699
Thu Sep 30 10:21:12 EDT 1999 25840
Thu Sep 30 10:21:17 EDT 1999 31628
Thu Sep 30 10:21:22 EDT 1999 14776
Thu Sep 30 11:56:12 EDT 1999 35652
Thu Sep 30 11:56:17 EDT 1999 47559
Thu Sep 30 11:56:22 EDT 1999 11635
Thu Sep 30 11:56:26 EDT 1999 16189
Thu Sep 30 11:56:31 EDT 1999 9368
Thu Sep 30 11:56:36 EDT 1999 13807
Thu Sep 30 11:56:41 EDT 1999 9035
Thu Sep 30 11:56:45 EDT 1999 23188
Thu Sep 30 11:56:51 EDT 1999 49910
Thu Sep 30 11:56:56 EDT 1999 38517
Thu Sep 30 11:57:01 EDT 1999 18026
Thu Sep 30 13:18:19 EDT 1999 8356
Thu Sep 30 13:18:24 EDT 1999 8174
Thu Sep 30 13:18:29 EDT 1999 25941
Thu Sep 30 13:18:33 EDT 1999 37526
Thu Sep 30 13:18:38 EDT 1999 2158
Thu Sep 30 13:18:43 EDT 1999 49454
Thu Sep 30 13:21:48 EDT 1999 30755
Thu Sep 30 13:21:51 EDT 1999 25340
Thu Sep 30 13:21:55 EDT 1999 37960
Thu Sep 30 13:22:00 EDT 1999 38005
Thu Sep 30 13:22:04 EDT 1999 43846
Thu Sep 30 13:22:09 EDT 1999 1849
Thu Sep 30 13:22:13 EDT 1999 43817
Thu Sep 30 13:22:18 EDT 1999 20389
Thu Sep 30 13:22:23 EDT 1999 39711
Thu Sep 30 13:22:28 EDT 1999 20391
Thu Sep 30 13:22:34 EDT 1999 4477
Thu Sep 30 13:22:39 EDT 1999 12197
Thu Sep 30 13:22:43 EDT 1999 46432
Thu Sep 30 13:22:47 EDT 1999 46507
Thu Sep 30 13:22:52 EDT 1999 42045
Thu Sep 30 13:22:57 EDT 1999 17893
Thu Sep 30 13:23:02 EDT 1999 24128
Thu Sep 30 13:23:06 EDT 1999 13306
Thu Sep 30 13:43:41 EDT 1999 38725
Thu Sep 30 13:43:46 EDT 1999 38450
Thu Sep 30 13:43:50 EDT 1999 12851
Thu Sep 30 13:43:55 EDT 1999 45056
Thu Sep 30 13:43:59 EDT 1999 95
Thu Sep 30 13:44:27 EDT 1999 46469
Thu Sep 30 13:44:31 EDT 1999 35859
Thu Sep 30 13:44:36 EDT 1999 16233
Thu Sep 30 13:44:40 EDT 1999 32356
Thu Sep 30 13:44:45 EDT 1999 33459
Thu Sep 30 13:44:49 EDT 1999 19173
Thu Sep 30 13:44:54 EDT 1999 38218
Thu Sep 30 14:18:56 EDT 1999 31956
Thu Sep 30 14:18:58 EDT 1999 8980
Thu Sep 30 14:19:03 EDT 1999 13417
Thu Sep 30 14:19:07 EDT 1999 40800
Thu Sep 30 14:19:12 EDT 1999 11095
Thu Sep 30 14:19:17 EDT 1999 6325
Thu Sep 30 14:19:21 EDT 1999 28811
Thu Sep 30 14:19:27 EDT 1999 40706
Thu Sep 30 14:19:32 EDT 1999 7466
Thu Sep 30 14:19:36 EDT 1999 24427
Thu Sep 30 14:19:42 EDT 1999 19291
Thu Sep 30 14:19:47 EDT 1999 14324
Thu Sep 30 14:19:52 EDT 1999 1741
Thu Sep 30 14:19:57 EDT 1999 10698
Thu Sep 30 14:20:01 EDT 1999 26707
Thu Sep 30 14:20:06 EDT 1999 16811
Thu Sep 30 14:20:11 EDT 1999 41189
Thu Sep 30 14:20:15 EDT 1999 14458
Thu Sep 30 14:20:24 EDT 1999 20986
Thu Sep 30 14:22:48 EDT 1999 14780
Thu Sep 30 14:22:50 EDT 1999 42900
Thu Sep 30 14:22:55 EDT 1999 15673
Thu Sep 30 14:23:00 EDT 1999 47261
Thu Sep 30 14:23:04 EDT 1999 24743
Thu Sep 30 14:23:09 EDT 1999 25022
Thu Sep 30 14:23:14 EDT 1999 8655
Thu Sep 30 14:23:19 EDT 1999 15839
Thu Sep 30 14:23:24 EDT 1999 24506
Thu Sep 30 14:23:29 EDT 1999 39477
Thu Sep 30 14:23:34 EDT 1999 45445
Thu Sep 30 14:23:39 EDT 1999 46008
Thu Sep 30 15:02:56 EDT 1999 29707
Thu Sep 30 15:03:00 EDT 1999 4569
Thu Sep 30 15:37:22 EDT 1999 18546
Thu Sep 30 15:37:25 EDT 1999 49568
Thu Sep 30 15:37:29 EDT 1999 2663
Thu Sep 30 15:37:34 EDT 1999 10929
Thu Sep 30 15:37:38 EDT 1999 37701
Thu Sep 30 15:37:43 EDT 1999 15050
Thu Sep 30 15:37:48 EDT 1999 35748
Thu Sep 30 15:37:53 EDT 1999 49257
Thu Sep 30 15:37:58 EDT 1999 30392
Thu Sep 30 15:38:03 EDT 1999 28576
Thu Sep 30 15:38:08 EDT 1999 26449
Thu Sep 30 15:38:12 EDT 1999 33245
Thu Sep 30 16:45:25 EDT 1999 20772
Thu Sep 30 16:45:30 EDT 1999 42238
Thu Sep 30 16:45:35 EDT 1999 36331
Thu Sep 30 16:45:39 EDT 1999 16198
Thu Sep 30 16:45:44 EDT 1999 16695
Thu Sep 30 16:45:48 EDT 1999 26012
Thu Sep 30 17:07:50 EDT 1999 1057
Fri Oct 1 08:22:00 EDT 1999 24694
Fri Oct 1 09:34:06 EDT 1999 9534
Fri Oct 1 09:34:11 EDT 1999 14089
Fri Oct 1 09:34:15 EDT 1999 33683
Fri Oct 1 12:51:10 EDT 1999 7816
Fri Oct 1 13:00:57 EDT 1999 16486
Fri Oct 1 13:05:56 EDT 1999 31573
Fri Oct 1 13:12:49 EDT 1999 38392
Fri Oct 1 13:22:08 EDT 1999 25317
Fri Oct 1 13:22:14 EDT 1999 20049
Fri Oct 1 13:26:26 EDT 1999 12487
Fri Oct 1 13:39:50 EDT 1999 26875
Fri Oct 1 13:39:55 EDT 1999 23206
Fri Oct 1 13:39:59 EDT 1999 34338
Fri Oct 1 13:48:08 EDT 1999 45050
Fri Oct 1 13:48:12 EDT 1999 4523
Fri Oct 1 13:48:17 EDT 1999 20167
Fri Oct 1 13:48:22 EDT 1999 2966
Fri Oct 1 13:48:27 EDT 1999 5092
Fri Oct 1 13:48:31 EDT 1999 18653
Fri Oct 1 13:48:36 EDT 1999 3252
Fri Oct 1 13:48:41 EDT 1999 8142
Fri Oct 1 13:48:46 EDT 1999 13645
Fri Oct 1 13:48:51 EDT 1999 35904
Fri Oct 1 13:48:56 EDT 1999 6302
Fri Oct 1 13:49:00 EDT 1999 45682
Fri Oct 1 13:49:05 EDT 1999 29536
Fri Oct 1 13:49:10 EDT 1999 41038
Fri Oct 1 13:49:14 EDT 1999 19500
Fri Oct 1 13:49:19 EDT 1999 45637
Fri Oct 1 13:49:23 EDT 1999 13021
Fri Oct 1 14:15:33 EDT 1999 24322
Fri Oct 1 14:15:36 EDT 1999 3533
Fri Oct 1 14:15:40 EDT 1999 43214
Fri Oct 1 14:15:45 EDT 1999 21335
Fri Oct 1 14:15:50 EDT 1999 49648
Fri Oct 1 14:15:55 EDT 1999 6767
Fri Oct 1 14:15:59 EDT 1999 29669
Fri Oct 1 14:16:05 EDT 1999 22108
Fri Oct 1 14:16:10 EDT 1999 20621
Fri Oct 1 14:16:14 EDT 1999 8904
Fri Oct 1 14:16:20 EDT 1999 37873
Fri Oct 1 14:16:25 EDT 1999 35592
Fri Oct 1 14:16:30 EDT 1999 36787
Fri Oct 1 14:16:35 EDT 1999 39517
Fri Oct 1 14:16:39 EDT 1999 42233
Fri Oct 1 14:16:45 EDT 1999 41649
Fri Oct 1 14:16:50 EDT 1999 7158
Fri Oct 1 14:16:55 EDT 1999 44946
Fri Oct 1 14:35:55 EDT 1999 27651
Fri Oct 1 14:35:59 EDT 1999 12401
Fri Oct 1 14:36:04 EDT 1999 13288
Fri Oct 1 14:44:55 EDT 1999 1965
Fri Oct 1 14:44:59 EDT 1999 7228
Fri Oct 1 14:45:04 EDT 1999 6517
Fri Oct 1 15:05:37 EDT 1999 39012
Fri Oct 1 15:11:31 EDT 1999 1662
Fri Oct 1 15:11:33 EDT 1999 43370
Fri Oct 1 15:11:37 EDT 1999 36050
Fri Oct 1 15:11:42 EDT 1999 9095
Fri Oct 1 15:11:46 EDT 1999 1964
Fri Oct 1 15:15:39 EDT 1999 1999
Fri Oct 1 15:15:41 EDT 1999 41768
Fri Oct 1 15:15:46 EDT 1999 3943
Fri Oct 1 15:15:50 EDT 1999 22272
Fri Oct 1 15:15:54 EDT 1999 44580
Fri Oct 1 15:48:12 EDT 1999 37931
Fri Oct 1 15:48:17 EDT 1999 42592
Fri Oct 1 15:48:23 EDT 1999 28603
Fri Oct 1 16:05:22 EDT 1999 37593
Fri Oct 1 16:14:37 EDT 1999 12432
Fri Oct 1 16:20:28 EDT 1999 1112
Fri Oct 1 16:20:31 EDT 1999 32707
Fri Oct 1 16:20:35 EDT 1999 34210
Fri Oct 1 16:20:40 EDT 1999 43237
Fri Oct 1 16:20:44 EDT 1999 8699
Fri Oct 1 16:20:49 EDT 1999 3584
Fri Oct 1 16:20:54 EDT 1999 7791
Fri Oct 1 16:20:59 EDT 1999 17087
Fri Oct 1 16:21:04 EDT 1999 38536
Fri Oct 1 16:21:10 EDT 1999 14844
Fri Oct 1 16:21:15 EDT 1999 41964
Fri Oct 1 16:21:20 EDT 1999 11377
Fri Oct 1 16:27:13 EDT 1999 35705
Fri Oct 1 16:27:16 EDT 1999 26339
Fri Oct 1 16:27:20 EDT 1999 6885
Fri Oct 1 16:27:25 EDT 1999 25152
Fri Oct 1 16:27:29 EDT 1999 49290
Fri Oct 1 16:27:33 EDT 1999 23510
Fri Oct 1 16:27:39 EDT 1999 26472
Fri Oct 1 16:27:44 EDT 1999 20165
Fri Oct 1 16:27:49 EDT 1999 10849
Fri Oct 1 16:27:54 EDT 1999 12893
Fri Oct 1 16:28:00 EDT 1999 16193
Fri Oct 1 16:28:05 EDT 1999 7939
Fri Oct 1 16:30:53 EDT 1999 26487
Fri Oct 1 16:30:55 EDT 1999 47211
Fri Oct 1 16:31:00 EDT 1999 46188
Fri Oct 1 16:31:04 EDT 1999 43748
Fri Oct 1 16:31:08 EDT 1999 24664
Fri Oct 1 16:31:13 EDT 1999 28486
Fri Oct 1 16:31:19 EDT 1999 9339
Fri Oct 1 16:31:24 EDT 1999 13472
Fri Oct 1 16:31:28 EDT 1999 26975
Fri Oct 1 16:31:34 EDT 1999 12632
Fri Oct 1 16:31:40 EDT 1999 49034
Fri Oct 1 16:32:01 EDT 1999 24281
Fri Oct 1 16:32:04 EDT 1999 34056
Fri Oct 1 16:32:09 EDT 1999 13935
Fri Oct 1 16:32:14 EDT 1999 26270
Fri Oct 1 16:32:18 EDT 1999 35028
Fri Oct 1 16:34:56 EDT 1999 43806
Fri Oct 1 16:34:59 EDT 1999 32881
Fri Oct 1 16:35:03 EDT 1999 30805
Fri Oct 1 16:35:08 EDT 1999 37361
Fri Oct 1 16:35:12 EDT 1999 44142
Fri Oct 1 16:35:17 EDT 1999 5756
Fri Oct 1 16:35:22 EDT 1999 16037
Fri Oct 1 16:46:10 EDT 1999 23440
Fri Oct 1 16:46:15 EDT 1999 47436
Fri Oct 1 16:46:19 EDT 1999 49474
Fri Oct 1 16:46:24 EDT 1999 12311
Fri Oct 1 16:46:28 EDT 1999 1207
Fri Oct 1 16:46:33 EDT 1999 8840
Fri Oct 1 16:46:38 EDT 1999 29
Fri Oct 1 16:46:43 EDT 1999 48315
Fri Oct 1 16:46:48 EDT 1999 43170
Fri Oct 1 16:46:53 EDT 1999 45697
Fri Oct 1 16:46:58 EDT 1999 18081
Fri Oct 1 16:48:15 EDT 1999 35284
Fri Oct 1 16:48:20 EDT 1999 29592
Fri Oct 1 16:48:24 EDT 1999 197
Fri Oct 1 17:10:21 EDT 1999 10016
Fri Oct 1 17:10:26 EDT 1999 43674
Fri Oct 1 17:10:30 EDT 1999 22092
Fri Oct 1 17:10:36 EDT 1999 12502
Fri Oct 1 17:10:41 EDT 1999 38021
Fri Oct 1 17:10:46 EDT 1999 27013
Fri Oct 1 17:10:51 EDT 1999 28512
Fri Oct 1 17:10:57 EDT 1999 46486
Fri Oct 1 17:11:02 EDT 1999 17527
Fri Oct 1 17:11:06 EDT 1999 22605
Fri Oct 1 17:13:10 EDT 1999 45062
Fri Oct 1 17:13:15 EDT 1999 35313
Fri Oct 1 17:13:20 EDT 1999 25503
Fri Oct 1 17:13:24 EDT 1999 33763
Fri Oct 1 17:13:29 EDT 1999 36628
Fri Oct 1 17:13:35 EDT 1999 39027
Fri Oct 1 17:13:39 EDT 1999 18035
Fri Oct 1 17:47:23 EDT 1999 23293
Fri Oct 1 17:47:25 EDT 1999 41215
Fri Oct 1 17:47:29 EDT 1999 31338
Fri Oct 1 17:47:34 EDT 1999 30610
Fri Oct 1 17:47:38 EDT 1999 22895
Fri Oct 1 17:47:43 EDT 1999 9438
Fri Oct 1 17:47:48 EDT 1999 7788
Fri Oct 1 17:47:53 EDT 1999 9551
Fri Oct 1 17:47:58 EDT 1999 38145
Fri Oct 1 17:48:04 EDT 1999 15020
Fri Oct 1 17:48:08 EDT 1999 32508
Fri Oct 1 17:48:13 EDT 1999 48054
Fri Oct 1 17:55:07 EDT 1999 3795
Fri Oct 1 17:55:12 EDT 1999 47212
Fri Oct 1 17:55:16 EDT 1999 15712
Fri Oct 1 17:55:21 EDT 1999 25234
Fri Oct 1 20:52:45 EDT 1999 19051
Fri Oct 1 20:52:49 EDT 1999 21090
Fri Oct 1 20:53:50 EDT 1999 39177
Fri Oct 1 20:53:55 EDT 1999 21657
Fri Oct 1 20:54:00 EDT 1999 17502
Fri Oct 1 20:54:04 EDT 1999 16665
Fri Oct 1 20:54:09 EDT 1999 21807
Fri Oct 1 20:54:14 EDT 1999 9757
Fri Oct 1 20:54:19 EDT 1999 1422
Fri Oct 1 20:54:24 EDT 1999 32730
Fri Oct 1 20:54:29 EDT 1999 42584
Fri Oct 1 20:54:34 EDT 1999 42604
Fri Oct 1 20:54:39 EDT 1999 45111
Fri Oct 1 20:54:43 EDT 1999 16393
Fri Oct 1 20:54:48 EDT 1999 12975
Fri Oct 1 20:54:53 EDT 1999 39434
Fri Oct 1 20:54:58 EDT 1999 46954
Sat Oct 2 07:50:42 EDT 1999 4244
Sat Oct 2 09:06:22 EDT 1999 16073
Sat Oct 2 09:21:16 EDT 1999 41423
Sat Oct 2 10:10:01 EDT 1999 34922
Sat Oct 2 10:55:53 EDT 1999 36055
Sat Oct 2 10:55:55 EDT 1999 4608
Sat Oct 2 10:56:00 EDT 1999 36076
Sat Oct 2 10:56:04 EDT 1999 5153
Sat Oct 2 10:56:08 EDT 1999 26995
Sat Oct 2 10:56:13 EDT 1999 25043
Sat Oct 2 10:56:18 EDT 1999 23739
Sat Oct 2 10:56:23 EDT 1999 48346
Sat Oct 2 10:56:28 EDT 1999 9287
Sat Oct 2 10:56:33 EDT 1999 9920
Sat Oct 2 10:56:38 EDT 1999 24613
Sat Oct 2 10:56:43 EDT 1999 43616
Sat Oct 2 12:28:41 EDT 1999 29203
Sat Oct 2 12:28:45 EDT 1999 5664
Sat Oct 2 12:28:50 EDT 1999 49757
Sat Oct 2 12:28:54 EDT 1999 24538
Sat Oct 2 12:48:30 EDT 1999 10402
Sat Oct 2 12:48:35 EDT 1999 28027
Sat Oct 2 12:48:52 EDT 1999 34465
Sat Oct 2 12:49:09 EDT 1999 47038
Sat Oct 2 12:49:27 EDT 1999 19498
Sat Oct 2 12:49:41 EDT 1999 12337
Sat Oct 2 12:49:53 EDT 1999 7509
Sat Oct 2 12:50:08 EDT 1999 13811
Sat Oct 2 12:50:13 EDT 1999 44810
Sat Oct 2 12:50:18 EDT 1999 789
Sat Oct 2 12:50:34 EDT 1999 44650
Sat Oct 2 12:50:51 EDT 1999 35003
Sat Oct 2 12:50:56 EDT 1999 24235
Sat Oct 2 12:51:00 EDT 1999 33905
Sat Oct 2 12:51:05 EDT 1999 29849
Sat Oct 2 12:51:10 EDT 1999 29775
Sat Oct 2 12:51:14 EDT 1999 33192
Sat Oct 2 12:51:20 EDT 1999 38400
Sat Oct 2 13:04:47 EDT 1999 22658
Sat Oct 2 13:05:04 EDT 1999 48502
Sat Oct 2 13:52:36 EDT 1999 18537
Sat Oct 2 14:03:03 EDT 1999 28614
Sat Oct 2 14:03:08 EDT 1999 5182
Sat Oct 2 14:03:12 EDT 1999 20237
Sat Oct 2 14:03:17 EDT 1999 39441
Sat Oct 2 14:26:04 EDT 1999 13712
Sat Oct 2 14:26:07 EDT 1999 7070
Sat Oct 2 14:26:11 EDT 1999 5193
Sat Oct 2 14:26:16 EDT 1999 1108
Sat Oct 2 14:26:20 EDT 1999 27825
Sat Oct 2 14:26:24 EDT 1999 31976
Sat Oct 2 14:26:30 EDT 1999 6851
Sat Oct 2 14:26:35 EDT 1999 42334
Sat Oct 2 14:26:40 EDT 1999 25335
Sat Oct 2 14:26:45 EDT 1999 33920
Sat Oct 2 14:26:50 EDT 1999 23450
Sat Oct 2 14:26:55 EDT 1999 12781
Sat Oct 2 14:49:52 EDT 1999 8475
Sat Oct 2 14:52:09 EDT 1999 16987
Sat Oct 2 15:20:50 EDT 1999 43518
Sat Oct 2 15:20:55 EDT 1999 964
Sat Oct 2 15:21:00 EDT 1999 29458
Sat Oct 2 15:21:04 EDT 1999 6810
Sat Oct 2 15:37:56 EDT 1999 15116
Sat Oct 2 16:59:25 EDT 1999 48833
Sat Oct 2 16:59:30 EDT 1999 34283
Sat Oct 2 16:59:34 EDT 1999 17260
Sat Oct 2 16:59:38 EDT 1999 43527
Sat Oct 2 16:59:43 EDT 1999 13926
Sat Oct 2 16:59:48 EDT 1999 40448
Sat Oct 2 16:59:53 EDT 1999 10788
Sat Oct 2 16:59:57 EDT 1999 47029
Sat Oct 2 17:00:03 EDT 1999 15024
Sat Oct 2 17:00:09 EDT 1999 15717
Sat Oct 2 17:00:14 EDT 1999 25869
Sat Oct 2 17:15:42 EDT 1999 25465
Sat Oct 2 17:15:46 EDT 1999 22230
Sat Oct 2 17:15:51 EDT 1999 175
Sat Oct 2 17:15:56 EDT 1999 19955
Sat Oct 2 17:16:00 EDT 1999 21303
Sat Oct 2 17:16:05 EDT 1999 27418
Sat Oct 2 17:16:10 EDT 1999 38705
Sat Oct 2 17:16:15 EDT 1999 1408
Sat Oct 2 17:16:20 EDT 1999 27856
Sat Oct 2 17:16:25 EDT 1999 5998
Sat Oct 2 17:16:30 EDT 1999 16114
ploticus-2.42/pltestsuite/data28 0000644 0001750 0001750 00000035057 10071330136 015674 0 ustar colin colin // This file contains the cellcount fields.
//
// Counts were taken after sac, so to build analysis groups
// rows must be selected based on @sactime and @inj.
//
strain sex id sactime inj aero cells_ml pct_mac pct_neutro pct_lym pct_air pct_eos
129S1/SvImJ m 12493 0 ctrl CTRLaero 11207 95 1 0 4 0
129S1/SvImJ m 12494 0 ctrl CTRLaero 12727 86 13 0 1 0
129S1/SvImJ m 12495 0 ctrl CTRLaero 11538 96 0 0 4 0
129S1/SvImJ m 12496 0 trt CTRLaero 10909 88 2 0 10 0
129S1/SvImJ m 12497 0 trt CTRLaero 19091 92 1 0 7 0
129S1/SvImJ m 12498 0 trt CTRLaero 28125 96 1 0 30 0
129S1/SvImJ m 12499 24 ctrl OVAaero 15789 92.5 1.50 0 4.50 1.50
129S1/SvImJ m 12500 24 ctrl OVAaero 9091 93.5 3.50 0 1.50 1
129S1/SvImJ m 12501 24 ctrl OVAaero 10000 90 0 0 10 0
129S1/SvImJ m 12502 24 ctrl OVAaero 20755 96 0 0 2 1.50
129S1/SvImJ m 12503 24 ctrl OVAaero 6818 82 1 0 16.5 0.500
129S1/SvImJ m 12504 24 trt OVAaero 17925 74.5 13 0 3.50 9
129S1/SvImJ m 12505 24 trt OVAaero 222222 10 10 0 0 80
129S1/SvImJ m 12506 24 trt OVAaero 40000 36.5 6.50 0 0 57
129S1/SvImJ m 12507 24 trt OVAaero 21053 77.5 4.50 0 5 13.5
129S1/SvImJ m 12508 24 trt OVAaero 105357 17 5.50 0 0 77.5
129S1/SvImJ m 12509 48 ctrl OVAaero 7547 85.5 1.50 0 5.50 7.50
129S1/SvImJ m 12510 48 ctrl OVAaero 6667 90.5 1 0 7.50 2
129S1/SvImJ m 12511 48 ctrl OVAaero 8772 80.5 0.500 0 7 7.50
129S1/SvImJ m 12512 48 ctrl OVAaero 20000 90 1.50 0 3 5.50
129S1/SvImJ m 12513 48 ctrl OVAaero 11538 78 3 0 2.50 16.5
129S1/SvImJ m 12514 48 trt OVAaero 331481 17.5 5 0 0 77.5
129S1/SvImJ m 12515 48 trt OVAaero 64151 25.5 5 2 4 64.5
129S1/SvImJ m 12516 48 trt OVAaero 238983 14.5 2 0 0 83.5
129S1/SvImJ m 12517 48 trt OVAaero 168000 = = = = =
129S1/SvImJ m 12518 48 trt OVAaero 267797 13.5 4.50 0 0 82
129S1/SvImJ m 12519 72 ctrl OVAaero 12727 87 0 0 13 0
129S1/SvImJ m 12520 72 ctrl OVAaero 15385 91.5 0 0 6.50 2
129S1/SvImJ m 12521 72 ctrl OVAaero 15094 86.5 0 0 11 2.50
129S1/SvImJ m 12522 72 ctrl OVAaero 182143 95 4 0 0 1
129S1/SvImJ m 12523 72 ctrl OVAaero NA = = = = =
129S1/SvImJ m 12524 72 trt OVAaero 31667 53 0 0 6 41
129S1/SvImJ m 12525 72 trt OVAaero 8824 67 1.50 0 14 18
129S1/SvImJ m 12526 72 trt OVAaero 1000000 40 4 0 0 56
129S1/SvImJ m 12527 72 trt OVAaero 627119 18 6 0 0 76
129S1/SvImJ m 12528 72 trt OVAaero 440000 20 5 0 0 75
A/J m 11616 0 trt CTRLaero 22727 100 0 0 0 0
A/J m 11617 0 trt CTRLaero 8333 100 0 0 0 0
A/J m 11618 0 trt CTRLaero 8333 100 0 0 0 0
A/J m 11619 24 trt OVAaero 27500 68 5 0 1 26
A/J m 11620 24 trt OVAaero 36364 82 5 1 0 12
A/J m 11621 24 trt OVAaero 32727 42 4 0 0 54
A/J m 11622 0 ctrl CTRLaero 5833 98 0 0 2 0
A/J m 11623 0 ctrl CTRLaero 15455 100 0 0 0 0
A/J m 11624 0 ctrl CTRLaero 1818 98 0 1 1 0
A/J m 11625 24 ctrl OVAaero 16667 100 0 0 0 0
A/J m 11626 24 ctrl OVAaero 21818 98 2 0 0 0
A/J m 11627 24 ctrl OVAaero 5000 98 1 1 0 0
A/J m 11628 24 trt OVAaero 19167 42 7 1 1 49
A/J m 11629 24 trt OVAaero 61818 48 8 2 0 42
A/J m 11630 48 trt OVAaero 14545 50 0 5 0 45
A/J m 11631 48 trt OVAaero 16667 75 0 1 0 24
A/J m 11632 48 trt OVAaero 30833 76 0 0 0 24
A/J m 11633 48 trt OVAaero 10000 60 1 0 0 39
A/J m 11634 24 ctrl OVAaero 5000 98 2 0 0 0
A/J m 11635 24 ctrl OVAaero 4000 98 2 0 0 0
A/J m 11636 48 ctrl OVAaero 3636 99 0 0 0 1
A/J m 11637 48 ctrl OVAaero 1818 95 0 0 5 0
A/J m 11638 48 ctrl OVAaero 20000 100 0 0 0 0
A/J m 11639 48 ctrl OVAaero = = = = = =
A/J m 11640 48 trt OVAaero 23636 46 2 0 0 52
A/J m 11641 72 trt OVAaero 41667 57 0 1 0 42
A/J m 11642 72 trt OVAaero 59167 62 0 0 0 38
A/J m 11643 72 trt OVAaero 36364 58 0 1 0 40
A/J m 11644 72 trt OVAaero 21818 51 0 1 0 48
A/J m 11645 48 ctrl OVAaero 13333 100 0 0 0 0
A/J m 11646 72 ctrl OVAaero 3636 94 2 3 0 1
A/J m 11647 72 ctrl OVAaero 3636 92 0 4 0 4
A/J m 11648 72 ctrl OVAaero 9091 98 0 2 0 0
A/J m 11649 72 ctrl OVAaero 4000 96 0 2 0 2
A/J m 11650 72 ctrl OVAaero 1667 99 0 0 1 0
A/J m NA 72 trt OVAaero = = = = = =
BALB/cJ m 12339 0 ctrl CTRLaero 12000 90 0 0 10 0
BALB/cJ m 12340 0 ctrl CTRLaero 4000 60 0 1 37 2
BALB/cJ m 12341 0 ctrl CTRLaero 17308 93 0 0 7 0
BALB/cJ m 12342 0 trt CTRLaero 1852 62 1 0 37 0
BALB/cJ m 12343 0 trt CTRLaero 16364 72 6 2 20 0
BALB/cJ m 12344 0 trt CTRLaero 10000 80 1 2 17 0
BALB/cJ m 12345 24 ctrl OVAaero 11538 76 6 1 16 1
BALB/cJ m 12346 24 ctrl OVAaero 12727 77 5 9 5 4
BALB/cJ m 12347 24 ctrl OVAaero 12500 80 16 1 0 3
BALB/cJ m 12348 24 ctrl OVAaero 12000 63 6 1 30 0
BALB/cJ m 12349 24 ctrl OVAaero 9259 72 10 2 14 2
BALB/cJ m 12350 24 trt OVAaero 23636 62 17 4 0 17
BALB/cJ m 12351 24 trt OVAaero 10000 81 8 1 9 1
BALB/cJ m 12352 24 trt OVAaero 17391 44 16 5 6 29
BALB/cJ m 12353 24 trt OVAaero 10169 51 16 6 0 27
BALB/cJ m 12354 24 trt OVAaero 11111 48 19 3 32 0
BALB/cJ m 12355 48 ctrl OVAaero 12500 68 3 1 26 2
BALB/cJ m 12356 48 ctrl OVAaero 17241 79 2 0 19 0
BALB/cJ m 12357 48 ctrl OVAaero 12069 66 1 2 31 0
BALB/cJ m 12358 48 ctrl OVAaero 8333 78 2 1 19 0
BALB/cJ m 12359 48 ctrl OVAaero 12245 64 0 0 36 0
BALB/cJ m 12360 48 trt OVAaero 21569 75 1 2 12 10
BALB/cJ m 12361 48 trt OVAaero 20833 47 15 3 0 35
BALB/cJ m 12362 48 trt OVAaero 44444 77 5 1 2 15
BALB/cJ m 12363 48 trt OVAaero 21154 71 3 1 24 1
BALB/cJ m 12364 48 trt OVAaero 11111 59 2 3 3 33
BALB/cJ m 12365 72 ctrl OVAaero 8000 70 0 2 25 3
BALB/cJ m 12366 72 ctrl OVAaero 7547 42 2 9 46 1
BALB/cJ m 12367 72 ctrl OVAaero 5000 81 1 6 5 7
BALB/cJ m 12368 72 ctrl OVAaero 10000 81 1 0 18 0
BALB/cJ m 12369 72 ctrl OVAaero 8000 49 3 0 47 0
BALB/cJ m 12370 72 trt OVAaero 85455 55 5 0 8 32
BALB/cJ m 12371 72 trt OVAaero 36842 51 5 5 11 28
BALB/cJ m 12372 72 trt OVAaero 16364 65 1 4 19 11
BALB/cJ m 12373 72 trt OVAaero 49091 62 12 0 2 24
BALB/cJ m 12374 72 trt OVAaero 96154 46 4 3 6 41
BTBR_T+_tf/J m 12061 24 ctrl OVAaero 44828 67 29 0 0 4
BTBR_T+_tf/J m 12062 24 ctrl OVAaero 45192 42 50 0 0 8
BTBR_T+_tf/J m 12063 24 ctrl OVAaero 34545 63 31 0 0 6
BTBR_T+_tf/J m 12064 24 ctrl OVAaero 41818 53 43 0 1 3
BTBR_T+_tf/J m 12065 24 ctrl OVAaero 42593 58 27 0 7 8
BTBR_T+_tf/J m 12066 48 ctrl OVAaero 16000 95 2 0 3 0
BTBR_T+_tf/J m 12067 48 ctrl OVAaero 26364 87 4 0 9 0
BTBR_T+_tf/J m 12068 24 trt OVAaero 75000 41 46 0 0 10
BTBR_T+_tf/J m 12069 24 trt OVAaero 116667 41 56 0 2 1
BTBR_T+_tf/J m 12070 24 trt OVAaero 73000 46 35 0 0 19
BTBR_T+_tf/J m 12071 24 trt OVAaero 210000 32 43 0 0 25
BTBR_T+_tf/J m 12072 24 trt OVAaero 39655 69 22 0 0 9
BTBR_T+_tf/J m 12073 48 trt OVAaero 226415 50 24 1 0 25
BTBR_T+_tf/J m 12074 48 trt OVAaero 21429 90 7 0 3 0
BTBR_T+_tf/J m 12075 48 trt OVAaero 232692 52 20 1 1 26
BTBR_T+_tf/J m 12076 72 ctrl OVAaero 15094 88 0 0 10 2
BTBR_T+_tf/J m 12077 72 ctrl OVAaero 18000 88 0 0 12 0
BTBR_T+_tf/J m 12078 72 ctrl OVAaero 12245 75 0 0 25 0
BTBR_T+_tf/J m 12079 72 ctrl OVAaero 25455 91 0 2 6 1
BTBR_T+_tf/J m 12080 72 trt OVAaero 22917 87 0 1 10 2
BTBR_T+_tf/J m 12081 72 trt OVAaero 68000 47 0 2 10 41
BTBR_T+_tf/J m 12082 72 trt OVAaero 61538 35 4 11 4 46
BTBR_T+_tf/J m 12083 72 trt OVAaero 45833 64 0 1 10 24
BTBR_T+_tf/J m 12084 72 trt OVAaero 44231 54 1 8 0 37
BTBR_T+_tf/J m 12086 48 ctrl OVAaero 32500 93 2 0 4 1
BTBR_T+_tf/J m 12087 48 ctrl OVAaero 19643 93 0 1 5 1
BTBR_T+_tf/J m 12088 48 ctrl OVAaero 23256 92 0 0 7 1
BTBR_T+_tf/J m 12089 48 trt OVAaero 35849 68 5 8 0 19
BTBR_T+_tf/J m 12090 48 trt OVAaero 37500 87 1 8 4 0
BTBR_T+_tf/J m 12091 0 ctrl CTRLaero 17544 98 0 0 2 0
BTBR_T+_tf/J m 12092 0 ctrl CTRLaero 21818 85 2 3 8 1
BTBR_T+_tf/J m 12093 0 ctrl CTRLaero 12963 91 0 0 9 0
BTBR_T+_tf/J m 12094 0 trt CTRLaero 13208 87 0 1 12 0
BTBR_T+_tf/J m 12095 0 trt CTRLaero 10000 88 0 1 11 0
BTBR_T+_tf/J m 12096 0 trt CTRLaero 15517 91 1 1 7 0
BTBR_T+_tf/J m NA 72 ctrl OVAaero DI = = = = =
C3H/HeJ m 11672 0 trt CTRLaero 14545 100 0 0 0 0
C3H/HeJ m 11673 0 trt CTRLaero 18182 98 0 1 1 0
C3H/HeJ m 11674 0 trt CTRLaero 14444 100 0 0 0 0
C3H/HeJ m 11675 24 trt OVAaero 20000 77 3 0 0 20
C3H/HeJ m 11676 24 trt OVAaero 3333 59 2 1 0 38
C3H/HeJ m 11677 24 trt OVAaero 3636 96 4 0 0 0
C3H/HeJ m 11678 0 ctrl CTRLaero 5833 99 0 1 0 0
C3H/HeJ m 11679 0 ctrl CTRLaero 16000 100 0 0 0 0
C3H/HeJ m 11680 0 ctrl CTRLaero 1818 100 0 0 0 0
C3H/HeJ m 11681 24 ctrl OVAaero 3636 92 6 2 0 0
C3H/HeJ m 11682 24 ctrl OVAaero 3333 94 3 1 0 0
C3H/HeJ m 11683 24 ctrl OVAaero 5000 97 3 0 0 0
C3H/HeJ m 11684 24 trt OVAaero 8000 98 0 0 2 0
C3H/HeJ m 11685 24 trt OVAaero 21818 75 2 1 0 22
C3H/HeJ m 11686 72 trt OVAaero 13333 53 0 9 0 38
C3H/HeJ m 11687 72 trt OVAaero 8333 90 1 1 0 8
C3H/HeJ m 11688 72 trt OVAaero 18182 40 0 2 0 58
C3H/HeJ m 11689 72 trt OVAaero 8333 92 0 3 0 5
C3H/HeJ m 11690 24 ctrl OVAaero 5000 97 2 1 0 0
C3H/HeJ m 11691 24 ctrl OVAaero 6000 99 1 0 0 0
C3H/HeJ m 11692 72 ctrl OVAaero 13333 98 1 0 1 0
C3H/HeJ m 11693 72 ctrl OVAaero 7273 100 0 0 0 0
C3H/HeJ m 11694 72 ctrl OVAaero 3333 100 0 0 0 0
C3H/HeJ m 11695 72 ctrl OVAaero 3636 96 1 2 0 1
C3H/HeJ m 11696 72 trt OVAaero 23636 57 0 2 0 45
C3H/HeJ m 11697 48 trt OVAaero 8000 85 0 0 0 15
C3H/HeJ m 11698 48 trt OVAaero 16364 88 0 0 0 22
C3H/HeJ m 11699 48 trt OVAaero 16667 53 1 2 0 44
C3H/HeJ m 11700 48 trt OVAaero 8000 67 0 0 0 33
C3H/HeJ m 11701 48 trt OVAaero 14000 86 0 0 0 14
C3H/HeJ m 11702 72 ctrl OVAaero 3636 100 0 0 0 0
C3H/HeJ m 11703 48 ctrl OVAaero 2500 97 0 3 0 0
C3H/HeJ m 11704 48 ctrl OVAaero 8333 76 23 1 0 0
C3H/HeJ m 11705 48 ctrl OVAaero 3333 95 1 1 0 3
C3H/HeJ m 11706 48 ctrl OVAaero 8000 92 0 8 0 0
C3H/HeJ m 11707 48 ctrl OVAaero 3333 100 0 0 0 0
C57BL/6J m 11791 0 trt CTRLaero 5455 95 1 1 3 0
C57BL/6J m 11792 0 trt CTRLaero 11667 96 1 3 0 0
C57BL/6J m 11793 0 trt CTRLaero 15833 93 1 4 2 0
C57BL/6J m 11794 24 trt OVAaero 45000 59 18 4 0 19
C57BL/6J m 11795 24 trt OVAaero 23333 47 25 3 0 25
C57BL/6J m 11796 24 trt OVAaero 25455 80 7 2 0 11
C57BL/6J m 11797 0 ctrl CTRLaero 13333 99 0 1 0 0
C57BL/6J m 11798 0 ctrl CTRLaero 6364 99 0 1 0 0
C57BL/6J m 11799 0 ctrl CTRLaero 11818 100 0 0 0 0
C57BL/6J m 11800 24 ctrl OVAaero 9167 89 1 1 9 0
C57BL/6J m 11801 24 ctrl OVAaero 6364 96 1 0 3 0
C57BL/6J m 11802 24 ctrl OVAaero 9167 97 1 1 1 0
C57BL/6J m 11803 24 trt OVAaero 14545 81 7 1 1 10
C57BL/6J m 11804 24 trt OVAaero 9167 85 5 2 0 8
C57BL/6J m 11805 48 trt OVAaero 362000 23 31 3 0 43
C57BL/6J m 11806 48 trt OVAaero 11667 96 1 1 2 0
C57BL/6J m 11807 48 trt OVAaero 67167 30 31 9 0 20
C57BL/6J m 11808 48 trt OVAaero 307273 15 32 4 0 49
C57BL/6J m 11809 24 ctrl OVAaero 8333 94 3 2 1 0
C57BL/6J m 11810 24 ctrl OVAaero 15833 99 0 0 1 0
C57BL/6J m 11811 48 ctrl OVAaero 88333 27 17 3 1 33
C57BL/6J m 11812 48 ctrl OVAaero 50000 25 23 3 0 49
C57BL/6J m 11813 48 ctrl OVAaero 17500 76 6 9 0 9
C57BL/6J m 11814 48 ctrl OVAaero 25000 75 4 3 0 18
C57BL/6J m 11815 48 trt OVAaero 36667 62 19 5 0 14
C57BL/6J m 11816 72 trt OVAaero 308333 11 5 3 0 81
C57BL/6J m 11817 72 trt OVAaero 116667 9 0 4 0 87
C57BL/6J m 11818 72 trt OVAaero 766667 8 8 4 0 80
C57BL/6J m 11819 72 trt OVAaero 251667 4 1 1 0 94
C57BL/6J m 11820 72 trt OVAaero 113333 31 0 3 0 64
C57BL/6J m 11821 48 ctrl OVAaero 15833 96 1 0 3 0
C57BL/6J m 11822 72 ctrl OVAaero 38462 53 1 6 0 40
C57BL/6J m 11823 72 ctrl OVAaero 28333 67 0 4 0 29
C57BL/6J m 11824 72 ctrl OVAaero 10000 97 0 0 0 3
C57BL/6J m 11825 72 ctrl OVAaero 10000 80 0 0 0 20
C57BL/6J m NA 72 ctrl OVAaero = = = = = =
DBA/2J m 11541 72 ctrl OVAaero 25455 100 0 0 0 0
DBA/2J m 11542 72 ctrl OVAaero 13636 100 0 0 0 0
DBA/2J m 11543 72 ctrl OVAaero 8000 99 1 0 0 0
DBA/2J m 11544 72 ctrl OVAaero 45455 100 0 0 0 0
DBA/2J m 11545 72 ctrl OVAaero 4545 98 1 1 0 0
DBA/2J m 11546 72 trt OVAaero 50000 90 0 0 0 10
DBA/2J m 11547 72 trt OVAaero 14545 83 0 2 0 15
DBA/2J m 11548 72 trt OVAaero 105000 55 0 1 0 44
DBA/2J m 11549 72 trt OVAaero 70000 57 0 3 0 40
DBA/2J m 11550 72 trt OVAaero 81667 69 0 0 0 31
DBA/2J m 11551 48 ctrl OVAaero 7273 98 2 0 0 0
DBA/2J m 11552 48 ctrl OVAaero 14000 100 0 0 0 0
DBA/2J m 11553 48 ctrl OVAaero 21000 100 0 0 0 0
DBA/2J m 11554 48 ctrl OVAaero 14545 100 0 0 0 0
DBA/2J m 11555 48 ctrl OVAaero 9167 100 0 0 0 0
DBA/2J m 11556 48 trt OVAaero 153333 23 0 0 0 77
DBA/2J m 11557 48 trt OVAaero 18333 34 0 0 0 66
DBA/2J m 11558 48 trt OVAaero 130000 9 0 1 0 90
DBA/2J m 11559 48 trt OVAaero 15000 34 0 0 0 66
DBA/2J m 11560 48 trt OVAaero 13636 95 0 0 0 5
DBA/2J m 11589 0 trt CTRLaero 15455 100 0 0 0 0
DBA/2J m 11590 0 trt CTRLaero 42000 100 0 0 0 0
DBA/2J m 11591 0 trt CTRLaero 11818 100 0 0 0 0
DBA/2J m 11592 0 ctrl CTRLaero 23636 100 0 0 0 0
DBA/2J m 11593 0 ctrl CTRLaero 3000 96 2 2 0 0
DBA/2J m 11594 0 ctrl CTRLaero 7273 99 1 0 0 0
DBA/2J m 11595 24 trt OVAaero 14545 76 15 5 0 4
DBA/2J m 11596 24 trt OVAaero 41818 78 9 1 0 12
DBA/2J m 11597 24 trt OVAaero 27273 52 11 1 0 36
DBA/2J m 11598 24 trt OVAaero 50000 70 4 0 0 26
DBA/2J m 11599 24 trt OVAaero 52000 28 17 0 0 55
DBA/2J m 11600 24 ctrl OVAaero 18333 99 1 0 0 0
DBA/2J m 11601 24 ctrl OVAaero 5000 94 1 3 0 2
DBA/2J m 11602 24 ctrl OVAaero 1667 98 1 1 0 0
DBA/2J m 11603 24 ctrl OVAaero 9000 96 1 0 0 3
DBA/2J m 11604 24 ctrl OVAaero 12727 97 2 1 0 0
FVB/NJ m 11845 0 trt CTRLaero 10000 96 2 0 2 0
FVB/NJ m 11846 0 trt CTRLaero 12727 94 1 0 5 0
FVB/NJ m 11847 0 trt CTRLaero 16364 94 1 0 5 0
FVB/NJ m 11848 24 trt OVAaero 56667 71 7 0 0 22
FVB/NJ m 11849 24 trt OVAaero 10833 87 4 1 0 8
FVB/NJ m 11850 24 trt OVAaero 17273 87 0 1 0 12
FVB/NJ m 11851 0 ctrl CTRLaero 2727 96 0 3 1 0
FVB/NJ m 11852 0 ctrl CTRLaero 9091 96 1 1 2 0
FVB/NJ m 11853 0 ctrl CTRLaero 10909 98 0 2 0 0
FVB/NJ m 11854 24 ctrl OVAaero 10833 100 0 0 0 0
FVB/NJ m 11855 24 ctrl OVAaero 10000 100 0 0 0 0
FVB/NJ m 11856 24 ctrl OVAaero 18182 100 0 0 0 0
FVB/NJ m 11857 24 trt OVAaero 5000 99 0 0 0 1
FVB/NJ m 11858 24 trt OVAaero 33333 100 0 0 0 0
FVB/NJ m 11859 48 trt OVAaero 141667 41 9 1 0 49
FVB/NJ m 11860 48 trt OVAaero 73333 21 0 0 0 79
FVB/NJ m 11861 48 trt OVAaero 136364 52 2 1 0 45
FVB/NJ m 11862 48 trt OVAaero 104167 46 0 0 0 54
FVB/NJ m 11863 24 ctrl OVAaero 17273 100 0 0 0 0
FVB/NJ m 11864 24 ctrl OVAaero 10909 100 0 0 0 0
FVB/NJ m 11865 48 ctrl OVAaero 16364 100 0 0 0 0
FVB/NJ m 11866 48 ctrl OVAaero 10909 100 0 0 0 0
FVB/NJ m 11867 48 ctrl OVAaero 10000 100 0 0 0 0
FVB/NJ m 11868 48 ctrl OVAaero 14545 100 0 0 0 0
FVB/NJ m 11869 48 trt OVAaero 60000 46 0 2 0 52
FVB/NJ m 11870 72 trt OVAaero 61818 26 0 2 0 72
FVB/NJ m 11871 72 trt OVAaero 27273 58 1 1 0 40
FVB/NJ m 11872 72 trt OVAaero 24000 54 0 1 0 45
FVB/NJ m 11873 72 trt OVAaero 192727 67 0 0 0 33
FVB/NJ m 11874 48 ctrl OVAaero 7273 100 0 0 0 0
FVB/NJ m 11875 72 ctrl OVAaero 13333 100 0 0 0 0
FVB/NJ m 11876 72 ctrl OVAaero 10000 100 0 0 0 0
FVB/NJ m 11877 72 ctrl OVAaero 21667 89 0 0 0 11
FVB/NJ m 11878 72 ctrl OVAaero 7273 100 0 0 0 0
FVB/NJ m 11879 72 ctrl OVAaero 10000 100 0 0 0 0
FVB/NJ m NA 72 trt OVAaero = = = = = =
ploticus-2.42/pltestsuite/catlines1.htm 0000644 0001750 0001750 00000001727 10743161002 017260 0 ustar colin colin catlines1

How to download and try this example
Usage: pl -gif catlines1.htm
#proc page
pagesize: 14 8
scale: 0.6
#proc getdata
file: hgb.dat
commentchar: //
#proc categories
axis: x
datafield: 1
#proc areadef
rectangle: 1 2 12 5
xscaletype: categories
yautorange: datafield=3,4 combomode=hilo
catbinsadjust: 1
// yaxis.stubs: inc
xaxis.tics: none
xaxis.ticincrement: 1
xaxis.grid: color=gray(0.7)
frame: color=gray(0.7) width=0.5
#proc categories
axis: x
slideamount: -0.5
#proc xaxis
stubs: usecategories
tics: none
stubvert: yes
#proc catlines
// subcats: M06 M12 M18
subcats: auto
catfield: 1
subcatfield: 2
valfield: 3
errfield: 4
linedetails: color=red width=1.0
dpsymbol: color=gray(0.5) radius=0.03 style=filled
errbardetails: color=gray(0.7)
plotwidth: 0.6
ploticus-2.42/pltestsuite/bars3.htm 0000644 0001750 0001750 00000003202 07372027314 016410 0 ustar colin colin bars3

How to download and try this example
Usage: pl -gif bars3.htm
#set TODATE = 9903
// Set up plotting area using proc areadef
#proc areadef
title: Monthly volume per operator
rectangle: 1 1 4 4
xscaletype: date yymm
xrange: 9704 9906
yrange: 0 1800
xaxis.stubs: inc 1 month
xaxis.stubformat: M
xaxis.autoyears: yes
yaxis.stubs: inc 500
yaxis.labeldetails: adjust=-0.3,0
// Read and process data file using proc getdata
#proc getdata
file: vermonth.tab
// draw bars for steve using proc bars
#proc bars
lenfield: 2
locfield: 1
color: red
outline: no
barsrange: 9704 @TODATE
legendlabel: Steve
barwidth: 0.07
outline: yes
#saveas B
// draw bars for lisa, stacking them above steve, using proc bars
#proc bars
#clone: B
lenfield: 3
color: yellow
stackfields: 2
legendlabel: Lisa
// draw bars for rob, stacking them above lisa and steve, using proc bars
#proc bars
#clone: B
lenfield: 4
color: blue
stackfields: 2 3
legendlabel: Rob
// draw bars for takisha, stacking them above the others, using proc bars
#proc bars
#clone: B
lenfield: 5
color: green
stackfields: 2 3 4
legendlabel: Takisha
// render legend using labels defined above (proc legend)
#proc legend
location: min+0.3 max
reverseorder: yes
seglen: 0.3
ploticus-2.42/pltestsuite/kmslide.htm 0000644 0001750 0001750 00000007512 07570466315 017046 0 ustar colin colin kmslide

How to download and try this example
Usage: pl -gif kmslide.htm
Note: the simplistic technique used herein for coloring the
overlapping ranges only works when one range is always below the other.
#proc page
linewidth: 2
textsize: 11
backgroundcolor: darkblue
color: white
pagesize: 6.6 4.4
#if @DEVICE in gif,png
scale: 0.7
#endif
// Set up plotting region using proc areadef
#proc areadef
title: Kaplan-Meier Example\nProtocol 2M\n10-31-99
titledetails: size=14 align=C
areaname: slide
// 'slide' is equivalent to: lower left at 1 0.7 and upper right at 5.85 3.2
yrange: 0 1
xrange: 0 60
xaxis.stubs: incremental 6
xaxis.label: Months
yaxis.stubs: incremental 0.1
yaxis.stubformat: %3.1f
// Get data (from end of this file) using proc getdata
#proc getdata
#intrailer
// do the blue range using proc rangesweep
#proc rangesweep
xfield: 1
lofield: 3
hifield: 4
color: powderblue
legendlabel: 95% CI Group A
// do the pink range using proc rangesweep
#proc rangesweep
xfield: 1
lofield: 6
hifield: 7
color: pink
legendlabel: 95% CI Group B
// do the yellow range which shows overlap using proc rangesweep
#proc rangesweep
xfield: 1
lofield: 6
hifield: 4
color: rgb(0.8,1,0.8)
legendlabel: Overlap of CIs
// now do the curves last so they come out on top of ranges..
// do the blue curve using proc lineplot
#proc lineplot
xfield: 1
yfield: 2
linedetails: color=blue
legendlabel: Group A
// do the red curve using proc lineplot
#proc lineplot
xfield: 1
yfield: 5
linedetails: color=red
legendlabel: Group B
// render the legend using proc legend
#proc legend
location: max-1 max
seglen: 0.2
specifyorder:
Group A
95% CI Group A
Group B
95% CI Group B
Overlap
// here is the data...
#proc trailer
data:
// T val1 lo1 hi1 val2 lo2 hi2
0 1 1 1 1 1 1
1 0.993 0.986 1.000 0.9895 0.981 0.998
2 0.9915 0.984 0.999 0.98 0.968 0.992
3 0.9845 0.974 0.995 0.972 0.958 0.986
4 0.9725 0.959 0.986 0.9625 0.946 0.979
5 0.937 0.916 0.958 0.9285 0.906 0.951
6 0.892 0.865 0.919 0.884 0.856 0.912
8 0.8335 0.801 0.866 0.8365 0.804 0.869
10 0.78 0.744 0.816 0.782 0.746 0.818
12 0.741 0.703 0.779 0.7585 0.721 0.796
14 0.6855 0.645 0.726 0.726 0.687 0.765
16 0.6565 0.615 0.698 0.6945 0.654 0.735
18 0.628 0.586 0.670 0.6595 0.618 0.701
20 0.607 0.564 0.650 0.6385 0.596 0.681
22 0.5685 0.525 0.612 0.6155 0.572 0.659
24 0.561 0.517 0.605 0.6035 0.560 0.647
26 0.536 0.491 0.581 0.569 0.524 0.614
28 0.514 0.469 0.559 0.539 0.493 0.585
30 0.497 0.451 0.543 0.5155 0.469 0.562
32 0.474 0.427 0.521 0.509 0.465 0.553
34 0.4635 0.416 0.511 0.4885 0.441 0.536
36 0.444 0.396 0.492 0.469 0.420 0.518
38 0.444 0.396 0.492 0.442 0.391 0.493
40 0.424 0.374 0.474 0.4365 0.385 0.488
42 0.4115 0.360 0.463 0.4305 0.379 0.482
44 0.403 0.350 0.456 0.4235 0.371 0.476
46 0.3865 0.331 0.442 0.415 0.361 0.469
48 0.3755 0.318 0.433 0.394 0.335 0.453
50 0.356 0.290 0.422 0.394 0.335 0.453
ploticus-2.42/pltestsuite/wind.csv 0000644 0001750 0001750 00000136260 07662442323 016360 0 ustar colin colin legendId,windTimeStamp,windLevel,windSpeed,windDirection
1,"2003-05-07 17:50:02",227,23.7,346
1,"2003-05-07 17:50:02",323,19.7,175
1,"2003-05-07 17:50:02",419,23.2,170
1,"2003-05-07 17:50:02",515,25.0,171
1,"2003-05-07 17:50:02",612,25.2,175
1,"2003-05-07 17:50:02",708,25.1,180
1,"2003-05-07 17:50:02",804,25.4,185
1,"2003-05-07 17:50:02",900,24.7,193
1,"2003-05-07 17:50:02",997,23.9,197
1,"2003-05-07 17:50:02",1093,22.3,205
1,"2003-05-07 17:50:02",1189,20.5,210
1,"2003-05-07 17:50:02",1285,19.1,215
1,"2003-05-07 17:50:02",1381,17.7,219
1,"2003-05-07 17:50:02",1478,15.4,220
1,"2003-05-07 17:50:02",1574,12.7,221
1,"2003-05-07 17:50:02",1670,11.4,218
1,"2003-05-07 17:50:02",1766,11.2,220
1,"2003-05-07 17:50:02",1863,11.3,216
1,"2003-05-07 17:50:02",1959,10.8,218
1,"2003-05-07 17:50:02",2055,10.1,222
1,"2003-05-07 17:50:02",2151,10.1,226
1,"2003-05-07 17:50:02",2247,11.3,231
1,"2003-05-07 17:50:02",2344,11.4,229
1,"2003-05-07 17:50:02",2440,10.9,227
1,"2003-05-07 12:50:47",227,81.9,303
1,"2003-05-07 12:50:47",419,20.4,342
1,"2003-05-07 12:50:47",515,24.2,166
1,"2003-05-07 12:50:47",612,24.2,170
1,"2003-05-07 12:50:47",708,23.4,171
1,"2003-05-07 12:50:47",804,24.5,170
1,"2003-05-07 12:50:47",900,24.2,170
1,"2003-05-07 12:50:47",997,23.5,167
1,"2003-05-07 12:50:47",1093,22.1,167
1,"2003-05-07 12:50:47",1189,21.3,168
1,"2003-05-07 12:50:47",1285,21.3,171
1,"2003-05-07 12:50:47",1381,22.5,181
1,"2003-05-07 12:50:47",1478,22.0,190
1,"2003-05-07 12:50:47",1574,22.9,191
1,"2003-05-07 12:50:47",1670,21.5,196
1,"2003-05-07 12:50:47",1766,18.6,194
1,"2003-05-07 12:50:47",1863,18.1,191
1,"2003-05-07 12:50:47",1959,18.9,189
1,"2003-05-07 12:50:47",2151,14.6,195
1,"2003-05-07 12:50:47",2247,12.4,196
1,"2003-05-07 12:50:47",2344,11.6,203
1,"2003-05-07 17:51:42",344,19.5,328
1,"2003-05-07 17:51:42",729,24.5,176
1,"2003-05-07 17:51:42",1113,22.8,193
1,"2003-05-07 17:51:42",1498,15.0,215
1,"2003-05-07 17:51:42",1883,10.9,221
1,"2003-05-07 17:51:42",2268,10.8,228
1,"2003-05-07 12:52:27",729,23.4,170
1,"2003-05-07 12:52:27",1113,22.7,168
1,"2003-05-07 12:52:27",1498,21.7,178
1,"2003-05-07 12:52:27",1883,18.5,188
1,"2003-05-07 12:52:27",2268,13.8,197
1,"2003-05-08 01:50:05",131,52.6,79
1,"2003-05-08 01:50:05",227,35.1,303
1,"2003-05-08 01:50:05",323,77.6,303
1,"2003-05-08 01:50:05",515,10.2,333
1,"2003-05-08 01:50:05",612,12.6,337
1,"2003-05-08 01:50:05",708,11.0,340
1,"2003-05-08 01:50:05",804,13.5,101
1,"2003-05-08 01:50:05",997,10.9,76
1,"2003-05-08 01:50:05",1670,6.2,247
1,"2003-05-08 01:50:05",1766,6.8,245
1,"2003-05-08 01:50:05",1863,8.2,251
1,"2003-05-08 01:50:05",1959,9.8,250
1,"2003-05-08 01:50:05",2055,10.6,250
1,"2003-05-08 01:50:05",2151,11.7,243
1,"2003-05-08 01:50:05",2247,13.3,237
2,"2003-05-08 00:00:00",32,1.40463518395347,310.201560941063
2,"2003-05-08 00:00:00",72,1.96290600895713,285.520057540651
2,"2003-05-08 00:00:00",154,3.94178893397401,282.907996636264
2,"2003-05-08 00:00:00",280,6.06268092513535,293.576472596661
2,"2003-05-08 00:00:00",451,7.48305418929998,303.881231416802
2,"2003-05-08 00:00:00",670,7.29021947543419,308.642993252938
2,"2003-05-08 00:00:00",950,7.35611990114354,304.362082548605
2,"2003-05-08 00:00:00",1280,8.85641010793877,287.060582336928
2,"2003-05-08 00:00:00",1681,10.0504975001241,270.446080451949
2,"2003-05-08 00:00:00",2140,10.9233145152925,250.771346912668
2,"2003-05-08 01:00:00",32,1.22380554010839,313.161938995266
2,"2003-05-08 01:00:00",72,2.02232539419353,337.404052824495
2,"2003-05-08 01:00:00",155,4.01139626564118,319.965950000101
2,"2003-05-08 01:00:00",280,6.67108686796987,317.970450316873
2,"2003-05-08 01:00:00",451,8.89281170384261,320.694487303731
2,"2003-05-08 01:00:00",670,8.51818055690298,326.873451877609
2,"2003-05-08 01:00:00",950,6.89104491350913,321.937702012258
2,"2003-05-08 01:00:00",1279,7.97659075043969,293.966683667443
2,"2003-05-08 01:00:00",1679,8.66750829246791,274.436534842078
2,"2003-05-08 01:00:00",2137,9.87579363899428,251.485386031763
2,"2003-05-08 02:00:00",32,1.70073513516949,330.967459813901
2,"2003-05-08 02:00:00",72,2.51914668092193,352.694628295682
2,"2003-05-08 02:00:00",155,4.45432374216334,335.81082297777
2,"2003-05-08 02:00:00",281,7.27780186594826,326.458487676335
2,"2003-05-08 02:00:00",452,9.96543024660752,326.507716102699
2,"2003-05-08 02:00:00",670,9.82700361249552,335.256322199995
2,"2003-05-08 02:00:00",950,6.42572953056694,338.808768490298
2,"2003-05-08 02:00:00",1279,6.7931215210682,302.632968261069
2,"2003-05-08 02:00:00",1678,7.53018592067952,280.113140006292
2,"2003-05-08 02:00:00",2135,8.99249131220042,254.748571316029
2,"2003-05-08 03:00:00",32,2.02800394476934,322.821274973128
2,"2003-05-08 03:00:00",73,2.90931263359578,344.019084430233
2,"2003-05-08 03:00:00",155,5.15911814169825,336.251776890049
2,"2003-05-08 03:00:00",282,8.10246875958186,330.697568747207
2,"2003-05-08 03:00:00",452,10.6489670860605,331.422396009169
2,"2003-05-08 03:00:00",671,10.5864299931563,339.035870263292
2,"2003-05-08 03:00:00",950,6.02747874322258,347.50959734145
2,"2003-05-08 03:00:00",1278,5.66083032778761,312.670513884778
2,"2003-05-08 03:00:00",1676,6.47797807961713,287.001541543869
2,"2003-05-08 03:00:00",2132,8.15453248200042,258.719933134673
2,"2003-05-08 04:00:00",32,2.34917006621487,303.723369804998
2,"2003-05-08 04:00:00",73,3.42242604010664,323.836958107735
2,"2003-05-08 04:00:00",155,5.79,330.306793050183
2,"2003-05-08 04:00:00",282,8.40334457225217,332.829010657647
2,"2003-05-08 04:00:00",452,10.7225463393729,336.782906938029
2,"2003-05-08 04:00:00",671,10.0880325138255,344.250689654867
2,"2003-05-08 04:00:00",950,5.76365335529471,343.761800799865
2,"2003-05-08 04:00:00",1277,5.47300648638388,314.815158852672
2,"2003-05-08 04:00:00",1675,6.0940708889871,288.909996918328
2,"2003-05-08 04:00:00",2130,7.93521896358254,261.99233963402
2,"2003-05-08 05:00:00",32,2.91238733687674,292.888819220042
2,"2003-05-08 05:00:00",73,4.26517291560377,313.392135645931
2,"2003-05-08 05:00:00",156,6.57343137181792,326.592441048147
2,"2003-05-08 05:00:00",282,8.77483333175052,333.837261185586
2,"2003-05-08 05:00:00",452,10.8124604045518,340.72466254453
2,"2003-05-08 05:00:00",670,9.70004639164164,347.267483797798
2,"2003-05-08 05:00:00",949,5.61680514171535,339.249490645403
2,"2003-05-08 05:00:00",1276,5.39545178831208,314.290243941798
2,"2003-05-08 05:00:00",1673,5.95658459186135,289.775071247447
2,"2003-05-08 05:00:00",2128,7.80627952356307,265.1805227034
2,"2003-05-08 06:00:00",32,3.48432202874533,290.519991196177
2,"2003-05-08 06:00:00",73,5.04920785866457,311.688574828693
2,"2003-05-08 06:00:00",156,7.34741451124135,325.504839665216
2,"2003-05-08 06:00:00",282,9.26335252486917,334.274608139604
2,"2003-05-08 06:00:00",452,10.847363735028,343.829981571329
2,"2003-05-08 06:00:00",670,9.01130401218381,347.338309927501
2,"2003-05-08 06:00:00",949,5.65226503271034,330.099614013336
2,"2003-05-08 06:00:00",1275,5.7097898385142,308.781000216014
2,"2003-05-08 06:00:00",1672,6.22656406053933,288.489893085936
2,"2003-05-08 06:00:00",2126,7.78617364306756,267.598110066095
2,"2003-05-08 07:00:00",32,3.7705304666585,295.455309888128
2,"2003-05-08 07:00:00",73,5.48172418131376,316.217625375192
2,"2003-05-08 07:00:00",156,7.58538067601093,327.616078340134
2,"2003-05-08 07:00:00",281,9.52634767368901,336.799655380542
2,"2003-05-08 07:00:00",452,10.5514975240484,347.236010076431
2,"2003-05-08 07:00:00",669,7.87764558735667,343.710259345716
2,"2003-05-08 07:00:00",949,5.98017558270658,317.183753531116
2,"2003-05-08 07:00:00",1274,6.44181651399665,301.376990051864
2,"2003-05-08 07:00:00",1670,6.7948804257323,286.795118708445
2,"2003-05-08 07:00:00",2123,7.81005761822536,270.096556367737
2,"2003-05-08 08:00:00",32,3.92730187278747,303.722749623439
2,"2003-05-08 08:00:00",73,5.70600560812903,322.853908992063
2,"2003-05-08 08:00:00",156,7.48062163192338,331.548522781352
2,"2003-05-08 08:00:00",281,9.27683674535668,340.193013167487
2,"2003-05-08 08:00:00",452,9.72613489521917,349.162885434229
2,"2003-05-08 08:00:00",669,6.91035454951481,332.299100681167
2,"2003-05-08 08:00:00",948,7.01206103795453,305.308878624941
2,"2003-05-08 08:00:00",1273,7.38068425012207,295.191932082815
2,"2003-05-08 08:00:00",1669,7.54120016973426,286.102574230808
2,"2003-05-08 08:00:00",2120,7.86122763949754,272.935165885538
2,"2003-05-08 09:00:00",32,3.96547601177967,311.752871964126
2,"2003-05-08 09:00:00",73,5.68876963850708,329.263418889085
2,"2003-05-08 09:00:00",155,7.18966619531116,335.823865450873
2,"2003-05-08 09:00:00",281,8.72401856944378,343.39754895092
2,"2003-05-08 09:00:00",451,8.82331570329431,350.176247467376
2,"2003-05-08 09:00:00",668,6.87273599085546,317.347330611818
2,"2003-05-08 09:00:00",948,8.05908803773727,298.374398359219
2,"2003-05-08 09:00:00",1272,8.24907873644082,290.282899217871
2,"2003-05-08 09:00:00",1667,8.28734577533724,285.250277633496
2,"2003-05-08 09:00:00",2118,7.98649485068387,274.538698353481
2,"2003-05-08 10:00:00",32,3.84707681233427,313.973788170828
2,"2003-05-08 10:00:00",73,5.42284980430032,330.298045978392
2,"2003-05-08 10:00:00",155,6.72293090846544,336.385564138064
2,"2003-05-08 10:00:00",281,7.92323166391088,343.35384279398
2,"2003-05-08 10:00:00",451,7.99145168289216,350.186471933546
2,"2003-05-08 10:00:00",667,7.32602211298874,306.836771022023
2,"2003-05-08 10:00:00",946,8.59014551681169,292.798708940254
2,"2003-05-08 10:00:00",1270,9.20489000477464,286.910383855531
2,"2003-05-08 10:00:00",1665,8.78231176854933,283.625173709326
2,"2003-05-08 10:00:00",2116,8.16919212652022,274.715323453814
2,"2003-05-08 11:00:00",32,3.69437410125179,317.225190960521
2,"2003-05-08 11:00:00",73,4.90294809272952,331.815600676518
2,"2003-05-08 11:00:00",155,5.86570541367362,336.061568070188
2,"2003-05-08 11:00:00",280,6.99411895809615,342.818584321879
2,"2003-05-08 11:00:00",450,7.16648449380866,350.855464186028
2,"2003-05-08 11:00:00",667,7.50798241873274,303.20366304026
2,"2003-05-08 11:00:00",945,8.54534376137087,290.044179172093
2,"2003-05-08 11:00:00",1268,9.36226468329111,287.126828432651
2,"2003-05-08 11:00:00",1663,8.25538612058818,282.666579184944
2,"2003-05-08 11:00:00",2115,8.00315562762589,275.821418941241
2,"2003-05-08 12:00:00",32,3.39607125955861,318.988549096248
2,"2003-05-08 12:00:00",73,4.53538311501906,334.184041709845
2,"2003-05-08 12:00:00",156,4.89612091353962,335.420431813748
2,"2003-05-08 12:00:00",280,5.41557937805365,338.904133359854
2,"2003-05-08 12:00:00",450,6.35033857365101,348.141031029247
2,"2003-05-08 12:00:00",666,7.39784428059959,304.421697712775
2,"2003-05-08 12:00:00",943,8.1488649516359,289.79652506365
2,"2003-05-08 12:00:00",1266,8.67107836430971,287.99434483019
2,"2003-05-08 12:00:00",1661,7.3623501682547,281.537015298437
2,"2003-05-08 12:00:00",2113,7.65,278.66213791926
2,"2003-05-08 13:00:00",32,2.84253408071038,320.517933082117
2,"2003-05-08 13:00:00",73,3.85529506004404,333.954978579683
2,"2003-05-08 13:00:00",156,3.99382022629963,333.80150556284
2,"2003-05-08 13:00:00",281,4.0968890636677,334.036848497229
2,"2003-05-08 13:00:00",451,5.58802290618068,343.35177509629
2,"2003-05-08 13:00:00",667,7.0129594323652,307.642652096784
2,"2003-05-08 13:00:00",944,7.28233479043637,293.311836230296
2,"2003-05-08 13:00:00",1267,7.52261922471156,289.82602006997
2,"2003-05-08 13:00:00",1661,6.49150213741011,281.413224947167
2,"2003-05-08 13:00:00",2114,7.15002797197326,282.379746099799
2,"2003-05-08 14:00:00",32,2.00897984061563,316.426488538238
2,"2003-05-08 14:00:00",73,2.91075591556558,327.854493301864
2,"2003-05-08 14:00:00",156,3.01264003823889,327.268546096917
2,"2003-05-08 14:00:00",282,3.11481941691649,326.720987703799
2,"2003-05-08 14:00:00",452,4.32187459327547,328.423495717271
2,"2003-05-08 14:00:00",668,6.46594927292196,311.622328174966
2,"2003-05-08 14:00:00",944,6.36317530797321,300.027057349941
2,"2003-05-08 14:00:00",1267,6.64307910535469,292.512044634961
2,"2003-05-08 14:00:00",1662,6.04804927228607,282.562868453507
2,"2003-05-08 14:00:00",2115,6.79720530806595,285.037175286764
2,"2003-05-08 15:00:00",32,1.13251931550857,298.891595287105
2,"2003-05-08 15:00:00",73,2.26384628453435,313.027698978726
2,"2003-05-08 15:00:00",157,2.41979337960909,312.80835650804
2,"2003-05-08 15:00:00",282,2.61137894607428,312.490530993348
2,"2003-05-08 15:00:00",453,3.17775077688607,312.395379163103
2,"2003-05-08 15:00:00",669,5.42796462774031,311.085636962235
2,"2003-05-08 15:00:00",945,5.99403870524707,308.796715266639
2,"2003-05-08 15:00:00",1268,6.29471206648882,297.991026495265
2,"2003-05-08 15:00:00",1662,5.97657092319668,285.681982826729
2,"2003-05-08 15:00:00",2116,6.69633481839133,286.962366685007
2,"2003-05-08 16:00:00",32,0.830240928887513,260.880603212848
2,"2003-05-08 16:00:00",73,2.00384630149121,292.443702115057
2,"2003-05-08 16:00:00",157,2.18504004539963,293.593749403459
2,"2003-05-08 16:00:00",283,2.41107859681098,295.131806225211
2,"2003-05-08 16:00:00",454,2.87600417245873,297.38419015418
2,"2003-05-08 16:00:00",670,4.20529428221141,302.501777426195
2,"2003-05-08 16:00:00",947,6.18896598794985,316.188111218144
2,"2003-05-08 16:00:00",1270,6.41131811720492,307.856443004412
2,"2003-05-08 16:00:00",1663,6.00170809020232,291.453595252987
2,"2003-05-08 16:00:00",2117,6.58210452666926,289.468602019363
2,"2003-05-08 17:00:00",32,1.0463746938836,218.350680198742
2,"2003-05-08 17:00:00",73,2.02,269.876772568448
2,"2003-05-08 17:00:00",157,2.19447032333545,273.529531016443
2,"2003-05-08 17:00:00",284,2.43248843779369,277.663088087701
2,"2003-05-08 17:00:00",455,2.8212408617486,282.762390068552
2,"2003-05-08 17:00:00",672,3.39948525515261,288.020355176349
2,"2003-05-08 17:00:00",949,6.24374887387377,317.537736998785
2,"2003-05-08 17:00:00",1271,6.56745003787619,317.156801678493
2,"2003-05-08 17:00:00",1664,5.92595983786593,297.053166739963
2,"2003-05-08 17:00:00",2118,6.35836456960436,291.247282215661
2,"2003-05-08 18:00:00",32,1.44557946858691,199.78666432493
2,"2003-05-08 18:00:00",73,2.04298800779642,250.758527227969
2,"2003-05-08 18:00:00",157,2.18341475675145,257.194576269722
2,"2003-05-08 18:00:00",285,2.35227549406952,264.028776999833
2,"2003-05-08 18:00:00",456,2.66422596639249,273.099900200645
2,"2003-05-08 18:00:00",674,3.192256255378,282.893900562058
2,"2003-05-08 18:00:00",951,5.50967331154942,313.566711803229
2,"2003-05-08 18:00:00",1273,6.55951979949752,325.674133507535
2,"2003-05-08 18:00:00",1666,5.69722739584791,304.244943193291
2,"2003-05-08 18:00:00",2118,5.91338312643448,293.894871822557
2,"2003-05-08 19:00:00",32,1.97772596686194,189.592052770151
2,"2003-05-08 19:00:00",73,2.32398364882372,230.693129010272
2,"2003-05-08 19:00:00",158,2.33585102264678,239.291485850891
2,"2003-05-08 19:00:00",285,2.36019067026374,248.015178370114
2,"2003-05-08 19:00:00",457,2.5486663179004,265.156940500125
2,"2003-05-08 19:00:00",674,3.02200264725231,284.031559867239
2,"2003-05-08 19:00:00",952,4.91809922632718,312.593444557866
2,"2003-05-08 19:00:00",1274,6.41463950662857,334.501471086524
2,"2003-05-08 19:00:00",1667,5.43765574489596,314.740754043515
2,"2003-05-08 19:00:00",2120,5.32016917024262,300.207904955041
2,"2003-05-08 20:00:00",32,2.31812424170923,188.921845732104
2,"2003-05-08 20:00:00",73,2.60967430918113,220.5932658011
2,"2003-05-08 20:00:00",158,2.42406683076189,233.482230311328
2,"2003-05-08 20:00:00",285,2.33,243.128450907618
2,"2003-05-08 20:00:00",457,2.36076258865647,271.331137165744
2,"2003-05-08 20:00:00",675,2.914875640572,299.215715318459
2,"2003-05-08 20:00:00",953,4.85202019781451,323.09922441154
2,"2003-05-08 20:00:00",1275,6.39203410504043,342.391241955801
2,"2003-05-08 20:00:00",1668,5.57355362403557,327.476409940969
2,"2003-05-08 20:00:00",2121,4.8382331485781,311.384560337331
2,"2003-05-08 21:00:00",32,2.31482180739685,189.937002352739
2,"2003-05-08 21:00:00",73,2.55501467706156,218.432006441292
2,"2003-05-08 21:00:00",158,2.16905509381389,236.964472809286
2,"2003-05-08 21:00:00",285,2.009601950636,253.71855277715
2,"2003-05-08 21:00:00",458,2.23707398178961,294.689445808509
2,"2003-05-08 21:00:00",676,3.24006172780705,322.580940609845
2,"2003-05-08 21:00:00",954,5.05949602233266,336.007584925433
2,"2003-05-08 21:00:00",1276,6.49278060618099,345.415918221024
2,"2003-05-08 21:00:00",1670,6.09926225046931,339.741696096556
2,"2003-05-08 21:00:00",2123,4.36790567663726,319.079965909238
2,"2003-05-08 22:00:00",32,2.14897650056951,193.435830703596
2,"2003-05-08 22:00:00",73,2.49721845259881,218.606875488807
2,"2003-05-08 22:00:00",157,1.8962067397834,243.617985158349
2,"2003-05-08 22:00:00",285,1.7401149387325,269.219131064044
2,"2003-05-08 22:00:00",457,2.29106961919537,315.168347764863
2,"2003-05-08 22:00:00",675,3.53012747645181,337.65090572339
2,"2003-05-08 22:00:00",953,4.86491520994971,342.682880136132
2,"2003-05-08 22:00:00",1275,6.34641631158877,348.777361849091
2,"2003-05-08 22:00:00",1669,6.17612337959662,349.131357221256
2,"2003-05-08 22:00:00",2121,3.67164813128927,321.219681940013
2,"2003-05-08 23:00:00",32,1.91637678967368,201.716116001832
2,"2003-05-08 23:00:00",73,2.34797785338789,223.904450696723
2,"2003-05-08 23:00:00",157,1.61789987329253,261.357687228892
2,"2003-05-08 23:00:00",284,1.69094648052503,295.0433909946
2,"2003-05-08 23:00:00",457,2.59886513693958,332.043265356073
2,"2003-05-08 23:00:00",675,3.83099203862394,347.25809148889
2,"2003-05-08 23:00:00",952,4.57450543774953,346.373590146451
2,"2003-05-08 23:00:00",1275,5.8966515922174,357.035582408253
2,"2003-05-08 23:00:00",1668,5.89383576289669,350.687217848835
2,"2003-05-08 23:00:00",2120,3.35,322.934129522036
2,"2003-05-09 00:00:00",32,1.5440207252495,216.522955415502
2,"2003-05-09 00:00:00",73,2.16092572755289,239.318691172794
2,"2003-05-09 00:00:00",157,1.63856644662339,299.061177868478
2,"2003-05-09 00:00:00",284,2.14946504972749,326.183434611151
2,"2003-05-09 00:00:00",456,3.19662321833525,345.649695594286
2,"2003-05-09 00:00:00",675,4.19109770823826,354.010017829946
2,"2003-05-09 00:00:00",952,4.44704396200442,350.579158188929
2,"2003-05-09 00:00:00",1274,5.36725255601038,4.83536653937347
2,"2003-05-09 00:00:00",1667,6.09338165553414,348.219696491564
2,"2003-05-09 00:00:00",2118,3.59477398455035,329.378134309626
2,"2003-05-09 01:00:00",32,1.00881118153994,252.005142915576
2,"2003-05-09 01:00:00",73,1.60224842018958,294.1690413836
2,"2003-05-09 01:00:00",156,2.63782107050497,348.841959332283
2,"2003-05-09 01:00:00",284,3.45244840656598,357.598549336868
2,"2003-05-09 01:00:00",456,4.25621897932895,3.33990456629897
2,"2003-05-09 01:00:00",674,4.75042103397162,5.55372389068407
2,"2003-05-09 01:00:00",951,4.73207142803234,1.93949678563308
2,"2003-05-09 01:00:00",1273,5.33970972993851,9.50204415518499
2,"2003-05-09 01:00:00",1666,6.55036640196562,354.241987159105
2,"2003-05-09 01:00:00",2117,3.63792523287656,338.5077047197
2,"2003-05-09 02:00:00",32,1.71679934762336,326.202040863975
2,"2003-05-09 02:00:00",73,3.08857572353342,355.488738080331
2,"2003-05-09 02:00:00",156,4.90926674769257,16.1860277540773
2,"2003-05-09 02:00:00",284,5.40120356957595,18.4551658492161
2,"2003-05-09 02:00:00",455,5.51530597519304,18.0656377962658
2,"2003-05-09 02:00:00",674,5.41365865196542,16.7507376962406
2,"2003-05-09 02:00:00",950,5.2461890930465,11.2200603679215
2,"2003-05-09 02:00:00",1273,6.01950994683122,10.6647192725268
2,"2003-05-09 02:00:00",1665,6.79982352712186,7.84182065213088
2,"2003-05-09 02:00:00",2116,3.38195209901027,344.341251989014
2,"2003-05-09 03:00:00",32,3.44095916860401,349.894123609578
2,"2003-05-09 03:00:00",73,5.15911814169825,13.5641022311171
2,"2003-05-09 03:00:00",156,6.77661419884591,31.9932175849485
2,"2003-05-09 03:00:00",283,6.64653293078429,32.7920327676844
2,"2003-05-09 03:00:00",455,5.90474385557917,25.4749632926943
2,"2003-05-09 03:00:00",673,5.35058875265143,18.5208973658017
2,"2003-05-09 03:00:00",950,5.54373520291148,8.21946327130257
2,"2003-05-09 03:00:00",1272,7.06770825657087,9.26992674826658
2,"2003-05-09 03:00:00",1664,6.59427782247609,17.6957701070154
2,"2003-05-09 03:00:00",2115,3.29971210865433,343.043947797952
2,"2003-05-09 04:00:00",32,4.79307834277722,11.5409018490149
2,"2003-05-09 04:00:00",73,6.63319681601564,27.7781665160227
2,"2003-05-09 04:00:00",156,8.27392289062449,45.9672515969432
2,"2003-05-09 04:00:00",282,7.32374903993849,43.0298453472993
2,"2003-05-09 04:00:00",454,6.0153969112603,27.4132183790308
2,"2003-05-09 04:00:00",672,5.56493486035551,15.4355978444112
2,"2003-05-09 04:00:00",948,6.89979709846601,6.39481221720132
2,"2003-05-09 04:00:00",1271,8.47502802355249,13.4611143928119
2,"2003-05-09 04:00:00",1663,6.17644719883527,24.495938754068
2,"2003-05-09 04:00:00",2113,3.36762527606621,332.768961324563
2,"2003-05-09 05:00:00",32,4.94,22.8353488349262
2,"2003-05-09 05:00:00",73,6.47074957018119,33.4734728569658
2,"2003-05-09 05:00:00",155,8.28481140400915,47.0897526557246
2,"2003-05-09 05:00:00",281,7.38610858300905,43.3220998581246
2,"2003-05-09 05:00:00",452,6.00097492079412,24.7279597131516
2,"2003-05-09 05:00:00",670,5.82073878472484,11.4252335487113
2,"2003-05-09 05:00:00",947,8.01207214146253,6.11266612958241
2,"2003-05-09 05:00:00",1269,9.09228244171946,12.0345680329397
2,"2003-05-09 05:00:00",1661,5.6849362353504,24.2987648250014
2,"2003-05-09 05:00:00",2111,3.7,325.594921095756
2,"2003-05-09 06:00:00",32,4.09206549312202,18.3024278852062
2,"2003-05-09 06:00:00",73,5.36003731330296,28.4940016381661
2,"2003-05-09 06:00:00",155,7.38664335134708,40.4140758878532
2,"2003-05-09 06:00:00",280,7.46836662195958,38.5063453574842
2,"2003-05-09 06:00:00",451,6.14857707116045,22.4845901619213
2,"2003-05-09 06:00:00",669,5.65305227288763,5.41544445240089
2,"2003-05-09 06:00:00",946,7.91364012323027,1.98197290566975
2,"2003-05-09 06:00:00",1267,9.23146792227542,3.09875056014926
2,"2003-05-09 06:00:00",1659,5.36492311221699,14.470413380397
2,"2003-05-09 06:00:00",2108,4.02836194997421,322.167110960554
2,"2003-05-09 07:00:00",32,3.65242385273122,16.2776101230208
2,"2003-05-09 07:00:00",73,5.01103781666034,29.738170049115
2,"2003-05-09 07:00:00",155,7.15069926650534,37.8660606905201
2,"2003-05-09 07:00:00",280,8.41005350755868,37.2699742394486
2,"2003-05-09 07:00:00",450,7.37499152541886,27.3996761211168
2,"2003-05-09 07:00:00",668,5.95309163376476,9.22178634508998
2,"2003-05-09 07:00:00",944,7.78301997941673,3.55650237377654
2,"2003-05-09 07:00:00",1266,8.91080804416749,1.01701205326418
2,"2003-05-09 07:00:00",1657,4.69669032404735,6.34925899544623
2,"2003-05-09 07:00:00",2106,4.80093740846514,317.850396894907
2,"2003-05-09 08:00:00",32,3.27649202654302,9.89678452379098
2,"2003-05-09 08:00:00",72,4.38563564378073,23.4475438835968
2,"2003-05-09 08:00:00",155,6.44906194729125,32.019926021417
2,"2003-05-09 08:00:00",279,8.82972819513715,35.0047598360131
2,"2003-05-09 08:00:00",449,8.73945078365912,27.594977562827
2,"2003-05-09 08:00:00",667,6.48077155900438,9.28941383288304
2,"2003-05-09 08:00:00",943,7.36010869484955,0.55741555420957
2,"2003-05-09 08:00:00",1264,8.31329657837371,356.516984084237
2,"2003-05-09 08:00:00",1656,4.51611558753759,352.512566680841
2,"2003-05-09 08:00:00",2104,5.3122688184993,320.154172173288
2,"2003-05-09 09:00:00",32,3.02238316564925,344.818182648392
2,"2003-05-09 09:00:00",72,4.13004842586621,359.476465799204
2,"2003-05-09 09:00:00",154,5.71052536987623,15.4543229721191
2,"2003-05-09 09:00:00",279,8.32281803237341,27.1440739364032
2,"2003-05-09 09:00:00",449,9.27920794033629,22.1096166094289
2,"2003-05-09 09:00:00",666,7.13763266076365,2.89277378408758
2,"2003-05-09 09:00:00",942,7.20573382800114,347.836179588895
2,"2003-05-09 09:00:00",1263,8.14734926218338,345.05519072707
2,"2003-05-09 09:00:00",1654,5.92868450838801,336.117837845291
2,"2003-05-09 09:00:00",2102,5.6868444677167,321.948068449231
2,"2003-05-09 10:00:00",32,3.57393340732588,340.331246939944
2,"2003-05-09 10:00:00",72,5.03953370858852,352.581954202645
2,"2003-05-09 10:00:00",154,6.65469758892168,6.88180524786776
2,"2003-05-09 10:00:00",279,8.91152063342727,20.8495023637104
2,"2003-05-09 10:00:00",449,9.94034707643551,17.7278051189255
2,"2003-05-09 10:00:00",666,8.00005624980225,359.53898115331
2,"2003-05-09 10:00:00",942,7.74162773581887,340.782901080293
2,"2003-05-09 10:00:00",1263,8.4639943289206,338.007092333043
2,"2003-05-09 10:00:00",1654,7.29937668571776,336.802864456489
2,"2003-05-09 10:00:00",2102,6.0605280298007,322.178829099674
2,"2003-05-09 11:00:00",32,4.24449054657918,345.311484796567
2,"2003-05-09 11:00:00",72,5.20499759846246,350.701765860343
2,"2003-05-09 11:00:00",155,7.67475081028694,2.25979289528857
2,"2003-05-09 11:00:00",279,10.0864760942561,15.9284650162035
2,"2003-05-09 11:00:00",449,10.3735866507202,9.7774307686521
2,"2003-05-09 11:00:00",666,8.92679673791221,352.749586471349
2,"2003-05-09 11:00:00",942,8.94471911241488,333.79702089374
2,"2003-05-09 11:00:00",1263,9.71670726120737,334.699756532602
2,"2003-05-09 11:00:00",1653,7.97213271339608,341.502710905083
2,"2003-05-09 11:00:00",2102,6.8006029144481,318.267842353264
1,"2003-05-07 18:50:17",419,15.9,180
1,"2003-05-07 18:50:17",515,20.6,180
1,"2003-05-07 18:50:17",612,22.4,184
1,"2003-05-07 18:50:17",708,22.4,192
1,"2003-05-07 18:50:17",804,22.1,198
1,"2003-05-07 18:50:17",900,21.6,204
1,"2003-05-07 18:50:17",997,19.9,206
1,"2003-05-07 18:50:17",1093,17.2,214
1,"2003-05-07 18:50:17",1189,15.6,216
1,"2003-05-07 18:50:17",1285,13.8,219
1,"2003-05-07 18:50:17",1381,11.9,222
1,"2003-05-07 18:50:17",1478,9.8,219
1,"2003-05-07 18:50:17",1574,8.6,224
1,"2003-05-07 18:50:17",1670,8.5,224
1,"2003-05-07 18:50:17",1766,8.4,227
1,"2003-05-07 18:50:17",1863,8.4,232
1,"2003-05-07 18:50:17",1959,8.5,236
1,"2003-05-07 18:50:17",2055,9.4,238
1,"2003-05-07 18:50:17",2151,9.7,236
1,"2003-05-07 18:50:17",2247,11.7,243
1,"2003-05-07 18:50:17",2344,11.0,237
1,"2003-05-07 13:50:54",515,23.0,167
1,"2003-05-07 13:50:54",612,23.7,169
1,"2003-05-07 13:50:54",708,23.2,172
1,"2003-05-07 13:50:54",804,24.7,169
1,"2003-05-07 13:50:54",900,23.3,168
1,"2003-05-07 13:50:54",997,23.8,166
1,"2003-05-07 13:50:54",1093,22.7,178
1,"2003-05-07 13:50:54",1189,21.7,180
1,"2003-05-07 13:50:54",1285,20.3,179
1,"2003-05-07 13:50:54",1381,19.6,182
1,"2003-05-07 13:50:54",1478,19.7,183
1,"2003-05-07 13:50:54",1574,19.4,185
1,"2003-05-07 13:50:54",1670,18.9,187
1,"2003-05-07 13:50:54",1766,18.5,189
1,"2003-05-07 13:50:54",1863,18.2,192
1,"2003-05-07 13:50:54",1959,18.1,194
1,"2003-05-07 13:50:54",2055,17.5,197
1,"2003-05-07 13:50:54",2151,16.8,199
1,"2003-05-07 13:50:54",2247,15.7,201
1,"2003-05-07 13:50:54",2344,15.1,201
1,"2003-05-07 13:50:54",2440,14.8,199
1,"2003-05-08 02:45:00",131,72.9,123
1,"2003-05-08 02:45:00",227,90.5,303
1,"2003-05-08 02:45:00",323,34.7,303
1,"2003-05-08 02:45:00",515,8.4,338
1,"2003-05-08 02:45:00",612,10.7,332
1,"2003-05-08 02:45:00",708,11.8,326
1,"2003-05-08 02:45:00",804,9.0,101
1,"2003-05-08 02:45:00",1093,14.9,271
1,"2003-05-08 02:45:00",1285,5.8,277
1,"2003-05-08 02:45:00",1381,6.5,266
1,"2003-05-08 02:45:00",1478,5.3,259
1,"2003-05-08 02:45:00",1670,5.8,254
1,"2003-05-08 02:45:00",1766,5.9,249
1,"2003-05-08 02:45:00",2151,8.2,243
1,"2003-05-08 02:45:00",2247,9.7,239
1,"2003-05-07 18:51:57",344,21.0,322
1,"2003-05-07 18:51:57",729,21.4,187
1,"2003-05-07 18:51:57",1113,17.5,210
1,"2003-05-07 18:51:57",1498,10.1,220
1,"2003-05-07 18:51:57",1883,8.5,232
1,"2003-05-07 18:51:57",2268,9.7,238
1,"2003-05-08 02:46:39",344,51.4,304
1,"2003-05-08 02:46:39",1113,6.2,293
1,"2003-05-08 03:40:30",131,73.8,123
1,"2003-05-08 03:40:30",227,35.8,303
1,"2003-05-08 03:40:30",323,56.8,303
1,"2003-05-08 03:40:30",515,6.8,341
1,"2003-05-08 03:40:30",612,8.7,335
1,"2003-05-08 03:40:30",708,9.4,329
1,"2003-05-08 03:40:30",804,13.0,104
1,"2003-05-08 03:40:30",900,2.6,262
1,"2003-05-08 03:40:30",1189,7.8,289
1,"2003-05-08 03:40:30",1574,6.0,247
1,"2003-05-08 03:40:30",1670,6.5,243
1,"2003-05-07 19:50:55",131,49.9,141
1,"2003-05-07 19:50:55",323,22.1,329
1,"2003-05-07 19:50:55",419,15.2,192
1,"2003-05-07 19:50:55",515,18.5,192
1,"2003-05-07 19:50:55",612,20.0,201
1,"2003-05-07 19:50:55",708,19.4,209
1,"2003-05-07 19:50:55",804,17.8,203
1,"2003-05-07 19:50:55",900,16.2,216
1,"2003-05-07 19:50:55",997,16.6,317
1,"2003-05-07 19:50:55",1189,7.5,205
1,"2003-05-07 19:50:55",1285,7.0,210
1,"2003-05-07 19:50:55",1381,6.0,218
1,"2003-05-07 19:50:55",1478,6.8,234
1,"2003-05-07 19:50:55",1574,8.2,246
1,"2003-05-07 19:50:55",1670,9.8,251
1,"2003-05-07 19:50:55",1766,11.3,254
1,"2003-05-07 19:50:55",1863,12.2,253
1,"2003-05-07 19:50:55",1959,12.1,253
1,"2003-05-07 19:50:55",2055,12.3,251
1,"2003-05-07 19:50:55",2151,11.8,243
1,"2003-05-07 19:50:55",2247,13.0,242
1,"2003-05-07 19:50:55",2344,13.0,240
1,"2003-05-08 03:42:09",1113,8.0,287
1,"2003-05-08 03:42:09",1498,5.8,259
1,"2003-05-08 03:42:09",1883,6.7,249
1,"2003-05-08 03:42:09",2268,8.5,255
1,"2003-05-07 19:52:34",729,17.4,205
1,"2003-05-07 19:52:34",1113,10.4,211
1,"2003-05-07 19:52:34",1498,8.1,245
1,"2003-05-07 19:52:34",1883,10.5,252
1,"2003-05-07 19:52:34",2268,12.2,248
1,"2003-05-08 04:37:05",344,52.3,303
1,"2003-05-08 04:37:05",729,44.9,298
1,"2003-05-08 04:37:05",1113,6.7,304
1,"2003-05-08 04:37:05",1498,6.4,252
1,"2003-05-08 04:37:05",1883,7.3,253
1,"2003-05-08 04:37:05",2268,8.9,252
1,"2003-05-08 04:35:26",131,74.1,123
1,"2003-05-08 04:35:26",227,91.2,303
1,"2003-05-08 04:35:26",323,35.6,302
1,"2003-05-08 04:35:26",419,21.9,290
1,"2003-05-08 04:35:26",515,7.4,351
1,"2003-05-08 04:35:26",708,19.5,280
1,"2003-05-08 04:35:26",900,16.1,110
1,"2003-05-08 04:35:26",997,12.4,77
1,"2003-05-08 04:35:26",1478,7.1,253
1,"2003-05-08 04:35:26",1574,7.5,259
1,"2003-05-08 04:35:26",1670,7.0,253
1,"2003-05-08 04:35:26",1766,7.8,257
1,"2003-05-08 05:30:23",323,36.5,302
1,"2003-05-08 05:30:23",515,8.6,333
1,"2003-05-08 05:30:23",612,9.2,336
1,"2003-05-08 05:30:23",708,7.5,332
1,"2003-05-08 05:30:23",804,17.5,115
1,"2003-05-08 05:30:23",997,11.9,73
1,"2003-05-08 05:30:23",1093,18.8,272
1,"2003-05-08 05:30:23",1189,7.8,298
1,"2003-05-08 05:30:23",1285,8.1,297
1,"2003-05-08 05:30:23",1381,8.3,295
1,"2003-05-08 05:30:23",1478,8.2,294
1,"2003-05-08 05:30:23",1574,7.9,283
1,"2003-05-08 05:30:23",1670,7.5,259
1,"2003-05-08 05:30:23",1766,8.5,249
1,"2003-05-08 05:30:23",1863,8.3,240
1,"2003-05-08 05:30:23",1959,9.0,242
1,"2003-05-08 05:32:02",344,53.2,303
1,"2003-05-08 05:32:02",1498,7.6,284
1,"2003-05-08 05:32:02",1883,7.8,251
1,"2003-05-08 05:32:02",2268,9.0,247
1,"2003-05-07 13:52:33",729,23.3,166
1,"2003-05-07 13:52:33",1113,23.0,169
1,"2003-05-07 13:52:33",1498,19.6,181
1,"2003-05-07 13:52:33",1883,18.2,189
1,"2003-05-07 13:52:33",2268,16.6,194
2,"2003-05-07 12:00:00",32,10.203964915659,123.36281070188
2,"2003-05-07 12:00:00",73,13.298308163071,133.540234842494
2,"2003-05-07 12:00:00",155,15.7050724289957,137.509711549321
2,"2003-05-07 12:00:00",280,19.180002606882,144.833493983807
2,"2003-05-07 12:00:00",450,22.352847693303,156.093711453915
2,"2003-05-07 12:00:00",668,20.9915078067298,161.900597058996
2,"2003-05-07 12:00:00",946,18.6272971737716,156.591172331223
2,"2003-05-07 12:00:00",1269,18.6269509045361,155.683575101036
2,"2003-05-07 12:00:00",1662,16.0268275088989,171.254955749242
2,"2003-05-07 12:00:00",2117,15.1962001829405,195.944251381893
2,"2003-05-07 13:00:00",32,10.3742758783445,131.315021488997
2,"2003-05-07 13:00:00",73,12.7386734003192,137.412557881628
2,"2003-05-07 13:00:00",155,15.3166347478811,140.856381368975
2,"2003-05-07 13:00:00",280,18.5660254227985,147.381810602795
2,"2003-05-07 13:00:00",450,21.7566656452683,157.803567508077
2,"2003-05-07 13:00:00",668,21.0450112853379,164.730000230493
2,"2003-05-07 13:00:00",946,18.7557164619217,160.075530488703
2,"2003-05-07 13:00:00",1269,18.5498517514292,159.48293044952
2,"2003-05-07 13:00:00",1663,15.6493610093192,173.882482880176
2,"2003-05-07 13:00:00",2118,15.8472363521215,196.662546593282
2,"2003-05-07 14:00:00",32,9.48369653668863,134.080353774115
2,"2003-05-07 14:00:00",73,11.7719369689104,140.603655923262
2,"2003-05-07 14:00:00",155,14.4821338206771,144.547722713421
2,"2003-05-07 14:00:00",280,17.783298344233,151.082055076436
2,"2003-05-07 14:00:00",450,21.2528586312524,160.7389066628
2,"2003-05-07 14:00:00",668,21.3343127379346,167.785063081804
2,"2003-05-07 14:00:00",946,19.0535928370478,164.402304809935
2,"2003-05-07 14:00:00",1269,17.8822174240221,166.138182219543
2,"2003-05-07 14:00:00",1664,15.5001451606106,177.082525142877
2,"2003-05-07 14:00:00",2120,16.9005798717085,197.681682264165
2,"2003-05-07 15:00:00",32,8.78777560023013,137.087789326956
2,"2003-05-07 15:00:00",73,10.9301646831143,143.494674535741
2,"2003-05-07 15:00:00",155,13.6455487247674,148.345123515106
2,"2003-05-07 15:00:00",280,16.8601304858533,155.353590474415
2,"2003-05-07 15:00:00",450,20.4383585446581,164.468672222396
2,"2003-05-07 15:00:00",668,21.1639410318589,169.670573099936
2,"2003-05-07 15:00:00",946,18.8604135691665,167.896376831834
2,"2003-05-07 15:00:00",1269,17.0253252538681,174.986114691356
2,"2003-05-07 15:00:00",1666,16.3574722986163,184.797787591177
2,"2003-05-07 15:00:00",2122,19.3868924791984,201.453688346133
2,"2003-05-07 16:00:00",32,8.41628183938727,136.215420263382
2,"2003-05-07 16:00:00",73,10.5520614099805,142.985378177213
2,"2003-05-07 16:00:00",155,13.3462953661306,148.711017778857
2,"2003-05-07 16:00:00",281,16.6243255502291,156.227577590534
2,"2003-05-07 16:00:00",451,20.4653976262373,164.199327350627
2,"2003-05-07 16:00:00",669,21.6241069179747,168.383819193829
2,"2003-05-07 16:00:00",947,19.4391769373088,171.01517541088
2,"2003-05-07 16:00:00",1271,18.622105144156,179.139653861027
2,"2003-05-07 16:00:00",1669,19.7566444519306,188.282799371243
2,"2003-05-07 16:00:00",2126,20.7880831247135,204.706616001606
2,"2003-05-07 17:00:00",32,7.93620816259251,136.489200880768
2,"2003-05-07 17:00:00",73,10.0843839673031,143.679889945657
2,"2003-05-07 17:00:00",155,12.9977921202026,149.984617448939
2,"2003-05-07 17:00:00",281,16.51,157.411106028177
2,"2003-05-07 17:00:00",451,20.4892288776323,163.665994670509
2,"2003-05-07 17:00:00",670,22.1445817300756,168.132942749592
2,"2003-05-07 17:00:00",948,20.6265896357105,173.913556045197
2,"2003-05-07 17:00:00",1273,20.8367415878779,181.4555277734
2,"2003-05-07 17:00:00",1672,22.4839787404276,192.25771153172
2,"2003-05-07 17:00:00",2131,21.005846805116,210.454215012726
2,"2003-05-07 18:00:00",32,7.39316576305442,139.059758258591
2,"2003-05-07 18:00:00",73,9.67731884356406,146.979211344634
2,"2003-05-07 18:00:00",155,12.8133719215513,152.872209068632
2,"2003-05-07 18:00:00",281,16.6451494436067,158.936998159691
2,"2003-05-07 18:00:00",452,20.7398770488159,163.466313169317
2,"2003-05-07 18:00:00",671,23.0693411262654,168.94389637699
2,"2003-05-07 18:00:00",950,22.8793465815788,175.544021721494
2,"2003-05-07 18:00:00",1276,23.5174594716351,184.334836520725
2,"2003-05-07 18:00:00",1675,23.353770573507,200.920755778246
2,"2003-05-07 18:00:00",2135,19.1648245491578,220.733523703276
2,"2003-05-07 19:00:00",32,7.02496263335258,144.842369246149
2,"2003-05-07 19:00:00",73,9.41940550141037,152.601989288614
2,"2003-05-07 19:00:00",155,12.7200353773093,157.276159744206
2,"2003-05-07 19:00:00",281,16.7284787114669,161.482131016125
2,"2003-05-07 19:00:00",452,21.0081722194007,164.787267108467
2,"2003-05-07 19:00:00",671,24.1139067759664,169.910880959092
2,"2003-05-07 19:00:00",950,24.8884893073083,178.505514195436
2,"2003-05-07 19:00:00",1277,24.4225326287017,193.357881550161
2,"2003-05-07 19:00:00",1677,21.6472862040488,213.460668526956
2,"2003-05-07 19:00:00",2137,15.7780924068786,232.861532147975
2,"2003-05-07 20:00:00",32,6.64602888949484,152.816777655389
2,"2003-05-07 20:00:00",73,8.86315970746325,160.242809805433
2,"2003-05-07 20:00:00",155,12.1320237388492,163.648869233271
2,"2003-05-07 20:00:00",281,16.0583498529581,166.147168538909
2,"2003-05-07 20:00:00",452,20.5099097998992,168.541418838679
2,"2003-05-07 20:00:00",670,24.3466075665584,174.397779255857
2,"2003-05-07 20:00:00",950,24.3077929890807,187.839344331352
2,"2003-05-07 20:00:00",1278,21.5876006077563,206.101956763886
2,"2003-05-07 20:00:00",1679,16.5780577873284,226.109908495467
2,"2003-05-07 20:00:00",2139,11.9057969073893,242.617333963393
2,"2003-05-07 21:00:00",32,5.90736828037663,158.893937804586
2,"2003-05-07 21:00:00",73,7.83715509607919,166.81523264431
2,"2003-05-07 21:00:00",155,10.8767642247132,170.273889242376
2,"2003-05-07 21:00:00",281,14.5553014396817,172.192352580496
2,"2003-05-07 21:00:00",451,18.7592164015451,175.083303762663
2,"2003-05-07 21:00:00",670,21.3955696348567,185.410064181621
2,"2003-05-07 21:00:00",951,19.3431874312379,202.782302647894
2,"2003-05-07 21:00:00",1280,15.1984242604291,219.312428016421
2,"2003-05-07 21:00:00",1680,10.4464826616426,241.755731666806
2,"2003-05-07 21:00:00",2141,10.056023070777,246.0972995843
2,"2003-05-07 22:00:00",32,5.24752322529401,160.314408935431
2,"2003-05-07 22:00:00",73,6.92018785872176,169.775820409067
2,"2003-05-07 22:00:00",155,9.65660395791398,175.016531889513
2,"2003-05-07 22:00:00",281,12.9471425418893,178.099350698051
2,"2003-05-07 22:00:00",452,16.1847397260506,184.707209425648
2,"2003-05-07 22:00:00",671,15.5354884055829,199.411374689928
2,"2003-05-07 22:00:00",952,11.8921318526158,217.088852784694
2,"2003-05-07 22:00:00",1281,8.06022332196819,235.642172932934
2,"2003-05-07 22:00:00",1682,8.44712969001897,259.937429272641
2,"2003-05-07 22:00:00",2142,10.6870809859381,246.534195478157
2,"2003-05-07 23:00:00",32,4.4873265983211,161.30803844725
2,"2003-05-07 23:00:00",73,5.70312195205398,172.959402899251
2,"2003-05-07 23:00:00",155,7.97122951620388,181.004968948926
2,"2003-05-07 23:00:00",281,10.6312605085192,187.502444874073
2,"2003-05-07 23:00:00",452,11.3315003419671,199.19214554957
2,"2003-05-07 23:00:00",671,8.73485546531824,214.552362969574
2,"2003-05-07 23:00:00",953,5.91209776644467,233.386411045237
2,"2003-05-07 23:00:00",1282,5.84216569432946,261.522340962857
2,"2003-05-07 23:00:00",1683,8.90224690738243,268.591206229579
2,"2003-05-07 23:00:00",2143,10.094671861928,248.52623107844
1,"2003-05-07 14:51:52",344,19.2,340
1,"2003-05-07 14:51:52",729,24.9,166
1,"2003-05-07 14:51:52",1113,23.0,170
1,"2003-05-07 14:51:52",1498,21.7,179
1,"2003-05-07 14:51:52",1883,20.3,195
1,"2003-05-07 14:51:52",2268,13.6,213
1,"2003-05-07 14:50:12",419,23.9,164
1,"2003-05-07 14:50:12",515,24.1,168
1,"2003-05-07 14:50:12",612,24.6,167
1,"2003-05-07 14:50:12",708,24.7,165
1,"2003-05-07 14:50:12",804,25.5,165
1,"2003-05-07 14:50:12",900,24.5,166
1,"2003-05-07 14:50:12",997,23.8,167
1,"2003-05-07 14:50:12",1093,23.6,168
1,"2003-05-07 14:50:12",1189,22.9,170
1,"2003-05-07 14:50:12",1285,21.7,173
1,"2003-05-07 14:50:12",1381,21.1,177
1,"2003-05-07 14:50:12",1478,21.0,182
1,"2003-05-07 14:50:12",1574,21.4,186
1,"2003-05-07 14:50:12",1670,21.1,193
1,"2003-05-07 14:50:12",1766,21.3,197
1,"2003-05-07 14:50:12",1863,20.0,201
1,"2003-05-07 14:50:12",1959,18.1,204
1,"2003-05-07 14:50:12",2055,16.4,207
1,"2003-05-07 14:50:12",2151,13.9,209
1,"2003-05-07 14:50:12",2247,13.4,211
1,"2003-05-07 14:50:12",2344,12.0,212
1,"2003-05-07 14:50:12",2440,11.8,215
1,"2003-05-07 20:51:48",1113,8.5,248
1,"2003-05-07 20:51:48",1498,10.7,256
1,"2003-05-07 20:51:48",1883,11.8,250
1,"2003-05-07 20:51:48",2268,11.8,242
1,"2003-05-07 15:50:49",323,15.2,163
1,"2003-05-07 15:50:49",419,21.6,167
1,"2003-05-07 15:50:49",515,24.3,167
1,"2003-05-07 15:50:49",612,24.3,168
1,"2003-05-07 15:50:49",708,24.2,166
1,"2003-05-07 15:50:49",804,23.9,167
1,"2003-05-07 15:50:49",900,23.0,168
1,"2003-05-07 15:50:49",997,23.6,171
1,"2003-05-07 15:50:49",1093,22.9,175
1,"2003-05-07 15:50:49",1189,22.7,181
1,"2003-05-07 15:50:49",1285,22.8,188
1,"2003-05-07 15:50:49",1381,22.7,192
1,"2003-05-07 15:50:49",1478,21.3,201
1,"2003-05-07 15:50:49",1574,22.0,202
1,"2003-05-07 15:50:49",1670,21.2,208
1,"2003-05-07 15:50:49",1766,19.4,212
1,"2003-05-07 15:50:49",1863,17.1,217
1,"2003-05-07 15:50:49",1959,15.6,223
1,"2003-05-07 15:50:49",2055,14.7,225
1,"2003-05-07 15:50:49",2151,14.6,228
1,"2003-05-07 15:50:49",2247,14.6,230
1,"2003-05-07 15:50:49",2344,13.7,230
1,"2003-05-07 15:50:49",2440,13.7,232
1,"2003-05-07 20:50:08",131,69.6,123
1,"2003-05-07 20:50:08",323,12.8,295
1,"2003-05-07 20:50:08",419,12.6,219
1,"2003-05-07 20:50:08",515,12.7,214
1,"2003-05-07 20:50:08",612,11.6,222
1,"2003-05-07 20:50:08",708,10.0,220
1,"2003-05-07 20:50:08",804,18.6,151
1,"2003-05-07 20:50:08",997,5.8,66
1,"2003-05-07 20:50:08",1093,12.6,244
1,"2003-05-07 20:50:08",1189,10.0,245
1,"2003-05-07 20:50:08",1285,9.6,247
1,"2003-05-07 20:50:08",1381,9.5,247
1,"2003-05-07 20:50:08",1478,10.4,253
1,"2003-05-07 20:50:08",1574,11.7,256
1,"2003-05-07 20:50:08",1670,13.2,260
1,"2003-05-07 20:50:08",1766,12.8,261
1,"2003-05-07 20:50:08",1863,11.9,256
1,"2003-05-07 20:50:08",1959,11.5,251
1,"2003-05-07 20:50:08",2055,12.3,250
1,"2003-05-07 20:50:08",2151,12.0,239
1,"2003-05-07 20:50:08",2247,12.8,238
1,"2003-05-07 15:52:29",344,13.5,183
1,"2003-05-07 15:52:29",729,24.7,165
1,"2003-05-07 15:52:29",1113,23.8,170
1,"2003-05-07 15:52:29",1498,22.1,191
1,"2003-05-07 15:52:29",1883,18.0,208
1,"2003-05-07 15:52:29",2268,13.6,222
1,"2003-05-08 06:27:00",344,52.9,303
1,"2003-05-08 06:27:00",1113,6.2,294
1,"2003-05-08 06:27:00",1498,10.2,285
1,"2003-05-08 06:27:00",1883,9.4,269
1,"2003-05-08 06:27:00",2268,9.2,258
1,"2003-05-07 21:50:50",323,10.8,295
1,"2003-05-07 21:50:50",419,9.5,251
1,"2003-05-07 21:50:50",515,5.5,230
1,"2003-05-07 21:50:50",612,6.4,247
1,"2003-05-07 21:50:50",708,8.1,263
1,"2003-05-07 21:50:50",804,6.9,260
1,"2003-05-07 21:50:50",997,7.7,251
1,"2003-05-07 21:50:50",1093,8.4,254
1,"2003-05-07 21:50:50",1189,8.6,265
1,"2003-05-07 21:50:50",1285,10.4,268
1,"2003-05-07 21:50:50",1381,11.9,265
1,"2003-05-07 21:50:50",1478,11.9,263
1,"2003-05-07 21:50:50",1574,11.3,262
1,"2003-05-07 21:50:50",1670,10.7,258
1,"2003-05-07 21:50:50",1766,11.1,260
1,"2003-05-07 21:50:50",1863,11.8,254
1,"2003-05-07 21:50:50",1959,12.8,252
1,"2003-05-07 21:50:50",2055,13.0,246
1,"2003-05-07 21:50:50",2151,12.8,239
1,"2003-05-07 21:50:50",2247,12.3,234
1,"2003-05-07 21:50:50",2344,12.1,228
1,"2003-05-07 21:50:50",2440,12.9,234
1,"2003-05-08 06:25:21",227,91.7,303
1,"2003-05-08 06:25:21",323,35.8,302
1,"2003-05-08 06:25:21",515,6.4,326
1,"2003-05-08 06:25:21",612,5.8,308
1,"2003-05-08 06:25:21",708,5.4,302
1,"2003-05-08 06:25:21",804,17.5,124
1,"2003-05-08 06:25:21",900,5.2,297
1,"2003-05-08 06:25:21",1093,17.6,274
1,"2003-05-08 06:25:21",1189,8.8,296
1,"2003-05-08 06:25:21",1285,9.5,292
1,"2003-05-08 06:25:21",1478,10.5,289
1,"2003-05-08 06:25:21",1574,10.4,286
1,"2003-05-08 06:25:21",1670,10.8,282
1,"2003-05-08 06:25:21",1766,8.8,265
1,"2003-05-08 06:25:21",1863,8.3,250
1,"2003-05-08 06:25:21",1959,9.1,253
1,"2003-05-08 06:25:21",2055,10.1,249
1,"2003-05-08 06:25:21",2440,9.5,249
1,"2003-05-07 16:50:54",227,23.7,301
1,"2003-05-07 16:50:54",323,11.8,177
1,"2003-05-07 16:50:54",419,18.2,174
1,"2003-05-07 16:50:54",515,21.9,175
1,"2003-05-07 16:50:54",612,23.1,172
1,"2003-05-07 16:50:54",708,23.5,171
1,"2003-05-07 16:50:54",804,23.5,170
1,"2003-05-07 16:50:54",900,23.5,174
1,"2003-05-07 16:50:54",997,23.9,180
1,"2003-05-07 16:50:54",1093,23.6,186
1,"2003-05-07 16:50:54",1189,23.7,192
1,"2003-05-07 16:50:54",1285,23.4,198
1,"2003-05-07 16:50:54",1381,22.6,202
1,"2003-05-07 16:50:54",1478,20.8,206
1,"2003-05-07 16:50:54",1574,18.0,212
1,"2003-05-07 16:50:54",1670,16.1,215
1,"2003-05-07 16:50:54",1766,14.9,219
1,"2003-05-07 16:50:54",1863,13.4,221
1,"2003-05-07 16:50:54",1959,13.1,226
1,"2003-05-07 16:50:54",2055,12.7,229
1,"2003-05-07 16:50:54",2151,12.5,230
1,"2003-05-07 16:50:54",2247,11.7,232
1,"2003-05-07 16:50:54",2344,11.7,232
1,"2003-05-07 16:50:54",2440,12.0,231
1,"2003-05-07 21:52:30",344,10.1,267
1,"2003-05-07 21:52:30",729,10.7,270
1,"2003-05-07 21:52:30",1113,8.1,262
1,"2003-05-07 21:52:30",1498,10.5,263
1,"2003-05-07 21:52:30",1883,11.2,246
1,"2003-05-07 21:52:30",2268,12.2,234
1,"2003-05-08 07:21:57",344,52.7,303
1,"2003-05-08 07:21:57",1113,6.8,296
1,"2003-05-08 07:21:57",1498,10.5,289
1,"2003-05-08 07:21:57",1883,10.3,260
1,"2003-05-08 07:21:57",2268,10.2,251
1,"2003-05-08 07:20:18",131,1.4,3
1,"2003-05-08 07:20:18",227,91.7,303
1,"2003-05-08 07:20:18",323,58.6,303
1,"2003-05-08 07:20:18",419,23.7,301
1,"2003-05-08 07:20:18",515,6.0,330
1,"2003-05-08 07:20:18",612,5.4,307
1,"2003-05-08 07:20:18",708,4.6,302
1,"2003-05-08 07:20:18",804,18.5,122
1,"2003-05-08 07:20:18",997,12.8,73
1,"2003-05-08 07:20:18",1093,17.5,271
1,"2003-05-08 07:20:18",1189,8.1,293
1,"2003-05-08 07:20:18",1285,9.6,291
1,"2003-05-08 07:20:18",1381,10.5,292
1,"2003-05-08 07:20:18",1478,11.6,291
1,"2003-05-08 07:20:18",1574,11.3,291
1,"2003-05-08 07:20:18",1670,10.1,283
1,"2003-05-08 07:20:18",1863,10.3,242
1,"2003-05-08 07:20:18",2344,10.4,250
1,"2003-05-08 07:20:18",2440,10.0,252
1,"2003-05-08 00:55:05",131,73.8,123
1,"2003-05-08 00:55:05",227,87.6,303
1,"2003-05-08 00:55:05",323,33.6,303
1,"2003-05-08 00:55:05",515,11.8,337
1,"2003-05-08 00:55:05",612,11.9,336
1,"2003-05-08 00:55:05",708,8.8,333
1,"2003-05-08 00:55:05",804,14.7,118
1,"2003-05-08 00:55:05",900,16.2,328
1,"2003-05-08 00:55:05",997,6.8,67
1,"2003-05-08 00:55:05",1381,6.6,277
1,"2003-05-08 00:55:05",1478,7.0,270
1,"2003-05-08 00:55:05",1574,7.2,266
1,"2003-05-08 00:55:05",1670,8.3,259
1,"2003-05-08 00:55:05",1766,10.0,251
1,"2003-05-08 00:55:05",1863,10.9,245
1,"2003-05-08 00:55:05",1959,12.2,241
1,"2003-05-08 00:55:05",2055,13.2,238
1,"2003-05-08 00:55:05",2151,13.8,232
1,"2003-05-08 00:55:05",2247,14.3,233
1,"2003-05-08 00:55:05",2344,13.6,226
1,"2003-05-08 00:55:05",2440,13.8,225
1,"2003-05-08 08:15:14",131,52.2,77
1,"2003-05-08 08:15:14",227,36.5,303
1,"2003-05-08 08:15:14",323,35.5,302
1,"2003-05-08 08:15:14",419,23.0,301
1,"2003-05-08 08:15:14",515,6.5,324
1,"2003-05-08 08:15:14",612,6.9,320
1,"2003-05-08 08:15:14",708,6.1,319
1,"2003-05-08 08:15:14",804,19.2,121
1,"2003-05-08 08:15:14",1093,17.4,265
1,"2003-05-08 08:15:14",1285,6.0,295
1,"2003-05-08 08:15:14",1381,7.6,298
1,"2003-05-08 08:15:14",1478,10.3,297
1,"2003-05-08 08:15:14",1574,10.3,290
1,"2003-05-08 08:15:14",1670,9.1,278
1,"2003-05-08 00:56:44",1113,6.2,279
1,"2003-05-08 00:56:44",1498,6.7,258
1,"2003-05-08 00:56:44",1883,10.6,247
1,"2003-05-08 00:56:44",2268,13.3,231
1,"2003-05-08 08:16:53",344,52.8,303
1,"2003-05-08 08:16:53",1113,5.1,294
1,"2003-05-08 08:16:53",1498,8.4,295
1,"2003-05-08 08:16:53",1883,10.0,268
1,"2003-05-08 08:16:53",2268,12.6,262
1,"2003-05-08 01:51:43",344,49.3,303
1,"2003-05-08 01:51:43",1113,5.9,285
1,"2003-05-08 01:51:43",1498,6.6,260
1,"2003-05-08 01:51:43",1883,8.6,250
1,"2003-05-08 01:51:43",2268,11.6,244
1,"2003-05-08 09:11:49",729,6.6,296
1,"2003-05-08 09:11:49",1113,3.7,296
1,"2003-05-08 09:11:49",1498,6.1,299
1,"2003-05-08 09:11:49",1883,8.6,298
1,"2003-05-08 09:11:49",2268,19.2,319
1,"2003-05-08 09:10:10",131,1.5,344
1,"2003-05-08 09:10:10",227,35.4,303
1,"2003-05-08 09:10:10",323,34.3,302
1,"2003-05-08 09:10:10",515,5.6,312
1,"2003-05-08 09:10:10",612,6.0,308
1,"2003-05-08 09:10:10",708,5.4,297
1,"2003-05-08 09:10:10",804,3.7,298
1,"2003-05-08 09:10:10",900,3.2,295
1,"2003-05-08 09:10:10",997,13.4,72
1,"2003-05-08 09:10:10",1189,2.6,259
1,"2003-05-08 09:10:10",1285,3.4,285
1,"2003-05-08 09:10:10",1381,5.4,296
1,"2003-05-08 09:10:10",1478,9.5,300
1,"2003-05-08 09:10:10",1574,9.3,296
1,"2003-05-07 11:51:40",344,22.1,339
1,"2003-05-07 11:51:40",1113,24.4,168
1,"2003-05-07 11:51:40",1498,21.6,176
1,"2003-05-07 11:51:40",1883,17.2,196
1,"2003-05-07 11:51:40",2268,13.4,206
1,"2003-05-07 16:52:34",729,22.3,171
1,"2003-05-07 16:52:34",1113,23.0,180
1,"2003-05-07 16:52:34",1498,20.4,201
1,"2003-05-07 16:52:34",1883,14.6,220
1,"2003-05-07 16:52:34",2268,12.2,230
1,"2003-05-07 11:50:01",515,23.1,165
1,"2003-05-07 11:50:01",612,24.0,164
1,"2003-05-07 11:50:01",708,23.2,168
1,"2003-05-07 11:50:01",804,23.3,167
1,"2003-05-07 11:50:01",900,23.6,168
1,"2003-05-07 11:50:01",997,24.5,168
1,"2003-05-07 11:50:01",1093,22.7,171
1,"2003-05-07 11:50:01",1189,23.8,170
1,"2003-05-07 11:50:01",1285,22.2,172
1,"2003-05-07 11:50:01",1381,21.2,178
1,"2003-05-07 11:50:01",1478,20.6,187
1,"2003-05-07 11:50:01",1574,19.0,189
1,"2003-05-07 11:50:01",1670,18.5,189
1,"2003-05-07 11:50:01",1766,18.3,192
1,"2003-05-07 11:50:01",1863,18.0,190
1,"2003-05-07 11:50:01",1959,16.4,200
1,"2003-05-07 11:50:01",2055,15.7,204
1,"2003-05-07 11:50:01",2151,14.6,206
1,"2003-05-07 11:50:01",2344,12.6,212
ploticus-2.42/pltestsuite/vector1.htm 0000644 0001750 0001750 00000001562 07575361504 016777 0 ustar colin colin vector1

How to download and try this example
Usage: pl -gif vector1.htm
Demonstrate proc vector.
#proc getdata
fieldnameheader: yes
data:
name x len y dir
Test_3 76 19 84 14
Test_4 83 12 64 9
Test_5 95 11 92 13
Test_6 42 8 76 11
Test_7 69 13 68 6
Test_8 76 2 22 14
Test_9 83 15 12 9
Test_10 -10 15 -10 9
Test_11 -12 18 -10 3
#proc areadef
rectangle: 1 1 4 4
xrange: 0 120
yrange: 0 120
frame: yes
// do vectors..
#proc vector
xfield: x
yfield: y
linedetails: width=1 color=blue
arrowheadcolor: blue
lenunits: user
dirfield: dir
lenfield: len
lenscale: 3
dirrange: 20
// clip: no
// do red dots..
#proc scatterplot
xfield: x
yfield: y
symbol: shape=circle fillcolor=red
// do labels..
#proc scatterplot
xfield: x
yfield: y
labelfield: name
textdetails: align=L adjust=0.1,0 size=6
ploticus-2.42/pltestsuite/colorgrid.htm 0000644 0001750 0001750 00000004246 07662430767 017407 0 ustar colin colin colorgrid

How to download and try this example
Usage: pl -gif colorgrid.htm
This demonstrates a color grid rendered directly from a data matrix.
// the following may be modified to change point shapes, sizes, etc.
#set SYM = "shape=nicecircle radius=0.1 style=filled"
#setifnotgiven CGI = "http://ploticus.sourceforge.net/cgi-bin/showcgiargs"
// set black background..
#proc page
backgroundcolor: black
color: white
// get data..
#proc getdata
//showresults: yes
data:
"Mammary gland" 7 23 12 8 3
Skin 6 12 7 4 2
Lymph 9 21 18 15 9
Lung 22 15 12 3 6
Digestive 5 11 14 7 9
"Female reproductive" 2 4 19 2 4
"Male reproductive" 1 3 8 7 1
"Soft tissues" 0 2 1 0 0
Endocrine 0 3 4 11 0
// set up plotting area..
#proc areadef
rectangle: 3 1 5 4
yscaletype: categories
ycategories: datafield=1
yaxis.stubs: usecategories
yaxis.tics: none
yaxis.axisline: none
yaxis.stubdetails: adjust=0.25,0
xrange: 0 6
xaxis.location: max+0.08
xaxis.stubs: list A\nB\nC\nD\nE
xaxis.tics: none
xaxis.axisline: none
xaxis.label: Test Group
xaxis.labeldetails: adjust=0,0.4
// set up legend entries for color gradients..
#proc legendentry
sampletype: symbol
details: fillcolor=orange @SYM
label: >20
tag: 21
#proc legendentry
sampletype: symbol
details: fillcolor=red @SYM
label: 11-20
tag: 11
#proc legendentry
sampletype: symbol
details: fillcolor=lightpurple @SYM
label: 6-10
tag: 6
#proc legendentry
sampletype: symbol
details: fillcolor=blue @SYM
label: 1-5
tag: 1
#proc legendentry
sampletype: symbol
details: fillcolor=black @SYM style=outline linecolor=gray(0.8)
label: None
tag: 0
// loop through the 5 groups (data fields), doing a legend-driven scatterplot
// for each, using a fixed X location..
#set FLD = 2
#for GROUP in A,B,C,D,E
#set XLOC = $arith(@FLD-1)
// #set SELECT = "@" @FLD " > 0"
#proc scatterplot
xlocation: @XLOC(s)
yfield: 1
symrangefield: @FLD
clickmapurl: @CGI?group=@GROUP&site=@@1&
// select: @SELECT
// increment..
#set FLD = $arith( @FLD+1 )
#endloop
#proc legend
location: min-1 min-0.2
format: singleline
sep: 0.5
outlinecolors: yes
ploticus-2.42/pltestsuite/td.htm 0000644 0001750 0001750 00000004366 07164643376 016034 0 ustar colin colin td

How to download and try this example
Usage: pl -gif td.htm
Source: Steffen R et.al., Epidemiology, Etiology and Impact
of Traveler's Diarrhea in Jamaica, JAMA 3/3/99 p. 815.
// set page-wide attributes appropriate for slides (proc page)
#proc page
color: white
backgroundcolor: darkblue
linewidth: 2
pagesize: 6.6 4.4
#if @DEVICE in gif,png
scale: 0.7
#endif
// specify data (proc getdata)
#proc getdata
data:
// Mild Moderate Classic HA HB
23 18 10 10 35
21 17 9 16 22
28 24 13 24 39
30 25 15 24 38
28 24 14 16 29
// set up plotting area (proc areadef)
#proc areadef
title: TD (Travelers Diarrhea)\nAttack Rates in Tourists
titledetails: align=C size=14 adjust=0,0.3
//rectangle: 1 1 5 2
areaname: slide
xrange: 0 6
yrange: 0 40
// do filled pink curve (proc lineplot)
#proc lineplot
yfield: 1
fill: pink
legendlabel: Mild TD
// do filled blue curve (proc lineplot)
#proc lineplot
yfield: 2
fill: powderblue
legendlabel: Moderate TD
// do filled green curve (proc lineplot)
#proc lineplot
yfield: 3
fill: green
legendlabel: Classic TD
// do curve w/ diamond points (proc lineplot)
#proc lineplot
yfield: 4
pointsymbol: shape=diamond style=filled fillcolor=orange
linedetails: width=0.5 color=yellow
legendlabel: Hotel A
// do curve w/ square points (proc lineplot)
#proc lineplot
yfield: 5
pointsymbol: shape=square style=filled fillcolor=orange
linedetails: width=0.5 color=yellow
legendlabel: Hotel B
// do axes (proc xaxis, proc yaxis) last so they are not obliterated
#proc xaxis
stubrange: 0 6
stubs: text
March\n1996
April\n1996
May\n1996
June\n1996
July\n1996
#proc yaxis
stubs: inc 10
// render legend using labels specified above (proc legend)
#proc legend
location: max-1 max
ploticus-2.42/pltestsuite/hitcount3.htm 0000644 0001750 0001750 00000003432 10743161675 017330 0 ustar colin colin hitcount3

How to download and try this example
Usage: pl -gif hitcount3.htm
Uses the data file hitcount.dat
See also hitcount.
This example illustrates datetime scaling with time windowing.
Only the hours from 8 to 18 (6pm) are shown for each day.
#proc getdata
file: hitcount.dat
// the following filter strips seconds from the time value,
// then builds a ddMmmyyyy date and connects it with the time
// value (separated by a dot)
pf_fieldnames: datetime nbytes
filter:
##set TIME = @@4
##set TIME = $substring(@@TIME,1,5)
@@3@@2@@6.@@TIME @@7
// use proc processdata to sum nbytes for each unique time value
#proc processdata
action: count
fields: datetime nbytes
fieldnames: datetime nbytes
// #proc print
// label: After transform: nrecords=@NRECORDS nfields=@NFIELDS
// set up plotting area with datetime in X and autorange on the y axis.
// do x axis showing day of week and y axis
#proc areadef
title: Intranet web page hits
rectangle: 1 1 6 2.5
xscaletype: datetime8-18 ddMmmyyyy.hh:mm
xrange: 26Sep1999.08:00 02Oct1999.18:00
yautorange: datafield=nbytes nearest=20000
xaxis.stubs: inc 1 day
xaxis.stubformat: Www
xaxis.stubslide: 0.4
xaxis.minorticinc: 2 hours
xaxis.grid: width=0.3 color=purple
yaxis.stubs: inc 50 1000
yaxis.label: kBytes Transferred
yaxis.labeldistance: 0.6
frame: yes
// do a 2nd X axis with month and day
#proc xaxis
stubs: inc 1 day
stubformat: Mmmdd
stubslide: 0.4
stubdetails: adjust=0,-0.14
// use proc yaxis again to do grid lines at every 100 kB
//#proc yaxis
//grid: color=orange
//gridskip: min
//ticincrement: 100 1000
// make bar graph
#proc bars
locfield: datetime
lenfield: nbytes
thinbarline: color=green
ploticus-2.42/pltestsuite/scatterplot10.htm 0000644 0001750 0001750 00000002664 07372027477 020130 0 ustar colin colin scatterplot10

How to download and try this example
Usage: pl -gif scatterplot10.htm
Uses data file scatterplot10.dat.
// read in data
#proc getdata
file: scatterplot10.dat
fieldnames: strain xval xse xsd extra yval yse ysd
// set up plot area
#proc areadef
rectangle: 1 1 4 4
xautorange: datafield=xval
yautorange: datafield=yval
xaxis.stubs: inc
yaxis.stubs: inc
xaxis.stubdetails: size=6
yaxis.stubdetails: size=6
// do regression curve..
#proc curvefit
curvetype: regression
xfield: xval
yfield: yval
linedetails: color=red width=0.5
// do annotation in lower right corner..
#proc annotate
location: max min-0.4
textdetails: color=red align=R size=6
text: @REGRESSION_LINE
r = @CORRELATION
// do vertical error bars..
#proc bars
locfield: xval
lenfield: yval
errbarfield: yse
//errbarmult: 2
thinbarline: color=orange width=0.5
tails: 0.02
truncate: yes
// do horizontal error bars..
#proc bars
locfield: yval
lenfield: xval
horizontalbars: yes
errbarfield: xse
//errbarmult: 2
thinbarline: color=orange width=0.5
tails: 0.02
truncate: yes
// do point labels..
//#proc scatterplot
//xfield: xval
//yfield: yval
//labelfield: strain
//textdetails: size=6 color=teal adjust=0,0.07
// do points..
#proc scatterplot
xfield: xval
yfield: yval
symbol: shape=circle style=filled radius=0.02 fillcolor=blue
ploticus-2.42/pltestsuite/drawcom.htm 0000644 0001750 0001750 00000001033 07417573001 017031 0 ustar colin colin drawcom

How to download and try this example
Usage: pl -gif drawcom.htm
#proc page
pagesize: 8.5 11
#proc drawcommands
commands:
color blue
linetype 0 2 1
mov 1 9
lin 2 9
lin 1.5 10
lin 1 9
cblock 3 9 5 10 yelloworange 1
mark 2.4 9.5 sym9agreen .5
mov 1 9.5
lin 5 9.5
#proc areadef
rectangle: 1 7 5 9
xrange: 0 40
yrange: 0 25
#write stderr
done with areadef
#endwrite noclose
#proc drawcommands
file: drawcom.dcm
ploticus-2.42/pltestsuite/testpf_chron 0000755 0001750 0001750 00000005107 10406030345 017304 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=
if [ "$DEV" = "" ]; then
DEV=x11
fi
### chron1 example uses datematic defaults..
echo "chron1 (datematic).."
pl -prefab chron data=data14 x=1 y=2 datefmt=yy/mm/dd \
yrange="0 25" barwidth=line color=red \
title="# hits per day" omitweekends=yes \
-$DEV -o ${OUTDIR}chron1.$DEV $ARGS
echo chron2..
pl -prefab chron data=data14 x=1 y=2 datefmt=yy/mm/dd xinc="1 month" \
stubfmt=M xyears=yyyy color=green tab=week title="# hits per week" \
-$DEV -o ${OUTDIR}chron2.$DEV $ARGS
echo chron3..
pl -prefab chron data=data19 x=2 y=1 datefmt=mmddyy xinc="1 month" \
stubfmt=M xyears=yyyy color=green tab=week barwidth=0.05 include2=annot \
title="# website visitors per week" -scale 0.7 rectangle="1 1 4 2.5" ygrid=yes \
mode=line step=yes fill=red \
-$DEV -o ${OUTDIR}chron3.$DEV $ARGS
echo chron4..
pl -prefab chron data=data14 x=1 y=2 datefmt=yy/mm/dd xinc="1 month" \
stubfmt=M xyears=yyyy color=powderblue tab=month tabmode=first nearest=month\
barwidth=0.2 curve=yes \
-$DEV -o ${OUTDIR}chron4.$DEV $ARGS
echo chron5..
pl -prefab chron data=data16 timefld=2 x=1 tab=hour datefmt=yy/mm/dd xinc="1 day" \
barwidth=line stubfmt=MMMdd unittype=datetime timefld=2 title="# hits per hour" \
-$DEV -o ${OUTDIR}chron5.$DEV $ARGS
echo chron6..
pl -prefab chron data=data15 x=1 tab=hour unittype=time xinc="1 hour" nearest=hour \
barwidth=0.2 stubfmt=HHA title="# events per hour" color=coral \
-$DEV -o ${OUTDIR}chron6.$DEV $ARGS
echo "chron6b (datematic).."
pl -prefab chron data=data15 x=1 tab=hour unittype=time \
barwidth=0.2 title="# events per hour" color=coral \
-$DEV -o ${OUTDIR}chron6.$DEV $ARGS
echo chron7..
pl -prefab chron data=data22 header=yes x=1 y=2 datefmt=mm/dd/yyyy xinc="1 day" \
mode=line unittype=datetime title="temperatures this week" \
-$DEV -o ${OUTDIR}chron7.$DEV $ARGS
echo chron8
pl -prefab chron data=data24 header=yes x=dt y=air_temp y2=soil_temp y3=water_temp ylbl=#usefname \
mode=line unittype=datetime datefmt=mm/dd/yyyy xinc="1 day" legendfmt=singleline \
-$DEV -o ${OUTDIR}chron8.$DEV $ARGS
echo chron8a
pl -prefab chron data=data24 header=yes x=dt y=air_temp y2=soil_temp y3=water_temp ylbl=#usefname \
mode=bars stack=yes barwidth=0.1 unittype=datetime datefmt=mm/dd/yyyy xinc="1 day" legendfmt=singleline \
-$DEV -o ${OUTDIR}chron8.$DEV $ARGS
# chron9 added to test day-less date format fix Jan '03
echo chron9
pl -prefab chron data=data27 datefmt=mm/yyyy x=1 y=2 \
xinc="1 month" xstubfmt=Mmm ygrid=yes color=green \
-$DEV -o ${OUTDIR}chron8.$DEV $ARGS
ploticus-2.42/pltestsuite/testpf_stack 0000755 0001750 0001750 00000001150 11154300310 017263 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=$3
if [ "$DEV" = "" ]; then
DEV=x11
fi
echo stack1..
pl -prefab stack data=data10 x=1 y=2 y2=4 y3=6 y4=8 xlbl=Months \
name="Group A" name2="Group B" name3="Group C" name4="Group D" \
-$DEV -o ${OUTDIR}stack1.$DEV $ARGS
echo stack2..
pl -prefab stack data=data10h x=1 y=2 y2=4 y3=6 y4=8 xlbl=Months \
header=yes reverseleg=yes \
-$DEV -o ${OUTDIR}stack2.$DEV $ARGS
echo "stack3.."
pl -prefab stack data=data5 delim=tab x=1 y=2 y2=3 y3=4 y4=5 \
stackarea=yes stubvert=yes \
name=eastern name2=central name3=mountain name4=pacific \
-$DEV -o ${OUTDIR}stack3.$DEV $ARGS
ploticus-2.42/pltestsuite/testpf_draw 0000755 0001750 0001750 00000000332 07745255245 017147 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=$3
if [ "$DEV" = "" ]; then
DEV=x11
fi
echo draw1..
pl -prefab draw cmdfile=drawcom.dcm xrange="0 40" yrange="0 40" rectangle="1 1 3 3" \
-$DEV -o ${OUTDIR}draw1.$DEV $ARGS
ploticus-2.42/pltestsuite/windbarbs.htm 0000644 0001750 0001750 00000003633 07662442343 017366 0 ustar colin colin #!/usr/bin/pl
// Setup drawing area
#proc page
pagesize: 8 6
landscape: yes
#proc areadef
rectangle: 0.55 0.80 7.6 5.95
frame: color=grey(0.9)
xscaletype: datetime yyyy-mm-dd.hh:mm:ss
xrange: 2003-05-07.11:00:00 2003-05-09.12:00:00
yrange: 0 2500
#proc xaxis
stubs: incremental 4 hour
stubformat: hh:mm
stubcull: yes
stubrange: 2003-05-07.11:00:00
minorticinc: 1 hour
grid: color=grey(0.9)
gridskip: min
#proc xaxis
location: min-0.25
stubs: incremental 1 day
stubrange: 2003-05-07.24:00:00
stubformat: yyyy-mm-dd
minorticinc: 1 day
stubcull: yes
label: Time/Temp (min)
#proc yaxis
stubs: incremental 200
minorticinc: 100
stubdetails: size=8
labeldetails: size=10
grid: color=grey(0.9) width=1
gridskip: min
label: Elevation/Élévation (m)
minorticlen: 0.05
// Wind data
#proc getdata
delim: comma
file: wind.csv
fieldnameheader: yes
pf_fieldnames: legendId,windTimeStamp,windLevel,windSpeed,windDirection
filter: ##set newWindTimeStamp = $change(' ', '.', @@windTimeStamp)
##print @@legendId,@@newWindTimeStamp,@@windLevel,@@windSpeed,@@windDirection
// Wind legend entries
#proc legendentry
label: Data 1
sampletype: line
details: color=blue
tag: 1
#proc legendentry
label: Data 2
sampletype: line
details: color=red
tag: 2
// Draw the windbarbs
#proc vector
xfield: windTimeStamp
yfield: windLevel
linedetails: color=black
magfield: windSpeed
dirfield: windDirection
colorfield: legendId
type: barb
constantlen: 0.25
// Draw dots at the points of the windbarbs
#proc scatterplot
xfield: windTimeStamp
yfield: windLevel
symbol: shape=circle radius=0.005 style=fill fillcolor=black
cluster: no
#proc legend
location: min+0.21 min-0.65
//details: size=12 color=black style=B
sep: 1
format: singleline
#proc legend
reset
ploticus-2.42/pltestsuite/run_prefabs_test.bat 0000644 0001750 0001750 00000003762 10064557351 020735 0 ustar colin colin echo off
rem Batch file to test ploticus prefabs
set PL=pl
set PLOTICUS_PREFABS=c:..\prefabs
echo Testing %PL% .. output will be gif and svg..
echo
echo Be sure you have pl.exe in your PATH, or else copied into this dir..
echo
echo This batch file is setting PLOTICUS_PREFABS to: %PLOTICUS_PREFABS%
echo (you may need to change this)
pause
%PL% -gif -prefab dist fld=1 data=data6 curve=yes binsize=0.05 barwidth=0.08 ygrid=yes -o dist1.gif
%PL% -gif -prefab dist fld=1 data=data8 cats=yes yrange=0 stubvert=yes barwidth=0.05 ylbl="# Hits" order=rev -o dist2.gif
%PL% -gif -prefab pie values=3 labels=1 data=data9 delim=tab title="Student enrollment" -o pie1.gif
%PL% -gif -prefab chron data=data14 x=1 y=2 datefmt=yy/mm/dd xinc="1 month" stubfmt=M xyears=yyyy yrange="0 25" barwidth=line color=red title="# hits per day" omitweekends=yes -o chron1.gif
%PL% -svg -prefab dist fld=1 data=data6 curve=yes binsize=0.05 barwidth=0.08 ygrid=yes -o dist1.svg
%PL% -svg -prefab dist fld=1 data=data8 cats=yes yrange=0 stubvert=yes barwidth=0.05 ylbl="# Hits" order=rev -o dist2.svg
%PL% -svg -prefab pie values=3 labels=1 data=data9 delim=tab title="Student enrollment" -o pie1.svg
%PL% -svg -prefab chron data=data14 x=1 y=2 datefmt=yy/mm/dd xinc="1 month" stubfmt=M xyears=yyyy yrange="0 25" barwidth=line color=red title="# hits per day" omitweekends=yes -o chron1.svg
%PL% -gif -prefab stack data=data10 x=1 y=2 y2=4 y3=6 y4=8 xlbl=Months name="Group A" name2="Group B" name3="Group C" name4="Group D" -o stack1.gif
%PL% -gif -prefab multidist overlay=yes data=data21 rotate=yes xrange="0 2000" yrange="0 20" -o multidist1.gif
%PL% -gif -prefab vdist data=data6 data2=data6b y=1 y2=1 dist=hist title="Set 1" title2="Set 2" -o vdist1.gif
%PL% -gif -prefab compare data=dexa.dat header=yes catfields=strain,sex y=RFbmc y2=LFbmc leftsub=f rightsub=m stubvert=yes title="Comparison of two variables, with f & m subcats" titledet="adjust=0,+0.4" -o compare1.gif
ploticus-2.42/pltestsuite/data25 0000644 0001750 0001750 00000000166 07751501070 015672 0 ustar colin colin ABC A 5 4 2.5 2.3
ABC B 4 4.5 1.6 1.8
DEF A 8 9 1.8 1.5
DEF B 3 3 0.9 1.3
GHI A 7.7 6.5 1.2 0.6
GHI B 6.6 6.3 0.8 1.1
ploticus-2.42/pltestsuite/lineplot5.htm 0000644 0001750 0001750 00000002114 07164643367 017325 0 ustar colin colin lineplot5

How to download and try this example
Usage: pl -gif lineplot5.htm
#proc getdata
data:
9807 13000 13000
9808 14500 13400
9809 12400 13500
9810 13100 15000
9811 12700 12000
9812 11800 11800
#proc page
textsize: 9
#proc areadef
title: Collections- actual vs. budget FY99 (in thousands)
rectangle: 1 1 5 2
xscaletype: date yymm
xrange: 9806 9901
yrange: 11000 18000
// xaxis.stubs: list Jul\nAug\nSep\nOct\nNov\nDec
xaxis.stubformat: Mmm
xaxis.stubs: inc 1
xaxis.stubrange: 9807 9812
yaxis.stubs: incremental 1000
#proc lineplot
xfield: 1
yfield: 2
linedetails: color=red
pointsymbol: shape=diamond style=fill fillcolor=red radius=0.04
legendlabel: Actual
#proc lineplot
xfield: 1
yfield: 3
linedetails: color=blue
pointsymbol: shape=circle style=fill fillcolor=blue radius=0.04
legendlabel: Budget
altwhen: @@3 = @@2
altsymbol: shape=square fillcolor=white radius=0.04
#proc legend
location: min+1 min-0.35
format: singleline
ploticus-2.42/pltestsuite/data9 0000644 0001750 0001750 00000000243 07343213177 015615 0 ustar colin colin Business Admin 1.39 331
English 1.67 182
Chemistry 2.07 301
French 1.34 173
Physics 2.16 265
Mathematics 2.51 429
Biology 1.27 101
Music 1.53 119
History 1.32 177
ploticus-2.42/pltestsuite/scatterplot10.dat 0000644 0001750 0001750 00000004550 07230644206 020070 0 ustar colin colin 129S3/SvImJ 1.59 0.0309 0.0977 129S3/SvImJ 33.2 4.93 15.6
A/J 2.21 0.0589 0.186 A/J 25.9 3.90 12.3
AKR/J 2.53 0.0755 0.239 AKR/J 5.68 1.62 3.63
B6.Cg-A 1.92 0.0463 0.270 B6.Cg-A 27.2 1.66 9.25
B6.Cg-m+/+Lepr 4.14 0.226 0.903 B6.Cg-m+/+Lepr 46.6 6.84 26.5
B6.V-Lep 4.83 0.191 0.856 B6.V-Lep 55.0 5.74 24.4
BALB/cJ 2.23 0.0806 0.255 BALB/cJ 7.91 1.36 4.31
BKS.Cg-m+/+Lepr 3.85 0.253 0.979 BKS.Cg-m+/+Lepr 14.1 2.42 8.02
BKS.HRS-Cpe/J 2.11 0.0996 0.423 BKS.HRS-Cpe/J 13.8 2.71 11.5
BPH/2@J 1.29 0.0532 0.160 BPH/2@J 8.70 1.52 4.55
BPL/1@J 1.66 0.0489 0.155 BPL/1@J 10.0 1.22 3.67
BPN/3@J 1.59 0.0417 0.125 BPN/3@J 27.2 3.42 10.3
BTBR+Ttf/tf 2.26 0.0560 0.224 BTBR+Ttf/tf 18.4 3.18 12.7
C3H/HeJ 1.85 0.134 0.402 C3H/HeJ 11.0 2.14 6.77
C57BL/10J 1.73 0.0366 0.116 C57BL/10J 13.0 3.72 11.1
C57BL/6J 1.76 0.0728 0.291 C57BL/6J 28.7 2.75 11.0
C57BL/6J-tub/+ 2.51 0.0814 0.415 C57BL/6J-tub/+ 27.7 2.75 14.0
C57BLKS/J 1.70 0.119 0.476 C57BLKS/J 10.1 1.27 4.40
C57BR/cdJ 1.77 0.0644 0.204 C57BR/cdJ 8.83 1.80 5.71
C57L/J 1.63 0.0414 0.131 C57L/J 12.8 2.24 6.71
C58/J 3.30 0.132 0.396 C58/J 65.7 12.6 40.0
CAST/Ei 1.02 0.0200 0.0600 CAST/Ei 7.74 1.79 5.36
CBA/J 2.03 0.0606 0.192 CBA/J 5.85 2.36 5.77
CE/J 2.15 0.162 0.427 CE/J 17.9 13.9 31.0
CZECHII/Ei 0.824 0.0347 0.0777 CZECHII/Ei 6.49 1.31 3.46
DBA/1J 1.27 0.0124 0.0371 DBA/1J 6.07 1.33 3.26
DBA/2J 2.03 0.0615 0.184 DBA/2J 5.94 2.95 8.84
FVB/NJ 1.96 0.129 0.223 FVB/NJ 23.6 1.80 3.11
I/LnJ 1.63 0.0879 0.278 I/LnJ 19.7 1.88 5.65
KK/H1J 2.53 0.250 0.749 KK/H1J 29.5 8.93 25.2
LP/J 1.70 0.0766 0.242 LP/J 18.6 2.77 7.83
MOLF/Ei 2.21 0.0749 0.237 MOLF/Ei 26.9 3.80 11.4
NOD/LtJ 2.66 0.128 0.338 NOD/LtJ 40.6 13.3 29.7
NON/LtJ 2.59 0.0688 0.218 NON/LtJ 29.5 2.94 8.81
NZB/BlNJ 2.85 0.0806 0.242 NZB/BlNJ 5.52 1.12 3.17
NZW/LacJ 2.24 0.102 0.324 NZW/LacJ 16.6 2.85 8.05
P/J 1.99 0.0644 0.204 P/J 14.7 3.90 10.3
PERA/Ei 1.86 0.170 0.340 PERA/Ei 61.1 24.6 49.1
PL/J 1.79 0.0561 0.0971 PL/J 5.13 0.677 1.17
RBF/DnJ 2.20 0.0882 0.265 RBF/DnJ 12.2 4.33 12.2
RF/J 2.27 0.105 0.258 RF/J 6.86 1.71 3.83
RIIIS/J 2.00 0.110 0.331 RIIIS/J 40.2 6.86 20.6
SEA/GnJ 1.62 0.0264 0.0835 SEA/GnJ 9.11 1.45 4.35
SJL/J 1.78 0.0465 0.139 SJL/J 4.76 0.818 2.16
SM/J 1.68 0.0942 0.231 SM/J 4.20 1.29 2.23
SPRET/Ei 0.888 0.0285 0.0638 SPRET/Ei 10.3 1.75 3.51
SWR/J 2.09 0.244 0.690 SWR/J 7.67 1.13 2.99
WSB/Ei 1.02 0.0419 0.103 WSB/Ei 1.58 0.310 0.694
ploticus-2.42/pltestsuite/drawcom.dcm 0000644 0001750 0001750 00000002764 07417572775 017041 0 ustar colin colin movs 3.5 23
lins 3.5 22
lins 3 21.6
lins 3.2 22.3
lins 2.4 22.8
lins 2.4 21.6
lins 2.2 20.8
lins 2 19.8
lins 1 18.1
lins 1 17.2
lins .4 16
lins .25 13.6
lins 1 13.3
lins .7 13
lins 1.4 11.1
lins 1.4 10.4
lins 3.6 8
lins 5.4 7.7
lins 8.1 6
lins 10.5 6
lins 10.5 6.2
lins 11.6 6.2
lins 13 4.8
lins 13 4.1
lins 14 3.8
lins 14.5 4.2
lins 15.4 4.2
lins 16.3 2.8
lins 17.2 1
lins 19 0.8
lins 18.8 2.3
lins 21.3 4.2
lins 23 4.2
lins 24 3.8
lins 25.2 3.9
lins 24.6 4.4
lins 27.6 5
lins 28.2 4.7
lins 29.2 5
lins 30.4 4.2
lins 30.8 2.7
lins 32.2 1.2
lins 32.9 1.35
lins 33 2.5
lins 31 5.5
lins 30.9 6.6
lins 31.2 7.5
lins 32.5 9
lins 34.3 11.3
lins 33.5 12
lins 33.1 13.5
lins 33.6 13
lins 34 12.5
lins 34.3 14.3
lins 34 14.4
lins 33.8 15.4
lins 34.5 15.5
lins 35 16
lins 34.4 16.2
lins 35.6 16.7
lins 37 17
lins 36.5 17.4
lins 36 18
lins 36.6 19.5
lins 36.7 20
lins 37.7 20.2
lins 37.5 20.8
lins 36.8 21.2
lins 36.5 22.3
lins 35.5 22.2
lins 35 20
lins 32.8 19.4
lins 32.2 18.5
lins 32 17.2
lins 30.3 17
lins 30.2 16.4
lins 28.4 15.2
lins 27.9 15.3
lins 28.4 16.5
lins 28 17
lins 28.2 17.5
lins 27.8 18.6
lins 26.4 18.9
lins 25.8 17.7
lins 26 16.2
lins 25.9 15.2
lins 25.2 15
lins 24.9 16.6
lins 25.3 18.7
lins 26.3 19.2
lins 24.3 19.3
lins 24.3 19.7
lins 23 19
lins 22.8 19.4
lins 22.1 19.1
lins 23 20
lins 23.7 20.4
lins 20.5 21
lins 20.3 21.4
lins 20.1 21.3
lins 20 21
lins 14.7 21.15
lins 7.6 22.1
lins 6.8 22.2
lins 3.5 23
ploticus-2.42/pltestsuite/data8 0000644 0001750 0001750 00000007374 07342725157 015635 0 ustar colin colin home
kwindex
details
browseform
list
measplot
details
involvsearch
home
home
home
listpar
home
list
list
details
home
gen
home
home
home
details
details
details
details
indexpage
list
details
list
details
gen
details
indexpage
listall
listall
home
details
twostrains
twostrains
home
phenomelist
details
liststudies
home
introducing
phenomelist
home
listpar
details
kwindex
details
details
details
details
details
details
details
measlist
measplot
measplot
list
future
details
details
details
details
liststudies
twostrains
twostrains
phenomelist
details
twostrains
twostrains
details
browseform
list
list
measplot
details
details
twostrains
twostrains
browseform
involvsearch
involvsearch
details
home
form
gen
details
twostrains
twostrains
browseform
liststudies
details
list
details
projstrainlist
details
list
statshelp
liststudies
details
list
details
list
details
measnumhelp
measlist
measplot
measplot
measplot
measplot
measplot
details
measplot
measplot
measplot
projstrainlist
list
list
list
list
list
list
projstrainlist
details
genscat
genscat
genscat
genscat
list
liststudies
details
details
details
list
statshelp
phenomelist
phenomelist
details
details
browseform
liststudies
home
home
gen
gen
details
liststudies
details
gen
measplot
cr
details
involvsearch
home
details
details
involvsearch
browseform
details
phenomelist
list
list
details
involvsearch
home
kwindex
home
details
browseform
details
browseform
list
sexdiff
liststudies
twostrains
twostrains
home
gen
measplot
stats
details
home
details
introducing
gettinginvolved
recommendations
details
gen
details
twostrains
twostrains
phenomelist
twostrains
browseform
list
details
liststudies
details
home
phenomelist
phenomelist
home
home
home
listall
list
list
list
list
list
measlist
details
browseform
home
home
list
details
list
home
details
home
list
details
browseform
list
list
list
measplot
projstrainlist
list
details
browseform
details
details
twostrains
twostrains
twostrains
details
listall
details
list
list
sublist
details
home
list
home
gen
gen
form
listall
details
gen
details
home
gen
gen
kwindex
details
details
details
details
details
introducing
details
twostrains
home
gen
cr
cr
home
listall
listall
details
measplot
measplot
measplot
measplot
listall
details
home
home
gen
list
details
browseform
involvsearch
details
home
home
home
home
home
home
home
list
statshelp
measplot
measplot
measplot
recommendations
recommendations
recommendations
home
gen
indexpage
list
details
browseform
list
details
list
list
form
gen
home
gen
gen
home
home
home
plothelp
details
twostrains
twostrains
twostrains
details
home
gen
gen
recommendations
home
form
list
home
list
measlist
details
phenomelist
list
details
liststudies
details
measnumhelp
browseform
list
measplot
projstrainlist
projstrainlist
details
stats
home
introducing
gettinginvolved
list
details
browseform
list
details
browseform
home
gentips
home
details
browseform
list
twostrains
twostrains
details
browseform
sexdiff
phenomelist
measplot
details
phenomelist
phenomelist
form
indexpage
list
details
details
indexpage
list
home
recommendations
home
steeringcomm
home
details
gentips
gen
gen
details
home
gettinginvolved
home
plin
plothelp
home
genscat
home
home
collab
recommendations
home
details
details
list
list
list
home
details
measplot
plin
home
steeringcomm
introducing
list
listall
listpar
kwindex
measlist
list
collab
recommendations
dataguide
details
plothelp
future
details
measnumhelp
plothelp
plothelp
home
home
recommendations
recommendations
details
list
list
list
details
browseform
list
sexdiff
sexdiff
twostrains
twostrains
twostrains
twostrains
liststudies
listall
details
monellanimal
details
monellanimal
monellanimal
monellanimal
monellgroup
home
dataguide
dataguide
dataguide
details
steeringcomm
steeringcomm
form
details
home
details
details
twostrains
liststudies
ploticus-2.42/pltestsuite/rangesweep2_dostext.htm 0000644 0001750 0001750 00000003753 10743167447 021415 0 ustar colin colin rangesweep2

How to download and try this example
Usage: pl -gif rangesweep2.htm
Contributed by Michelle Melia
#proc page
title: Average Night Driving Score
With Missing Values Imputed Using Approximate Bayesian Bootstrap
and 10% Lower on Average than Observed Values
titledetails: adjust=0,0.5
backgroundcolor: transparent
#proc areadef
// areaname: standard
xrange: 0 120
xaxis.stubs: inc 12
xaxis.label: Follow-up Time (Months)
yrange: 0 100
yaxis.stubs: inc 10
yaxis.label: Average Night Driving Score
#proc getdata
data:
0 a 69.44 . 64.24 74.65
0 b 74.62 . 70.45 78.79
6 a 57.59 . 52.11 63.07
6 b 66.26 . 60.91 71.61
12 a 58.46 0.81 56.69 60.22
12 b 67.28 2.90 63.17 71.40
24 a 55.13 2.52 51.87 58.38
24 b 63.07 2.94 59.04 67.10
36 a 59.39 6.25 53.95 64.82
36 b 54.62 6.65 49.39 59.85
48 a 53.67 6.91 48.48 58.86
48 b 57.62 38.09 41.97 73.26
60 a 53.45 7.06 48.20 58.71
60 b 64.53 7.91 58.30 70.76
72 a 54.74 7.25 49.42 60.07
72 b 59.41 10.88 51.47 67.34
84 a 61.48 7.60 56.01 66.94
84 b 63.78 5.09 59.05 68.52
96 a 56.87 8.35 51.17 62.56
96 b 65.90 6.46 60.25 71.56
108 a 57.37 18.97 47.68 67.05
108 b 62.27 8.07 56.38 68.16
120 a 55.51 12.81 48.46 62.56
120 b 53.52 6.95 48.35 58.69
#proc rangesweep
select: @@2 = a
xfield: 1
lofield: 5
hifield: 6
color: blue
legendlabel: Treatment A
#proc rangesweep
select: @@2 = b
xfield: 1
lofield: 5
hifield: 6
color: red
legendlabel: Treatment B
#proc lineplot
select: @@2 = a
yfield: 3
xfield: 1
linedetails: width=1.0 style=0 dashscale=2.0
pointsymbol: shape=circle style=fill
#saveas: R
#proc lineplot
#clone: R
select: @@2 = b
linedetails: width=1.0 style=2 dashscale=2.0
pointsymbol: shape=circle style=outline
#proc legend
location: min+1 min+0.7
ploticus-2.42/pltestsuite/testpf_cumufrac 0000755 0001750 0001750 00000001017 10111122531 017764 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=$3
if [ "$DEV" = "" ]; then
DEV=x11
fi
echo "cumufrac1.."
pl -prefab cumufrac data=cumufrac.dat x=1 x2=2 title="Cumulative fraction plot" \
name="set 1" name2="set 2" header=yes \
-$DEV -o ${OUTDIR}cumufrac1.$DEV $ARGS
echo "cumufrac2.."
pl -prefab cumufrac data=cumufrac.dat logmode=log x=1 x2=2 title="Cumulative fraction plot w/ log scale" \
linedet="color=blue width=1.5" linedet2="color=orange width=1.5 style=2 dashscale=3" header=yes \
-$DEV -o ${OUTDIR}cumufrac2.$DEV $ARGS
ploticus-2.42/pltestsuite/data6 0000644 0001750 0001750 00000004104 07342506173 015612 0 ustar colin colin 0.017
0.269
0.178
0.075
0.150
0.144
0.157
0.140
0.171
0.091
-0.418
-0.439
0.062
0.096
0.051
-0.299
0.048
-0.485
-0.336
-0.122
-0.119
-0.142
-0.069
-0.283
-0.114
0.115
0.123
0.185
0.204
-0.350
-0.234
0.375
0.137
-0.477
-0.349
-0.032
-0.210
-0.234
0.277
0.493
-0.117
0.034
-0.040
-0.040
0.421
0.239
-0.037
0.281
0.252
-0.113
0.095
0.088
0.222
0.466
0.136
0.380
0.049
0.454
0.224
-0.372
0.286
0.063
0.370
0.261
0.462
0.360
0.298
0.362
0.128
0.029
-0.031
0.032
-0.200
-0.328
0.295
0.331
0.064
0.153
-0.034
-0.036
-0.213
-0.182
-0.111
0.153
-0.006
0.231
0.229
0.209
-0.031
0.325
0.153
-0.062
0.168
0.110
-0.149
0.170
0.153
0.029
0.155
0.004
-0.030
0.242
0.135
-0.100
-0.320
0.183
0.125
-0.286
-0.081
0.042
-0.022
-0.208
-0.072
0.289
0.380
-0.018
0.080
0.214
0.044
-0.143
0.030
-0.345
0.167
0.264
-0.151
-0.282
-0.123
-0.181
0.153
0.057
-0.109
-0.222
-0.122
-0.230
-0.319
-0.058
-0.034
0.091
0.276
0.101
0.444
0.094
0.350
0.104
0.302
-0.014
-0.040
0.113
-0.108
0.153
0.181
-0.252
-0.127
-0.226
-0.479
-0.466
-0.439
0.101
-0.150
-0.124
0.247
0.106
0.139
0.152
0.131
0.096
0.096
0.219
-0.104
0.065
0.126
0.134
0.006
0.075
0.001
0.113
0.146
0.229
-0.018
0.293
0.065
0.071
-0.031
0.100
0.037
0.124
0.320
0.247
-0.010
-0.184
-0.066
-0.117
0.052
0.371
-0.058
-0.208
-0.400
0.109
-0.066
-0.232
0.120
-0.171
-0.108
-0.136
-0.160
-0.116
0.326
-0.002
-0.073
0.110
0.174
0.235
-0.128
-0.266
-0.105
0.322
0.101
-0.407
-0.045
0.037
0.116
-0.026
-0.117
0.204
-0.162
0.345
0.038
0.406
-0.041
0.169
-0.110
-0.161
-0.036
0.237
-0.053
-0.263
0.312
-0.027
-0.096
0.011
-0.111
0.089
-0.194
0.227
-0.010
-0.204
0.080
-0.095
0.246
-0.253
-0.038
-0.077
-0.077
0.170
-0.045
0.090
-0.355
0.189
0.217
-0.093
-0.052
-0.172
-0.123
-0.178
0.122
0.069
-0.038
0.179
-0.042
-0.265
0.004
-0.222
-0.005
0.028
0.104
-0.141
-0.143
-0.017
0.290
0.475
0.461
-0.097
0.289
0.335
-0.102
0.181
-0.002
-0.417
-0.414
0.205
-0.188
0.001
-0.193
0.145
0.124
0.013
0.195
0.034
0.100
0.114
0.491
0.172
0.176
-0.136
-0.148
0.414
0.539
0.561
0.538
0.564
0.502
-0.271
-0.736
0.562
0.561
0.419
0.645
-0.591
0.599
0.575
0.406
0.506
0.550
0.798
0.702
-0.528
0.519
-0.258
0.541
ploticus-2.42/pltestsuite/data27 0000644 0001750 0001750 00000000307 07776540530 015704 0 ustar colin colin 01/2003 5564
02/2003 34643
03/2003 12171008
04/2003 313003236
05/2003 1333282007
06/2003 48056454
07/2003 1422936580
08/2003 221422879
09/2003 39411542
10/2003 291975026
11/2003 7868609
12/2003 3311
ploticus-2.42/pltestsuite/data11 0000644 0001750 0001750 00000000044 07350130433 015654 0 ustar colin colin 20 17
42 65
43 67
44 62
45 78
54 27
ploticus-2.42/pltestsuite/timeline2.htm 0000644 0001750 0001750 00000003406 07164643376 017307 0 ustar colin colin timeline2

How to download and try this example
Usage: pl -gif timeline2.htm
// specify data using proc getdata
#proc getdata
data:
OWUNN 01/12/99 11/12/98 03/13/99
SMFWW 01/19/99 11/19/98 03/18/99
SDUNN 01/26/99 11/26/98 03/25/99
BAABR 01/31/99 12/01/98 04/01/99
UBANI 02/22/99 12/22/98 04/22/99
// set up plotting area using proc areadef
// Note that date format of mm/dd/yy is specified as the xscaletype.
#proc areadef
title: Allowable follow-up visit time windows
rectangle: 1 1 5 2
xscaletype: date mm/dd/yy
xrange: 11/01/98 05/01/99
yscaletype: categories
ycategories: datafield 1
// set up x and y axes using proc axis
// first time- do month stubs every 3 months
#proc xaxis
stubs: incremental 1 month
stubformat: MMMyy
// run it again to do the grid at every month
#proc xaxis
stubs: none
ticincrement: 1 month
grid: color=blue
#proc yaxis
stubs: categories
label: Patient code
labeldetails: adjust=-0.2,0
grid: color=green
// render bars using proc bars
// use segmentfields and tails but not lenfield
#proc bars
color: green
barwidth: 0.05
horizontalbars: yes
segmentfields: 3 4
locfield: 1
tails: 0.1
// render dots using proc scatterplot
#proc scatterplot
xfield: 2
yfield: 1
symbol: shape=circle style=filled fillcolor=red
legendlabel: = Target\n date
// render legend using proc legend
#proc legend
format: singleline
location: max-0.5 max
ploticus-2.42/pltestsuite/timely.htm 0000644 0001750 0001750 00000005420 07405130717 016704 0 ustar colin colin timely

How to download and try this example
Usage: pl -gif timely.htm
Uses the data file timely.dat
// do page title using proc page
#proc page
pagesize: 8.5 11
#if @DEVICE in gif,png
scale: 0.5
#endif
title: Timeliness of Problem Resolution, By Center
03-31-99
// do column headers using proc annotate
// and proc line
#proc annotate
location: 1 9.2
textdetails: align=C size=10
text: CENTER
#proc line
points 0.7 9 1.3 9
#proc annotate
location: 1.9 9.75
textdetails: align=C size=10
text: Number of
Problems
Reported &
Resolved
#proc line
points 1.5 9 2.3 9
// read in data file using proc getdata
#proc getdata
file: timely.dat
// keep only fields 3 and 9 using proc processdata
#proc processdata
keepfields: 3 9
// define the plotting area and do Y axis using proc areadef
#proc areadef
rectangle: 2.5 2 7.5 9.0
axes: Y
xrange: 0 90
yscaletype: categories
ycategories:
01 Sea
02 Alb
06 NY
07 Buf
08 DC
09 Orl
10 Hou
11 Cin
13 Chi
15 Tor
16 LV
18 Mon
19 Rch
20 Nor
21 NO
22 Mai
\
All
yaxis.stubdetails: align=L adjust=-1.5,0 size=10
yaxis.axisline: yes
yaxis.ticlen: 0
yaxis.stubs: usecategories
// do an X axis on bottom and top using proc xaxis
#proc xaxis
grid: color=green
label: Number of days
#saveas: AX
stubs: inc 20
// do a second x axis across the top..
#proc xaxis
#clone: AX
location: max
stubdetails: adjust=0,0.3
labeldetails: adjust=0,0.7
// do rangebar for all clinics using proc rangebar
#proc rangebar
axis: x
barloc: All
datafield: 2
mediansym: shape=circle fillcolor=0.2 style=filled radius=0.05
nlocation: 1.9
barwidth: 0.15
nword: N=@@N
tailmode: 5/95
textdetails: size=10
#saveas: B
#loop
#set CEN = $nextstub(2)
#if $strlen(@CEN) < 1
#break
#endif
#proc print
label: @CEN
// do rangebar for each center using proc rangebar
#proc rangebar
#clone B
select: @@1 = @CEN
barloc: @CEN
showoutliers: yes
#endloop
// do annotations at bottom of page using proc annotate
#proc annotate
location: 1 1.4
textdetails: align=L
text:
Dot = median.
Box = 25th through 75th percentile.
Tails = 5th and 95th percentile.
Outliers are marked with a circle or asterisk.
\
\
Includes only 2-year-contracted centers.
ploticus-2.42/pltestsuite/scatterplot4.htm 0000644 0001750 0001750 00000003204 07164643375 020042 0 ustar colin colin scatterplot4

How to download and try this example
Usage: pl -gif scatterplot4.htm
This example demonstrates how points out of plotting area are not shown.
// set up plotting region using proc areadef
#proc areadef
rectangle: 1 1 3 3
xrange: 30 60
yrange: 30 60
frame: width=0.5 color=0.3
xaxis.stubs: inc 10
yaxis.stubs: inc 10
// specify data using proc getdata
#proc getdata
#intrailer
// draw diagonal line using proc line
#proc line
notation: scaled
linedetails: width=0.5 color=0.8
points: 30 30 60 60
// draw pink points using proc scatterplot
#proc scatterplot
xfield: 1
yfield: 2
symbol: shape=nicecircle linecolor=red radius=0.07
text: A
textdetails: color=red style=I size=6
legendlabel: Alpha type
// draw green points using proc scatterplot
#proc scatterplot
xfield: 2
yfield: 3
symbol: shape=nicecircle linecolor=green radius=0.07
text: B
textdetails: color=green style=I size=6
legendlabel: Beta type
#proc legend
location: min+0.3 max-0.1
#proc trailer
data: 5 8 12
10 9 15
56 51 22
56 51 30
17 22 33
28 27 35
56 51 40
56 51 42
56 51 44
32 22 46
42 45 48
43 39 50
56 51 20
56 51 22
54 72 24
55 55 28
56 37 32
56 51 34
56 51 44
56 52 50
57 54 52
60 65 57
56 51 40
56 51 42
56 51 46
ploticus-2.42/pltestsuite/timely.dat 0000644 0001750 0001750 00000035543 06722536106 016700 0 ustar colin colin posted to 06 on 051597 returned on 100897 146
posted to 01 on 072897 returned on 080197 4
posted to 02 on 072897 returned on 082597 28
posted to 05 on 072897 returned on 080597 8
posted to 06 on 072897 returned on 080597 8
posted to 07 on 072897 returned on 102497 88
posted to 08 on 072897 returned on 072897 0
posted to 09 on 072897 returned on 072897 0
posted to 10 on 072897 returned on 080197 4
posted to 01 on 082797 returned on 090997 13
posted to 02 on 082797 returned on 092697 30
posted to 05 on 082797 returned on 091597 19
posted to 06 on 082797 returned on 093097 34
posted to 08 on 082797 returned on 092697 30
posted to 11 on 082797 returned on 091297 16
posted to 02 on 090597 returned on 092697 21
posted to 16 on 090597 returned on 091597 10
posted to 15 on 092397 returned on 092697 3
posted to 13 on 092497 returned on 100697 12
posted to 08 on 100197 returned on 100197 0
posted to 09 on 100197 returned on 100697 5
posted to 01 on 100697 returned on 100697 0
posted to 01 on 100897 returned on 102497 16
posted to 03 on 100897 returned on 102097 12
posted to 02 on 102297 returned on 102997 7
posted to 07 on 102297 returned on 102497 2
posted to 09 on 111097 returned on 111197 1
posted to 08 on 111197 returned on 111197 0
posted to 06 on 111197 returned on 111297 1
posted to 07 on 111297 returned on 111497 2
posted to 07 on 051597 returned on 111797 186
posted to 01 on 111497 returned on 111997 5
posted to 11 on 100897 returned on 112197 44
posted to 11 on 100197 returned on 112197 51
posted to 11 on 102297 returned on 112197 30
posted to 09 on 112197 returned on 112497 3
posted to 13 on 112197 returned on 112497 3
posted to 01 on 112197 returned on 112497 3
posted to 02 on 112197 returned on 112497 3
posted to 02 on 103197 returned on 112497 24
posted to 08 on 112597 returned on 112597 0
posted to 02 on 112597 returned on 120897 13
posted to 03 on 111997 returned on 120897 19
posted to 14 on 111997 returned on 120897 19
posted to 18 on 111197 returned on 120897 27
posted to 11 on 112197 returned on 120897 17
posted to 09 on 120897 returned on 120897 0
posted to 02 on 120897 returned on 120997 1
posted to 09 on 121297 returned on 121297 0
posted to 15 on 121297 returned on 121597 3
posted to 01 on 121797 returned on 121997 2
posted to 02 on 121297 returned on 010698 25
posted to 02 on 010798 returned on 010998 2
posted to 06 on 011698 returned on 011698 0
posted to 09 on 011698 returned on 011698 0
posted to 02 on 011698 returned on 012398 7
posted to tve on 012698 returned on 012698 0
posted to 15 on 012398 returned on 012798 4
posted to 13 on 011698 returned on 012898 12
posted to 06 on 012698 returned on 013098 4
posted to 02 on 020298 returned on 020298 0
posted to 13 on 020298 returned on 020298 0
posted to 06 on 112597 returned on 020998 76
posted to 06 on 020998 returned on 020998 0
posted to 06 on 120897 returned on 020998 63
posted to 07 on 020998 returned on 020998 0
posted to 02 on 100197 returned on 021198 133
posted to 02 on 021298 returned on 021398 1
posted to 15 on 022098 returned on 022398 3
posted to 14 on 021298 returned on 022798 15
posted to 01 on 022798 returned on 030298 3
posted to 06 on 112197 returned on 030298 101
posted to 05 on 020398 returned on 030298 27
posted to 13 on 010798 returned on 030398 55
posted to 02 on 022798 returned on 030498 5
posted to 16 on 112197 returned on 030498 103
posted to 13 on 031098 returned on 031098 0
posted to 01 on 031098 returned on 031098 0
posted to 02 on 031398 returned on 031898 5
posted to tve on 031398 returned on 031898 5
posted to 01 on 031398 returned on 032098 7
posted to 06 on 032098 returned on 032398 3
posted to 08 on 033198 returned on 033198 0
posted to 02 on 033098 returned on 040198 2
posted to 03 on 051597 returned on 040398 323
posted to 09 on 040698 returned on 040698 0
posted to 10 on 020998 returned on 040798 57
posted to 18 on 020998 returned on 040798 57
posted to 18 on 030498 returned on 040798 34
posted to 01 on 040698 returned on 040898 2
posted to 14 on 112597 returned on 041398 139
posted to 13 on 041398 returned on 041398 0
posted to 01 on 041398 returned on 041498 1
posted to 08 on 041398 returned on 041498 1
posted to 03 on 033198 returned on 041498 14
posted to 02 on 041498 returned on 041798 3
posted to 02 on 041398 returned on 041798 4
posted to 20 on 040698 returned on 041798 11
posted to 20 on 031398 returned on 041798 35
posted to 20 on 041398 returned on 041798 4
posted to 19 on 041498 returned on 041798 3
posted to 08 on 042298 returned on 042298 0
posted to 02 on 042298 returned on 042298 0
posted to tve on 042298 returned on 042298 0
posted to 15 on 041398 returned on 042998 16
posted to 10 on 041398 returned on 050498 21
posted to 10 on 041498 returned on 050498 20
posted to 06 on 041398 returned on 050598 22
posted to 13 on 051198 returned on 051298 1
posted to 07 on 051198 returned on 051298 1
posted to 06 on 051398 returned on 051398 0
posted to 07 on 051398 returned on 051398 0
posted to 18 on 112197 returned on 051598 175
posted to 18 on 041398 returned on 051598 32
posted to 02 on 051598 returned on 051598 0
posted to 09 on 052098 returned on 052298 2
posted to 19 on 052298 returned on 052298 0
posted to 02 on 052298 returned on 052298 0
posted to 06 on 052298 returned on 052298 0
posted to 11 on 051398 returned on 052798 14
posted to 02 on 052698 returned on 052798 1
posted to 01 on 052298 returned on 052998 7
posted to 07 on 052998 returned on 052998 0
posted to 20 on 052998 returned on 060198 3
posted to 02 on 060198 returned on 060198 0
posted to 20 on 060198 returned on 060298 1
posted to 08 on 060198 returned on 060398 2
posted to 13 on 060598 returned on 060898 3
posted to 06 on 060598 returned on 060898 3
posted to 20 on 060598 returned on 060898 3
posted to 15 on 060598 returned on 061098 5
posted to 01 on 060598 returned on 061298 7
posted to 02 on 061298 returned on 061298 0
posted to 16 on 060198 returned on 061698 15
posted to 03 on 060598 returned on 061698 11
posted to 19 on 061798 returned on 062298 5
posted to 21 on 061798 returned on 062298 5
posted to 14 on 020398 returned on 062298 139
posted to 02 on 062398 returned on 062998 6
posted to 09 on 062398 returned on 062998 6
posted to 06 on 070198 returned on 070198 0
posted to 09 on 070198 returned on 070198 0
posted to 02 on 070198 returned on 070698 5
posted to 06 on 070898 returned on 071098 2
posted to 19 on 062998 returned on 071098 11
posted to 07 on 071498 returned on 071498 0
posted to 06 on 071498 returned on 071598 1
posted to 22 on 071498 returned on 071598 1
posted to 06 on 072098 returned on 072198 1
posted to 09 on 072198 returned on 072498 3
posted to 21 on 072198 returned on 072498 3
posted to 01 on 072198 returned on 072498 3
posted to 01 on 072498 returned on 072498 0
posted to 02 on 072198 returned on 072798 6
posted to tve on 072898 returned on 073198 3
posted to 02 on 072498 returned on 073198 7
posted to 21 on 072898 returned on 073198 3
posted to 11 on 073198 returned on 080798 7
posted to 02 on 080798 returned on 080798 0
posted to 15 on 080798 returned on 081498 7
posted to 02 on 081498 returned on 081498 0
posted to 08 on 081798 returned on 081798 0
posted to 09 on 081798 returned on 081798 0
posted to 11 on 081798 returned on 081898 1
posted to 13 on 081498 returned on 081898 4
posted to 01 on 081498 returned on 081898 4
posted to 06 on 081498 returned on 081898 4
posted to 06 on 081798 returned on 081898 1
posted to 02 on 081798 returned on 081898 1
posted to 08 on 081498 returned on 081898 4
posted to 11 on 080798 returned on 081898 11
posted to 16 on 081798 returned on 082498 7
posted to 02 on 082598 returned on 082698 1
posted to 22 on 081498 returned on 082698 12
posted to 19 on 082598 returned on 082898 3
posted to 19 on 082698 returned on 082898 2
posted to tve on 082698 returned on 082898 2
posted to 01 on 083198 returned on 090198 1
posted to 16 on 061798 returned on 090198 76
posted to 16 on 051598 returned on 090198 109
posted to 16 on 070198 returned on 090298 63
posted to 21 on 082898 returned on 090298 5
posted to 02 on 090498 returned on 090898 4
posted to 01 on 090498 returned on 090898 4
posted to 15 on 083198 returned on 091498 14
posted to 06 on 091698 returned on 091698 0
posted to 15 on 091698 returned on 091898 2
posted to 02 on 091898 returned on 092198 3
posted to 02 on 092198 returned on 092198 0
posted to 02 on 091698 returned on 092298 6
posted to 09 on 091898 returned on 092398 5
posted to 16 on 092198 returned on 092398 2
posted to 21 on 092398 returned on 092498 1
posted to 02 on 092398 returned on 092498 1
posted to 11 on 091898 returned on 092998 11
posted to 11 on 092398 returned on 093098 7
posted to 10 on 092498 returned on 093098 6
posted to 15 on 091898 returned on 100698 18
posted to 15 on 100598 returned on 100698 1
posted to 01 on 100598 returned on 100798 2
posted to 07 on 100698 returned on 100798 1
posted to 08 on 100698 returned on 101298 6
posted to 01 on 101298 returned on 101298 0
posted to 11 on 100598 returned on 101398 8
posted to 21 on 101398 returned on 101398 0
posted to 11 on 101298 returned on 101498 2
posted to 02 on 101398 returned on 101498 1
posted to 02 on 100698 returned on 101498 8
posted to 13 on 101498 returned on 101498 0
posted to 02 on 101498 returned on 101698 2
posted to 19 on 101398 returned on 101698 3
posted to 06 on 101998 returned on 102098 1
posted to tve on 101398 returned on 102098 7
posted to 22 on 101298 returned on 102098 8
posted to 22 on 101398 returned on 102098 7
posted to 01 on 102198 returned on 102398 2
posted to 14 on 100698 returned on 102398 17
posted to 07 on 101298 returned on 102698 14
posted to 10 on 102398 returned on 102698 3
posted to 02 on 102398 returned on 102798 4
posted to 11 on 101998 returned on 102798 8
posted to 06 on 102898 returned on 103098 2
posted to 11 on 102898 returned on 103098 2
posted to 14 on 101498 returned on 103098 16
posted to 02 on 102898 returned on 103098 2
posted to 08 on 103098 returned on 103098 0
posted to 06 on 103098 returned on 103098 0
posted to 22 on 103098 returned on 110298 3
posted to 02 on 103098 returned on 110298 3
posted to 02 on 110398 returned on 110398 0
posted to 13 on 110998 returned on 110998 0
posted to 20 on 082598 returned on 111198 78
posted to 08 on 110998 returned on 111798 8
posted to 01 on 111698 returned on 111798 1
posted to 07 on 111798 returned on 111898 1
posted to 01 on 111798 returned on 112098 3
posted to 10 on 101398 returned on 112098 38
posted to 19 on 111698 returned on 112098 4
posted to 09 on 112098 returned on 112398 3
posted to 02 on 111698 returned on 112398 7
posted to 07 on 112498 returned on 112498 0
posted to 08 on 112498 returned on 112498 0
posted to 09 on 112498 returned on 112598 1
posted to 10 on 112498 returned on 112598 1
posted to 19 on 112498 returned on 120198 7
posted to 02 on 112098 returned on 120198 11
posted to 22 on 112598 returned on 120298 7
posted to 02 on 112598 returned on 120298 7
posted to 01 on 112498 returned on 120498 10
posted to 02 on 120498 returned on 120498 0
posted to 13 on 120498 returned on 120798 3
posted to 06 on 120898 returned on 120998 1
posted to 01 on 120498 returned on 121198 7
posted to 16 on 121498 returned on 121598 1
posted to 22 on 121498 returned on 121698 2
posted to 16 on 121698 returned on 121698 0
posted to 07 on 121698 returned on 121698 0
posted to 07 on 121498 returned on 121698 2
posted to 06 on 121698 returned on 121698 0
posted to tve on 121498 returned on 121898 4
posted to 02 on 121898 returned on 123098 12
posted to 02 on 123098 returned on 123098 0
posted to 07 on 122898 returned on 010499 7
posted to 02 on 122898 returned on 010499 7
posted to 06 on 082098 returned on 010499 137
posted to 06 on 123098 returned on 010599 6
posted to 15 on 122898 returned on 010699 9
posted to 02 on 010699 returned on 010699 0
posted to 01 on 122898 returned on 010899 11
posted to 08 on 120498 returned on 010899 35
posted to 08 on 011199 returned on 011199 0
posted to 02 on 011199 returned on 011199 0
posted to 06 on 011199 returned on 011199 0
posted to 16 on 011299 returned on 011299 0
posted to 20 on 112498 returned on 011399 50
posted to 18 on 122898 returned on 011399 16
posted to 01 on 011399 returned on 011499 1
posted to 02 on 011599 returned on 011599 0
posted to 11 on 012199 returned on 012199 0
posted to 09 on 012199 returned on 012299 1
posted to 18 on 012199 returned on 012299 1
posted to 16 on 012199 returned on 012599 4
posted to 09 on 012699 returned on 012699 0
posted to 06 on 012699 returned on 012799 1
posted to 03 on 122898 returned on 012999 32
posted to 08 on 012199 returned on 012999 8
posted to 10 on 012999 returned on 020299 4
posted to 02 on 020399 returned on 020399 0
posted to 10 on 011199 returned on 020499 24
posted to 21 on 122898 returned on 020899 42
posted to 10 on 121898 returned on 020899 52
posted to 07 on 020599 returned on 020899 3
posted to 10 on 020599 returned on 020899 3
posted to 06 on 020399 returned on 020899 5
posted to 02 on 020599 returned on 020899 3
posted to 16 on 020899 returned on 021099 2
posted to 08 on 012999 returned on 021099 12
posted to 11 on 021099 returned on 021099 0
posted to 11 on 020599 returned on 021299 7
posted to 02 on 022299 returned on 022299 0
posted to 16 on 022299 returned on 022399 1
posted to 02 on 022499 returned on 022699 2
posted to 18 on 022499 returned on 030199 5
posted to 10 on 022299 returned on 030199 7
posted to 11 on 022499 returned on 030299 6
posted to tve on 122898 returned on 030499 66
posted to 06 on 030499 returned on 030599 1
posted to 22 on 030499 returned on 030599 1
posted to 21 on 030499 returned on 030599 1
posted to 22 on 091898 returned on 030899 171
posted to 22 on 121698 returned on 030899 82
posted to 01 on 030499 returned on 030899 4
posted to 18 on 030499 returned on 030899 4
posted to 13 on 030899 returned on 030999 1
posted to 18 on 030899 returned on 031099 2
posted to 16 on 031099 returned on 031199 1
posted to 10 on 031099 returned on 031599 5
posted to tve on 031099 returned on 031599 5
posted to 01 on 031599 returned on 031599 0
posted to 06 on 031599 returned on 031699 1
posted to 11 on 031599 returned on 031799 2
posted to 06 on 031699 returned on 031799 1
posted to 02 on 031599 returned on 031899 3
posted to 11 on 031699 returned on 031999 3
posted to 22 on 031899 returned on 032299 4
posted to 06 on 032299 returned on 032299 0
posted to tve on 031599 returned on 032299 7
posted to 18 on 032299 returned on 032399 1
posted to 02 on 032599 returned on 032699 1
posted to 13 on 032599 returned on 032699 1
posted to 17 on 082598 returned on 032699 213
posted to 02 on 032699 returned on 032699 0
posted to 13 on 032999 returned on 032999 0
posted to 07 on 032999 returned on 032999 0
posted to 22 on 032699 returned on 032999 3
posted to 11 on 032999 returned on 033099 1
posted to rc on 033099 returned on 033099 0
posted to 15 on 033099 returned on 033099 0
posted to 08 on 032999 returned on 033199 2
posted to 18 on 020899 returned on 033199 51
posted to 18 on 062398 returned on 040199 282
posted to 18 on 081798 returned on 040299 228
posted to 13 on 033099 returned on 040299 3
ploticus-2.42/pltestsuite/sar-cpu.dat 0000644 0001750 0001750 00000017425 10743167736 016755 0 ustar colin colin
00:05:01 18 42 15 25
00:10:02 18 22 49 11
00:15:02 15 14 14 58
00:20:03 15 18 23 44
00:25:03 16 26 25 33
00:30:04 16 12 63 9
00:35:04 12 9 73 5
00:40:05 15 15 59 11
00:45:05 15 12 11 63
00:50:05 13 9 10 68
00:55:05 15 10 6 69
01:00:05 10 7 9 74
01:05:05 18 26 8 48
01:10:06 16 14 21 49
01:15:06 15 15 19 50
01:20:07 13 12 18 57
01:25:07 15 7 5 73
01:30:07 10 6 6 78
01:35:07 12 7 5 76
01:40:07 14 5 2 79
01:45:07 14 5 2 80
01:50:07 12 5 4 80
01:55:07 14 6 2 78
02:00:07 9 4 2 84
02:05:07 11 3 0 85
02:10:07 13 4 0 83
02:15:07 13 4 0 82
02:20:07 11 3 0 85
02:25:07 14 4 0 82
02:30:07 9 3 0 88
02:35:07 11 3 0 85
02:40:08 13 4 3 80
02:45:08 13 4 1 82
02:50:08 11 3 0 85
02:55:08 14 4 0 82
03:00:08 9 3 0 88
03:05:08 11 3 1 85
03:10:08 13 4 0 82
03:15:08 14 4 0 83
03:20:08 11 3 0 85
03:25:08 14 4 0 83
03:30:08 9 3 2 85
03:35:08 11 4 1 84
03:40:08 14 4 0 83
03:45:08 13 4 0 83
03:50:08 11 3 0 85
03:55:08 14 4 0 83
04:00:08 9 3 0 88
04:05:08 11 3 0 86
04:10:08 13 4 0 83
04:15:08 13 4 0 83
04:20:08 11 3 0 85
04:25:08 14 4 0 82
04:30:08 9 3 0 88
04:35:08 11 3 0 85
04:40:08 13 4 0 83
04:45:08 14 4 0 83
04:50:08 11 3 0 85
04:55:08 14 4 0 82
05:00:08 9 3 0 88
05:05:08 11 3 0 85
05:10:08 13 4 0 83
05:15:08 13 4 0 83
05:20:08 11 3 0 85
05:25:08 14 4 0 82
05:30:08 9 3 0 88
05:35:08 11 3 0 85
05:40:08 13 4 0 83
05:45:08 13 4 0 83
05:50:08 11 3 0 86
05:55:08 14 4 0 83
06:00:08 9 3 0 88
06:05:08 11 3 0 86
06:10:08 13 4 0 83
06:15:08 13 4 0 83
06:20:08 11 3 0 85
06:25:08 14 3 0 83
06:30:08 9 3 0 88
06:35:08 11 3 0 85
06:40:08 13 4 0 83
06:45:08 13 4 0 83
06:50:08 11 3 0 85
06:55:08 14 4 0 82
07:00:08 9 3 0 87
07:05:08 12 5 0 83
07:10:08 14 5 3 78
07:15:08 14 4 0 82
07:20:08 11 5 2 82
07:25:08 16 6 2 77
07:30:08 9 4 2 85
07:35:08 11 4 2 83
07:40:08 14 5 1 81
07:45:08 14 6 3 77
07:50:09 12 5 3 80
07:55:09 14 5 2 79
08:00:09 9 4 1 86
08:05:09 11 4 1 85
08:10:09 14 4 0 82
08:15:09 14 5 3 79
08:20:09 12 7 5 76
08:25:09 15 9 12 63
08:30:09 11 8 14 66
08:35:09 13 7 6 74
08:40:09 15 7 4 75
08:45:09 16 9 3 73
08:50:09 14 5 3 78
08:55:10 17 11 10 62
09:00:10 25 28 7 40
09:05:10 13 7 6 73
09:10:10 16 12 9 63
09:15:10 14 7 5 73
09:20:10 13 8 5 74
09:25:10 15 9 8 69
09:30:10 15 14 10 60
09:35:10 15 12 10 63
09:40:10 15 8 7 71
09:45:10 15 9 5 71
09:50:10 16 15 13 56
09:55:10 20 17 12 51
10:00:10 12 15 11 61
10:05:11 18 21 14 48
10:10:11 17 18 15 51
10:15:12 16 9 8 66
10:20:12 14 13 13 60
10:25:13 18 21 32 29
10:30:13 14 22 63 1
10:35:14 26 44 19 12
10:40:14 19 25 20 36
10:45:15 20 22 17 41
10:50:15 17 21 16 46
10:55:16 20 19 19 41
11:00:16 12 12 11 65
11:05:16 14 13 14 58
11:10:17 18 17 14 50
11:15:17 17 17 23 43
11:20:18 20 30 19 31
11:25:18 21 36 11 33
11:30:20 13 15 16 56
11:35:20 14 13 12 61
11:40:20 17 20 19 44
11:45:21 18 16 16 50
11:50:21 14 17 13 56
11:55:21 18 15 18 48
12:00:22 12 15 21 52
12:05:22 14 14 11 61
12:10:22 14 9 5 71
12:15:22 16 13 6 65
12:20:23 13 14 9 64
12:25:23 19 31 7 43
12:30:23 11 9 6 74
12:35:23 16 10 6 68
12:40:23 18 15 6 60
12:45:24 16 9 9 66
12:50:24 14 27 6 52
12:55:24 18 23 5 54
13:00:24 11 8 5 77
13:05:24 20 22 13 44
13:10:25 21 32 11 36
13:15:25 16 11 9 64
13:20:25 13 15 6 66
13:25:26 19 30 13 39
13:30:26 13 15 22 51
13:35:26 16 15 12 57
13:40:27 18 31 4 46
13:45:27 16 15 8 62
13:50:27 13 15 11 60
13:55:27 19 32 10 39
14:00:28 13 21 12 55
14:05:29 16 17 15 52
14:10:29 16 18 18 48
14:15:30 16 15 9 60
14:20:30 14 16 14 57
14:25:31 20 20 16 45
14:30:31 12 14 14 60
14:35:32 16 17 17 51
14:40:32 17 16 10 56
14:45:32 19 19 14 48
14:50:33 15 17 16 52
14:55:34 17 17 17 49
15:00:34 17 36 20 27
15:05:35 17 18 15 49
15:10:35 17 17 18 48
15:15:36 20 32 11 37
15:20:37 16 29 21 34
15:25:37 21 30 25 24
15:30:38 21 34 17 28
15:35:39 19 23 14 44
15:40:39 19 21 17 43
15:45:41 17 18 18 47
15:50:41 12 16 14 58
15:55:42 20 23 17 41
16:00:43 14 22 20 44
16:05:43 20 23 23 34
16:10:44 27 41 21 11
ploticus-2.42/pltestsuite/data17 0000644 0001750 0001750 00000002437 07343436174 015707 0 ustar colin colin 331 75
331.624 83.5518
332.105 88.7758
332.492 91.8638
332.818 93.6546
333.103 94.7003
333.361 95.3329
333.6 95.7299
333.822 95.9802
334.031 96.1365
334.229 96.2329
334.417 96.2892
334.597 96.3146
334.77 96.3119
334.937 96.2806
335.099 96.2213
335.256 96.138
335.409 96.0381
335.559 95.9312
335.707 95.828
335.853 95.7389
335.998 95.6729
336.142 95.6363
336.285 95.6322
336.428 95.6601
336.571 95.7173
336.714 95.7988
336.857 95.8982
337 96.0083
337.143 96.1219
337.286 96.2319
337.429 96.3313
337.571 96.4136
337.714 96.4722
337.857 96.5005
338 96.4917
338.143 96.4386
338.286 96.334
338.429 96.1716
338.571 95.9468
338.714 95.6584
338.857 95.3094
339 94.9083
339.143 94.4705
339.286 94.0179
339.429 93.5772
339.571 93.1761
339.714 92.8401
339.857 92.5889
340 92.4333
340.143 92.3717
340.286 92.3882
340.429 92.4546
340.571 92.5335
340.714 92.582
340.857 92.555
341 92.4083
341.143 92.1024
341.286 91.6051
341.429 90.8933
341.572 89.9539
341.715 88.7855
341.858 87.3989
342.002 85.8187
342.147 84.0842
342.293 82.2492
342.441 80.3788
342.591 78.5446
342.744 76.8201
342.901 75.2761
343.063 73.9759
343.23 72.9706
343.403 72.2959
343.583 71.9712
343.771 72.0006
343.969 72.3734
344.178 73.0645
344.4 74.0359
344.639 75.2362
344.897 76.5988
345.182 78.0319
345.508 79.4048
345.895 80.5352
346.376 81.1755
347 81
ploticus-2.42/pltestsuite/Diag.out 0000644 0001750 0001750 00000007403 10723354317 016270 0 ustar colin colin /home/scg/bin/pl
no -debug in /bin /usr/bin /usr/openwin/bin /usr/ccs/bin /usr/jax/bin /usr/local/bin /home/scg/bin /group/phenome/public/dev/bin /group/phenome/public/dev/bin2 /home/mpddba/util_bin ./
Wed Nov 28 16:08:28 EST 2007
--------- stock2...
Got command line arg(s): -x11
Got command line arg(s): stock2.htm
Device code is x
Clearing all data sets.
Version: pl 2.40-Dec'07
Script file is: stock2.htm
Script file successfully opened
Executing page
Executing areadef
areadef: lowerleft: 1,3 upperright: 5,5
areadef: xrange is 4-Apr-99 to 1-Jun-99. yrange is 50 to 60.
Executing getdata
Clearing data set field names.
Clearing all data sets.
Creating dataset 1 which has 29 rows and 6 fields.
Executing processdata
Creating dataset 2 which has 29 rows and 6 fields.
Executing xaxis
Executing yaxis
Executing bars
pl proc bars: error 2479: No such data field (2 // open)
pl proc bars: error 2479: No such data field (5 // close)
Executing areadef
areadef: lowerleft: 1,1.6 upperright: 5,2.6
areadef: xrange is 4-Apr-99 to 1-Jun-99. yrange is 0 to 5000000.
Executing xaxis
Executing yaxis
Executing bars
Done with page. Bounding box is: 0.00 , -27.86 to 8.00 , 8.00
--------- timely...
Got command line arg(s): -x11
Got command line arg(s): timely.htm
Device code is x
Clearing all data sets.
Version: pl 2.40-Dec'07
Script file is: timely.htm
Script file successfully opened
Executing page
Executing annotate
Executing line
Executing annotate
Executing line
Executing getdata
Clearing data set field names.
Clearing all data sets.
Creating dataset 1 which has 343 rows and 9 fields.
Executing processdata
pl proc processdata: error 7395: warning, no action specified, defaulting to action: echo
Clearing data set field names.
Creating dataset 2 which has 343 rows and 2 fields.
Executing areadef
categories in y: list of size=250 malloced
categories in y: setting up 18 categories
areadef: lowerleft: 2.5,2 upperright: 7.5,9
areadef: xrange is 0 to 90. yrange is 0 to 19.
Executing xaxis
Executing xaxis
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
01
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
02
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
06
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
07
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
08
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
09
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
10
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
11
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
13
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
15
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
16
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
18
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
19
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
20
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
21
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing print
22
Executing rangebar
pl: error 27925: proc rangebar has been replaced with proc boxplot
Executing annotate
ploticus-2.42/pltestsuite/run_prefabs_test 0000755 0001750 0001750 00000000600 07575630055 020165 0 ustar colin colin #!/bin/sh
#
# This script tests all prefabs.
# If no args are given, runs in X11 mode.
#
# Otherwise:
#
# DEV is output format, eg gif, png, svgz, etc.
DEV=$1
# OUTDIR is output directory. Must end in slash (/)..
OUTDIR=$2
# ARGS is any other arguments, typically "-scale 0.7" etc.
ARGS=$3
if [ "$DEV" = "" ]; then
DEV=x11
fi
for i in testpf_*
do
./$i $DEV $OUTDIR $ARGS
done
ploticus-2.42/pltestsuite/data14 0000644 0001750 0001750 00000004023 07347662701 015676 0 ustar colin colin 00/12/16 1
00/12/19 1
00/12/21 1
00/12/22 1
00/12/23 2
00/12/27 1
00/12/29 2
01/01/16 1
01/01/19 1
01/01/21 1
01/01/22 1
01/01/23 2
01/01/29 2
01/02/01 1
01/02/05 2
01/02/07 1
01/02/08 3
01/02/12 1
01/02/13 12
01/02/14 12
01/02/15 7
01/02/16 4
01/02/17 3
01/02/18 4
01/02/19 2
01/02/20 5
01/02/21 8
01/02/22 7
01/02/23 5
01/02/24 1
01/02/25 1
01/02/26 15
01/02/27 25
01/02/28 8
01/03/01 1
01/03/02 1
01/03/04 5
01/03/05 4
01/03/06 6
01/03/07 4
01/03/08 3
01/03/09 2
01/03/12 2
01/03/13 5
01/03/14 10
01/03/15 6
01/03/16 2
01/03/17 2
01/03/19 2
01/03/20 4
01/03/21 2
01/03/22 3
01/03/23 9
01/03/25 2
01/03/26 11
01/03/27 8
01/03/28 11
01/03/29 1
01/03/30 7
01/03/31 2
01/04/01 1
01/04/02 2
01/04/03 1
01/04/04 7
01/04/05 3
01/04/06 2
01/04/08 1
01/04/09 6
01/04/10 8
01/04/11 5
01/04/12 5
01/04/13 6
01/04/16 1
01/04/17 5
01/04/18 5
01/04/19 6
01/04/20 5
01/04/21 2
01/04/23 9
01/04/24 3
01/04/25 5
01/04/26 6
01/04/27 3
01/04/30 5
01/05/01 2
01/05/02 12
01/05/03 6
01/05/04 6
01/05/06 1
01/05/07 7
01/05/08 5
01/05/09 3
01/05/10 4
01/05/11 5
01/05/14 3
01/05/15 3
01/05/16 5
01/05/17 3
01/05/18 5
01/05/19 1
01/05/21 9
01/05/22 4
01/05/23 4
01/05/24 7
01/05/25 5
01/05/26 1
01/05/29 4
01/05/30 6
01/05/31 6
01/06/01 6
01/06/04 2
01/06/05 6
01/06/06 8
01/06/07 5
01/06/08 4
01/06/11 6
01/06/12 7
01/06/13 10
01/06/14 6
01/06/15 3
01/06/16 1
01/06/18 4
01/06/19 4
01/06/20 1
01/06/21 9
01/06/22 6
01/06/23 1
01/06/25 8
01/06/26 4
01/06/27 4
01/06/28 6
01/06/29 2
01/07/02 2
01/07/03 1
01/07/05 1
01/07/06 3
01/07/07 1
01/07/09 8
01/07/10 2
01/07/11 3
01/07/12 3
01/07/13 4
01/07/15 1
01/07/16 3
01/07/17 1
01/07/18 4
01/07/19 6
01/07/20 5
01/07/23 3
01/07/24 3
01/07/25 2
01/07/26 2
01/07/27 4
01/07/30 2
01/07/31 3
01/08/01 1
01/08/02 2
01/08/03 6
01/08/05 1
01/08/06 2
01/08/07 5
01/08/08 3
01/08/09 5
01/08/10 3
01/08/13 8
01/08/14 4
01/08/15 1
01/08/16 3
01/08/18 1
01/08/20 1
01/08/21 2
01/08/22 3
01/08/23 2
01/08/24 3
01/08/25 1
01/08/26 1
01/08/28 3
01/08/29 3
01/08/30 2
01/08/31 1
01/09/03 1
01/09/05 3
01/09/06 3
01/09/07 4
01/09/08 2
01/09/10 10
01/09/11 2
ploticus-2.42/pltestsuite/plconfig.spanish 0000644 0001750 0001750 00000000504 07441401675 020061 0 ustar colin colin // an example ploticus config file with Spanish used for dates
months: ene feb mar abr pue jun jul ago sep oct nov dic
months.abbrev: Ene Feb Mar Abr Pue Jun Jul Ago Sep Oct Nov Dic
months.full: Enero Febrero Marcha Abril Pueda Junio Julio Agosto Septiembre Octubre Noviembre Diciembre
weekdays: Dom Lun Mar Mie Jue Vie Sab
ploticus-2.42/pltestsuite/vermonth.tab 0000644 0001750 0001750 00000003162 07417601756 017233 0 ustar colin colin // 2-way distribution on field 2 (down) by field 1 (across)
// steve lisa rob takisha Total
970501 6 0 0 0 6
970601 118 0 0 0 118
970701 260 337 0 0 597
970801 100 368 0 0 468
970901 99 439 0 0 538
971001 66 508 0 0 574
971101 49 546 0 0 595
971201 48 357 0 0 405
980101 27 260 0 0 287
980201 212 387 0 0 599
980301 473 76 0 0 549
980401 418 330 0 0 748
980501 129 433 0 0 562
980601 314 284 0 0 598
980701 266 238 0 0 504
980801 82 286 365 0 733
980901 27 358 394 0 779
981001 160 524 412 0 1096
981101 86 55 685 0 826
981201 192 4 909 0 1105
990101 126 20 732 32 910
990201 105 0 942 73 1120
990301 51 0 1232 403 1686
990401 0 0 11 8 19
//Total: 3414 5810 5682 516 15422
ploticus-2.42/pltestsuite/cumufrac.dat 0000644 0001750 0001750 00000000357 07745766162 017212 0 ustar colin colin set1 set2
1.26 2.37
0.34 2.16
0.70 14.82
1.75 1.73
50.57 41.04
1.55 0.23
0.08 1.32
0.42 2.91
0.50 39.41
3.20 0.11
= 27.44
0.15 =
0.49 4.51
0.95 0.51
0.24 4.50
1.37 0.18
0.17 14.68
6.98 4.66
0.10 1.30
0.94 2.06
0.38 1.19
ploticus-2.42/pltestsuite/propbars1.htm 0000644 0001750 0001750 00000004577 07164643370 017334 0 ustar colin colin propbars1

How to download and try this example
Usage: pl -gif propbars1.htm
Source: Artemis Simopoulos, "The Omega Plan"
(Values interpreted from another graph and may not be exact)
// specify the data using proc getdata
// Each value is an individual percentage.
#proc page
landscape: yes
#proc getdata
// oil lin alph mono sat
data: Canola 22 10 63 5
Flaxseed 17 46 29 8
Olive 6 2 80 12
Walnut 62 8 20 10
Coconut 3 0 20 77
Corn 62 1 23 14
Safflower 78 0 12 10
// define plotting area using proc areadef
#proc areadef
title: Fats content of various oils
rectangle: 1 1 4 2.7
xrange: 0 100
yrange: 0 8
// do y axis stubs (oil names) using proc yaxis
#proc yaxis
stubs: datafields 1
grid: color=powderblue
axisline: none
tics: no
// do x axis stubs (percents) using proc xaxis
#proc xaxis
stubs: inc 20
stubformat: %3.0f%%
// do light green bars using proc bars
#proc bars
horizontalbars: yes
barwidth: 0.13
lenfield: 2
color: rgb(.6,.85,.8)
outline: no
legendlabel: Linolenic (omega-6)
#saveas: B
// do dark green bars
// Use stackfields to position bars beyond the first set of bars
#proc bars
#clone B
lenfield: 3
stackfields: 2
legendlabel: Alpha-Linolenic (omega-3)
color: teal
// do pink bars
// Use stackfields to position bars beyond the first two sets of bars
#proc bars
#clone B
lenfield: 4
stackfields: 2 3
legendlabel: Monounsaturated fats
color: pink
// do red bars
// Use stackfields to position bars beyond the first three sets of bars
#proc bars
#clone B
lenfield: 5
stackfields: 2 3 4
legendlabel: Saturated fats
color: red
// do legend (1st column) using proc legend
// the noclear attribute must be specified otherwise the entries are removed
// we need to keep them for the 2nd invocation, below..
#proc legend
location: min+0.2 min-0.3
noclear: yes
specifyorder: Lin
alpha
// do legend (2nd column) using proc legend
#proc legend
location: min+2.4 min-0.3
specifyorder: Mono
Satu
ploticus-2.42/pltestsuite/testpf_dist 0000755 0001750 0001750 00000000635 10175262670 017152 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=
if [ "$DEV" = "" ]; then
DEV=x11
fi
echo dist1..
pl -prefab dist x=1 data=data6 curve=yes binsize=0.05 barwidth=0.08 ygrid=yes \
title="Distribution of responses" \
-$DEV -o ${OUTDIR}dist1.$DEV $ARGS
echo dist2..
pl -prefab dist x=1 data=data8 cats=yes yrange=0 stubvert=yes barwidth=0.05 \
ylbl="# Hits" order=rev \
-$DEV -o ${OUTDIR}dist2.$DEV $ARGS
ploticus-2.42/pltestsuite/vf.dat 0000644 0001750 0001750 00000063171 06713637071 016011 0 ustar colin colin 41001 3 C 7 021 022 028 - - - - - - -
41002 1 C 7 048 049 049 - - - - - - -
41003 3 C B 047 035 - - - - - - - -
41004 1 A 7 100 100 100 - - - - - - -
41005 2 C B 093 093 - - - - - - - -
41006 2 C 7 087 034 - - - - - - - -
41007 3 A B 099 099 - - - - - - - -
41009 3 A B 069 073 - - - - - - - -
41010 2 C B 100 - - - - - - - - -
41011 1 A 7 100 - - - - - - - - -
41012 3 C B 049 - - - - - - - - -
41014 2 C B 094 - - - - - - - - -
41015 1 C B 030 - - - - - - - - -
41016 3 A 7 058 - - - - - - - - -
41017 2 A B 020 - - - - - - - - -
41090 5 A B 055 064 - 033 - - - - - -
41902 4 C B 098 085 093 098 100 - - - - 089
41903 6 C B 019 - - - - - - - - -
41904 4 A 7 051 051 053 055 053 051 - - 049 050
41906 7 A r 026 028 041 - - - - - - -
41908 6 A 7 047 019 033 053 - 046 - - - -
41909 4 A 7 091 100 100 085 100 099 - 047 - 061
41913 7 B l 079 097 094 100 098 100 - - - -
41916 4 C B 070 070 066 059 060 032 - 041 - 033
41917 5 C 7 080 080 081 083 085 073 - - - -
41919 5 A B 078 066 069 091 085 081 - - - -
41920 5 C 7 021 008 009 027 024 022 - - - -
41922 7 B l 018 025 025 027 025 023 - - - -
41923 5 A 7 020 028 027 027 029 028 - - - -
41925 7 A B 070 075 073 075 081 068 - - - -
41930 5 C B 078 080 078 081 079 078 - - - -
41932 4 C 7 020 025 049 048 061 054 - - 053 057
41934 5 A B 080 080 069 068 061 077 075 - - -
41936 5 A 7 046 054 023 025 032 030 - - - -
41937 4 A B 100 100 098 100 099 100 - 100 - 100
41938 6 C 7 098 100 096 090 092 089 095 - - -
41939 6 C 7 083 - - - - - - - - -
41940 4 C B 033 - - - - - - - - -
41948 7 B l 051 064 053 030 046 - 031 - - -
41949 6 A B 019 020 039 034 028 - 030 - - -
41951 4 A 7 100 100 100 100 098 100 - 100 - -
41952 4 A B 100 100 099 099 - - - - - -
41954 7 A r 067 058 032 024 - 021 025 - - -
41955 6 A B 037 022 028 027 - 023 025 - - -
41958 7 B r 039 035 - - - - - - - -
41961 6 A 7 064 063 065 055 064 - 065 - - -
41963 6 C 7 090 087 088 088 - 095 093 - - -
41964 7 A r 053 058 057 058 - 075 065 - - -
41966 5 C B 075 060 060 059 - 060 058 - - -
41967 6 C 7 071 090 073 064 - 057 - - - -
41970 5 C B 011 013 015 011 - - 022 - - -
41972 5 A B 092 091 085 089 - - 081 - - -
41973 4 C 7 091 097 094 088 - - 094 - - -
41983 5 A 7 095 097 098 097 - - - - - -
41985 5 C 7 079 080 071 022 - - 029 - - -
41989 1 C B 100 - 099 - - - - - - -
41991 5 C B 080 090 091 093 - - - - - -
41992 5 C 7 084 088 084 079 - - - - - -
41993 1 A B 099 099 096 100 - - - - - -
41994 1 A B 099 100 099 100 - - - - - -
41995 1 C 7 100 100 100 100 - - - - - -
41996 1 A 7 100 100 100 - - - - - - -
41997 1 A 7 100 100 100 - - - - - - -
41998 1 C B 100 - - - - - - - - -
42001 2 A B 079 074 072 - - - - - - -
42002 2 C B 086 085 083 - - - - - - -
42006 2 A B 082 082 076 - - - - - - -
42008 2 C 7 028 - - - - - - - - -
42009 2 C B 018 018 - - - - - - - -
42010 2 A B 096 097 098 - - - - - - -
42011 2 C B 088 087 - - - - - - - -
42013 2 A 7 048 033 - - - - - - - -
42014 2 A 7 021 026 031 - - - - - - -
42015 2 A 7 097 091 088 - - - - - - -
42016 3 A 7 090 092 088 - - - - - - -
42018 3 C B l l - - - - - - - -
42021 1 A 7 100 100 - - - - - - - -
42022 2 C 7 095 096 - - - - - - - -
42023 3 C B 092 094 094 - - - - - - -
42024 2 A B 084 085 - - - - - - - -
42025 1 C 7 100 - - - - - - - - -
42026 2 A 7 034 058 - - - - - - - -
42027 2 C 7 080 065 - - - - - - - -
42028 3 A 7 091 091 - - - - - - - -
42029 2 C B 023 026 - - - - - - - -
42030 2 C 7 095 - - - - - - - - -
42031 1 A 7 100 099 - - - - - - - -
42032 3 A 7 097 - - - - - - - - -
42034 3 C B 098 100 - - - - - - - -
42036 2 C 7 044 - - - - - - - - -
42037 2 A 7 090 084 - - - - - - - -
42038 3 A B 070 - - - - - - - - -
42039 2 C B 088 - - - - - - - - -
42040 1 C 7 100 - - - - - - - - -
42042 2 A B 093 - - - - - - - - -
42043 1 A B 030 - - - - - - - - -
42044 1 A B 065 - - - - - - - - -
42045 1 C B 098 - - - - - - - - -
42801 5 A B 034 052 052 054 - - 052 - - -
42802 7 B r 033 047 052 052 - 054 050 - - -
42803 7 B r 025 030 028 022 - 024 026 - - -
42805 5 C B 033 048 055 052 - 055 057 - - -
42806 5 A 7 061 058 061 054 - - - - - -
42807 4 C 7 026 047 048 046 - 047 049 - - -
42808 5 C 7 096 093 092 - - 053 051 - - -
42810 7 A B 080 078 076 067 - 071 053 - - -
42811 5 A B 093 095 098 098 - 096 098 - - -
42813 6 C 7 100 100 100 097 - 099 099 - - -
42816 5 C B 047 046 051 050 - 053 048 - - -
42818 5 C B 026 046 044 035 - 038 030 - - -
42819 5 C 7 080 073 080 078 - 074 079 - - -
42821 6 A 7 077 069 073 073 - 076 070 - - -
42822 5 A B 030 - 021 - - - - - - -
42824 5 A 7 094 091 095 050 - - 060 - - -
42825 5 C B 089 089 096 093 - - 062 - - -
42826 5 A 7 099 099 099 097 - - 062 - - -
42827 6 A B 100 099 093 092 - - 092 - - -
42828 4 C B 100 100 - 100 - - - - - -
42829 6 C B 064 - 089 090 - - 093 - - -
42830 6 A B 085 094 085 093 - - - - - -
42831 5 C 7 B l l 007 - - - - - -
42832 5 C 7 099 099 099 100 - - 098 - - -
42833 6 C B 016 033 - - - - - - - -
42834 1 A 7 019 010 016 023 - - 027 - - -
42835 1 A B 100 100 100 100 - - 100 - - -
42836 6 A B 100 100 100 100 - - 100 - - -
42838 6 C 7 099 099 099 099 - - - - - -
42840 1 C 7 100 100 100 100 - - - - - -
42842 1 C B 096 100 100 100 - - - - - -
42843 5 A B 026 023 022 028 - - - - - -
42846 5 A 7 091 098 094 095 - - - - - -
42847 6 A 7 070 082 092 080 - - - - - -
42848 6 C 7 045 051 046 035 - - - - - -
42852 1 A B 024 016 015 - - - - - - -
42901 6 C 7 091 094 094 094 096 096 - - - -
42902 6 A B 063 057 049 046 048 048 - - - -
42905 4 C B 100 - 100 - - - - - - -
42908 4 A 7 092 095 097 - - - - - - -
42909 4 C B 037 032 015 037 004 006 - 009 010 007
42910 6 A 7 080 085 083 093 084 090 - - - -
42912 5 C 7 089 - - 061 - - - - - -
42913 6 A B 099 100 097 100 100 099 - - - -
42916 6 C 7 073 068 039 024 020 030 - - - -
42917 5 C B 032 030 032 019 020 023 - - - -
42918 5 A 7 039 049 051 052 051 054 - - - -
42919 4 C B 046 049 054 050 l l - l l 017
42920 4 A 7 067 078 078 046 053 049 - - 029 028
42921 4 C B 069 070 073 064 059 069 - - 079 080
42922 5 C 7 019 024 B 017 025 024 - - - -
42923 5 A 7 096 083 096 097 071 061 - - - -
42926 4 A B 100 100 100 100 100 100 - - 100 100
42927 4 A B 080 099 092 093 063 068 - 076 068 -
42932 7 A r 068 048 045 042 037 034 - - - -
42934 4 A B 051 060 069 064 064 065 - - 062 066
42936 4 A 7 100 100 100 100 100 100 - 100 100 100
42938 5 A B 043 049 054 050 053 054 - - - -
42943 7 B r 097 098 098 097 099 - - - - -
42944 7 A B 023 028 039 046 047 036 046 - - -
42948 5 A B 095 095 097 095 090 - 094 - - -
42949 5 A 7 034 048 052 049 - - 040 - - -
42951 5 A B 095 094 094 096 - 086 090 - - -
42952 5 C B 082 084 088 087 086 090 092 - - -
42953 5 A 7 068 072 068 061 045 051 052 - - -
42955 7 B r 083 082 077 057 015 024 025 - - -
42959 6 C 7 087 089 084 080 080 088 075 - - -
42961 7 B r 045 053 050 053 055 054 054 - - -
42963 4 C 7 099 100 100 100 - 100 099 100 - -
42964 5 C B 096 - 091 078 055 057 - - - -
42965 5 C 7 063 030 027 028 035 038 - - - -
42966 5 A B 061 046 050 047 049 038 - - - -
42968 5 C B 015 019 013 018 - 025 019 - - -
42969 7 A B 055 061 058 064 - 060 061 - - -
42970 5 C 7 071 058 059 061 060 062 061 - - -
42971 4 C 7 100 100 100 100 - 100 - 100 - -
42972 6 C B 066 - - - - - - - - -
42973 4 A 7 100 100 100 100 - 100 100 100 - -
42976 4 C B 100 099 100 100 - - 100 086 - -
42977 4 A 7 039 045 040 045 - - 048 048 - -
42978 5 A B 060 076 068 - - - - - - -
42981 4 A 7 047 - - - - - - - - -
42982 5 C B 098 099 098 099 - 099 099 - - -
42983 5 C B 025 - 046 030 - - 036 - - -
42984 5 A B 018 019 018 017 - 020 016 - - -
42988 5 A B 052 046 048 052 - 048 050 - - -
42989 4 C B 100 100 100 100 - 100 100 099 - -
42990 5 C B 100 100 100 100 - 083 097 - - -
42991 5 A B 022 026 021 029 - 015 020 - - -
42992 5 C B 097 098 - 095 - 052 059 - - -
42993 6 A B 072 078 076 - - 069 - - - -
42995 6 C B 078 075 080 - - - - - - -
42997 5 C 7 080 080 076 058 - 071 075 - - -
42998 5 A B 074 074 070 072 - 064 068 - - -
43802 6 A 7 092 095 085 100 084 070 - - - -
43821 6 A B 060 065 069 - - - - - - -
43824 7 B r 020 017 026 026 014 013 - - - -
43838 7 A B 090 095 094 092 - - - - - -
43840 5 A B 085 085 088 078 077 064 076 - - -
43841 5 A B 099 - - - - - - - - -
43842 6 C 7 090 098 089 098 - - - - - -
43872 5 C B 100 099 100 098 100 099 098 - - -
43876 6 C B 060 020 018 006 007 015 - - - -
43877 5 A B 084 083 082 085 - 084 090 - - -
43878 5 C 7 094 095 096 095 080 100 - - - -
43882 5 A 7 095 100 100 098 - 099 100 - - -
43883 5 C 7 B 013 l l - l l - - -
43885 5 A B 003 009 029 025 - 029 036 - - -
43901 5 C 7 060 051 051 047 - - - - - -
43998 5 C 7 050 050 047 - - - - - - -
44904 5 A B 053 - - - - - - - - -
44910 7 B l 030 031 029 026 025 033 - - - -
45902 5 A 7 100 100 100 100 099 100 100 - - -
45903 7 A B 018 029 026 027 021 - 021 - - -
45904 5 C 7 094 095 099 095 - - - - - -
45905 7 B r 099 100 098 097 - - 099 - - -
45906 6 A 7 091 097 096 093 - - 097 - - -
45910 5 A 7 021 032 035 - - - - - - -
46001 1 C B 064 063 063 - - - - - - -
46003 1 A 7 091 093 092 - - - - - - -
46004 1 C B 100 100 100 - - - - - - -
46005 1 A 7 100 100 100 - - - - - - -
46006 1 A 7 100 100 - - - - - - - -
46007 1 C B 099 100 - - - - - - - -
46009 2 C 7 100 100 - - - - - - - -
46010 1 C 7 100 - - - - - - - - -
46012 3 A 7 092 - - - - - - - - -
46013 2 A 7 049 - - - - - - - - -
46014 2 C B 099 - - - - - - - - -
46015 3 C B 034 - - - - - - - - -
46017 2 A B 098 - - - - - - - - -
46018 2 C B 077 - - - - - - - - -
46800 5 C 7 099 100 100 100 - 099 - - - -
46809 6 A B 088 093 098 098 - - 061 - - -
46811 6 C B 099 100 099 099 - - - - - -
46815 1 C B 100 098 094 100 - 100 100 - - -
46816 5 C B 100 100 093 095 - - 092 - - -
46820 6 A 7 049 050 049 050 - - - - - -
46821 5 C 7 058 061 - 062 - - - - - -
46822 6 C B 100 097 100 092 - - - - - -
46823 1 A 7 100 100 100 - - - - - - -
46824 1 C 7 100 100 100 100 - - - - - -
46825 1 A B 100 100 100 - - - - - - -
46826 1 C B 071 083 082 096 - - - - - -
46827 1 A B 100 100 100 - - - - - - -
46828 1 A B 100 094 086 - - - - - - -
46901 4 A 7 055 060 057 056 - 055 - - - -
46902 4 C B 100 100 100 100 - 100 - - 100 100
46903 4 A B 100 100 100 100 - 100 - - - -
46904 4 C 7 091 078 093 100 - - - - - -
46905 4 A B 100 100 100 100 100 100 - - - 100
46906 6 A 7 097 095 100 100 100 - - - - -
46907 5 A 7 088 094 092 098 098 - - - - -
46912 4 C 7 100 100 100 100 - - - - 099 100
46914 7 A r 033 047 046 045 - 028 - - - -
46917 5 C 7 062 045 035 038 053 048 - - - -
46919 5 A B 028 032 029 - - - - - - -
46922 4 A B 100 100 100 100 100 100 - - 100 100
46924 5 A B 022 - - - - - - - - -
46925 5 C B 087 - - - - - - - - -
46926 7 B r 046 038 047 045 046 045 - - - -
46928 6 C B 038 034 048 028 049 052 - - - -
46929 6 C B 046 056 066 063 066 071 - - - -
46931 4 C 7 071 - - - - - - - - -
46934 6 A 7 070 057 047 045 - 035 - - - -
46936 5 C 7 021 032 047 040 045 048 - - - -
46939 6 C B 082 087 086 088 095 - 083 - - -
46941 7 B l 051 052 053 054 053 057 - - - -
46942 6 A 7 075 069 063 065 003 - - - - -
46946 4 A 7 099 099 - - - - - - - -
46947 4 C B 099 100 100 100 100 - 100 100 098 098
46949 5 A B 020 005 018 021 026 024 - - - -
46950 4 A 7 100 100 100 100 100 100 - 100 - -
46953 4 C 7 100 100 100 100 100 - 100 - - -
46955 6 A 7 038 040 048 050 - 052 - - - -
46956 6 C 7 045 017 023 021 033 - - - - -
46957 6 C 7 046 - - - - - - - - -
46958 6 A 7 068 063 071 075 - 070 - - - -
46960 4 C 7 100 100 100 100 100 - 100 - - 100
46964 4 A 7 077 091 090 093 091 091 094 091 - -
46969 6 C B 100 - - - - - - - - -
46970 5 C 7 086 090 088 085 - - 087 - - -
46973 6 A 7 021 053 054 - - - - - - -
46974 7 B l 050 - 055 058 050 054 - - - -
46976 4 C B 100 100 100 100 - 100 100 100 - -
46978 7 A B 073 020 069 067 017 - 017 - - -
46980 5 A B 045 041 042 030 040 - - - - -
46982 6 C 7 070 - - - - - - - - -
46984 4 A 7 100 100 100 100 - 100 100 100 - -
46985 7 A B 053 026 022 026 027 030 031 - - -
46990 7 B r 100 100 100 100 - - - - - -
46991 7 A B 039 - - - - - - - - -
46997 5 A 7 075 070 068 065 - - 034 - - -
46998 7 A B 100 100 097 100 - - 100 - - -
47001 2 A B 043 048 - - - - - - - -
47002 2 A B 100 098 - - - - - - - -
47003 2 C 7 070 - - - - - - - - -
47004 2 A B 071 063 - - - - - - - -
47006 3 C B 075 054 - - - - - - - -
47007 1 A 7 100 - - - - - - - - -
47008 2 C 7 015 - - - - - - - - -
47009 2 C B 020 - - - - - - - - -
47011 2 A B 026 - - - - - - - - -
47901 6 A B 015 029 032 033 038 030 - - - -
47904 4 A 7 023 030 031 037 040 031 - 040 - 040
47908 4 A B 100 - - - - - - - - -
47914 4 C 7 053 053 056 054 059 057 - - - -
47917 5 C 7 B l 006 002 012 004 - - - -
47919 7 A B 099 091 100 068 - - - - - -
47921 6 C 7 100 092 095 093 - - - - - -
47923 7 B r 028 049 057 058 062 052 - - - -
47925 4 C 7 100 - 100 - - - - - - -
47926 4 A B 100 100 100 100 100 100 - 100 - -
47929 7 A B 004 008 015 013 011 - 020 - - -
47930 5 A B 090 - - - - - - - - -
47931 6 C B 059 057 060 - - - - - - -
47932 6 C B 083 083 082 083 084 048 - - - -
47933 6 A 7 100 098 100 100 100 100 - - - -
47934 6 A 7 029 - 040 - - - - - - -
47935 6 A B 092 - 095 - - - - - - -
47936 6 C 7 100 - - - - - - - - -
47937 6 C B 090 098 - - - - - - - -
47938 6 C 7 006 - 014 - - - - - - -
47939 4 C B 097 093 - - - 096 - 093 - -
47940 5 C B 081 - 083 080 079 - 098 - - -
47942 5 A B 092 097 099 097 - - 098 - - -
47945 5 A B 100 100 100 097 - 100 097 - - -
47946 5 C 7 068 071 072 070 - - 071 - - -
47948 6 A 7 053 050 050 048 - 046 046 - - -
47949 5 C B 100 100 100 096 - - 099 - - -
47950 5 C B 054 067 067 055 - - 066 - - -
47952 7 B r 059 061 059 063 - - 060 - - -
47953 4 C 7 100 100 100 100 - - 100 - - -
47954 6 A B 086 084 083 084 - - - - - -
47955 5 A B 096 099 100 - - - - - - -
47956 1 A B 100 100 100 100 - - - - - -
47957 1 C B 087 - - - - - - - - -
47958 1 A B 022 025 028 026 - - - - - -
47959 1 A 7 099 090 079 090 - - - - - -
47960 1 C 7 052 053 055 - - - - - - -
48002 2 C B 050 053 054 - - - - - - -
48006 2 C B 050 - - - - - - - - -
48007 2 A 7 049 054 - - - - - - - -
48009 1 C B 100 100 - - - - - - - -
48010 1 A 7 100 099 - - - - - - - -
48011 2 A B 058 059 - - - - - - - -
48013 3 A B 092 - - - - - - - - -
48017 3 A 7 099 - - - - - - - - -
48019 3 C B 048 - - - - - - - - -
48023 2 A B 013 - - - - - - - - -
48024 1 A B 017 - - - - - - - - -
48025 2 A B 052 - - - - - - - - -
48901 4 C 7 100 100 100 100 100 100 098 100 - 097
48903 5 A B 092 093 093 - - - - - - -
48905 4 C 7 100 100 - - - 100 - - - -
48912 5 C B 049 052 047 046 045 045 045 - - -
48918 6 A B 100 099 100 097 100 099 - - - -
48919 4 A 7 100 100 100 100 100 100 - - 100 100
48922 4 C B 077 090 088 087 - 047 - - - -
48923 5 C 7 091 083 086 090 - 089 - - - -
48924 4 A B 100 100 100 100 - 100 - 100 - -
48925 4 A B 100 097 098 098 - 100 - 099 - -
48926 5 A 7 081 085 087 - - - - - - -
48927 4 C 7 023 045 052 045 - 060 058 062 - -
48928 6 A B 072 082 077 071 - - 051 - - -
48929 4 A B 100 100 100 100 - - 100 100 - -
48930 4 A B 100 100 100 100 - 100 100 - - -
48931 5 C 7 080 - - - - 064 - - - -
48932 5 A B 013 046 051 050 - - 057 - - -
48933 6 C 7 100 099 100 100 - - 095 - - -
48934 4 C B 100 - 100 - - - - - - -
48935 4 C B 100 100 100 100 - 100 100 - - -
48936 5 A 7 086 087 086 090 - - 088 - - -
48938 7 B r 084 085 083 087 - - 087 - - -
48939 4 A B 100 100 100 100 - - 100 - - -
48940 4 C B 090 096 095 092 - - 099 - - -
48941 4 A B 009 - 004 - - - - - - -
48943 7 A B 021 019 019 032 - - - - - -
48944 5 A 7 086 080 086 084 - - 080 - - -
48945 1 C 7 100 100 100 100 - 100 100 - - -
48947 5 C 7 026 - - - - - - - - -
48948 4 A 7 024 025 037 040 - 045 040 - - -
48951 1 C 7 100 100 100 100 - - 100 - - -
48952 6 C B 097 096 097 098 - - 077 - - -
48954 1 A B 100 100 100 100 - - - - - -
48956 1 C 7 100 100 100 100 - - - - - -
48957 1 A B 100 098 - - - - - - - -
48958 1 C B 045 - 065 - - - - - - -
49001 1 A B 099 094 095 - - - - - - -
49002 1 C B 100 100 100 - - - - - - -
49004 3 C 7 086 093 091 - - - - - - -
49006 2 A B 026 031 - - - - - - - -
49007 1 C B 099 099 - - - - - - - -
49008 1 A 7 066 - - - - - - - - -
49012 3 C 7 082 - - - - - - - - -
49901 7 B r 026 048 046 033 035 030 026 - - -
49902 5 A 7 055 054 046 025 018 020 - - - -
49909 5 A B 083 079 083 084 - - 083 - - -
49915 5 C B 057 056 061 063 - - 059 - - -
49916 4 C B 100 100 100 100 - 100 100 100 - -
49919 4 A B 100 100 100 100 - 100 100 100 - -
49920 7 B r 051 056 059 055 - 042 - - - -
49924 5 C 7 004 003 012 - - 025 025 - - -
49925 5 A B 100 100 100 100 - 099 - - - -
49927 5 C B 097 098 098 086 - - 050 - - -
49935 7 A r 016 021 024 017 - - 013 - - -
49937 7 A r 021 026 - - - - 013 - - -
49938 7 B r 034 029 031 030 - 029 028 - - -
49939 7 A B 076 078 - 080 - - 085 - - -
49941 5 A 7 098 099 100 098 - - 098 - - -
49943 7 B l 095 095 099 089 - 091 094 - - -
49944 4 A B 100 100 100 100 - - - - - -
49947 1 C 7 100 100 100 100 - - - - - -
49948 1 C B 100 100 - 099 - - - - - -
49949 5 A B 062 065 065 060 - - - - - -
49951 5 C 7 052 027 030 033 - - - - - -
49953 5 C 7 042 045 - 047 - - - - - -
49954 1 A B 100 099 100 100 - - - - - -
49955 1 C B 045 047 045 030 - - - - - -
49957 1 A 7 100 099 100 100 - - - - - -
49960 1 A 7 002 002 003 - - - - - - -
49961 1 C B 099 098 096 - - - - - - -
49962 1 A B 037 036 045 - - - - - - -
50001 3 A 7 094 096 - - - - - - - -
50002 2 C B 067 073 - - - - - - - -
50004 2 A 7 100 098 - - - - - - - -
50005 2 A B 089 072 - - - - - - - -
50007 3 C B 094 090 - - - - - - - -
50009 2 C 7 097 098 - - - - - - - -
50010 3 A B 091 088 - - - - - - - -
50014 3 A B 100 - - - - - - - - -
50015 2 A 7 029 - - - - - - - - -
50019 2 A 7 099 - - - - - - - - -
50022 3 C 7 099 - - - - - - - - -
50023 2 C B 090 - - - - - - - - -
50025 2 C B 091 - - - - - - - - -
50901 5 A B 048 038 037 - - - - - - -
50902 6 A 7 042 041 041 049 042 048 - - - -
50903 5 C B 021 028 012 - - - - - - -
50908 6 C B 093 100 - - - - - - - -
50909 5 C B 097 097 094 094 097 080 075 - - -
50910 5 A B 053 059 061 048 - - - - - -
50911 5 A B 039 046 050 045 035 040 031 - - -
50912 5 C B 085 086 078 090 089 092 092 - - -
50913 6 C B 013 - - - - - - - - -
50914 7 B l 098 097 094 096 096 087 - - - -
50915 6 A B 055 063 060 058 - 047 051 - - -
50917 7 A B 100 094 100 099 071 073 - - - -
50919 7 B r 020 027 022 030 - - - - - -
50920 6 A 7 098 099 - 099 - 100 - - - -
50925 5 A 7 091 084 053 057 054 046 - - - -
50930 6 C B 100 090 099 - - - - - - -
50931 5 A 7 032 036 036 033 - - - - - -
50933 5 C B 068 - 065 067 - - 051 - - -
50934 5 C B 088 086 090 082 - - 033 - - -
50936 5 C B 013 020 - 029 - - 037 - - -
50937 4 C B 100 100 100 100 - - 100 - - -
50938 5 C B 096 093 097 093 - - 090 - - -
50939 7 B l 086 087 084 051 - 050 050 - - -
50940 5 A 7 028 031 033 024 - - 032 - - -
50941 5 A B 098 - 098 096 - 096 098 - - -
50942 7 A B 012 016 006 004 - 002 - - - -
50943 5 A 7 070 059 066 062 - - 062 - - -
50944 7 A r 097 096 054 042 - - - - - -
50946 6 A 7 020 014 017 020 - 020 - - - -
50948 7 B r 098 097 098 099 - 096 098 - - -
50949 7 A B 067 071 063 052 - 064 060 - - -
50956 5 C 7 099 099 - - - - - - - -
50958 6 C 7 096 097 100 100 - - - - - -
51001 2 A B 083 080 089 - - - - - - -
51002 3 C B 097 093 087 - - - - - - -
51003 2 A 7 018 027 031 - - - - - - -
51005 2 C B 035 019 - - - - - - - -
51006 2 A B 062 061 - - - - - - - -
51007 3 C B 029 033 - - - - - - - -
51008 2 C 7 036 - - - - - - - - -
51009 2 C 7 073 062 - - - - - - - -
51010 2 C B 048 - - - - - - - - -
51011 3 A 7 046 - - - - - - - - -
51901 5 C B 095 - - - - - - - - -
51902 7 A r 087 086 087 089 - - 092 - - -
51903 7 A B 088 085 085 063 - 050 - - - -
51904 7 B l 083 076 080 080 - 079 080 - - -
51905 6 C B 094 093 098 084 - 014 - - - -
51906 6 A B 088 - 083 090 - 080 083 - - -
51907 5 C B 005 029 044 027 - 047 046 - - -
51908 6 A 7 050 056 053 054 - - 057 - - -
51909 6 C 7 077 078 085 074 - - 067 - - -
51910 6 A B 095 087 094 087 - - 092 - - -
51911 5 A 7 099 097 099 100 - - 082 - - -
51912 6 C 7 034 027 032 026 - - - - - -
52901 7 B l 100 090 065 024 - - - - - -
52902 5 C B 084 099 079 086 - - - - - -
53001 1 C 7 028 028 022 - - - - - - -
53002 3 C B 093 - - - - - - - - -
53003 3 A B 025 040 - - - - - - - -
53004 2 C 7 095 095 - - - - - - - -
53006 1 C 7 080 097 - - - - - - - -
53007 2 C B 096 099 - - - - - - - -
53008 2 C B 084 066 - - - - - - - -
53009 2 A B 084 - - - - - - - - -
53010 2 C 7 093 - - - - - - - - -
53011 1 A 7 B - - - - - - - - -
53901 4 A 7 100 099 100 100 - 100 100 - - -
53902 4 C B 100 100 - - - - - - - -
53903 4 A B 100 098 098 096 - - - - - -
53904 1 C 7 100 100 - 100 - - - - - -
53905 1 C 7 098 096 100 099 - - - - - -
53906 1 A B 100 - - 099 - - - - - -
53907 1 C 7 100 100 100 099 - - - - - -
53908 1 A B 100 098 - - - - - - - -
53909 1 C 7 100 100 096 - - - - - - -
53910 1 C B 100 100 100 099 - - - - - -
53911 1 A B 100 100 - 100 - - - - - -
53912 1 A B 100 100 - - - - - - - -
54901 6 C 7 002 - - 006 - - - - - -
54902 6 C B 024 055 050 017 - 021 - - - -
54904 6 A 7 100 - 090 - - - - - - -
54905 6 A 7 B 005 010 005 - 009 - - - -
54906 6 A B 056 047 065 061 - - - - - -
55001 1 C 7 099 100 - - - - - - - -
55002 1 A B 100 100 100 - - - - - - -
55004 1 A B 099 097 - - - - - - - -
55005 2 C B 098 094 - - - - - - - -
55006 2 C B 079 - - - - - - - - -
55007 1 C B 048 - - - - - - - - -
55008 3 C B 024 - - - - - - - - -
55009 2 A 7 015 - - - - - - - - -
55010 2 A 7 087 - - - - - - - - -
55011 3 A 7 091 - - - - - - - - -
55901 7 A B 098 093 099 100 - - 100 - - -
55902 7 B r 012 029 014 020 - - 041 - - -
55903 5 A B 028 046 049 050 - 047 049 - - -
55904 5 C B 005 003 003 007 - - - - - -
55905 7 A B 053 065 054 054 - 039 - - - -
55906 7 B r 095 093 097 100 - - 100 - - -
55907 6 A 7 091 094 096 098 - - 100 - - -
55908 6 A 7 018 034 051 047 - 049 056 - - -
55909 6 C B 083 084 082 059 - - - - - -
55910 5 C 7 073 055 052 045 - 030 030 - - -
55911 4 C 7 096 099 100 099 - 100 - - - -
55912 5 A B 092 096 099 092 - 089 092 - - -
55913 4 A B 095 093 099 096 - 096 - - - -
55914 7 A B 022 028 - - - - - - - -
55915 5 A 7 094 094 095 094 - - 092 - - -
55916 5 A B 062 063 060 067 - - 072 - - -
55917 7 A r 020 017 002 002 - B - - - -
55918 5 A 7 095 094 099 100 - 099 100 - - -
55919 5 C B 100 098 089 097 - - - - - -
55920 4 C B 100 - 099 098 - - - - - -
55921 5 A 7 100 - - - - - - - - -
55922 6 C 7 B l l l - - l - - -
55923 1 C B 100 - - - - - - - - -
55924 6 A 7 097 098 095 096 - - - - - -
55925 1 A 7 098 095 098 100 - - - - - -
55926 5 A 7 008 018 008 - - - - - - -
55927 5 A B 029 024 030 013 - - - - - -
55928 1 A 7 100 - 100 - - - - - - -
56001 3 A B 011 019 - - - - - - - -
56003 2 A B 093 092 - - - - - - - -
56004 2 A 7 097 099 - - - - - - - -
56005 2 C 7 100 100 - - - - - - - -
56006 3 C 7 009 - - - - - - - - -
56007 3 A B 086 - - - - - - - - -
56008 2 A B 040 - - - - - - - - -
56009 2 C B 016 - - - - - - - - -
56010 2 C B 092 - - - - - - - - -
56011 3 C 7 100 - - - - - - - - -
56013 2 A 7 020 - - - - - - - - -
56901 7 B l 070 050 032 048 - 030 033 - - -
56902 7 A B 078 085 077 082 - 062 - - - -
56903 6 C B 010 - - - - - - - - -
56904 5 A 7 020 025 033 017 - - - - - -
56905 6 A B 091 088 090 085 - - 085 - - -
56909 7 A r 018 022 024 031 - - 033 - - -
56910 7 B l 017 006 020 021 - - - - - -
56911 5 C 7 027 054 - - - - - - - -
56912 7 B r 026 017 022 022 - - 027 - - -
56913 5 C 7 047 - - - - - - - - -
56915 5 C 7 053 077 083 087 - 083 - - - -
56916 5 A B 085 - 088 086 - 087 - - - -
56917 7 B r 014 035 017 - - - - - - -
56918 5 A 7 016 025 021 - - - - - - -
56921 5 C 7 039 - - - - - - - - -
56922 5 C 7 025 043 039 026 - - - - - -
56923 7 B r 039 044 045 051 - - - - - -
57901 7 A r 028 048 - 054 - 057 - - - -
57906 5 A 7 028 028 027 030 - - - - - -
57907 5 A 7 079 096 094 093 - - - - - -
58005 2 A B 100 096 - - - - - - - -
58007 2 A B 005 - - - - - - - - -
58008 2 C 7 021 020 - - - - - - - -
58009 2 A 7 098 097 - - - - - - - -
58010 2 C B l - - - - - - - - -
58011 2 A 7 099 100 - - - - - - - -
58014 3 A B 024 - - - - - - - - -
58015 2 A B 077 - - - - - - - - -
58016 2 C 7 004 021 - - - - - - - -
58017 3 C B l l - - - - - - - -
58020 3 C B 069 - - - - - - - - -
58021 2 C 7 082 - - - - - - - - -
58022 2 C 7 081 - - - - - - - - -
58023 2 A B 061 - - - - - - - - -
58026 3 A 7 048 - - - - - - - - -
58028 2 C 7 079 - - - - - - - - -
58030 3 A B 084 - - - - - - - - -
58902 5 C 7 086 086 083 081 - - - - - -
58904 5 C 7 027 018 021 - - - - - - -
58906 5 A 7 096 095 091 094 - - - - - -
58908 5 C 7 073 071 - - - - - - - -
58909 6 A 7 006 012 - - - - - - - -
59001 1 A B 055 051 055 - - - - - - -
59002 1 C 7 100 100 100 - - - - - - -
59003 1 C B 100 - - - - - - - - -
60001 1 C B 095 100 100 100 - - - - - -
60002 1 A 7 090 098 100 091 - - - - - -
60003 1 C B 100 097 099 - - - - - - -
60004 1 C 7 100 100 100 - - - - - - -
60005 1 A B 098 099 100 - - - - - - -
60006 1 A B 100 099 100 - - - - - - -
61001 1 C 7 098 099 100 - - - - - - -
61002 1 A 7 100 100 100 - - - - - - -
61003 2 C B 051 069 - - - - - - - -
61004 1 C 7 099 090 - - - - - - - -
61005 3 A 7 013 015 - - - - - - - -
61006 2 C 7 068 065 - - - - - - - -
61007 2 A 7 052 074 - - - - - - - -
61008 2 A 7 054 052 - - - - - - - -
61009 2 C B 018 - - - - - - - - -
61010 3 C B 097 089 - - - - - - - -
61011 1 A 7 100 - - - - - - - - -
61012 2 C 7 079 - - - - - - - - -
61013 1 C B 100 - - - - - - - - -
61014 2 A B 095 - - - - - - - - -
61101 1 A 7 100 100 100 100 - - - - - -
62001 1 A 7 093 100 098 - - - - - - -
62002 1 C 7 094 098 100 - - - - - - -
62003 1 C 7 100 100 100 - - - - - - -
62004 2 C 7 100 - - - - - - - - -
62005 1 A B 095 096 091 - - - - - - -
62006 2 A B 088 100 095 - - - - - - -
62007 2 A 7 100 098 - - - - - - - -
62008 1 A B 099 100 - - - - - - - -
62009 2 A 7 098 089 - - - - - - - -
62010 3 C 7 059 075 - - - - - - - -
62011 2 C B 096 097 - - - - - - - -
62012 2 C B 014 - - - - - - - - -
62013 1 C 7 100 - - - - - - - - -
62014 2 C 7 094 - - - - - - - - -
ploticus-2.42/pltestsuite/data4 0000644 0001750 0001750 00000000050 07342470467 015612 0 ustar colin colin Group A 78 7
Group B 84 12
Group C 56 6
ploticus-2.42/pltestsuite/data1 0000644 0001750 0001750 00000000215 07204520617 015600 0 ustar colin colin A/J 1.39 331
BALB/cJ 1.67 182
C3H/HeJ 2.07 301
C57BL 1.34 173
C57BR 2.16 265
CAST/Ei 2.51 429
CBA/J 1.27 101
DBA/2J 1.53 119
FVB/NJ 1.32 177
ploticus-2.42/pltestsuite/dtfut.dat 0000644 0001750 0001750 00000001000 10743161147 016475 0 ustar colin colin "CC JU" 65 35
"FX JU" 87 13
"LH JU" 59 41
"LC AU" 86 14
"SP JU" 79 21
"BP JU" 87 13
"ND JU" 57 43
"US SE" 84 16
"HG JU" 50 50
"FB SE" 88 12
"CT JU" 59 41
"SI JU" 68 32
"NK JU" 24 76
"KC JU" 55 45
"AD JU" 84 16
"CD JU" 79 21
"SF JU" 86 14
"MB SE" 100 0
"ED SE" 91 9
"GC AU" 55 45
"TY SE" 80 20
"HU JU" 70 30
"HO JU" 80 20
"NG JU" 64 36
"W_ JU" 16 84
"BO JU" 60 40
"S_ JU" 79 21
"JY JU" 73 27
"C_ JU" 32 68
"CL JU" 75 25
"SB JU" 85 15
"SM JU" 86 14
ploticus-2.42/pltestsuite/venn.htm 0000644 0001750 0001750 00000000665 10302223620 016337 0 ustar colin colin venn

// Usage: pl -gif venn.htm
//
// Venn diagram example
#proc page
pagesize: 8 7
title: Venn diagram example
#proc venndisk
location: 3 4
area: 8
color: green
label: set A
#proc venndisk
location: 5 4
area: 7
color: lavender
label: set B
#proc venndisk
location: 4 2.6
area: 4
color: orange
label: set C
#proc legend
location: 2 1.3
format: across
ploticus-2.42/pltestsuite/csmap.out 0000644 0001750 0001750 00000035447 11766423465 016551 0 ustar colin colin
ploticus-2.42/pltestsuite/data2 0000644 0001750 0001750 00000000215 07342437244 015607 0 ustar colin colin A/J,1.39,331
BALB/cJ,1.67,182
C3H/HeJ,2.07,301
C57BL,1.34,173
C57BR,2.16,265
CAST/Ei,2.51,429
CBA/J,1.27,101
DBA/2J,1.53,119
FVB/NJ,1.32,177
ploticus-2.42/pltestsuite/data5 0000644 0001750 0001750 00000000273 07342500326 015606 0 ustar colin colin Test 3 76 19 84 14
Test 4 83 12 64 9
Test 5 95 11 92 13
Test 6 42 8 76 11
Test 7 69 13 68 6
Test 8 76 19 84 14
Test 9 83 12 64 9
Test 10 95 11 92 13
Test 11 42 8 76 11
Test 12 69 13 68 6
ploticus-2.42/pltestsuite/strainz.dat 0000644 0001750 0001750 00000004615 07575414015 017064 0 ustar colin colin strain meas value zscore
129S1/SvImJ HR 721.2 -0.344
A/J HR 732.5 -0.190
AKR/J HR 678.1 -0.936
BALB/cJ HR 558.8 -2.57
BTBR_T+_tf/tf HR 741.9 -0.0613
C3H/HeJ HR 798.0 0.709
C57BL/6J HR 764.2 0.246
CAST/Ei HR 841.9 1.31
CBA/J HR 806.9 0.832
DBA/2J HR 692.3 -0.741
FVB/NJ HR 781.4 0.481
LP/J HR 788.0 0.572
NOD/LtJ HR 793.7 0.650
NZB/BlNJ HR 808.1 0.848
PL/J HR 664.1 -1.13
SJL/J HR 689.4 -0.782
SWR/J HR 827.2 1.11
129S1/SvImJ HR_VAR 7.837 -0.797
A/J HR_VAR 16.33 -0.251
AKR/J HR_VAR 12.65 -0.487
BALB/cJ HR_VAR 44.69 1.58
BTBR_T+_tf/tf HR_VAR 9.562 -0.686
C3H/HeJ HR_VAR 57.65 2.41
C57BL/6J HR_VAR 11.38 -0.569
CAST/Ei HR_VAR 12.02 -0.528
CBA/J HR_VAR 8.736 -0.739
DBA/2J HR_VAR 48.89 1.85
FVB/NJ HR_VAR 21.43 0.0782
LP/J HR_VAR 14.69 -0.356
NOD/LtJ HR_VAR 5.431 -0.952
NZB/BlNJ HR_VAR 15.52 -0.303
PL/J HR_VAR 13.43 -0.437
SJL/J HR_VAR 14.71 -0.355
SWR/J HR_VAR 28.76 0.550
129S1/SvImJ PQ 24.43 1.41
A/J PQ 22.67 0.618
AKR/J PQ 21.79 0.223
BALB/cJ PQ 21.26 -0.0184
BTBR_T+_tf/tf PQ 23.89 1.17
C3H/HeJ PQ 18.35 -1.33
C57BL/6J PQ 21.76 0.206
CAST/Ei PQ 17.88 -1.55
CBA/J PQ 20.41 -0.405
DBA/2J PQ 19.67 -0.737
FVB/NJ PQ 17.79 -1.59
LP/J PQ 22.71 0.639
NOD/LtJ PQ 22.16 0.390
NZB/BlNJ PQ 23.05 0.790
PL/J PQ 23.00 0.769
SJL/J PQ 23.26 0.885
SWR/J PQ 18.05 -1.47
129S1/SvImJ PR 29.72 1.47
A/J PR 27.63 0.640
AKR/J PR 25.63 -0.159
BALB/cJ PR 27.38 0.539
BTBR_T+_tf/tf PR 28.66 1.05
C3H/HeJ PR 22.93 -1.23
C57BL/6J PR 25.03 -0.395
CAST/Ei PR 22.55 -1.38
CBA/J PR 24.14 -0.751
DBA/2J PR 25.47 -0.220
FVB/NJ PR 21.49 -1.80
LP/J PR 27.79 0.701
NOD/LtJ PR 26.23 0.0820
NZB/BlNJ PR 27.80 0.706
PL/J PR 28.56 1.01
SJL/J PR 28.53 0.997
SWR/J PR 22.88 -1.25
129S1/SvImJ QRS 8.613 0.780
A/J QRS 8.060 0.135
AKR/J QRS 7.594 -0.409
BALB/cJ QRS 10.15 2.58
BTBR_T+_tf/tf QRS 7.938 -0.00804
C3H/HeJ QRS 7.367 -0.674
C57BL/6J QRS 7.200 -0.869
CAST/Ei QRS 7.337 -0.708
CBA/J QRS 6.925 -1.19
DBA/2J QRS 8.943 1.17
FVB/NJ QRS 7.047 -1.05
LP/J QRS 7.938 -0.00804
NOD/LtJ QRS 7.325 -0.723
NZB/BlNJ QRS 7.700 -0.285
PL/J QRS 9.094 1.34
SJL/J QRS 8.369 0.495
SWR/J QRS 7.454 -0.573
129S1/SvImJ RR 83.92 0.146
A/J RR 82.57 0.0128
AKR/J RR 89.98 0.740
BALB/cJ RR 109.6 2.67
BTBR_T+_tf/tf RR 81.23 -0.119
C3H/HeJ RR 75.85 -0.648
C57BL/6J RR 77.91 -0.446
CAST/Ei RR 71.49 -1.08
CBA/J RR 75.74 -0.659
DBA/2J RR 97.14 1.44
FVB/NJ RR 76.81 -0.554
LP/J RR 76.34 -0.600
NOD/LtJ RR 75.39 -0.692
NZB/BlNJ RR 74.33 -0.797
PL/J RR 91.76 0.915
SJL/J RR 89.07 0.651
SWR/J RR 72.42 -0.985
ploticus-2.42/pltestsuite/data3 0000644 0001750 0001750 00000002022 07342440774 015610 0 ustar colin colin 129S1/SvImJ 0.4927 0.111 0.353 129S1/SvImJ 0.4080 0.0839 0.265
A/J 0.5547 0.0768 0.243 A/J 0.6051 0.0656 0.207
AKR/J 0.4125 0.0631 0.200 AKR/J 0.3653 0.0418 0.132
BALB/cJ 0.5597 0.0438 0.186 BALB/cJ 0.5473 0.0383 0.163
BUB/BnJ 0.3955 0.0360 0.114 BUB/BnJ 0.4513 0.0552 0.174
C3H/HeJ 0.8392 0.0753 0.238 C3H/HeJ 0.7127 0.0590 0.186
C57BL/6J 0.5344 0.0374 0.124 C57BL/6J 0.4939 0.0505 0.167
C57L/J 0.9961 0.0759 0.240 C57L/J 0.8934 0.0762 0.241
C58/J 0.4372 0.0544 0.172 C58/J 0.3572 0.0520 0.164
CZECHII/Ei 0.5539 0.0727 0.218 CZECHII/Ei 0.5538 0.0647 0.194
DBA/2J 0.8497 0.0659 0.208 DBA/2J 0.7651 0.0708 0.224
FVB/NJ 0.4713 0.0435 0.144 FVB/NJ 0.4100 0.0282 0.0936
MOLF/Ei 0.8608 0.0488 0.154 MOLF/Ei 0.8088 0.0383 0.121
NOD/LtJ 0.8588 0.0742 0.235 NOD/LtJ 0.8253 0.0653 0.206
PERA/Ei 0.6473 0.0314 0.0992 PERA/Ei 0.7266 0.0378 0.119
PL/J 0.3785 0.0421 0.133 PL/J 0.3915 0.0568 0.180
SJL/J 0.8534 0.0734 0.232 SJL/J 0.7835 0.0527 0.167
SM/J 0.2642 0.0136 0.0430 SM/J 0.2909 0.0221 0.0700
SWR/J 0.4475 0.0308 0.0973 SWR/J 0.4506 0.0501 0.159
ploticus-2.42/pltestsuite/data23 0000644 0001750 0001750 00000000217 07745526720 015701 0 ustar colin colin Employment 8 red
In transit 2 orange
Meals 1 green
Errands 1 purple
Household chores 2 yellow
Recreation & relaxation 2 blue
Sleep 8 gray(0.8)
ploticus-2.42/pltestsuite/errbar1.htm 0000644 0001750 0001750 00000011376 10437340754 016751 0 ustar colin colin errbar1

How to download and try this example
Usage: pl -gif errbar1.htm
or for postscript: pl -ps errbar1.htm | lp
In this example the means and standard deviations were already calculated,
so proc bars is used to render the bars. An alternative is to use proc
rangebar with meanmode option to calculate mean & standard deviation
and render bars.
Categories are used to position bars in X; proc catslide is used to
adjust the positioning slightly so that pairs of bars may be displayed
for each category.
#set TAILLEN = 0.05
#proc Page:
pagesize: 8.5 11
#if @DEVICE in gif,png
scale: 0.4
#endif
Title: Mean FES Scores
For Families in Emergency Shelters vs.
Families in Transitional Housing
/////////////////////////////
////// Top Panel
/////////////////////////////
///////// Left bars
// specify data for top panel, left of each pair
// (must be done before areadef because areadef uses data to set up category names)
#Proc Getdata:
Data:
// E (1-5)
//categ n obs mean stdev pval
//==== ===== ===== ===== =====
coh 23 37.83 18.66 p<.05
exp 23 42.17 9.00 p<.05
conf 23 54.48 13.67 p>.05
ind 23 42.52 14.71 p>.05
achiev 23 54.48 8.44 p>.05
// set up plot area
#Proc Areadef:
areaname: 2hi
xscaletype: categories
xcategories: datafield=1
yrange: 0 100
Xaxis.stubs: text
Cohesion
Expressiveness
Conflict
Independence
Achievement\nOrientation
yaxis.stubs: inc 10
Yaxis.label: Standard Score
// do horizontal lines..
#Proc Line
linedetails: width=0.4 dashscale=5
notation: locval
points: min 50(s) max 50(s)
#Proc Line
linedetails: width=0.4 dashscale=5 style=1
notation: locval
Points: min 40(s) max 40(s)
min 60(s) max 60(s)
// do centered p values
#Proc Scatterplot
Xfield: 1
ylocation: 5(s)
labelfield: 5
// prepare to do left bars
#proc catslide
axis: x
amount: -0.1
// render points
#Proc Scatterplot:
Xfield: 1
Yfield: 3
symbol: shape=pixdiamond style=solid color=black radius=0.05
// render bars
#Proc bars
locfield: 1
lenfield: 3
errbarfields: 4
tails: @TAILLEN
////////// Right bars ////////////////
// prepare to do right bars
#proc catslide
axis: x
amount: 0.1
// specify data for right bars
#Proc Getdata:
// T (1-5)
// cat n obs mean stdev
//===== ===== ===== =====
Data:
coh 39 52.38 15.44
exp 39 48.90 8.94
conf 39 50.90 10.99
ind 39 44.62 9.59
achiev 39 54.92 8.59
// render points
#Proc Scatterplot:
Xfield: 1
Yfield: 3
symbol: shape=pixsquare style=solid color=black radius=0.05
// render bars
#proc bars
locfield: 1
lenfield: 3
errbarfields: 4
tails: @TAILLEN
/////////////////////////////////////////////////
//// Bottom row
/////////////////////////////////////////////////
// specify data for left bars
#proc getdata:
// E (6-10)
//cat n obs mean stdev pval
//===== ===== ===== ===== =====
data:
int 23 45.78 14.30 p<.05
act 23 45.00 12.30 p>.05
mor 23 53.26 9.11 p<.05
org 23 49.17 10.43 p<.05
con 23 59.48 10.40 p>.05
#proc areadef:
areaname: 2lo
xscaletype: categories
xcategories: datafield 1
yrange: 0 100
#proc xaxis
stubs text
Intellectual-\nCultural\nOrientation
Active-\nRecreational\nOrientation
Moral-\nReligious\nEmphasis
Organization
Control
#proc yaxis
stubs: inc 10
label: Standard Score
// do horiz. lines
#Proc line
notation: locvalues
linedetails: width=0.4
Points: min 50(s) max 50(s)
#proc line:
notation: locvalues
linedetails: style=1 dashscale=5 width=0.4
Points: min 40(s) max 40(s)
min 60(s) max 60(s)
// do centered P values
#Proc Scatterplot
Xfield: 1
ylocation: 5(s)
labelfield: 5
#proc catslide
axis: X
amount: -0.1
// render points
#Proc Scatterplot:
Xfield: 1
Yfield: 3
symbol: shape=pixdiamond style=solid color=black radius=0.05
// render bars
#Proc bars
locfield: 1
lenfield: 3
errbarfields: 4
tails: @TAILLEN
//////////// Right bars
#proc catslide
axis: x
amount: 0.1
#proc getdata:
// T (6-10)
// cat n obs mean stdev
//==== ===== ===== =====
Data:
int 39 53.51 9.78
act 39 47.54 11.50
mor 39 58.67 6.34
org 39 55.33 9.86
con 39 56.31 8.97
// render points
#Proc Scatterplot:
Xfield: 1
Yfield: 3
symbol: shape=pixsquare style=solid color=black radius=0.05
// render bars
#proc bars
locfield: 1
lenfield: 3
errbarfields: 4
tails: @TAILLEN
// Define legend entries explicitly
#proc legendentry
sampletype: symbol
label: Emergency Shelters (N = 23)
details: shape=diamond style=filled fillcolor=black radius=0.05
#proc legendentry
sampletype: symbol
label: Transitional Housing (N = 39)
details: shape=square style=filled fillcolor=black radius=0.05
#proc legend:
location: 5.5 9
ploticus-2.42/pltestsuite/data20 0000644 0001750 0001750 00000000516 07417103715 015667 0 ustar colin colin 1031 20.96 6.4
1032 19.71 5.8
1033 19.98 5.9
1034 19.60 6.2
1035 19.92 6.8
1036 20.96 6.2
1037 20.01 5.9
1038 20.15 5.5
1039 19.55 6.1
1040 19.64 6.3
1041 unknown 6.8
1042 19.29 6.1
1043 19.20 5.7
1044 18.66 5.2
1045 19.22 5.9
1046 18.69 6.3
1047 unknown 6.0
1048 18.25 5.8
1049 18.90 5.5
1050 19.56 5.8
1051 19.63 5.3
1052 19.21 5.6
ploticus-2.42/pltestsuite/lineplot4.htm 0000644 0001750 0001750 00000011262 07570423466 017325 0 ustar colin colin lineplot4

How to download and try this example
Usage: pl -gif lineplot4.htm
This example uses proc lineplot with instancemode and accum options,
to count occurrances over time. Occurrances having the same date
are summed into one data point (groupmode).
// Set up plotting area using proc areadef...
#proc areadef
title: Cumulative number of events
rectangle: 1 1 5 2
xscaletype: date
xrange: 110198 041599
yrange: 0 120
xaxis.stubs: incremental 1 month
xaxis.stubformat: MMMyy
yaxis.stubs: incremental 20
yaxis.grid: color=green
// proc getdata will read data (from bottom of file)
#proc getdata
#intrailer
// Use proc lineplot to render curve..
#proc lineplot
xfield: 2
instancemode: yes
groupmode: yes
linedetails: color=purple
accum: yes
// label: Total: @@YFINAL
lastx: 030199
// Use #endproc to mark end of
// proc lineplot since it sets YFINAL..
#endproc
// now calculate percent of goal using some functions
#set PCTOFGOAL = $arith(@YFINAL/1.2)
#set PCTOFGOAL = $formatfloat(@PCTOFGOAL,%2.0f)
// Use proc annotate to display N
// and % of goal near the end of the curve..
#proc annotate
location: @XFINAL(s) @YFINAL(s)
textdetails: size=8 align=L adjust=0.1,0
text: N=@YFINAL
(@PCTOFGOAL% of goal)
#proc trailer
data:
hacvi 110298
aurco 110498
pmfil 110598
rybdu 110598
hamdo 111098
masha 111198
delro 111298
teulm 111398
whire 111398
triha 111698
magil 111698
lmwen 111798
vando 111798
tobpa 111898
ondma 111998
dogro 111998
yntsa 111998
dowco 112098
dosha 112398
hacra 112398
skezi 112498
robru 113098
loral 120198
rucoo 120198
ranth 120298
egavi 120298
feajo 120398
lagcl 120398
emeba 120798
sohay 120798
gleyo 120798
stepm 120898
shemi 120998
nebla 120998
dclen 121098
mezcm 121198
carst 121498
moonj 121498
rarkn 121498
armse 121598
gekoh 121598
jamen 121598
milmu 121698
mirle 121698
rolvi 121798
cofbl 121898
mccne 121898
holog 122198
yosed 122198
hofal 122398
eggal 122898
jawil 122898
bavke 122898
warse 123098
heddk 010699
fooel 010799
lalar 011199
taywi 011199
gooca 011199
flash 011299
glahe 011299
lilhl 011399
price 011599
bowth 011999
lesbu 011999
grasa 011999
jpick 012099
maand 012099
amemc 012099
daajo 012299
tisrr 012599
horfr 012699
dotka 012799
posla 012799
eisei 012899
catho 020199
carth 020199
citkc 020399
linlo 020499
schal 020499
cawfu 020599
chesf 020999
hajpl 021099
altil 021199
camor 021199
elidr 021299
latro 021699
davie 021699
tilia 021799
grimo 021799
vijmi 021899
belvi 021899
prihx 021999
klems 021999
ploticus-2.42/pltestsuite/data12 0000644 0001750 0001750 00000000046 07347404037 015671 0 ustar colin colin 1 A 6
2 A 8
3 A 9
4 B 8
5 B 11
6 B 13
ploticus-2.42/pltestsuite/data22 0000644 0001750 0001750 00000001236 07575352010 015670 0 ustar colin colin datetime airtemp soiltemp
12/08/2002.00:00 22 26
12/08/2002.06:00 24 27
12/08/2002.12:00 31 28
12/08/2002.18:00 30 28
12/09/2002.00:00 25 27
12/09/2002.06:00 25 26
12/09/2002.12:00 26 26
12/09/2002.18:00 27 26
12/10/2002.00:00 30 27
12/10/2002.06:00 38 29
12/10/2002.12:00 39 31
12/10/2002.18:00 35 33
12/11/2002.00:00 32 32
12/11/2002.06:00 35 33
12/11/2002.12:00 40 33
12/11/2002.18:00 42 35
12/12/2002.00:00 40 37
12/12/2002.06:00 39 38
12/12/2002.12:00 30 36
12/12/2002.18:00 27 31
12/13/2002.00:00 19 27
12/13/2002.06:00 18 25
12/13/2002.12:00 20 23
12/13/2002.18:00 19 21
12/14/2002.00:00 14 18
12/14/2002.06:00 12 16
12/14/2002.12:00 18 17
12/14/2002.18:00 23 19
ploticus-2.42/pltestsuite/errbar5.htm 0000644 0001750 0001750 00000002670 10743161404 016743 0 ustar colin colin errbar5

How to download and try this example
Usage: pl -gif errbar5.htm
In slide format.
#set LINEWID = 0.5
#proc page
backgroundcolor: darkblue
color: yellow
linewidth: 2.5
pagesize: 6.6 4.4
#if @DEVICE in gif,png
scale: 0.7
#endif
#proc areadef:
title: Power of Various Sample Sizes
titledetails: align=C size=18 adjust=0,0.5
areaname: slide
yrange: -0.10 0.25
xrange: -0.05 0.20
yaxis.stubs: inc 0.05
yaxis.stubformat: %4.2f
xaxis.stubs: inc 0.05
xaxis.stubformat: %4.2f
yaxis.label: 95% CI on p1 - p2
yaxis.labeldistance: 0.8
xaxis.label: Observed Difference in Mortality ( p1 <= p2 )
#proc getdata:
data: 0 .080 .057 .046 .040 .037
0.05 .078 .055 .045 .039 .036
0.1 .075 .053 .043 .038 .034
0.15 .072 .051 .041 .036 .033
#proc lineplot:
xfield: 1
yfield: 1
linedetails: width=@LINEWID
#proc bars
locfield: 1
lenfield: 1
errbarfield: 2
thinbarline: color=white width=@LINEWID
legendlabel: N = 500
#saveas: A
#proc bars
#clone: A
errbarfield: 3
thinbarline: color=yellow width=@LINEWID
legendlabel: N = 1000
#proc bars
#clone: A
errbarfield: 4
thinbarline: color=green width=@LINEWID
legendlabel: N = 1500
#proc bars
#clone: A
errbarfield: 5
thinbarline: color=pink width=@LINEWID
legendlabel: N = 2000
#proc bars
#clone: A
errbarfield: 6
thinbarline: color=red width=0.7
legendlabel: N = 2400
#proc legend
location: min+0.8 max-0.02
ploticus-2.42/pltestsuite/stock.csv 0000644 0001750 0001750 00000010214 06720046656 016533 0 ustar colin colin Date,Open,High,Low,Close,Volume
14-May-99,53.6875,53.875,52.5625,53,2182600
13-May-99,54.125,55.9375,54.125,54.5,2189000
12-May-99,54.9375,54.9375,53.5625,54.0625,1721000
11-May-99,54.0625,55,53.6875,54.8125,1425300
10-May-99,54.125,54.4375,53.375,54.25,1246200
7-May-99,53.75,54.5,53.6875,54.375,1276700
6-May-99,53.5,54,53.375,53.9375,1458300
5-May-99,54.875,55,53.5,54.6875,1962700
4-May-99,55.9375,55.9375,54.25,54.375,2109400
3-May-99,54.875,56,54.4375,55.9375,1373500
29-Apr-99,54.5,56.1875,54.3125,55.4375,2446200
28-Apr-99,54.9375,55.1875,54.5,55,2776900
27-Apr-99,54.25,55.25,53.9375,54.9375,2060000
26-Apr-99,54,54.375,53.3125,53.5625,2927200
23-Apr-99,54.6875,55.5,54.5625,55,854700
22-Apr-99,54.5,55.3125,53.875,55.1875,1872000
21-Apr-99,55.125,55.125,53.625,54.875,2504900
20-Apr-99,55.3125,55.625,54,54.9375,3982000
19-Apr-99,55.9375,57,55.3125,55.6875,4108100
16-Apr-99,55,56,54.5625,55.75,1610000
15-Apr-99,55.5625,56.5,55.1875,55.875,1763100
14-Apr-99,55.5,56,55,55.0625,1852300
13-Apr-99,55.3125,55.5625,54.75,55.125,1610700
12-Apr-99,54,55.75,53.875,55.3125,1625700
9-Apr-99,54.4375,54.875,53.8125,54.3125,2212400
8-Apr-99,54.5,55.5,54.125,54.9375,2002800
7-Apr-99,53.5,54.5,53.5,54.5,1742400
6-Apr-99,54.0625,54.25,53.25,53.3125,1584600
5-Apr-99,53.9375,54.1875,53.5625,53.9375,2154400
1-Apr-99,53.625,53.8125,53.0625,53.4375,1555800
31-Mar-99,53.625,54.1875,53.25,53.4375,2257200
30-Mar-99,54,54.375,53.75,53.75,1514900
29-Mar-99,53.75,54.875,53.6875,54.625,1708600
26-Mar-99,54,54.3125,53.4375,53.6875,1596900
25-Mar-99,53.25,54.75,53.25,54.1875,2659300
24-Mar-99,53.375,54.125,53.0625,53.1875,2819100
23-Mar-99,53.9375,53.9375,52.5,53.375,3440900
22-Mar-99,53.25,54.125,52.8125,53.9375,2252300
19-Mar-99,55.9375,55.9375,53.875,54.5,4793300
18-Mar-99,52,55.25,51.625,55.25,3960500
17-Mar-99,51.5,52.5,51.375,52.0625,3502800
16-Mar-99,52.375,53.5,50.625,50.875,4011400
15-Mar-99,53.125,53.1875,51.25,52,4337100
12-Mar-99,54.0625,54.1875,52.875,53.125,2924200
11-Mar-99,54.6875,55.1875,53.6875,54,4718500
10-Mar-99,53.75,54.9375,53,54.6875,2506300
9-Mar-99,53,53.375,52.125,53.25,2289300
8-Mar-99,53.4375,53.5,52.4375,53.1875,1685500
5-Mar-99,53.75,54.125,53.25,53.5625,2334300
4-Mar-99,52.375,53.1875,52.25,53,1626500
3-Mar-99,52.9375,52.9375,52.0625,52.375,1356500
2-Mar-99,53.5625,53.6875,52.375,52.875,2433900
1-Mar-99,53.5,53.6875,52.75,53.5625,2289800
26-Feb-99,53.5,53.5,52.3125,53.3125,2260200
25-Feb-99,51.5625,53.375,51,53.3125,3205900
24-Feb-99,54.1875,54.75,51.5,51.625,2617300
23-Feb-99,53.592,54.2735,53.0344,53.53,3530700
22-Feb-99,52.2909,53.9637,52.2289,53.9637,2709200
19-Feb-99,52.4148,52.7865,51.3615,51.8572,3212700
18-Feb-99,51.2996,52.3528,51.0518,51.7952,2818600
17-Feb-99,50.9278,51.2996,50.3083,50.8039,3856400
16-Feb-99,51.0518,51.2376,50.3083,50.8659,3732400
12-Feb-99,48.3257,51.0518,48.3257,50.3083,5455000
11-Feb-99,48.5116,49.8746,48.2018,49.317,4524600
10-Feb-99,48.0779,48.5735,47.7061,48.2637,3255000
9-Feb-99,48.6974,49.317,47.6442,48.2018,3219100
8-Feb-99,48.5735,49.7507,48.2018,48.3877,2474100
5-Feb-99,49.4409,49.6268,48.3877,48.6974,3513300
4-Feb-99,51.2996,51.4235,49.1311,49.1931,5007700
3-Feb-99,49.5648,51.0518,49.4409,50.8659,6840100
2-Feb-99,50.8039,51.1757,50.0605,50.6181,4195800
1-Feb-99,52.167,53.0344,51.1137,51.2996,5519000
29-Jan-99,51.4235,52.2909,50.8659,52.0431,9559800
28-Jan-99,51.5474,51.7333,50.3702,51.2996,12107600
27-Jan-99,50.1844,51.9191,50.1844,51.7333,20838500
26-Jan-99,56.2561,56.7517,56.1941,56.5658,3043400
25-Jan-99,56.0082,56.5039,55.6985,56.318,2579000
22-Jan-99,55.8224,56.4419,55.5745,55.5745,2492700
21-Jan-99,57.6811,58.1147,56.5039,56.5039,2780500
20-Jan-99,58.4245,58.4245,56.9376,57.6191,3494000
19-Jan-99,59.7876,60.2832,56.6278,57.743,4169400
15-Jan-99,60.531,61.3984,59.23,59.6017,5778500
14-Jan-99,61.7082,63.0712,60.4691,60.4691,2286800
13-Jan-99,56.5039,62.9473,56.5039,61.8941,2700300
12-Jan-99,62.6995,63.1951,61.7082,61.956,2312200
11-Jan-99,64.4343,64.4343,61.4604,63.5049,1615700
8-Jan-99,64.4343,65.1777,63.9386,64.4962,3223600
7-Jan-99,62.5136,63.5669,61.5223,63.3191,3162300
6-Jan-99,61.7082,63.1332,61.4604,62.7614,2632000
5-Jan-99,59.4778,61.0267,59.23,60.9028,1995000
4-Jan-99,60.2213,61.2125,58.3626,59.7876,2234200
ploticus-2.42/pltestsuite/heatmap3.htm 0000644 0001750 0001750 00000003360 10743161777 017115 0 ustar colin colin heatmap3

How to download and try this example
Usage: pl -gif [-map] heatmap3.htm
This color grid involves processing raw data by
counting occurances within ranges, then mapping counts to colors by range.
Uses data file snpmap.dat .
For brevity, only chromosomes 1-7 and X are represented in this example.
#set SYM = "radius=0.08 shape=square style=filled"
#setifnotgiven CGI = "http://ploticus.sourceforge.net/cgi-bin/showcgiargs"
#proc page
pagesize: 10 4
// read in the SNP map data file..
#proc getdata
fieldnameheader: yes
file: strainz.dat
#proc categories
axis: x
datafield: 2
#proc categories
axis: y
datafield: 1
// set up the plotting area
#proc areadef
rectangle: 1 1 9 3.5
xscaletype: categories
yscaletype: categories
yaxis.stubs: usecategories
yaxis.stubdetails: adjust=0.7,0
yaxis.axisline: none
yaxis.tics: none
xaxis.stubs: usecategories
xaxis.axisline: none
xaxis.tics: none
xaxis.location: max+0.3
// set up legend for color gradients..
#proc legendentry
sampletype: color
details: dullyellow
label: 1 or more SD above normal
tag: 1
#proc legendentry
sampletype: color
details: white
label: within 1 SD of normal
tag: -1
#proc legendentry
sampletype: color
details: skyblue
label: 1 or more SD below normal
tag: -99
// use proc scatterplot to count # of instances and pick appropriate color from legend..
#proc scatterplot
xfield: meas
yfield: strain
cluster: no
symrangefield: zscore
rectangle: 1 1 outline
// overlay the values..
#proc scatterplot
xfield: meas
yfield: strain
cluster: no
labelfield: value
textdetails: size=6
// display legend..
#proc legend
location: min+0.7 min-0.2
textdetails: size=6
ploticus-2.42/pltestsuite/testpf_heatmap 0000755 0001750 0001750 00000002114 10436572360 017620 0 ustar colin colin #!/bin/sh
#
DEV=$1
OUTDIR=$2
ARGS=$3
if [ "$DEV" = "" ]; then
DEV=x11
fi
echo heatmap1..
pl -prefab heatmap data=curve1.dat y=1 x=2 title="this is heatmap1" \
-$DEV -o ${OUTDIR}heatmap1.$DEV $ARGS
echo heatmap2..
pl -prefab heatmap data=snpmap.dat header=yes y=1 x=2 ycats=yes xbinsize=5 \
colorlist=white,limegreen,green,teal,blue,purple,black title="this is heatmap2" \
-$DEV -o ${OUTDIR}heatmap2.$DEV $ARGS
echo heatmap2a..
pl -prefab heatmap data=snpmap.dat header=yes y=1 x=2 ycats=yes xbinsize=5 \
colorlist=white,limegreen,green,teal,blue,purple,black title="here's heatmap2a" titledet="size=15" \
cutofflist=35,25,10,1 \
-$DEV -o ${OUTDIR}heatmap2a.$DEV $ARGS
echo heatmap3..
pl -prefab heatmap data=data26 x=1 xcats=yes y=2 ycats=yes contentfield=3 \
outline="color=black width=5" title="this is heatmap3" \
-$DEV -o ${OUTDIR}heatmap3.$DEV $ARGS
echo heatmap4..
pl -prefab heatmap data=data26 x=1 xcats=yes y=2 ycats=yes contentfield=3 symbol="shape=circle radius=0.1" \
legendsep=0.2 zerocolor=white title="here's heatmap4" \
-$DEV -o ${OUTDIR}heatmap4.$DEV $ARGS
ploticus-2.42/pltestsuite/lineplot20.htm 0000644 0001750 0001750 00000003455 10743161733 017400 0 ustar colin colin lineplot20

How to download and try this example
Usage: pl -gif lineplot20.htm
#proc getdata
data:
120301 0
120401 12
120501 0
120601 10
120701 9
120801 14
120901 13
121001 -
121101 18
121201 19
121301 17
121401 15
121501 18
121601 20
121701 17
121801 22
#for COL in 1,2,3,4
#if @COL = 1
#set XLEFT = 0.2
#set GAPMISSING = no
#elseif @COL = 2
#set XLEFT = 2.2
#set GAPMISSING = yes
#elseif @COL = 3
#set XLEFT = 4.2
#set GAPMISSING = small
#else
#set XLEFT = 6.2
#set GAPMISSING = autozero
#endif
// ------- set templates..
#procdef areadef
title:
box: 1.8 0.7
xautorange: datafield=1
yautorange: datafield=2
areacolor: gray(0.8)
#saveas: A
#procdef lineplot
xfield: 1
yfield: 2
gapmissing: @GAPMISSING
linedetails: color=red width=0.5
lastseglen: 0.1
#saveas: L
#proc areadef
#clone A
#if @COL = 1
title: standard
#elseif @COL = 2
title: gapmissing: yes
#elseif @COL = 3
title: gapmissing: small
#else
title: gapmissing: autozero
#endif
location: @XLEFT 4
#proc lineplot
#clone L
// -------------------------
#proc areadef
#clone A
#if @COL = 1
title: stairstep
#endif
location: @XLEFT 3
#proc lineplot
#clone L
stairstep: yes
// -------------------------
#proc areadef
#clone A
#if @COL = 1
title: filled
#endif
location: @XLEFT 2
#proc lineplot
#clone L
fill: pink
#proc lineplot
#clone L
// -------------------------
#proc areadef
#clone A
#if @COL = 1
title: stairstep filled
#endif
location: @XLEFT 1
#proc lineplot
#clone L
fill: pink
stairstep: yes
#proc lineplot
#clone L
stairstep: yes
#endloop
ploticus-2.42/pltestsuite/data19 0000644 0001750 0001750 00000004130 07416642170 015675 0 ustar colin colin 18 071301
16 071401
15 071501
34 071601
45 071701
41 071801
46 071901
45 072001
12 072101
8 072201
4 072301
27 072401
42 072501
40 072601
24 072701
6 072801
9 072901
28 073001
42 073101
44 080101
42 080201
42 080301
15 080401
14 080501
31 080601
39 080701
42 080801
31 080901
29 081001
19 081101
20 081201
39 081301
45 081401
35 081501
28 081601
37 081701
6 081801
15 081901
35 082001
34 082101
34 082201
31 082301
37 082401
15 082501
17 082601
39 082701
47 082801
49 082901
53 083001
35 083101
24 090101
14 090201
25 090301
36 090401
33 090501
42 090601
39 090701
27 090801
23 090901
48 091001
43 091101
46 091201
26 091301
41 091401
21 091501
16 091601
45 091701
29 091801
42 091901
28 092001
42 092101
17 092201
18 092301
40 092401
43 092501
34 092601
22 092701
29 092801
15 092901
13 093001
32 100101
49 100201
29 100301
44 100401
37 100501
16 100601
14 100701
43 100801
46 100901
38 101001
35 101101
51 101201
14 101301
14 101401
47 101501
50 101601
52 101701
35 101801
39 101901
29 102001
26 102101
26 102201
35 102301
36 102401
52 102501
47 102601
24 102701
25 102801
48 102901
55 103001
59 103101
52 110101
44 110201
16 110301
26 110401
47 110501
57 110601
48 110701
51 110801
56 110901
20 111001
20 111101
53 111201
54 111301
52 111401
46 111501
398 111601
91 111701
49 111801
106 111901
67 112001
64 112101
45 112201
45 112301
24 112401
34 112501
54 112601
54 112701
75 112801
50 112901
43 113001
23 120101
23 120201
64 120301
53 120401
66 120501
59 120601
48 120701
17 120801
27 120901
61 121001
64 121101
48 121201
65 121301
40 121401
20 121501
22 121601
50 121701
49 121801
53 121901
39 122001
15 122101
14 122201
10 122301
13 122401
9 122501
25 122601
22 122701
31 122801
19 122901
9 123001
17 123101
18 010102
37 010202
43 010302
39 010402
11 010502
18 010602
ploticus-2.42/pltestsuite/data24 0000644 0001750 0001750 00000000327 10104204114 015651 0 ustar colin colin dt air_temp soil_temp water_temp
12/08/2002.06:00 24 27 16
12/09/2002.00:00 25 27 16
12/10/2002.00:00 30 27 15
12/11/2002.00:00 32 32 15
12/12/2002.00:00 40 37 16
12/13/2002.00:00 19 27 15
12/14/2002.00:00 14 18 13
ploticus-2.42/pltestsuite/Makefile 0000644 0001750 0001750 00000000167 10722564303 016330 0 ustar colin colin runtest:
./run_script_test
clean:
rm -f *.gif *.png *.eps *.ps *.svg *.svgz *.jpeg 2> /dev/null
distclean: clean
ploticus-2.42/pltestsuite/run_script_test 0000755 0001750 0001750 00000004460 11766422532 020053 0 ustar colin colin #!/bin/sh
#
PL="ploticus"
echo "You will be invoking this instance of ploticus:"
which $PL
echo
echo -n "Enter an output format, one of: x11, gif, png, svg, (svgz), (jpeg), or eps: "
read MODE
if [ "$MODE" = "" ]; then
MODE=x11
fi
which $PL
date
OPTS=
echo "--------- stock2..."
$PL -$MODE $OPTS stock2.htm
echo "--------- kmslide..."
$PL -$MODE $OPTS kmslide.htm
echo "--------- propbars1..."
$PL -$MODE $OPTS propbars1.htm
echo "--------- td..."
$PL -$MODE $OPTS td.htm
echo "--------- errbar5..."
$PL -$MODE $OPTS errbar5.htm
echo "Note: some warnings are ok in errbar5..
"
echo "--------- scatterplot10..."
$PL -$MODE $OPTS scatterplot10.htm
echo "--------- devol..."
$PL -$MODE $OPTS devol.htm
echo "--------- lineplot4..."
$PL -$MODE $OPTS lineplot4.htm
echo "--------- lineplot5..."
$PL -$MODE $OPTS lineplot5.htm
echo "--------- pie1..."
$PL -$MODE $OPTS pie1.htm
echo "--------- bars3..."
$PL -$MODE $OPTS bars3.htm
echo "--------- quarters..."
$PL -$MODE $OPTS quarters.htm
echo "--------- timeline2..."
$PL -$MODE $OPTS timeline2.htm
echo "--------- scatterplot4..."
$PL -$MODE $OPTS scatterplot4.htm
echo "--------- annot2..."
$PL -$MODE $OPTS annot2.htm
echo "--------- drawcom..."
$PL -$MODE $OPTS drawcom.htm
echo "--------- hitcount3..."
$PL -$MODE $OPTS hitcount3.htm
echo "Note: there should be 8 'warning: time is outside of window range' msgs above..
"
echo "--------- lineplot20..."
$PL -$MODE $OPTS lineplot20.htm
echo "--------- colorgrid2... (should produce client size imagemap to file csmap.out)"
$PL -$MODE $OPTS colorgrid2.htm -csmap > csmap.out
head -3 csmap.out
echo "--------- heatmap3..."
$PL -$MODE $OPTS heatmap3.htm
echo "--------- vector1..."
$PL -$MODE $OPTS vector1.htm
echo "--------- windbarbs..."
$PL -$MODE $OPTS windbarbs.htm
echo "--------- supstubs..."
$PL -$MODE $OPTS supstubs.htm
echo "--------- legends232..."
$PL -$MODE $OPTS legends232.htm
echo "--------- venn..."
$PL -$MODE $OPTS venn.htm
echo "--------- catlines1..."
$PL -$MODE $OPTS catlines1.htm
echo "--------- tree1..."
$PL -$MODE $OPTS tree1.htm
echo "--------- dtfut..."
$PL -$MODE $OPTS dtfut.htm
echo "--------- rangesweep2_dostext..."
$PL -$MODE $OPTS rangesweep2_dostext.htm
echo "--------- sar-cpu..."
$PL -$MODE $OPTS sar-cpu.htm
echo "Finished."
ploticus-2.42/pltestsuite/devol.htm 0000644 0001750 0001750 00000002405 10743161514 016510 0 ustar colin colin devol

How to download and try this example
Usage: pl -gif devol.htm
Uses the data file devol.dat
// set page-wide attributes using proc page
#proc page
#if @DEVICE in gif,png
scale: 0.7 0.5
#endif
color: gray(0.7)
// set up plotting area and axes using proc areadef
#proc areadef:
// rectangle: 1 1 6 5
title: Number of inquiries per month
titledetails: size=18 align=C adjust=0,0.1 color=black
xscaletype: date mm/yy
xrange: 12/86 06/89
yrange: 0 2000
xaxis.stubs: inc 1 month
xaxis.stubformat: M
xaxis.autoyears: 'yy
xaxis.grid: width=0.5
xaxis.stubrange: 01/87 05/89
xaxis.label: Month and year
xaxis.labeldetails: adjust=0,-0.15
yaxis.stubs: inc 200
yaxis.grid: width=0.5
// read in data set using proc getdata
#proc getdata:
file: devol.dat
// do stairstep line plot using proc lineplot
#proc lineplot:
yfield: 2
xfield: 1
linedetails: width=2 color=purple
stairstep: yes
numbers: color=purple
lastseglen: 30(s)
#proc annotate
backdim: 11/87(s) 400(s) 1.2 0.7
ellipse: yes
outline: color=red
ploticus-2.42/pltestsuite/data26 0000644 0001750 0001750 00000000253 07754701626 015704 0 ustar colin colin CL PNG 44
CL SVG 38
CL SWF 26
CL PS 54
CGI PNG 37
CGI SVG 27
CGI SWF 62
CGI PS 34
Perl PNG 27
Perl SVG 38
Perl SWF 30
Perl PS 28
ASP PNG 7
ASP SVG 15
ASP SWF 29
ASP PS 21
ploticus-2.42/pltestsuite/data21 0000644 0001750 0001750 00000000665 07570740564 015706 0 ustar colin colin sample1 380 239 384 384 1220 888 351 859 481 565 1219 1233 1289 410 841 1584 380 1710 840 842 1601 338 435 700
sample2 778 870 398 499 1472 617 193 925
sample3 840 562 451 410 1525 380 843 1267 794 1812 390 786 287
sample4 939 601 1233 1336 610 1438
sample5 1220 791 747 562 617 410 297 1855 605 957 453 414
sample6 418 1150 418 418 937 418
sample7 290 600 332 267 548 790 553 450 435 530 323 791 478 469 486 413 206 701 392 545 549 452
ploticus-2.42/pltestsuite/devol.dat 0000644 0001750 0001750 00000000415 06714617251 016476 0 ustar colin colin 01/87 0
02/87 0
03/87 23
04/87 91
05/87 274
06/87 534
07/87 647
08/87 1278
09/87 727
10/87 1463
11/87 463
12/87 928
01/88 1412
02/88 911
03/88 1448
04/88 1476
05/88 1824
06/88 1885
07/88 1619
08/88 1694
09/88 1467
10/88 1628
11/88 1830
12/88 1375
01/89 1282
02/89 1026
ploticus-2.42/pltestsuite/stock2.htm 0000644 0001750 0001750 00000004131 10723354527 016610 0 ustar colin colin stock2

How to download and try this example
Usage: pl -gif stock2.htm
Data source: quote.yahoo.com (Spreadsheet format)
Illustrates use of segment bars, and tics on bars to show opening and
closing price. Also illustrates ranging of data using the $inrange() function.
#proc page
#if @DEVICE in gif,png
scale: 0.7
#endif
// define top plotting area using proc areadef
#proc areadef
title: Trailer Tongue Technologies Corp.
rectangle: 1 3 5 5
xscaletype: date dd-mmm-yy
xrange: 4-Apr-99 1-Jun-99
yrange: 50 60
yscaletype: log
#saveas: A
// read data file using proc getdata
#proc getdata
file: stock.csv
select: $inrange(@@1,X) = 1
delimit: comma
// reverse the record order, since the data is provided in reverse chronological
// order, using proc processdata
#proc processdata
action: reverse
// set up X axis using proc xaxis
#proc xaxis
stubs: inc 7
stubformat: Mmmdd
stubrange: 4-Apr-99
grid: color=skyblue
#saveas: XAX
// set up Y axis using proc yaxis
#proc yaxis
stubs: inc 2
grid: color=skyblue
// draw hi/low/close bars using proc bars
#proc bars
locfield: 1
segmentfields: 3 4
leftticfield: 2
rightticfield: 5
thinbarline: width=0.3 color=green
// do volume
// define bottom plotting area using proc areadef
#proc areadef
#clone: A
rectangle: 1 1.6 5 2.6
yrange: 0 5000000
yscaletype: linear
title:
// set up X axis using proc xaxis
#proc xaxis
label: Volume (1000s)
ticincrement: 7
labeldetails: adjust=0,0.2 size=8
// set up Y axis using proc yaxis
#proc yaxis
stubs: inc 1000 1000
grid: color=skyblue
// render histogram using proc bars
#proc bars
barwidth: 0.001
locfield: 1
lenfield: 6
thinbarline: color=green
ploticus-2.42/pltestsuite/data10 0000644 0001750 0001750 00000000343 07343423757 015675 0 ustar colin colin 0 100 2 100 4 100 3 100 4
1.5 92 4 94 7 87 6 86 5
3 89 4 92 8 78 6 74 4
6 86 5 91 8 65 8 61 6
12 80 5 90 7 58 7 51 8
24 78 4 81 5 53 12 = =
36 77 7 74 6 49 10 = =
48 75 6 69 7 46 8 = =
60 74 7 64 7 = = = =
72 74 9 57 6 = = = =
ploticus-2.42/pltestsuite/annot 0000644 0001750 0001750 00000000331 07417303170 015723 0 ustar colin colin // this code produces an annotation in one of the chron examples
#proc annotate
location: 100101(s) 600(s)
arrowhead: 111201(s) 700(s)
textdetails: size=6 color=gray(0.6)
arrowdetails: color=gray(0.6)
text: V 2.01
ploticus-2.42/pltestsuite/run_script_test.bat 0000755 0001750 0001750 00000004540 10743167774 020627 0 ustar colin colin REM MSDOS batch file to run pl examples..
REM
REM
echo off
set PL=pl
REM which %PL
REM available modes are generally: gif, svg, eps
set MODE=gif
echo Testing %PL% .. output format will be %MODE%
echo Be sure you have pl.exe in your PATH, or else copied into this dir..
pause
set OPTS=
echo "--------- stock2..."
%PL% -%MODE% %OPTS% stock2.htm
echo "--------- kmslide..."
%PL% -%MODE% %OPTS% kmslide.htm
echo "--------- propbars1..."
%PL% -%MODE% %OPTS% propbars1.htm
echo "--------- td..."
%PL% -%MODE% %OPTS% td.htm
echo "5 plots done"
echo "--------- errbar5..."
%PL% -%MODE% %OPTS% errbar5.htm
echo "Note: some warnings are ok in errbar5.. "
echo "--------- scatterplot10..."
%PL% -%MODE% %OPTS% scatterplot10.htm
echo "--------- devol..."
%PL% -%MODE% %OPTS% devol.htm
echo "10 plots done"
echo "--------- lineplot4..."
%PL% -%MODE% %OPTS% lineplot4.htm
echo "--------- lineplot5..."
%PL% -%MODE% %OPTS% lineplot5.htm
echo "--------- pie1..."
%PL% -%MODE% %OPTS% pie1.htm
echo "--------- bars3..."
%PL% -%MODE% %OPTS% bars3.htm
echo "--------- quarters..."
%PL% -%MODE% %OPTS% quarters.htm
echo "15 plots done"
echo "--------- timeline2..."
%PL% -%MODE% %OPTS% timeline2.htm
echo "--------- scatterplot4..."
%PL% -%MODE% %OPTS% scatterplot4.htm
echo "--------- annot2..."
%PL% -%MODE% %OPTS% annot2.htm
echo "--------- drawcom..."
%PL% -%MODE% %OPTS% drawcom.htm
echo "--------- hitcount3..."
%PL% -%MODE% %OPTS% hitcount3.htm
echo "Note: there should be 8 'warning: time is outside of window range' msgs above.. "
echo "20 plots done.."
echo "--------- lineplot20..."
%PL% -%MODE% %OPTS% lineplot20.htm
echo "--------- colorgrid2 (should produce client-side image map to file csmap.out)..."
%PL% -%MODE% %OPTS% colorgrid2.htm -csmap > csmap.out
echo "--------- heatmap3..."
%PL% -%MODE% %OPTS% heatmap3.htm
echo "--------- vector1..."
%PL% -%MODE% %OPTS% vector1.htm
echo "--------- windbarbs..."
%PL% -%MODE% %OPTS% windbarbs.htm
echo "--------- venn..."
%PL% -%MODE% %OPTS% venn.htm
echo "--------- catlines1..."
%PL% -%MODE% %OPTS% catlines1.htm
echo "--------- tree1..."
%PL% -%MODE% %OPTS% tree1.htm
echo "--------- dtfut..."
%PL% -%MODE% %OPTS% dtfut.htm
echo "--------- rangesweep2_dostext..."
%PL% -%MODE% %OPTS% rangesweep2.htm
echo "--------- sar-cpu..."
%PL% -%MODE% %OPTS% sar-cpu.htm
echo "Finished."
ploticus-2.42/pltestsuite/hgb.dat 0000644 0001750 0001750 00000004225 10743160775 016131 0 ustar colin colin 129S1/SvImJ hgb_M06 16.1 0.922
129S1/SvImJ hgb_M12 17.2 0.756
129S1/SvImJ hgb_M18 17.0 0.873
A/J hgb_M06 16.5 0.594
A/J hgb_M12 14.7 0.379
A/J hgb_M18 13.7 0.868
AKR/J hgb_M06 14.2 1.85
BALB/cByJ hgb_M06 17.8 0.294
BALB/cByJ hgb_M12 16.3 0.261
BALB/cByJ hgb_M18 15.9 0.374
BTBR_T+_tf/J hgb_M06 16.6 0.198
BTBR_T+_tf/J hgb_M12 15.0 0.236
BUB/BnJ hgb_M06 16.3 0.568
BUB/BnJ hgb_M12 15.2 0.736
BUB/BnJ hgb_M18 15.3 0.327
C3H/HeJ hgb_M06 15.6 0.338
C3H/HeJ hgb_M12 14.7 0.334
C3H/HeJ hgb_M18 14.5 0.438
C57BL/10J hgb_M06 16.3 1.23
C57BL/10J hgb_M12 15.2 0.559
C57BL/10J hgb_M18 14.3 1.21
C57BL/6J hgb_M06 15.7 0.506
C57BL/6J hgb_M12 15.3 1.68
C57BL/6J hgb_M18 16.0 0.544
C57BLKS/J hgb_M06 16.0 0.366
C57BLKS/J hgb_M12 15.7 1.66
C57BR/cdJ hgb_M06 17.1 0.279
C57BR/cdJ hgb_M18 15.4 0.748
C57L/J hgb_M06 16.4 0.282
C57L/J hgb_M12 16.4 0.646
C57L/J hgb_M18 15.8 0.341
CAST/EiJ hgb_M06 16.3 0.717
CBA/J hgb_M06 15.2 0.454
CBA/J hgb_M12 14.6 0.299
DBA/2J hgb_M06 14.8 0.754
DBA/2J hgb_M12 15.0 0.917
DBA/2J hgb_M18 15.2 0.301
FVB/NJ hgb_M06 15.8 0.549
FVB/NJ hgb_M12 14.8 0.442
FVB/NJ hgb_M18 14.4 0.794
KK/HlJ hgb_M06 15.5 0.585
KK/HlJ hgb_M18 15.4 1.02
LP/J hgb_M06 17.2 0.226
LP/J hgb_M12 15.6 0.514
MRL/MpJ hgb_M06 14.8 1.79
MRL/MpJ hgb_M12 15.1 1.33
MRL/MpJ hgb_M18 14.0 1.62
NOD.B10Sn-H2/J hgb_M06 16.4 0.431
NOD.B10Sn-H2/J hgb_M12 16.4 0.650
NOD.B10Sn-H2/J hgb_M18 14.0 1.61
NON/ShiLtJ hgb_M06 16.2 0.907
NON/ShiLtJ hgb_M12 14.3 1.23
NON/ShiLtJ hgb_M18 14.0 1.31
NZO/HlLtJ hgb_M06 16.7 0.519
NZO/HlLtJ hgb_M12 14.9 2.38
NZO/HlLtJ hgb_M18 14.9 0.826
NZW/LacJ hgb_M06 15.0 0.374
NZW/LacJ hgb_M12 14.0 0.271
NZW/LacJ hgb_M18 13.7 0.601
P/J hgb_M06 16.9 0.572
P/J hgb_M12 16.5 0.423
PL/J hgb_M06 17.5 1.19
PWD/PhJ hgb_M06 17.3 0.169
PWD/PhJ hgb_M12 17.1 0.362
PWD/PhJ hgb_M18 16.6 0.407
RIIIS/J hgb_M12 15.7 0.392
RIIIS/J hgb_M18 14.7 0.640
SJL/J hgb_M06 15.6 1.13
SJL/J hgb_M12 15.1 0.475
SJL/J hgb_M18 14.3 0.574
SM/J hgb_M06 15.9 0.367
SM/J hgb_M12 15.8 0.637
SM/J hgb_M18 15.8 0.404
SWR/J hgb_M06 17.3 0.709
SWR/J hgb_M12 15.7 1.63
WSB/EiJ hgb_M06 16.2 0.631
WSB/EiJ hgb_M12 16.2 0.291
WSB/EiJ hgb_M18 15.8 0.867
ploticus-2.42/pltestsuite/README 0000644 0001750 0001750 00000002162 07662416536 015562 0 ustar colin colin This directory contains a set of script examples as well as scripts to
run prefab examples.
It is assumed that pl (pl.exe on win32) is in your command PATH or else
copied into this directory.
To run the script examples, type: run_script_test
--------------------------
(windows users can try: run_script_test.bat from an MSDOS window)
To erase all results, type: make clean
To view script test result images, point your browser to this
directory.
To run the prefab examples in x11 mode, type: run_prefabs_test
--------------------------
There should be no error messages, other than row and field counts.
For other output modes, add an argument, eg: run_prefabs_test png
To test config file, do:
-------------------
PLOTICUS_CONFIG=plconfig.spanish; export PLOTICUS_CONFIG
To test the libploticus API
---------------------------
in the ../src directory, build libploticus and api_test program..
make clean
make -f Makefile_api
make api_test -f Makefile_api
then in this directory, do: ../src/api_test
Results will end up in the directory ./api_test_output
See also api_examp.c
ploticus-2.42/pltestsuite/supstubs.htm 0000644 0001750 0001750 00000001716 10301126512 017260 0 ustar colin colin supstubs

// Usage: pl -gif supstubs.htm
//
// Superscripts and subscripts in stubs.
// Available in versions 2.3+...
// Text must be rendered in a monospace font for it to work.
#proc settings
enable_suscripts: yes
// define plotting area using proc areadef
#proc areadef
rectangle: 1 1 4 4
xrange: 1 100000000
xscaletype: log
yrange: 0.000001 1
yscaletype: log
// set up X axis using proc xaxis
#proc xaxis
label: size
labeldetails: adjust=0,-0.1
selflocatingstubs: text
1 1
10 10
100 100
1000 10^3^
10000 10^4^
100000 10^5^
1000000 10^6^
10000000 10^7^
// set up Y axis using proc yaxis
#proc yaxis
label: prob
labeldetails: adjust=-0.2,0
selflocatingstubs: text
0.000001 10^-6^
0.00001 10^-5^
0.0001 10^-4^
0.001 10^-3^
0.01 0.01
0.1 0.1
1 1
#proc line
points: 3(s) 1(s) 3000000(s) 0.000005(s)
ploticus-2.42/pltestsuite/dexa.dat 0000644 0001750 0001750 00000011312 10055701423 016270 0 ustar colin colin strain sex bw RFbmc LFbmc RFbmd LFbmd
129S1/SvImJ f 20.5 0.0265 0.0313 0.0647 0.0695
129S1/SvImJ f 19.5 0.0299 0.0308 0.0648 0.0667
129S1/SvImJ f 20 0.0326 0.0351 0.0739 0.0741
129S1/SvImJ f 18.2 0.0230 0.0255 0.0601 0.0654
129S1/SvImJ f 20.7 0.0309 0.0332 0.0690 0.0701
129S1/SvImJ f 19.1 0.0288 0.0278 0.0690 0.0690
129S1/SvImJ f 18.9 0.0242 0.0308 0.0639 0.0682
129S1/SvImJ f 19.3 0.0249 0.0302 0.0682 0.0686
129S1/SvImJ m 26.2 0.0340 0.0408 0.0702 0.0802
129S1/SvImJ m 24.1 0.0285 0.0340 0.0720 0.0762
129S1/SvImJ m 20.6 0.0260 0.0270 0.0635 0.0670
129S1/SvImJ m 27.9 0.0332 0.0380 0.0742 0.0814
129S1/SvImJ m 26.7 0.0425 0.0372 0.0736 0.0774
129S1/SvImJ m 26.1 0.0351 0.0361 0.0731 0.0817
129S1/SvImJ m 24.3 0.0336 0.0372 0.0674 0.0745
129S1/SvImJ m 22.9 0.0322 0.0374 0.0730 0.0785
A/J f 21.6 0.0227 0.0257 0.0644 0.0691
A/J f 20.5 0.0212 0.0223 0.0625 0.0654
A/J f 21.1 0.0229 0.0284 0.0608 0.0674
A/J f 25.3 0.0257 0.0298 0.0675 0.0683
A/J f 23.3 0.0221 0.0292 0.0642 0.0689
A/J f 18.5 0.0187 0.0221 0.0587 0.0625
A/J f 23.4 0.0242 0.0259 0.0630 0.0687
A/J f 17.6 0.0197 0.0206 0.0585 0.0607
A/J m 25.1 0.0284 0.0315 0.0669 0.0661
A/J m 24.8 0.0239 0.0275 0.0634 0.0691
A/J m 27.3 0.0248 0.0296 0.0638 0.0696
A/J m 29.2 0.0280 0.0318 0.0701 0.0706
A/J m 25 0.0250 0.0248 0.0625 0.0695
A/J m 25.4 0.0284 0.0337 0.0656 0.0725
A/J m 24.6 0.0229 0.0227 0.0628 0.0682
A/J m 25.2 0.0243 0.0266 0.0653 0.0688
BALB/cJ f 23.3 0.0359 0.0421 0.0771 0.0781
BALB/cJ f 22.9 0.0322 0.0319 0.0740 0.0818
BALB/cJ f 23.2 0.0370 0.0418 0.0753 0.0792
BALB/cJ f 25.9 0.0380 0.0353 0.0804 0.0800
BALB/cJ f 21.9 0.0298 0.0338 0.0739 0.0750
BALB/cJ f 22.7 0.0280 0.0308 0.0735 0.0746
BALB/cJ f 21.7 0.0302 0.0343 0.0680 0.0711
BALB/cJ f 21.5 0.0327 0.0332 0.0745 0.0747
BALB/cJ m 27 0.0337 0.0382 0.0756 0.0790
BALB/cJ m 27.5 0.0373 0.0380 0.0826 0.0802
BALB/cJ m 28.8 0.0388 0.0461 0.0792 0.0817
BALB/cJ m 28.2 0.0363 0.0414 0.0763 0.0807
BALB/cJ m 29.4 0.0460 0.0397 0.0805 0.0811
BALB/cJ m 32.2 0.0505 0.0410 0.0837 0.0810
BALB/cJ m 33.7 0.0457 0.0467 0.0827 0.0854
BALB/cJ m 29.8 0.0388 0.0451 0.0795 0.0842
C57BL/6J f 19.6 0.0217 0.0271 0.0546 0.0623
C57BL/6J f 20.1 0.0225 0.0234 0.0559 0.0572
C57BL/6J f 20.6 0.0224 0.0251 0.0591 0.0605
C57BL/6J f 19.9 0.0229 0.0271 0.0593 0.0641
C57BL/6J f 17.6 0.0244 0.0237 0.0577 0.0561
C57BL/6J f 23.5 0.0293 0.0301 0.0598 0.0649
C57BL/6J f 23.1 0.0265 0.0272 0.0604 0.0625
C57BL/6J f 21.9 0.0280 0.0298 0.0617 0.0651
C57BL/6J m 26.8 0.0294 0.0319 0.0727 0.0744
C57BL/6J m 27.3 0.0338 0.0329 0.0714 0.0733
C57BL/6J m 26.2 0.0309 0.0290 0.0664 0.0683
C57BL/6J m 26.6 0.0281 0.0346 0.0674 0.0723
C57BL/6J m 33.3 0.0363 0.0398 0.0715 0.0817
C57BL/6J m 29.6 0.0350 0.0403 0.0732 0.0782
C57BL/6J m 26.1 0.0380 0.0365 0.0677 0.0761
C57BL/6J m 30.3 0.0392 0.0399 0.0726 0.0762
DBA/2J f 26.1 0.0280 0.0334 0.0647 0.0764
DBA/2J f 28.3 0.0334 0.0313 0.0721 0.0759
DBA/2J f 32.5 0.0241 0.0198 0.0524 0.0550
DBA/2J f 26.7 0.0247 0.0216 0.0482 0.0545
DBA/2J f 28.7 0.0330 0.0322 0.0697 0.0718
DBA/2J f 24.5 0.0310 0.0309 0.0646 0.0661
DBA/2J f 23.2 0.0266 0.0282 0.0677 0.0714
DBA/2J f 23 0.0266 0.0281 0.0685 0.0710
DBA/2J m 30.2 0.0290 0.0256 0.0678 0.0741
DBA/2J m 35.8 0.0324 0.0276 0.0679 0.0691
DBA/2J m 28.5 0.0330 0.0272 0.0682 0.0651
DBA/2J m 28.8 0.0246 0.0267 0.0627 0.0684
DBA/2J m 28.4 0.0187 0.0197 0.0346 0.0435
DBA/2J m 29.8 0.0280 0.0262 0.0634 0.0616
DBA/2J m 28.7 0.0262 0.0250 0.0564 0.0638
DBA/2J m 27.3 0.0253 0.0207 0.0554 0.0537
NOD/LtJ f 24.5 0.0339 0.0401 0.0688 0.0768
NOD/LtJ f 24.3 0.0294 0.0355 0.0647 0.0703
NOD/LtJ f 22.2 0.0322 0.0292 0.0657 0.0616
NOD/LtJ f 26 0.0338 0.0353 0.0734 0.0789
NOD/LtJ f 22.8 0.0259 0.0290 0.0650 0.0711
NOD/LtJ f 23.2 0.0282 0.0313 0.0650 0.0716
NOD/LtJ f 23.5 0.0265 0.0299 0.0652 0.0687
NOD/LtJ f 23.4 0.0285 0.0278 0.0669 0.0725
NOD/LtJ m 29.5 0.0321 0.0336 0.0726 0.0739
NOD/LtJ m 30.4 0.0322 0.0307 0.0732 0.0761
NOD/LtJ m 31.5 0.0310 0.0448 0.0689 0.0779
NOD/LtJ m 32.5 0.0348 0.0400 0.0715 0.0798
NOD/LtJ m 32.3 0.0307 0.0395 0.0685 0.0786
NOD/LtJ m 31.3 0.0343 0.0388 0.0723 0.0809
NOD/LtJ m 33.9 0.0313 0.0384 0.0722 0.0830
NOD/LtJ m 35 0.0341 0.0384 0.0708 0.0806
SJL/J f 21.5 0.0328 0.0434 0.0746 0.0822
SJL/J f 18.5 0.0309 0.0372 0.0707 0.0704
SJL/J f 20.3 0.0343 0.0372 0.0726 0.0804
SJL/J f 19.3 0.0335 0.0290 0.0732 0.0756
SJL/J f 19.5 0.0322 0.0440 0.0768 0.0821
SJL/J f 18.7 0.0288 0.0329 0.0721 0.0715
SJL/J f 18.6 0.0283 0.0284 0.0708 0.0728
SJL/J f 18.7 0.0281 0.0281 0.0687 0.0657
SJL/J m 27.9 0.0332 0.0363 0.0759 0.0849
SJL/J m 24.3 0.0373 0.0368 0.0796 0.0826
SJL/J m 24.4 0.0319 0.0334 0.0785 0.0812
SJL/J m 23.9 0.0345 0.0343 0.0744 0.0829
SJL/J m 26.8 0.0345 0.0365 0.0800 0.0850
SJL/J m 26.6 0.0344 0.0349 0.0780 0.0776
SJL/J m 26.4 0.0347 0.0381 0.0783 0.0813
SJL/J m 26.7 0.0321 0.0382 0.0771 0.0838
ploticus-2.42/pltestsuite/dtfut.htm 0000644 0001750 0001750 00000002431 10743161137 016525 0 ustar colin colin
Usage: pl -gif propbars1.htm
// specify the data using proc getdata
// Each value is an individual percentage.
#proc page
landscape: yes
#proc getdata
file: dtfut.dat
#endproc
// define plotting area using proc areadef
#proc areadef
title: Last 10 Wave Scores Over 100
// titledetails: size=18 align=C adjust=0,0.1 color=black
rectangle: 1 1 4 5.5
xrange: 0 100
yrange: 0 35
// do y axis stubs ( score names) using proc yaxis
#proc yaxis
stubs: datafields 1
grid: color=powderblue
axisline: none
tics: no
// do x axis stubs (percents) using proc xaxis
#proc xaxis
stubs: inc 20
stubformat: %3.0f%%
// do green bars using proc bars
#proc bars
horizontalbars: yes
barwidth: 0.13
lenfield: 2
color: green
// (.6,.85,.8)
outline: no
legendlabel: Long position components (Green)
#saveas: B
// do red bars
// Use stackfields to position bars beyond the first set of bars
#proc bars
#clone B
lenfield: 3
stackfields: 2
legendlabel: Short position components (Red)
color: red
// do legend (1st column) using proc legend
// the noclear attribute must be specified otherwise the entries are removed
// we need to keep them for the 2nd invocation, below..
#proc legend
location: min+.02 min-0.3
noclear: yes
ploticus-2.42/pltestsuite/quarters.htm 0000644 0001750 0001750 00000003621 10743161546 017253 0 ustar colin colin quarters

How to download and try this example
Usage: pl -gif quarters.htm
In order to use date quarters notation, the X range must be specified
with scaletype date using a month-day-year notation such as mmddyy;
then before plotting bars, switch to X scaletype date nqyy (or some other
quarters notation) using proc defineunits.
It must be done this way because internally dates in quarters notation
are converted to a midpoint mmddyy, e.g. 1Q99 -> 2/15/99 and
3Q99 -> 8/15/99. This is done for plotting and date arithmetic purposes.
Kind of tricky I realize.. it is touched on in the pl dates man page.
// do areadef with X scaled in years, using proc areadef
#proc areadef
title: Average dividend yield,\nby quarter
rectangle: 1 1 4 2.5
xscaletype: date mmddyy
xrange: 010198 123101
yrange: 3.0 6.0
// do year X axis using proc xaxis
#proc xaxis
stubs: inc 1 year
stubformat: yyyy
ticlen: 0 0.2
location: min-0.18
axisline: none
stubslide: 180(s)
// do another X axis to show quarters, using proc xaxis
#proc xaxis
stubs: inc 3 month
stubformat: Q
tics: none
stubdetails: adjust=0,+0.05
stubslide: 45(s)
// do a Y axis using proc yaxis
#proc yaxis
stubs: inc 0.5
grid: color=blue
stubformat: %3.1f%%
// switch to nqyy notation...
#call $changeunits( x, "date nqyy" )
// specify data using proc getdata
#proc getdata
data: 1Q98 5.3
2Q98 4.9
3Q98 4.7
4Q98 4.8
1Q99 5.1
2Q99 4.8
3Q99 5.2
4Q99 5.3
1Q00 5.5
2Q00 5.2
3Q00 4.9
4Q00 4.9
1Q01 4.8
2Q01 4.9
// render bars using proc bars
#proc bars
locfield: 1
lenfield: 2
barwidth: 0.1
color: yelloworange
ploticus-2.42/pltestsuite/ycase.newick 0000644 0001750 0001750 00000000571 10743161030 017166 0 ustar colin colin (((CAST/EiJ:0.08377, PWD/PhJ:0.15195):0.07349, ((BTBRT+tf/J:0.03469, (MOLF/EiJ:0.11686, (NOD/LtJ:0.01352, FVB/NJ:0.00729):0.11623):0.05377):0.09926, (WSB/EiJ:0.07204, AKR/J:0.05425):0.06139):1.20771):0.10313, (129S1SvImJ:0.00533, (C3H/HeJ:0.04002, BALB/cByJ:0.00089, (NZW/LacJ:0.01695, (KK/HlJ:0.03494, A/J:0.01334):0.03618):0.02865):0.02484):0.05949, DBA/2J:0.01695)[0.1429];
ploticus-2.42/pltestsuite/snpmap.dat 0000644 0001750 0001750 00000207575 07405152576 016705 0 ustar colin colin // Mouse SNP data merged from MIT and Roche.
// Available via Mouse Phenome Database (www.jax.org/phenome)
//
// These data are in tab-delimited text format for import into other programs; note that
// the columns do not line up properly when viewed directly.
//
//
chr cM cM2 129X1/SvJ A/J A/HeJ AKR/J B10.D2-H2/oSnJ BALB/cJ BALB/cByJ C3H/HeJ C57BL/6J CAST/Ei DBA/2J MRL/MpJ NZB/BlNJ NZW/LacJ SPRET/Ei extra1 extra2 assay SNPid source
1 4.4 = C C C C C C C C C A C = = A = = = D1Mit160 1 MR
1 4.4 = C C C C C C C C C T C = = T = = = M-05554 1 MR
1 4.4 = C C C C C C C C C C T C T C = = = M-05554 2 MR
1 4.4 = T T T T T T T T T G T = = G = = = M-05554 3 MR
1 4.4 = G G G G T G G G G T T = = T = = = M-05554 4 MR
1 4.4 = C C C C C C C C C T C = = T = = = M-05554 5 MR
1 5.5 = G G G G G G G G G A A G A G = = = D1Mit242 1 MR
1 5.5 6.6 G G G G G G G G G A G = = A = = = M-05377 1 MR
1 5.5 6.6 A A A A G A A A A T G = = T = = = M-05377 2 MR
1 5.5 6.6 A A A A A A A A A G A = = G = = = M-05377 3 MR
1 5.5 6.6 T T T T T T T T T T C T C T = = = M-05377 4 MR
1 5.5 6.6 T T T T T T T T T C T = = C = = = M-09789 1 MR
1 5.5 6.6 T T T T T T T T T A T = = A = = = M-09789 2 MR
1 6.6 4.4 = = = G = = G G A G G = = = = = = M-09886 1 M
1 8.7 8.7 C C C C C C C C C T C = = T = = = M-08188 1 MR
1 8.7 8.7 T T T T C T T T C C T C T T C = = M-08188 2 MR
1 8.7 = T T T T T T T T T C T = = C = = = M-09141 1 MR
1 8.7 = C C C C C C C C C T C = = T = = = M-09141 2 MR
1 8.7 8.7 T T T T T T T T T C T = = C = = = M-11013 1 MR
1 10.9 12.0 A A A A A A A A A G A = = G = = = M-09947 1 MR
1 10.9 12.0 C C C A C C C C C A C = = A = = = M-09947 2 MR
1 10.9 12.0 G G G G G G G G G A G = = A = = = M-09947 3 MR
1 10.9 12.0 G G G G G G G G G T G = = T = = = M-09947 4 MR
1 12.0 = T T T T T T T T T C T = = C = = = D1Mit432 1 MR
1 15.3 16.4 T T T T G G G T T G G = = G = = = M-10852 1 MR
1 15.3 16.4 A A A A A A A A A G A = = G = = = M-10852 2 MR
1 17.5 = G G G T G G G G G G G G G G = = = M-02149 1 MR
1 17.5 = C T = C = = C T C C C = = = = = = M-11380 1 M
1 19.7 20.3634 C C C C C C C C C A C = = A = = = M-11659 1 MR
1 19.7 20.3634 C C C C C C C C C T C = = T = = = M-11659 2 MR
1 20 = C C C C A A A C = C = C A = C = = X60184_352A 1 R
1 20 = G G G G A A A G = G = G A = G = = X60184_352A 2 R
1 20 = A A = = = = A = = = = = = = = = = X60184_352C 1 R
1 20 = C C C C A A A C = = = C A = = = = X60184_352E 1 R
1 20 = C C T = = = = = = = = = = = = = = X60184_352E 2 R
1 20 = T T T T G G G T = = = T G = = = = X60184_352E 3 R
1 20 = T T = = T = T = = = = T = = = = = X60184_352E 4 R
1 20 = A A A A G G G A = = = A G = = = = X60184_352E 5 R
1 20 = A A G = = = = = = = = = = = = = = X60184_352G 2 R
1 20 = = A = = = = A = = = = = = = = = = X60184_352G 3 R
1 20 = T T = = = = = = = = = = = = = = = X60184_352G 4 R
1 20 = G G G G A A A G = = = G A = = = = X60184_352I 1 R
1 20 = A A A A C C C A = = = A C = = = = X60184_352I 2 R
1 20.8 21.9 C C C C C C C C C T C = = T = = = M-01214 1 MR
1 20.8 21.9 C C C C C C C C C T = = = T = = = M-01325 1 MR
1 21.1 = T T = = = = = = = = = = = = = = = X52046_196 1 R
1 21.1 = G A A G A G G A = G = A A = = = = X52046_215 1 R
1 21.1 = A A T = = = = = = = = = = = = = = X52046_251 1 R
1 21.1 = = T = = C = = = = = = = = = = = = X52046_251 2 R
1 21.9 23.0 G G G G G G G G G A G = = A = = = M-08915 1 MR
1 25.1 = T T T T T T T T T G T = = G = = = M-05642 1 MR
1 25.1 = C C C C C C C C C T C = = T = = = M-07563 1 MR
1 25.1 = A A A A A A A A A G A = = G = = = M-07563 2 MR
1 25.1 25.9248 T T T T T T T T T A T = = A = = = M-09412 1 MR
1 25.1 25.9248 A A A A A A A A A G A = = G = = = M-09412 2 MR
1 25.1 25.9248 G G C C G G G G G = G = = = = = = M-10576 1 MR
1 25.1 25.9248 C C C C C T T C T = C = = = = = = M-10576 2 MR
1 25.1 = C C C T T C C T T C T T T T = = = M-11514 1 MR
1 25.9 = A A = = = = = T = = = = = = = = = U06924_BS395 1 R
1 25.9248 = G G G G G G G G G A G = = A = = = M-02354 1 MR
1 25.9248 = A A G G = A = A = G = = = G = = = M-08345 1 MR
1 30.1 = G G G G G T G G = = = G = = = = = AF067835_351A 1 R
1 30.1 = T T T T T C T T = = = C T = = = = AF067835_351A 2 R
1 30.1 = C C C C C T C C = C = T C = C = = AF067835_351A 3 R
1 30.1 = G G G G G A G G = = = A G = = = = AF067835_351A 4 R
1 30.1 = T T T T T A T T = A = A T = = = = AF067836_350A 1 R
1 30.1 = G G G G G A G G = = = A G = = = = AF067836_350A 3 R
1 30.1 = T T A = = = = = = = = = = = = = = AF067836_350A 4 R
1 30.1 = = G A = = = = = = = = = = = = = = AF067836_350A 5 R
1 31.7 = A A A A A A A A A G A = = G = = = D1Mit376 1 MR
1 31.7 31.7 A A A A A A A A A G A = = G = = = M-07040 1 MR
1 31.7 = G G G G G G G G G A G = = A = = = M-09309 1 MR
1 31.7 = G G G A G A A G G G G A G G = = = M-09309 2 MR
1 32.8 = A A A A A A A A A G A = = G = = = M-04387 1 MR
1 32.8 = C C C C C C C C C A C = = A = = = M-05866 1 MR
1 32.8 = C T T T T T T T T C T = = = = = = M-05866 2 MR
1 32.8 = C C C C C C C C C T C = = T = = = M-07126 1 MR
1 32.8 32.8 A A A A A A A A A G A = = G = = = M-07273 1 MR
1 32.8 = A A A A A A A A A G A = = G = = = M-10759 1 MR
1 32.8 = G G G G T T T G T G G G G G = = = M-10759 2 MR
1 32.8 32.8 T T T T T T T T T G T = = G = = = M-11415 1 MR
1 33.9 = C C C C A C C C A C C C C C = = = M-08882 1 MR
1 33.9 = G G G G G G G G G C G = = C = = = M-08882 2 MR
1 34.2306 = C C C C T T T C T C C C C T C = = M-05118 1 MR
1 36.1 = C C C T T T T C = = = C C = = = = U02023_354A 1 R
1 36.1 = T A A T T T T A = = = A A = = = = U02023_354A 4 R
1 36.1 = A A A G G G G A = = = A A = = = = U02023_354A 5 R
1 36.1 = T C C T T T T C = = = C C = = = = U02023_354A 7 R
1 36.1 = A A A T T T T A = = = A A = = = = U02023_354A 9 R
1 36.1 = = G G C C C C G = = = G G = = = = U02023_354B 1 R
1 36.1 = G G C = = = = = = = = = = = = = = U02023_354B 2 R
1 36.1 = = C A = = = = = = = = = = = = = = U02023_354B 3 R
1 36.1 = G G G A A A = G = = = G A = = = = U02023_354C 3 R
1 36.1 = A A A A T T T A = = = A T = = = = U02023_354C 6 R
1 36.1 = C C = = = = = = = = = = = = = = = U02023_354D 1 R
1 36.1 = C T T C C C C T = = = T C = = = = U02023_354E 1 R
1 36.1 = A A A G G G G A = = = A G = = = = U02023_354E 2 R
1 36.1 = = G G = = = = = = = = = = = = = = U02023_354E 3 R
1 36.1 = T T C = C = C = = = = = = = = = = U02023_354E 4 R
1 36.1 = G A G = G = G = = = = = = = = = = U02023_354E 5 R
1 36.1 = G G A = = = = = = = = = = = = = = U02025_346C 1 R
1 37.2 = C C T T T T T C T T T = = T = = = M-04460 1 MR
1 38.4 = T A A = T T = A T = = = = T = = = M-07288 1 R
1 42.6 41.5 A A G G A A A A A A A = = = = = = M-04734 1 MR
1 42.6 43.7 C C C A C C C C C C C C C = = = = M-04764 1 MR
1 42.6 41.5 G G G = G G G G G A G = = A = = = M-10226 1 MR
1 43.7 = C C C C C C C C C T C = = T = = = D1Mit284 1 MR
1 43.7 = A A A A A A A A A G A = = G = = = D1Mit284 2 MR
1 43.7 = T T T T T T T T T C T = = C = = = D1Mit284 3 MR
1 43.7 = T T T T T T T T T G T = = G = = = D1Mit284 4 MR
1 43.7 = T T T T T T T T T C T = = C = = = D1Mit483 1 MR
1 43.7 = T T T T T T T T T C T = = C = = = M-01906 1 MR
1 47 = C C C C C C C C C T C = = T = = = M-07387 1 MR
1 48.4 = T T A = = = = = = = = = = = = = = X07699_344J 1 R
1 48.4 = C C = = G = = = = = = = = = = = = X07699_344J 2 R
1 49.2 50.3 C C C A A A A C A A A A A C = = = M-01324 1 MR
1 49.2 50.3 G G G A A A A G A A A A A A = = = M-05229 1 MR
1 49.2 50.3 G G G C C C C G C C C C C C = = = M-05229 2 MR
1 51.4 = C C C G G G C C C C C C G C = = = D1Mit53 1 MR
1 51.4 = A A = A G A A G G A G = = A = = = M-02778 1 MR
1 51.4 = C C C C C C C C C A C = = A = = = M-10000 1 MR
1 52 = T T T C C C C T = C = C T = C = = M22381_169 1 R
1 52 = C C C T T T T C = C = T C = C = = M22381_169 2 R
1 52.3 = G G G T T T T G = = = G T = = = = M22381_235 1 R
1 52.5 54.6 C C C C C C C C C T C = = T = = = M-07120 1 MR
1 54.6 = T T T T T T T T T C T = = C = = = M-09944 1 MR
1 54.6 = G G G G G G G A G G G G G G = = = M-09944 2 MR
1 57.9 = T T T T T T T C T = T T T T = = = M-01362 1 MR
1 57.9 = T T T T T T T T T G T = = G = = = M-09416 1 MR
1 57.9 = G G G G G G G A G G G G G G = = = M-09735 1 MR
1 57.9 = C C C C C C C C C G C = = G = = = M-11213 1 MR
1 59.0 = A A A A A A A A A T A = = T = = = M-01610 1 MR
1 59.0 = T T C C T = T T T T T = = T = = = M-09217 1 MR
1 59.0 = T T T T T T T T T G T = = G = = = M-11376 1 MR
1 64.5 = T T T T A T T T A T T T T T = = = M-08387 1 MR
1 64.5 = G G G G G G G G G A G = = A = = = M-08387 2 MR
1 64.5 = T T T T T T T T T G T = = G = = = M-08387 3 MR
1 64.5 = C C C C T C C C T T C C C C = = = M-08387 4 MR
1 65.6 = A A A A A A A A A T A = = T = = = M-10550 1 MR
1 65.6 = G G G G G G G G G A G = = A = = = M-10550 2 MR
1 65.6 57.0327 C C C C C C C C C T C = = T = = = M-11178 1 MR
1 66.7 66.7 T T T T T T T T T G T = = G = = = M-05602 1 MR
1 66.7 66.7 A A A A A A A A A G A = = G = = = M-05602 2 MR
1 66.7 = T C C C C T T C C C C = = C = = = M-10621 1 MR
1 67.8 = G G G G C G G G C G G G G C = = = D1Mit421 1 MR
1 68.9 = T T T T T T T T T A T = = A = = = M-08471 1 MR
1 69 = G C C G C C C C = G = G G = G = = M32352 1 R
1 69.9 = A A A A A A A A A G A = = G = = = M-00747 1 MR
1 69.9 = G G G G G G G G G A G = = A = = = M-00747 2 MR
1 69.9 = G G G G G G G G A G G = = G = = = M-00747 3 MR
1 69.9 = C C C C C C C C C T C = = T = = = M-04042 1 MR
1 69.9 = G G C = C G = G = = = = = C = = = M-04294 1 R
1 70.449 67.8 T T T T T T T T G G T = = G = = = M-02000 1 MR
1 70.449 67.8 A A A A G A A A G A A A A G = = = M-02000 2 MR
1 72.6988 69.9 G G G G G G G G G A G = = A = = = M-01799 1 MR
1 72.6988 69.9 G G G G G G G G G T G = = T = = = M-01799 2 MR
1 73.2 = A A A A = A A A A G A = = G = = = M-00518 1 MR
1 73.2 = C T T C T T T T T T C C C C = = = M-00518 2 MR
1 73.2 = G G G G G G G G G A G = = A = = = M-00981 1 MR
1 73.2 75.4 G G G G A A A G A G G G G G = = = M-04311 1 MR
1 73.2 = G T T G T T T T T T G G G G = = = M-09500 1 MR
1 73.2 = C C = C = = C C C T C = = = = = = MUSREN1D 1 M
1 73.2 = C C = T = = C C C C T = = = = = = MUSREN1D 2 M
1 73.2 = T C T = T C = C C = = = = C = = = MUSREN1D_1 1 R
1 73.2 = C C C = C C = C C = = = = T = = = MUSREN1D_2 1 R
1 74.3 = G A A A A A A A A G A A A G = = = M-10653 1 MR
1 75.4 = G A A G A A A A A G G G G A = = = M-05733 1 MR
1 75.4 73.2 G G A A G G G G G G G = = G = = = M-10669 1 MR
1 75.4 73.2 A A G G A A A A A A A = = A = = = M-10669 2 MR
1 75.4 = T T T T T T T T T C T = = C = = = M-11208 1 MR
1 75.4 = G G G G G G G G G T G = = T = = = M-11208 2 MR
1 82.0 = G G G G G A A G G G A G A G G = = D1Mit266 1 MR
1 82.0 = A A A G G A A A G G A G A G = = = D1Mit424 1 MR
1 82.0 = G G G G G A A G G G A G A G = = = M-09966 1 MR
1 85 = A A A A A G A A = G = A G = G = = U58995 1 R
1 85.2 = A A = A = = A A A G G = = = = = = D1Mit539 1 M
1 85.2 = C C = C = = C C C C T = = = = = = D1Mit539 2 M
1 85.2 = C C C = T C = C C = = = = C = = = D1Mit539_1 1 R
1 85.2 = A A A A A A A A A G = A G A = = = D1Mit539_2 1 R
1 85.2 = G G G G G G G G G G A G A G = = = D1Mit57 1 MR
1 86.6 = T T T = C T = T T = = = = T = = = M-04729 1 R
1 86.6 = A A A A A A A A = G = A G = = = = M64545_343C 1 R
1 86.6 = A A A A A A A A = = = A C = = = = M64545_343C 2 R
1 86.6 = A A = = = = C = = = = = = = = = = M64545_343C 3 R
1 86.6 = T T T = G = T = = = = = = = = = = M64545_343C 4 R
1 86.6 = T T T = C = T = = = = = = = = = = M64545_343C 5 R
1 86.6 = = T = = C = = = = = = = = = = = = M64545_343D 1 R
1 86.6 = G G = = T = G = = = = = = = = = = M64545_343D 2 R
1 86.6 = C C = = T = = = = = = = = = = = = M64545_343E 1 R
1 86.6 = A A = = G = = = = = = = = = = = = M64545_343E 2 R
1 86.6 = G G = = A = = = = = = = = = = = = M64545_343E 3 R
1 86.6 = C C = = G = = = = = = = = = = = = M64545_343E 4 R
1 91.7103 91.8 G G G A A A A G A G A A = G = = = M-08501 1 MR
1 91.7103 91.8 A G A A A A A A A A A = = A = = = M-08501 2 MR
1 91.7103 91.8 G A A A A A A G A A A = = A = = = M-08501 3 MR
1 91.7103 91.8 A G G G G G G A G G G A G A = = = M-08501 4 MR
1 91.8 = A A A G G G G A G G G A G A = = = D1Mit455 1 MR
1 91.8 = C C C T T T T C T T T C T C = = = D1Mit455 2 MR
1 91.8 = G G A A A A A G A A A = = A = = = D1Mit455 3 MR
1 91.8 = C C T T T T T C T T T = = T = = = D1Mit455 4 MR
1 91.8 = A A A C C C C A C C C A C A = = = M-07264 1 MR
1 91.8 = G G G A A A A G A A A G A G = = = M-07264 2 MR
1 91.8 = A A A A A A A A G G A = = G = = = M-09303 1 MR
1 91.8 = G G A A G A A G A A G = = A = = = M-10796 1 MR
1 92.6 = C C C T T T T C = T = C T = T = = M31312 1 R
1 92.6 = C C C T T T T C = C = C T = C = = M63159 1 R
1 92.6 = C C C T T C T C = T = C C = C = = M79362 1 R
1 93.4 = = C = = T = = = = = = = = = = = = AJ004890_342A 1 R
1 93.4 = A A A A G A G A = = = A A = = = = AJ004890_342A 2 R
1 93.4 = T T T T C T C T = = = T T = = = = AJ004890_342A 4 R
1 93.4 = = G = = C = = = = = = = = = = = = AJ004890_342A 5 R
1 93.4 = C C = = A = = = = = = = = = = = = AJ004890_342A 6 R
1 93.4 = = G = = = = = = = = = = = = = = = AJ004890_342A 7 R
1 93.4 = G G G G A G A G = = = G G = = = = AJ004890_342A 8 R
1 93.4 = = A = = G = = = = = = = = = = = = AJ004890_342A 9 R
1 94 = A A A A G G G A G A G = = A = = = D1Mit540 1 MR
1 94 = T C C T T T T T C T T = T C = = = M-07622 1 MR
1 94 = G A A G G G G G G G G G G A = = = M-07622 2 MR
1 94 = A A A A G A A A G A A A A A = = = M-07622 3 MR
1 94 = C T T C T C C C T C C C C T = = = M-07622 4 MR
1 94.2 = G G G G G G G = = G = G G = = = = M29535 1 R
1 99.5 = = A A = A A = A A = = = = G = = = M-07381 1 R
1 100.5 = C C T T C C C C C C C = = C = = = M-01801 1 MR
1 100.5 = G G G A G G G G G A G G G G = = = M-01801 2 MR
1 101.6 = T C C C T T T T T C = T T T = = = M-07716 1 MR
1 101.6 = A G G A A A A A A G G A G A G = = M-11354 1 MR
1 104.9 = T T T T T T T T T C T = = C = = = M-05388 1 MR
1 104.9 = G A = A A A A A A G A = = = = = = M-05388 2 MR
1 104.9 = A A A A A A A A A G A = = G = = = M-05388 3 MR
1 110.4 111.5 A A A A A A A A A G = = = G = = = M-02819 1 MR
1 110.4 = A A A A A A A A A G A = = G = = = M-09895 1 MR
1 110.4 = G G G G G G G G G A G = = A = = = M-09895 2 MR
1 113.7 = T T T T T T T T T C C C C C C = = M-07572 1 MR
2 5.5 = C C C C C C C C C T C = = T = = = M-00685 1 MR
2 7.7 = A A A A A A A A A C A = = C = = = D2Mit314S 1 MR
2 7.7 = C T C C C C C C C C C = = C = = = D2Mit314S 2 MR
2 7.7 = A A A A A A A A A C A = = C = = = D2Mit358S 1 MR
2 7.7 = T G G T T T T T T T T T T G = = = D2Mit358S 2 MR
2 7.7 7.7 A A A = A A A A A T A = = T = = = M-00644 1 MR
2 7.7 7.7 T T T T T T T T T C T = = C = = = M-00644 2 MR
2 7.7 = A A A A A A A A A C A = = C = = = M-02161 1 MR
2 7.7 = A A A A A A A A A T A = = T = = = M-02161 2 MR
2 7.7 = G G G G G G G G G A G = = A = = = M-07025 1 MR
2 7.7 = T T T T T T T T T C T = = C = = = M-07025 2 MR
2 7.7 = C C C C C C T G C C C = = = = = = M-07025 3 MR
2 8.7 = T T T T T T T T T G T = = G = = = M-07666 1 MR
2 8.7 = A A A A A A A A A G A = = G = = = M-07666 2 MR
2 8.7 = A A A A A A A A A G A = = G = = = M-07666 3 MR
2 8.7 = A A A A A A A A A G A = = G = = = M-08739 1 MR
2 8.7 = A A A A A A A A A G A = = G = = = M-08739 2 MR
2 12 12.0 T T T T T T T T T C T = = C = = = M-02054 1 MR
2 12 12.0 A A A A A A A A A G A = = G = = = M-02054 2 MR
2 21.9 = C C C C C C = C C T C = = T = = = M-11357 1 MR
2 26.2 27.3 T C C C C T T T T T = C C C = = = M-11362 1 MR
2 27.3 = T T T T T T T T T C T = = C = = = M-00372 1 MR
2 27.3 27.3 C C C C A A A C A C C C C C A = = M-09011 1 MR
2 27.3 27.3 C C C C C C C C C A C = = A = = = M-09011 2 MR
2 27.3 = A A A A A A A A A G A = = G = = = M-10987 1 MR
2 29.5 = C C C C C C C C C T C = = T = = = M-11172 1 MR
2 31.7 = T T T T C C C T C C T T T C C = = M-08844 1 MR
2 31.7 = T T T T T T T T T C T = = C = = = M-09102 1 MR
2 32.8 = C C = = C T T C T = = = = = = = = M-09693 1 MR
2 36.1 36.1 A A A A A A A A A G A = = G = = = M-05552 1 MR
2 36.1 36.1 A A A A A A A A A G A = = G = = = M-05552 2 MR
2 38.3 = G G G G G G G G G A A G A A = = = M-00997 1 MR
2 38.3 = G A A G G G G G G G A A A G = = = M-05667 1 MR
2 38.3 = C C C C C C C C C T C = = T = = = M-05667 2 MR
2 38.3 = C C C C C C C C C T C = = T = = = M-11015 1 MR
2 38.3 = A A A A A A A A A G A = = G = = = M-11015 2 MR
2 40.4 64.5 G G G G G G G G G A G = = A = = = M-07711 1 MR
2 40.4 64.5 A A A A A A A A A G A = = G = = = M-07711 2 MR
2 40.4 64.5 G G G G A A A A A G A G A G = = = M-08889 1 MR
2 44.8 = T T T T T T T T T C T = = C = = = M-07394 1 MR
2 44.8 = T T T T T T T T T A T = = A = = = M-07394 2 MR
2 44.8 = T G T T T T T T T A T = = = = = = M-07394 3 MR
2 44.8 = T T T T T T T T T C T = = C = = = M-09813 1 MR
2 44.8 = C C C C C C C C C T C = = T = = = M-09813 2 MR
2 45.82278 = C C C C C C C C C T C = = T = = = M-10681 1 MR
2 47.0 = G G G G G G G G G A G = = A = = = M-11045 1 MR
2 49.2 48.1 T C T C C T C C T C C T T T T = = M-07672 1 MR
2 50.3 = T G G T T T T T T G T T T T = = = D2Mit438 1 MR
2 50.3 = T T T T T T T T T C T = = C = = = D2Mit478 1 MR
2 50.3 = C G G C C C C C C C C C C C = = = M-01301 1 MR
2 50.3 = C C C C C C C C C T C = = T = = = M-01301 2 MR
2 50.3 = A A A A A A A G A A A = = = = = = M-02818 1 MR
2 50.3 = T T T C C C C C C C = C C C = = = M-04354 1 MR
2 50.3 = G G G G G G G G G A = = = A = = = M-04354 2 MR
2 50.3 = G G G G G G G G G A = = = A = = = M-04354 3 MR
2 50.3 = T T T T T T T T T C = = = C = = = M-04354 4 MR
2 50.3 = G G A A G G G A G G = = = G = = = M-04354 5 MR
2 50.3 52.5 A A A A A A A A A G A = = G = = = M-05702 1 MR
2 50.3 52.5 T T A A T T T A T A T = = A = = = M-05702 2 MR
2 50.3 50.3 = C C C T = = C C T = = = = = = = M-08309 1 MR
2 50.3 = T T T T T T T T T C T = = C = = = M-09577 1 MR
2 50.3 = T T T T T T T T T A T = = A = = = M-09577 2 MR
2 50.3 = A A A A A A A A A G A = = G = = = M-09577 3 MR
2 50.3 = C C C C C C C C C G C = = G = = = M-09599 1 MR
2 50.3 = G G A A G G G A G G G = = G = = = M-09599 2 MR
2 50.3 = G G G G G G G G G C G = = C = = = M-11230 1 MR
2 51.4 = T T T T T = T T T G T = = G = = = D2Mit211 1 MR
2 51.4 = G A A A G A A A G G A A A G A = = M-09911 1 MR
2 52.5 = T T T T T T T T T G T = = G = = = D2Mit352 1 MR
2 52.5 51.4 C C C C C C C T C C C C C C = = = M-04348 1 MR
2 52.5 51.4 G G G G G G G G G A G = = A = = = M-04348 2 MR
2 52.5 = T T T T T T T T T C T = = C = = = M-05039 1 MR
2 52.5 = A A = A G G G A A A G = = A = = = M-09384 1 MR
2 52.5 = A T T T T T T T T T T = = T = = = M-09384 2 MR
2 52.5 = C C C C C C C C C G C = = G = = = M-09384 3 MR
2 52.5 52.5 G G G G G G G A G G G G G G = = = M-10361 1 MR
2 52.5 = T T T T T T T T T G T = = G = = = M-10662 1 MR
2 52.5 = G G G G G G G G G C G = = C = = = M-10662 2 MR
2 54.6 54.6 G G G G G G G G A A = = = A = = = M-04727 1 MR
2 55.7 = C C C C T C C C T C C T C C = = = M-08278 1 MR
2 55.7 = G A A G G A A G G G A G A A = = = M-08278 2 MR
2 56.8 = C C C C C C C C C T C = = T = = = M-01191 1 MR
2 56.8 = A A A A A A A A A T A = = T = = = M-04941 1 MR
2 56.8 57.9 T T A = T = A = T = T = = = = = = M-07027 1 MR
2 56.8 = T C C = = = = = = T C = = = = = = M-10221 1 MR
2 56.8 = T T T T T T T T T A T = = A = = = M-10620 1 MR
2 59.0 = T C C T T C C C T C C T C T = = = M-05621 1 MR
2 59.0 60.1 T T T T C T T C T C C = = C = = = M-07552 1 MR
2 59.0 60.1 A A A A A A A A A T A = = T = = = M-07552 2 MR
2 59.0 = G G G G G G G A G G A G A G = = = M-08807 1 MR
2 59.0 = G G G G A G G G A G G A G G = = = M-10790 1 MR
2 59.0 = C C C C C C C T C T T C T C = = = M-10790 2 MR
2 60.1 = C T T C T C C C T C C T C C C = = D2Mit399 1 MR
2 61.2 = T T T T T T T T T C T = = C = = = D2Mit19 1 MR
2 61.2 61.2 A A A A A A A A A T A = = T = = = M-01755 1 MR
2 61.2 61.2 A A A A A A A A A G A = = G = = = M-01755 2 MR
2 61.2 = G G G G G G G G G A G = = A = = = M-01936 1 MR
2 61.2 = A A A T A T T T A T T A T = T = = M-07246 1 MR
2 61.2 = C C C C C T T C C C C C C C = = = M-07269 1 MR
2 61.2 = C C C C C A A C C C C C C C = = = M-07269 2 MR
2 61.2 = G G G G G G G G G A G = = A = = = M-09476 1 MR
2 61.2 = G C C C C C C C C C T T T = = = = M-09476 2 MR
2 64.5 = A A A A A A A A A T A = = T = = = D2Mit209 1 MR
2 64.5 = G G G G G G G G G A G = = A = = = D2Mit209 2 MR
2 64.5 = A A A A A A A A A C A = = C = = = D2Mit209 3 MR
2 65 = = T = = = = = = = = = = = = = = = J05605_355F 1 R
2 65 = C C = = A = = = = = = = = = = = = J05605_355F 2 R
2 65 = = A G = G = G = = = = = = = = = = J05605_355F 3 R
2 65 = A A = = = = = = = = = = = = = = = J05605_355F 4 R
2 65 = = A = = = = = = = = = = = = = = = J05605_355G 1 R
2 65 = A A = = G = = = = = = = = = = = = J05606_361A 1 R
2 66.7 = G A A G A A A A A A G A G G = = = D2Mit404 1 MR
2 66.7 = G A A G A A A A A A G A G G = = = M-09373 1 MR
2 66.7 = G A A G A A A A A A G A G G = = = M-09373 2 MR
2 66.7 = A C C C C C C C C A A C A A = = = M-09503 1 MR
2 67.8 = A A A A A A = A A C = = = C = = = M-04441 1 MR
2 67.8 = A A A A A A A A A G A = = G = = = M-04441 2 MR
2 67.8 = T T T T T T T T T G T = = G = = = M-05106 1 MR
2 67.8 = G G G G G G G G G A G = = A = = = M-05106 2 MR
2 67.8 = A A A A A A A A A G A = = G = = = M-05106 3 MR
2 68.9 = T T T T T T T T T C T = = C = = = MMI47RNA 1 MR
2 71.0 = T T T = C T = C T = = = = C = = = M-04741 1 R
2 72.1 = T T T T T T T T T T A T A T = = = D2Mit284 1 MR
2 72.1 = C T C C T T T T C T T = = T = = = D2Mit284 2 MR
2 73 = C C C C C A C C = A = C C = = = = U03987_SNP63B 1 R
2 73 = T T C = = = = = = = = = = = = = = U03987_SNP63B 2 R
2 73 = = T G = = = = = = = = = = = = = = U03987_SNP63B 3 R
2 73 = G G G G G A G G = = = G G = = = = U03987_SNP63C 1 R
2 73 = A A A A A G A A = = = A A = = = = U03987_SNP63C 2 R
2 73 = T T T T T C T T = = = T T = = = = U03987_SNP63C 3 R
2 73 = G G G G G A G G = G = G G = = = = U03987_SNP63C 4 R
2 73 = T T T T T C T T = T = T T = T = = U03987_SNP63C 5 R
2 73 = G G G G G A G G = A = G G = A = = U03987_SNP63D 1 R
2 73 = T T T T T C T T = = = T T = = = = U03987_SNP63D 2 R
2 73 = T T C = = = = = = = = = = = = = = U03987_SNP63D 3 R
2 73 = A A A A A G A A = = = A A = = = = U03987_SNP63D 4 R
2 73 = T T G = = = = = = = = = = = = = = U03987_SNP63D 5 R
2 73.2 73.2 = G G G T G G G G T = = = = = = = M-04429 1 MR
2 73.2 = C T T T T C C C T T T T T C = = = M-10061 1 MR
2 73.2 = C T T T T C C C T T T = = T = = = M-10061 2 MR
2 73.2 = A G G G G A A A G G G = = G = = = M-10061 3 MR
2 73.2 = G A A A A G G G A A A A A G = = = M-10061 4 MR
2 73.2 = C C C C C C C C C G C = = G = = = M-11200 1 MR
2 73.2 = C C C C C T C C = T = C C = C = = M88354_359A 1 R
2 73.2 = C C C C C T C C = = = C C = = = = M88354_359B 1 R
2 73.2 = = T T T T C T T = = = T T = = = = M88354_359C 1 R
2 73.2 = G G A = = = = = = = = = = = = = = M88354_359C 2 R
2 73.2 = = C C C C T C C = = = C C = = = = M88354_359C 3 R
2 74.3 = A A A A A A A A A G A = = G = = = M-07036 1 MR
2 74.3 = C C C C C C C C C T C = = T = = = M-07036 2 MR
2 74.3 = A A A A A A A A A G A = = G = = = M-07036 3 MR
2 74.3 = A A A G A A A A A G G G G A = = = M-11696 1 MR
2 74.47758 66.7 T T T T T T T T T C T = = C = = = M-04660 1 MR
2 74.47758 66.7 A G G G G G G G G G A G A A = = = M-04660 2 MR
2 76.1 = T T C = T T = T T = = = = C = = = M-11651 1 R
2 76.1 = T T T = T T = T T = = = = C = = = M-11651 2 R
2 76.1 = A A A = A A = A A = = = = G = = = M-11651 3 R
2 77.6 78.7 G A A A A A A A G G A A A A G = = M-00688 1 MR
2 78.7 = G G C G T C G G G A G C C C = = = M-00971 1 MR
2 78.7 = C C C C T C C C T C C C C C = = = M-00971 2 MR
2 78.7 = G G G G G G G G G T G = = T = = = M-00971 3 MR
2 78.7 78.7 A A A A A A A A A G A = = G = = = M-01014 1 MR
2 78.7 = A A A A A A A A A G A = = G = = = M-09192 1 MR
2 78.7 = G G G G G G G G G T G = = T = = = M-09192 2 MR
2 79.8 = G G G G G G G G G A G = = A = = = M-09921 1 MR
2 79.8 = C C C C C C C C C A C = = A = = = M-10203 1 MR
2 79.8 = A A A A A A A A A G A = = G = = = M-10203 2 MR
2 82.0 = G A G = G A = A G = = = = A = = = M-09722 1 R
2 83.1 80.9 C C C C C C C C C T C = = T = = = M-09295 1 MR
2 83.1 80.9 G G G G G G G G G A G = = A = = = M-09295 2 MR
2 83.1 84.2 G A A G G A A G G = G G G G = = = M-09659 1 MR
2 83.1 84.2 C C C C C C C C C T C = = T = = = M-09659 2 MR
2 83.1 84.2 G G G G G G G G G C G = = C = = = M-09659 3 MR
2 83.1 84.2 T T T T T T T T T C T = = C = = = M-09659 4 MR
2 83.1 84.2 G G G G G G G G G A G = = A = = = M-09659 5 MR
2 84 = A A A = A = G = = = = = = = = = = U10098_358G 1 R
2 84 = A C = = C = A = = = = = = = = = = U10098_358G 2 R
2 84 = C C C = C = T = = = = = = = = = = U10098_358G 3 R
2 91.8 = A A A A A A A A A G A = = G = = = M-08274 1 MR
2 94.0 = C C = = = C = = C = = = = A = = = M-04331 1 R
2 94.0 = G G G = G G = G G = = = = A = = = M-04331 2 R
2 98.4 = T T T T T T T T T C T = = C = = = M-04325 1 MR
2 98.4 = A A A A A A A A A G A = = G = = = M-04325 2 MR
2 98.4 = G A A A G G G A G = = G A G = = = M-06965 1 MR
2 98.4 = T C C C T T T C T C C = C T C = = M-06965 2 MR
2 98.4 = T C C C T T T C T T C T C T = = = M-11056 1 MR
2 100.0 = T T T = T T = T T = = = = C = = = M-07522 1 R
3 2.2 = G A A A A A A A A G A = = = = = = M-09969 1 MR
3 2.2 = A A A A A A A A A T A = = T = = = M-09969 2 MR
3 2.2 = G G G G G G G G G C G = = C = = = M-09969 3 MR
3 2.2 = A A A A A A A A A G A = = G = = = M-09969 4 MR
3 2.2 = C C C C C C C C C C T T T C = = = M-11674 1 MR
3 4.4 = G A A A A A = A A G A = = = = = = M-04413 1 MR
3 4.4 = T G G G G G = G G T G = = = = = = M-04413 2 MR
3 4.4 4.4 C C C C C C C C C C T C T C = = = M-08413 1 MR
3 9.679 = A G G G A A A G A A A A A A = = = M-04444 1 MR
3 9.679 = C T T T C C C T C C C C C C = = = M-05709 1 MR
3 9.679 = G T T T G G G T G G G G G G = = = M-05709 2 MR
3 15.3 = C C C C T T T C T C = C C C = = = M-02707 1 MR
3 15.3 = A A A A G G G A G G = A A A = = = M-02707 2 MR
3 16.4 = T T T T T T T T T C T = = C = = = D3Mit333 1 MR
3 16.4 = C C C C C C C C C T C = = T = = = M-11372 1 MR
3 16.4 = G G G T G T T G G G T T T G G = = M-11372 2 MR
3 17.5 = C T T T T T T C C T T = = T = = = M-05261 1 MR
3 17.5 = T T T G T T T T T T G T G T = = = M-05384 1 MR
3 17.5 = C T T T T T T C C T T = = T = = = M-05384 2 MR
3 17.5 = G G G A G G G G G G A G A G = = = M-10405 1 MR
3 17.5 = G A A G G A G G G G G A G G = = = M-10405 2 MR
3 18.6 = T T T T T T T T T C T = = C = = = D3Mit134 1 MR
3 19.2 = T T T T C C C T = C = T C = C = = M16761_75 1 R
3 20.8 = A A A A A A A A A G A = = G = = = M-09394 1 MR
3 25.1 = G A A A A G G A G A A = = A = = = D3Mit52 1 MR
3 25.1 = G G = G G = G G G A G = = A = = = M-04575 1 MR
3 25.1 = T T = T T = T T T G T = = G = = = M-04575 2 MR
3 25.1 = A A A A A A A A A G A = = G = = = M-07644 1 MR
3 25.1 = A A A A A A A A A G A = = G = = = M-09377 1 MR
3 25.1 = G A A G A G G A A G G A G A G = = M-09377 2 MR
3 25.1 = G G G G G G G G G A G = = A = = = M-09413 1 MR
3 25.1 = A A A A A A A A A G A = = G = = = M-09413 2 MR
3 25.1 = G G G G G G G G G A G = = A = = = M-09455 1 MR
3 25.1 = T C C T T T T T T T T T T T = = = M-10056 1 MR
3 26.2 25.1 T T T T T T T T T G T = = G = = = M-01932 1 MR
3 26.2 25.1 A A A A A A A A A G A = = G = = = M-01932 2 MR
3 26.2 = A A A A A A A A A C A = = C = = = M-05067 1 MR
3 28.4 = T T T T T T T T T G T = = G = = = D3Mit244 1 MR
3 29.5 = G G A A A A A G G A A = = A = = = D3Mit281 1 MR
3 29.5 = C C T T T T T C C T T = = T = = = D3Mit281 2 MR
3 29.5 = G G A A G G T G G A T = = A = = = D3Mit281 3 MR
3 33.9 = T T T T T T T T T G T = = G = = = M-01074 1 MR
3 33.9 = C C C C C C C C C T C = = T = = = M-01074 2 MR
3 33.9 33.9 A A A A A A A A A G A = = G = = = M-05797 1 MR
3 33.9 33.9 A A A A A C C A A C A A A A = = = M-05797 2 MR
3 33.9 33.9 T T T T T T T T T C T = = C = = = M-05797 3 MR
3 33.9 33.9 A A A A A G G A A A G A G A = = = M-06943 1 MR
3 33.9 = T A A A A A A A A T A = = = = = = M-07091 1 MR
3 33.9 33.9 C C C C C C C C C A C = = A = = = M-07611 1 MR
3 33.9 = T T T T C C C T T T C = = T = = = MUSMSTA1 1 MR
3 36.1 = C T T T T T T T T C T T T C = = = D3Mit157 1 MR
3 37.2 37.2 C C C C C C C C C A C = = A = = = M-06981 1 MR
3 37.2 = T T T T T T T T T G T = = G = = = M-10516 1 MR
3 37.2 = G G G G G G G G G C G = = C = = = M-11719 1 MR
3 37.2 = G G G G G G G G G T G = = T = = = M-11719 2 MR
3 40.4 40.4 C C C C C C C C C T C = = T = = = M-02192 1 MR
3 40.4 = G G G G A G G G A G G G G G = = = M-04965 1 MR
3 40.4 = T T T T T T T T T C T = = C = = = M-05504 1 MR
3 40.4 = T T T T T T T T T C T = = C = = = M-05504 2 MR
3 40.4 = T C C C T C C C T C C C C C = = = M-05504 3 MR
3 40.4 40.4 A A A A A A A A A C A = = C = = = M-05514 1 MR
3 40.4 40.4 C C A A A A A C C C A = = C = = = M-05514 2 MR
3 41.5 = T T T T C T T T T C C = = C = = = M-04691 1 MR
3 41.5 = A A A A A A A A A C C A C A = = = M-04691 2 MR
3 42.6 = T T T T T T T T T C T = = C = = = D3Mit289 1 MR
3 42.6 42.6 G A A G G A A A G A G G G G = = = M-07613 1 MR
3 44.8 = G G G = G G G G G A = = = A = = = M-00392 1 MR
3 44.8 = T T T = T T T T T A = = = A = = = M-00392 2 MR
3 44.8 = T T T = T T T T T C = = = C = = = M-00392 3 MR
3 44.8 = T C T T C C C C C C C = = C = = = M-11390 1 MR
3 45.9 47.0 A A A A A A A A A G A = = G = = = M-07130 1 MR
3 45.9 47.0 T T T T T T T T T C T = = C = = = M-07130 2 MR
3 45.9 47.0 T T T T T T T T T C T = = C = = = M-07130 3 MR
3 45.9 47.0 C C C C C C C C C T C = = T = = = M-08318 1 MR
3 47.0 = G A A A A A A A A G A = = G = = = D3Mit195 1 MR
3 47.0 = A G G G G G G G G G G = = G = = = D3Mit195 2 MR
3 47.0 48.1 A A G G A A A A A G A = = G = = = M-05827 1 MR
3 47.0 48.1 A A T T A A A A A G A = = G = = = M-05827 2 MR
3 47.0 48.1 A A A A A A A A A G A = = G = = = M-09411 1 MR
3 47.0 48.1 C C C C C C C C C T C = = T = = = M-09411 2 MR
3 47.0 48.1 T T T T T T T T T C T = = C = = = M-09411 3 MR
3 47.0 48.1 C C C C C C C C C G C = = G = = = M-11756 1 MR
3 47.0 48.1 T T T T T T T T T G T = = G = = = M-11756 2 MR
3 48.5 = = A = = = = A = = = = = = = = = = M22739_346D 1 R
3 49.2 = G G A A A G G G G A A = = A = = = D3Mit160 1 MR
3 49.2 = A A A A A A = G A A A = = = = = = M-04685 1 MR
3 49.2 = T T T T T T T T T G T = = G = = = M-04685 2 MR
3 49.2 = A A G G G A A A A G G = = G = = = M-04685 3 MR
3 49.2 = G G G G G G G G G A G = = A = = = M-07116 1 MR
3 49.2 = T T T T T T T T T C T = = C = = = M-07116 2 MR
3 49.2 = C C C C C C C C C A C = = A = = = M-07682 1 MR
3 50.8 = A A A = A A = A A = = = = G = = = M-04457 1 R
3 51.4 50.3 G C C G G C C C G G G G G C = = = M-02233 1 MR
3 54.6 = T T T T T T T T T C T = = C = = = M-09880 1 MR
3 54.6 = C C C C T C C C T C C C C C = = = M-11717 1 MR
3 57.9 59.0 T T T T T T T T T T G G G T = = = M-09903 1 MR
3 64.5 = A A A A A A A T A A A = = = = = = D3Mit323 1 MR
3 64.5 65.6 T T T T T T T T T C T = = C = = = M-08414 1 MR
3 64.5 65.6 A A A A A A A A A G A = = G = = = M-08414 2 MR
3 64.5 = C C C C C C C C C G C = = G = = = M-09216 1 MR
3 64.5 65.6 T T T T T T T T T G T = = G = = = M-10582 1 MR
3 64.5 = C C C C C C C C C A C = = A = = = M-11347 1 MR
3 68.9 = C C C = C C = C C = = = = T = = = M-04664 1 R
3 82.0 = A A A = A A = A A = = = = G = = = M-03989 1 R
4 2.2 = T T T T T T T T T G T = = G = = = M-05053 1 MR
4 2.2 = C C C C C C C C C T C = = T = = = M-05053 2 MR
4 2.2 = C C C C C C C C C T C = = T = = = M-05053 3 MR
4 3.3 = G G G G G G G G G A G = = A = = = M-07408 1 MR
4 3.3 = G A A G G G G G A A G = G A = = = M-07408 2 MR
4 8.0 = G G G = G G = G G = = = = C = = = M-07549 1 R
4 8.7 = A A A A A A A A A G A = = G = = = M-00653 1 MR
4 8.7 = T T T T T T T T T G T = = G = = = M-00653 2 MR
4 8.7 = T T T T T T T T T G T = = G = = = M-02226 1 MR
4 8.7 = A A A A A A A A A C A = = C = = = M-08213 1 MR
4 8.7 = T T T T T T T T T C T = = C = = = M-08213 2 MR
4 8.7 = T T T T T T T T T G T = = G = = = M-08213 3 MR
4 8.7 = T T T T T T T T T C T = = C = = = M-08213 4 MR
4 9.8 = T T T T T T T T T C T = = C = = = M-06984 1 MR
4 9.8 = A A A A A A A A A G A = = G = = = M-06984 2 MR
4 10.5 = G G G G G G G G = G = G G = C = = L42901 1 R
4 10.9 = T T T T T T T T C T T T T = T = = M-01609 1 MR
4 10.9 = A A A A A A A A A T A = = T = = = M-02350 1 MR
4 10.9 = G G G G G G G G G C G = = C = = = M-05187 1 MR
4 10.9 = C C C C C C C C C T C = = T = = = M-05187 2 MR
4 10.9 = C T T C C = T C T C C = = = = = = M-05187 3 MR
4 10.9 10.9 G G G G G G G G G A G = = A = = = M-11704 1 MR
4 10.9 10.9 C C C C C C C C C T C = = T = = = M-11704 2 MR
4 10.9 10.9 A A A A A A A A A G A = = G = = = M-11704 3 MR
4 12.0 14.2 G G G G G G G G G A G = = A = = = M-01606 1 MR
4 12.0 14.2 G G G G G G G G G C G = = C = = = M-01606 2 MR
4 12.0 14.2 T T T T T T T T T C T = = C = = = M-01606 3 MR
4 12.0 = C C C C C C C C C G C = = G = = = M-10547 1 MR
4 12.0 = T T T T T T T T T C T = = C = = = M-10547 2 MR
4 16.4 = T T T T T T T T T C T = = C = = = M-01143 1 MR
4 16.4 = T T T T T T T T T C T = = C = = = M-01143 2 MR
4 18.6 = C C C C C C C C C T C = = T = = = D4Mit286 1 MR
4 18.6 = C C C C C C C C C T C = = T = = = D4Mit286 2 MR
4 18.6 = T T T T T T T T T C T = = C = = = D4Mit5 1 MR
4 18.6 = A A A A A A A A A T A = = T = = = D4Mit5 2 MR
4 18.6 = G G A A G G G G G = G = = = = = = M-10858 1 MR
4 23.0 = T C C C C C C C C T C = = T = = = M-08500 1 MR
4 24.0 = G G G G G G G G G A G = = A = = = M-08495 1 MR
4 24.0 = A A A A A A A A A T A = = T = = = M-08495 2 MR
4 25.1 = C C C C C C C C C T C = = T = = = M-02378 1 MR
4 25.1 = A A A A A A A A A T A = = T = = = M-02378 2 MR
4 25.1 = A A A A A A A A A C A = = C = = = M-05043 1 MR
4 25.1 = T T T T T T T T T G T = = G = = = M-10856 1 MR
4 27 = C C C C = C C = = G = = C = = = = X03208 1 R
4 28.4 = C C C C C C C C C T C = = T = = = M-01788 1 MR
4 28.4 = C C C C C C C C C T C = = T = = = M-07593 1 MR
4 28.4 = A A A A A A A A A G A = = G = = = M-07593 2 MR
4 30.6 31.7 = G G G A G G G G A = = = = = = = M-00916 1 MR
4 30.6 31.7 G G G G G G G G G A = = = A = = = M-00916 2 MR
4 30.6 31.7 C C C A A C C A A C = A C C = = = M-00916 3 MR
4 30.6 31.7 C C C C C C C C C T = = = T = = = M-00916 4 MR
4 30.6 = C C C C C C C C C A C = = A = = = M-05237 1 MR
4 30.6 = T T T T T T T T T G T = = G = = = M-05237 2 MR
4 30.6 30.6 G G G G G G G G G A G = = A = = = M-09259 1 MR
4 30.6 30.6 G G G G G G G G G A G = = A = = = M-09259 2 MR
4 30.6 30.6 C C C C C C C C C A C = = A = = = M-09259 3 MR
4 30.6 30.6 T T T T T T T T T C = = = C = = = M-10618 1 MR
4 30.6 = G A A A G A A A A G G = = G = = = M-11050 1 MR
4 30.6 = T A A A T A A A A T T = = T = = = M-11050 2 MR
4 31.7 = C C C C C C C C C A C = = A = = = M-01937 1 MR
4 31.7 = T T T T T T T T T G T = = G = = = M-01937 2 MR
4 31.7 = C C C C C C C C C T C = = T = = = M-01937 3 MR
4 31.7 = A A A A A A A A A G A = = G = = = M-01937 4 MR
4 31.7 = A T A A T T T A A A T = = A = = = M-05121 1 MR
4 31.7 31.7 G G G G G G G G G A G = = A = = = M-07258 1 MR
4 31.7 31.7 C C C T = C C T T C C T C = C = = M-07258 2 MR
4 31.7 31.7 A A A A A A A A A G A = = G = = = M-07258 3 MR
4 31.7 31.7 T T T T T T T T T C T = = C = = = M-07258 4 MR
4 31.7 31.7 T G G T T G G T T G G T G G = = = M-07258 5 MR
4 31.7 = T T T T T T T T T G T = = G = = = M-09605 1 MR
4 33.0 = A A A = A A = A A = = = = G = = = M-11335 1 R
4 33.3 = = G A = = = = = = = = = = = = = = S70142_SNP35A 1 R
4 33.3 = G G G A A A A G = G = A A = G = = S70142_SNP35A 2 R
4 33.9 36.1 G A G = A A A G G G A = = G = = = M-09648 1 MR
4 33.9 36.1 T A T = A A A T T T A = = T = = = M-09648 2 MR
4 35.0 = T T T T T T T T T G T = = G = = = D4Mit45 1 MR
4 35.0 = G G G G G G G G G A G = = A = = = D4Mit45 2 MR
4 35.0 = T T T T T T T T T C T = = C = = = D4Mit45 3 MR
4 35.0 = G G G G G G G G G A G = = A = = = M-01769 1 MR
4 35.0 = C C T T C C C C C C C = = C = = = M-01769 2 MR
4 35.0 = C C C C C C C C C T C = = T = = = M-01769 3 MR
4 35.0 = T T A A T T T T T T T = = = = = = M-07249 1 MR
4 35.0 = T T T T T T T T T A T = = A = = = M-07300 1 MR
4 35.0 = A A A A A A A A A G A = = G = = = M-07300 2 MR
4 35.0 35.0 = C C C A = C C C A = = = = = = = M-11382 1 MR
4 38 = A A A C C A C C = A = C A = A = = X59513 1 R
4 39.3 = A A A A A A A A A G A = = G = = = D4Mit350 1 MR
4 39.3 39.3 C T C C T T T T T C T = = C = = = M-02145 1 MR
4 39.3 = T T T T T T T T T C T = = C = = = M-08348 1 MR
4 39.3 = C C C C C C C C C T C = = T = = = M-08348 2 MR
4 39.3 = G G G G G G G G G T G = = T = = = M-08348 3 MR
4 39.3 = C C C C C C C C C T C = = T = = = M-08348 4 MR
4 43 = A A A A A A A A = A = A T = A = = M13660 1 R
4 45.9 = G G G G G G G G G A G = = A = = = M-01802 1 MR
4 45.9 = A A A A A A A A A A G = G A = = = M-01802 2 MR
4 45.9 = A A A A A A A A A G A = = G = = = M-01802 3 MR
4 47 48.1 C C C C C C C C C T C = = T = = = M-10050 1 MR
4 47 48.1 G G G G G G G G G T G = = T = = = M-10050 2 MR
4 47 48.1 C C C C C C C C T C T C T C = = = M-10050 3 MR
4 48.1 = C C C C C C C C C T C = = T = = = M-07142 1 MR
4 48.1 = C C C C C C C C C T C = = T = = = M-10021 1 MR
4 49.5 = T T T T T G T G = = = T T = = = = Y11638_315B 1 R
4 49.5 = = A G = = = = = = = = = = = = = = Y11638_315C 1 R
4 49.5 = C C C C C T C T = = = C C = = = = Y11638_315E 1 R
4 49.5 = C C = = = = = = = = = = = = = = = Y11638_315F 2 R
4 49.5 = = T = = = = = = = = = = = = = = = Y11638_315F 3 R
4 49.5 = G G = = = = = = = = = = = = = = = Y11638_315F 4 R
4 49.5 = = G = = = = = = = = = = = = = = = Y11638_315F 5 R
4 49.5 = A A A = G A A G = = = = A G = = = Y11638_BS489 1 R
4 49.5 = A A A = A A A A = = = = A = = = = Y11638_BS489 2 R
4 49.5 = A A A = A A A A = = = = A = = = = Y11638_BS491 1 R
4 49.5 = = T G = = = = = = = = = = = = = = Y11638_BS491 2 R
4 49.5 = A A G = = G G A = = = = G T = = = Y11638_BS492 1 R
4 49.5 = G A G = = G G A = = = = G T = = = Y11638_BS493 1 R
4 49.5 = A A G = = G G A = = = = G T = = = Y11638_BS495 1 R
4 49.5 = G G G = G A G A = = = = G G = = = Y11638_BS495 2 R
4 49.5 = G G G = G A G A = = = = G G = = = Y11638_BS499 1 R
4 49.5 = G G G = G A G A = = = = G G = = = Y11640_BS500 1 R
4 49.5 = G G C = = G G = = = = = = = = = = Y11640_BS502 1 R
4 49.5 = C C C = C C C C = = = = C T = = = Y11640_BS502 2 R
4 49.5 = C C C C C T C T = = = C C = = = = Y11642_321A 1 R
4 49.5 = = C C = C C C C = = = = C T = = = Y11642_BS504 1 R
4 49.5 = A A A = A A A A = = = = A G = = = Y11642_BS504 2 R
4 49.5 = A A A = A A A A = = = = A T = = = Y11642_BS504 3 R
4 49.5 = A A A = A A A A = = = = A T = = = Y11642_BS505 1 R
4 49.5 = A A A = A A A A = = = = A T = = = Y11642_BS506 1 R
4 50.3 = T T T A A A A A A T A A A A = = = M-04049 1 MR
4 50.3 = A A A A A A A A A C A = = C = = = M-10838 1 MR
4 50.3 = T T T T T T T T T C T = = C = = = M-10838 2 MR
4 50.3 = T T T T T T T T T C T = = C = = = M-10838 3 MR
4 52.5 = G G G A G G G G G G G A G G = = = M-10869 1 MR
4 52.5 = C C C C T T T T T C C C C T = = = M-10869 2 MR
4 53.6 53.6 T T T T T T T T T C T = = C = = = M-05173 1 MR
4 53.6 53.6 A A A A A A A A A C A = = C = = = M-05173 2 MR
4 53.6 = T G G T T T T T T G G T G T = = = M-05631 1 MR
4 53.6 = G G G G G G = G G T G = = T = = = M-09028 1 MR
4 53.6 = A A A A A A = A A G A = = G = = = M-09028 2 MR
4 53.6 = A A A A A A A A A G A = = G = = = M-11431 1 MR
4 54.6 = A A A A A A A A G G A = = G = = = M-04976 1 MR
4 54.6 = T T T T T T T T T C T = = C = = = M-07523 1 MR
4 54.6 = A A A A C A A A C C A A A A = = = M-08315 1 MR
4 54.6 = T T T T T T T T A A T = = A = = = M-08315 2 MR
4 54.6 = C C C C C C C C C G C = = G = = = M-09581 1 MR
4 54.6 = T T T T T T T T T C T = = C = = = M-09581 2 MR
4 54.6 = T A A T A T T T A A T T T T A = = M-10557 1 MR
4 57.6 = G G G = G G = G G = = = = C = = = M-07377 1 R
4 59.0 60.1 C C C C C C C C C T C = = T = = = M-07256 1 MR
4 59.0 60.1 C C C C T C C C T T C C C C = = = M-07409 1 MR
4 59.0 = C A A A A A A A A C A = = C = = = M-08277 1 MR
4 59 = C C C C T C T C = = = C C = = = = S65597_320C 3 R
4 59 = C C = = A = = = = = = = = = = = = S65597_320C 4 R
4 59 = = G = = T = = = = = = = = = = = = S65597_320C 5 R
4 59 = G G = = G = A = = = = = = = = = = S65597_320C 6 R
4 60 = C C C C C C C A = C = C C = C = = AF095353 1 R
4 60 = A A A A C A C A = C = A A = C = = M12056 1 R
4 60 = G G G G G G G G = A = G G = G = = M23191 1 R
4 60.1 = A A A A G A A A G G A A A A = = = D4Mit203 1 MR
4 60.1 60.1 T T T T T T T T T C T = = C = = = M-05533 1 MR
4 61.2 = C T T T T T T T C C T T T T = = = M-07136 1 MR
4 62.3 = T T T T T T T T T C T = = C = = = D4Mit339 1 MR
4 62.3 = C C C C C C C C T T C C C C = = = D4Mit339 2 MR
4 62.3 = A A A A A A A A G G A = = G = = = D4Mit339 3 MR
4 62.3 = C C C C C C C C T T C = = T = = = D4Mit339 4 MR
4 65 = A A A A G G G A = G = A G = G = = X94908 1 R
4 65 = C C C C T T T C = T = C T = C = = X94908 2 R
4 66 = A A A A T A T = = = = A A = = = = X92959 1 R
4 66 = G G G G A G A G = G = G G = G = = X92959 2 R
4 69.9 = A A A A A A A A A G A = = G = = = M-06998 1 MR
4 70.2 = G G = = = = = = = = = = = = = = = S57541_319C 1 R
4 70.2 = = T = = A = = = = = = = = = = = = X53659_318C 1 R
4 70.2 = T T = = C = = = = = = = = = = = = X53659_318C 2 R
4 70.2 = = G = = C = = = = = = = = = = = = X53659_318C 3 R
4 70.2 = G G = = A = = = = = = = = = = = = X53659_318C 4 R
4 70.2 = G G G G A G A G = G = G G = G = = X53659_318C 5 R
4 70.2 = G G G G T G T G = G = G G = G = = X53659_318C 6 R
4 70.2 = = T = = C = = = = = = = = = = = = X53659_318C 7 R
4 70.2 = A A A A G A G A = = = A A = = = = X53659_318C 8 R
4 70.2 = A A A A C A C A = A = A A = C = = X53659_318C 9 R
4 71 = T A T = = T = T = T = = = T = = = M-01209 1 MR
4 71 = A T T T T T T T T T A T A = = = = M-05393 1 MR
4 71 = C C C C C C C C C T C = = T = = = M-07542 1 MR
4 71 = A G G G G G G G G G G = = G = = = M-07542 2 MR
4 71 = G A A A A A A A A G G A G A = = = M-10424 1 MR
4 71 = A A A A G A A A A A G = = A = = = M-10820 1 MR
4 75 = A A A G A A A G = A = G G = G = = X97719 1 R
4 75 = T C C T C C C T = C = T T = C = = X97719 2 R
4 80.1 = T T T = T T = T T = = = = C = = = M-10641 1 R
4 80.1 = G G G = G G = G G = = = = A = = = M-10641 2 R
4 81 = G G G G G G G G = A = G G = = = = AB009967 1 R
4 81 = C C C C C C C C = G = C C = G = = AB009967 2 R
4 82 = T T T T T T T T T G T = = G = = = M-07085 1 MR
4 82 = A A A A A A A A A G A = = G = = = M-07085 2 MR
5 0.0 = C C = = = = = = = = = = = = = = = AI847882_BS453 1 R
5 F-G1 = C T = = = = = = = = = = T = = = = BC005476_BS572 1 R
5 F-G1 = T T = = = = = = = = = = = = = = = BC005476_BS577 1 R
5 F-G1 = = T T = T T T T = = = = T C = = = BC005476_BS581 1 R
5 F-G1 = T T = = T = T = = = = = = C = = = BC005476_BS584 1 R
5 F-G1 = C C T = = C = T = = = = = = = = = BC005476_BS584 3 R
5 0.0 = A T T A A A A T A T T T T = = = = M-02187 1 MR
5 0.0 = G T G G G G G T G G T T T G = = = M-02187 2 MR
5 0.0 = A T A A T A A T A A T = = A = = = M-02187 3 MR
5 0.0 = G G G G G G G G G A G = = A = = = M-05165 1 MR
5 0.0 = A A A A A A A A A G = = = G = = = M-05896 1 MR
5 2.0 = A A A = A A = A A = = = = C = = = M-04913 1 R
5 3.3 4.4 T A A A T A A A A T T = = = = = = M-08377 1 MR
5 3.3 4.4 G G G G G G G G G A G = = A = = = M-08377 2 MR
5 3.3 4.4 G G G G A A A G A G G A G A = = = M-08377 3 MR
5 4.4 = C A C C C C C A A A C = = A = = = D5Mit179 1 MR
5 4.4 = T C C T C T T C C T T T T T = = = D5Mit179 2 MR
5 5.5 = A A A A A A A A A C A = = C = = = D5Mit347 1 MR
5 5.5 = A A A A A A A A A C A = = C = = = D5Mit347 2 MR
5 5.5 = C C C C C C C C C T C = = T = = = M-02282 1 MR
5 5.5 = G G G = A G G G G G A = = G = = = M-05233 1 MR
5 5.5 = C A A A C C C A C A A C A C = = = M-05233 2 MR
5 5.5 = A A A A A A A A A G G A G A = = = M-05233 3 MR
5 5.5 = A A A A A A A A A G A = = G = = = M-11221 1 MR
5 5.5 = T T = T T T T T T C T = = C = = = M-11221 2 MR
5 8.7 = C T C = = T T C T = T = = = = = = M-09548 1 MR
5 14.2 = C C C C C C C C C T C = = T = = = M-01771 1 MR
5 14.2 = A A A A G A A A G A G G = G = = = M-01771 2 MR
5 14.2 = T T T T T T T T T C T = = C = = = M-09754 1 MR
5 14.2 = A A A A A A A A A G A = = G = = = M-09754 2 MR
5 15.3 = T T T T T T T T T G T = = G = = = M-08316 1 MR
5 15.3 = A A A A A A A A A G A = = G = = = M-08316 2 MR
5 15.3 = G G G G G G G G G A G = = A = = = M-08316 3 MR
5 16.4 17.5 C C C C A A A C A C A C A C = = = M-02410 1 MR
5 16.4 = T T T T T T T T T C T = = C = = = M-08248 1 MR
5 16.4 = T T T T T T T T T C T = = C = = = M-08248 2 MR
5 16.4 17.5 G G G G G T T G G G T G T T G = = M-11381 1 MR
5 16.4 17.5 G G G G G G G G G T G = = T = = = M-11381 2 MR
5 16.4 15.3 T T T T T T T T T A T = = A = = = M-11623 1 MR
5 16.4 15.3 T T T T T T T T T C T = = C = = = M-11623 2 MR
5 17.5 17.5 C C C C C G G C C C C C C C = = = M-02910 1 MR
5 17.5 = G G G G G G G G G T G = = T = = = M-05591 1 MR
5 17.5 = G G G G G G G G G A G = = A = = = M-08840 1 MR
5 17.5 = C C C C C C C C C T C = = T = = = M-08840 2 MR
5 17.5 = T T T T T T T T T C T = = C = = = M-08840 3 MR
5 17.5 = A A A A A A A A A G A = = G = = = M-10379 1 MR
5 17.5 = C C C C C C C C C A C = = A = = = M-10379 2 MR
5 17.5 = A A A A A A A A A G A = = G = = = M-11410 1 MR
5 18.6 = G A A A A G G A G A A = = A = = = M-01711 1 MR
5 18.6 = G A A A G G G A G G A A A A = = = M-01711 2 MR
5 18.6 = T G G G G T T G G G G G G T = = = M-02285 1 MR
5 18.6 = A G G G G A A G G G G = = G = = = M-02285 2 MR
5 18.6 = C T T T T T T T T C T = = C = = = M-11237 1 MR
5 18.6 = A A A A A A A A A G A = = G = = = M-11237 2 MR
5 19.7 = C C C C C C C C C A C = = A = = = D5Mit132 1 MR
5 19.7 24.0 T T T T T T T T T C T = = C = = = M-08733 1 MR
5 19.7 24.0 A A A A A A A A A G A = = G = = = M-08733 2 MR
5 19.7 24.0 A A A A A A A A A C A = = C = = = M-08733 3 MR
5 24 25.1 G G G G G G G G G T G = = T = = = M-03009 1 MR
5 25.1 26.2 C T T T C T T T C T C = = T = = = M-01563 1 MR
5 25.1 26.2 A A A A A A A A A T A = = T = = = M-01563 2 MR
5 25.1 = T C C C T C C C T T C C C C = = = M-05809 1 MR
5 26.2 = C A A A A A A A A C A = = = = = = D5Mit303 1 MR
5 26.2 27.3 T T = T T T T T T G T = = G = = = M-01708 1 MR
5 26.2 = T T T T T T T T T C T = = C = = = M-08453 1 MR
5 26.2 = C C C C C C C C C T C = = T = = = M-10986 1 MR
5 27.3 = A A A A A A A A A G A = = G = = = D5Mit356 1 MR
5 27.3 = G G G G G G G G G A G = = A = = = D5Mit356 2 MR
5 27.3 = T T T T T T T T T C T = = C = = = M-02750 1 MR
5 27.3 = A A A A A A A A A G A = = G = = = M-02750 2 MR
5 27.3 = A A A A A A A A A G A = = G = = = M-02750 3 MR
5 27.3 = T T C C C T T C T T C = = T = = = M-04355 1 MR
5 27.3 = A A A A G A A G A G G = = G = = = M-04355 2 MR
5 27.3 = C C C C C C C C C T = = = T = = = M-04721 1 MR
5 27.3 = A A A A A A A A A G = = = G = = = M-04721 2 MR
5 27.3 = G G G G G G G G G T = = = T = = = M-05710 1 MR
5 28.4 = A A A A A = A A A G A = = G = = = M-02045 1 MR
5 28.4 = A A A A A = A A A G A = = G = = = M-02045 2 MR
5 30.6 = T T T T T T T T T G T = = G = = = D5Mit204 1 MR
5 32.8 = T C = C = = = T = = = = = = = = = M-00854 1 MR
5 32.8 32.8 G G G G G G G G G A G = = A = = = M-01574 1 MR
5 32.8 = G G G G G G G G G C G = = C = = = M-01614 1 MR
5 32.8 = C C C C C C C C C G C = = G = = = M-01614 2 MR
5 32.8 = T T T T T T T T T C T = = C = = = M-04485 1 MR
5 32.8 = C C C T C T T T C C T T T C C = = M-04726 1 MR
5 32.8 = G G G A G A A A G G A A A G = = = M-04726 2 MR
5 32.8 = G G G G G G G G G A G = = A = = = M-08219 1 MR
5 32.8 = C C C C C C C C C T C = = T = = = M-08219 2 MR
5 32.8 = T T T T T T T T T C T = = C = = = M-08219 3 MR
5 32.8 = A A A A A A A A A G A = = G = = = M-09447 1 MR
5 32.8 = A A A A A A A A A T A = = T = = = M-10035 1 MR
5 32.8 = A A A A A A A A A T A = = T = = = MUSBCASE 1 MR
5 35 = C C C C C C C C C T C = = T = = = M-04653 1 MR
5 37.2 = A A A A A A A A A T A = = T = = = D5Mit22 1 MR
5 37.2 38.3 T T T T T T T T T C T = = C = = = M-04462 1 MR
5 37.2 38.3 G G G G G G G T G G G = = G = = = M-04462 2 MR
5 37.2 38.3 G A A A G = A A A A G = = A = = = M-04462 3 MR
5 37.2 37.2 C C C C C C C C C T C = = T = = = M-10676 1 MR
5 38.3 = T A T T A A A T T A A = = A = = = MMOESTEOP 1 MR
5 40.4 = C C C C C C C T C C C C C C = = = M-05220 1 MR
5 43.0705 = C C C C C C C C C G C = = G = = = MUSMKPG 1 MR
5 45 = = T = = = = = = = = = = = = = = = M26940_224 2 R
5 48.1 49.2 G G G G A G G A A A G G G G G = = M-09391 1 MR
5 48.1 49.2 C C C C C C C C C G C = = G = = = M-11668 1 MR
5 54.6 55.7 A A A A A A A A A T A = = T = = = M-07023 1 MR
5 54.77378 43.7 A A A A A A A G A A A = = A = = = M-02908 1 MR
5 56.0 = A A A A T T T = = T = T T = = = = AF017779_SNP2B 1 R
5 56.0 = G G T = G G = G G = = = = T = = = M-05524 1 R
5 56.0 = T T C = T T = T T = = = = C = = = M-05524 2 R
5 56.0 = T T C = T T = T T = = = = C = = = M-05524 3 R
5 57.9 60.8404 G G G G A G G G A A G G G A G = = M-08455 1 MR
5 57.9 60.8404 C C C C T C C C T C C C C T = = = M-08455 2 MR
5 62.3 = A A A A A A A A A G A = = G = = = D5Mit339 1 MR
5 62.3 = T T T T T T T T T A T = = A = = = D5Mit339 2 MR
5 62.3 = A A A A A A A A A C A = = C = = = M-04512 1 MR
5 62.3 = A A A A A A A A A G A = = G = = = M-04512 2 MR
5 66.7 = T T T T T T T T T C T = = C = = = D5Mit168 1 MR
5 66.7 = A A A G A A A A A G A G A G = = = D5Mit33 1 MR
5 66.7 = A A T T A A A A A G A = = = = = = D5Mit33 2 MR
5 66.7 = C C C T C C C C C C C T C C = = = M-09696 1 MR
5 66.7 = C T C T = = C C C C C = = = = = = M-09696 2 MR
5 66.7 = T T T T T T T T T G T = = G = = = M-09961 1 MR
5 66.7 66.7 T T T T T T T T T C T = = C = = = M-11666 1 MR
5 66.7 66.7 C C C C C C C C C T C = = T = = = M-11666 2 MR
5 73.0 = G G G = G G = G G = = = = A = = = M-04442 1 R
5 73.2 = G G G G G G G G G A G = = A = = = M-05492 1 MR
5 74.3 = G G G A A G G G A G A G A G = = = M-11055 1 MR
5 76.5 86.24838 A G G A G G G G G G G A G G = = = M-07046 1 MR
5 76.5 86.24838 T T T T T T T T T C T = = C = = = M-07706 1 MR
5 77.0 = C C C = C C = C C = = = = T = = = M-07298 1 R
5 77.6 = G A A G A A A A A G A A A A = = = M-05374 1 MR
5 77.6 = A A A A A A A A A G A = = G = = = M-05374 2 MR
6 2.2 3.3 C C C C C C C C C G C = = G = = = M-02178 1 MR
6 2.2 3.3 G G G G G G G G G A G = = A = = = M-02178 2 MR
6 3.3 = T T T T T T T T T C = = = C = = = D6Mit221 1 MR
6 3.3 = G G G G G G G G G T = = = T = = = D6Mit305 1 MR
6 3.3 = T T T T G T T T G G T T T T = = = M-02094 1 MR
6 3.3 = A A A A A A A A A C A = = C = = = M-02221 1 MR
6 3.3 = C T T T T T T T T C T = = C = = = M-02221 2 MR
6 3.3 = T T T T T T T T T C T = = C = = = M-02714 1 MR
6 3.3 = A A A A A A A A A G A = = G = = = M-08506 1 MR
6 3.3 = A A A A A A A A A G A = = G = = = M-08506 2 MR
6 3.3 = C C C C C C C C C T C = = T = = = M-08506 3 MR
6 3.3 = G G G G G G G G G A G = = A = = = M-08512 1 MR
6 3.3 = T T T T T T T T T G T = = G = = = M-08512 2 MR
6 3.3 3.3 G G G G G A A A A = G = = = = = = M-10647 1 MR
6 3.3 = C C C C C C C A C A C = = A = = = M-10746 1 MR
6 3.3 = T T T T T T T T T G T = = G = = = M-11000 1 MR
6 3.3 = A G G G G G G G G A G G G G = = = M-11671 1 MR
6 3.3 = G A A A G A A A A G G = = G = = = M-11671 2 MR
6 4.4 = A A A A A A A A A G A = = G = = = M-02428 1 MR
6 4.4 = A A A A A A A A A G A = = G = = = M-02428 2 MR
6 4.4 5.5 C C C C C C C C C T C = = T = = = M-07064 1 MR
6 4.4 5.5 G G G G G G G G G A G = = A = = = M-07064 2 MR
6 6.6 = T C C C C C C T C T C = = T = = = M-02116 1 MR
6 6.6 = G A A A A A A G A G A = = G = = = M-02116 2 MR
6 6.6 = A C C C C C C A C A C = = A = = = M-02116 3 MR
6 6.6 = C C C C = C C C C T = = = T = = = M-10474 1 MR
6 7.7 = A A A A A A A A A G A = = G = = = D6Mit161 1 MR
6 7.7 = T T T T A T T T A T A T A A = = = M-00853 1 MR
6 7.7 = G G G G G G G G G A G = = A = = = M-01463 1 MR
6 7.7 = G G G G G G G G G A G = = A = = = M-04452 1 MR
6 7.7 = A A A A A A A A A G A = = G = = = M-04452 2 MR
6 7.7 = T T T T T T T T T C T = = C = = = M-04765 1 MR
6 7.7 = A A A A A A A A A T A = = T = = = M-04765 2 MR
6 7.7 = T T T T T T T T T C T = = C = = = M-07687 1 MR
6 7.7 = A A A A A A A A A T A = = T = = = M-07687 2 MR
6 7.7 = A A A A A A A A A G A = = G = = = M-10230 1 MR
6 7.7 = A A A A A A A A A G A = = G = = = M-11286 1 MR
6 7.7 = G G G G G G G G G A G = = A = = = M-11286 2 MR
6 7.7 = A A A A A A A A A G A = = G = = = M-11286 3 MR
6 7.7 = G G = G = = G G G A G = = = = = = MUSMVDPA 0 M
6 7.7 = G G = G = = G G G C = = = = = = = MUSMVDPA 1 M
6 7.7 = C C = C = = C C C T C = = = = = = MUSMVDPA 2 M
6 7.7 = G G G = G G = G G = = = = A = = = MUSMVDPA_1 1 R
6 7.7 = C C C = C C = C C = = = = T = = = MUSMVDPA_1 2 R
6 7.7 = G G G = G G = G G = = = = C = = = MUSMVDPA_4 1 R
6 8.7 = G G G G G G G G G A G = = A = = = M-04499 1 MR
6 8.7 = G G G G G G G G G A G = = A = = = M-04499 2 MR
6 10.9 10.9 A A A A A A A A A G A = = G = = = M-08792 1 MR
6 10.9 10.9 G G G G G G G G G A G = = A = = = M-08792 2 MR
6 10.9 10.9 A A A A A A A A A G A = = G = = = M-08792 3 MR
6 10.9 10.9 C C C C C C C C C A C = = A = = = M-08792 4 MR
6 10.9 10.9 G G G G G G G G G T G = = T = = = M-08792 5 MR
6 10.9 10.9 C C C C C C C C C T C = = T = = = M-08792 6 MR
6 10.9 10.9 A A A A A A A A A C A = = C = = = M-10025 1 MR
6 12.0 = A G G A G G G G G G G G G A = = = M-04436 1 MR
6 12.0 = G T T G T T T G T T G G G G T = = M-07015 1 MR
6 12.0 = C C C C C C C C C T C = = T = = = M-08189 1 MR
6 12.0 = A A A A A A A A A G A = = G = = = M-08428 1 MR
6 12.0 = T T T T T T T T T G T = = G = = = M-08428 2 MR
6 12.0 = T T T T T T T T T C T = = C = = = M-08428 3 MR
6 12.0 12.0 C C C C C C C C C G C = = G = = = M-09305 1 MR
6 13.0 = G G G = = G G G = = = = G C = = = AB016662_BS634 1 R
6 13.0 = T T T = = = = A = = = = = = = = = AB016662_BS634 2 R
6 13.0 = = T = = G = = = = = = = = = = = = AB016662_BS639 1 R
6 13.0 = A A A = = A = A = = = = A = = = = AB016663_BS647 1 R
6 13.0 = G G G = G G G G = = = = G A = = = AB016663_BS647 2 R
6 13.0 = G G G = G G G G = = = = G A = = = AB016663_BS648 1 R
6 13.0 = T G = = = G = = = = = = = = = = = AB016663_BS650 1 R
6 13.0 = G G G = G = G G = = = = G A = = = AB016664_BS655 1 R
6 13.0 = A A A = A = A A = = = = A G = = = AB016664_BS655 2 R
6 13.0 = C C C = C = C C = = = = C T = = = AB016664_BS655 3 R
6 13.0 = C G G = G = G G = = = = G = = = = AB016664_BS655 4 R
6 13.1 = T C C T T C C T T T T T T T = = = D6Mit183 1 MR
6 15.3 = A A A A A A A A A C A = = C = = = M-08432 1 MR
6 16.4 = C C = C C C = C C T C = = T = = = M-05860 1 MR
6 16.4 = C C C C T C T C T C C C C C C = = M-05860 2 MR
6 18.6 = C C C C T C C T C T T = = T = = = M-00788 1 MR
6 18.6 = A A A A A A A T A T T A T A = = = M-00788 2 MR
6 18.6 = C C C C C C C C C G C = = G = = = M-00788 3 MR
6 18.6 = T T T T T T T T T C T = = C = = = M-09962 1 MR
6 18.6 = G G G G G G G G G T G = = T = = = M-10508 1 MR
6 18.6 = C C C C C C C C C T C = = T = = = M-10828 1 MR
6 18.6 = A A A A G A A G A G G = = G = = = M-10828 2 MR
6 18.6 = G G G G G G G G G A G = = A = = = M-10828 3 MR
6 21.9 = A A G G A G G A A G A = = G = = = M-11436 1 MR
6 21.9 = C C C T C T T C C C C T C C = = = M-11436 2 MR
6 21.9 = C C C A C A A C C C C A C C = = = M-11436 3 MR
6 21.9 = A A A A A A A A A G A = = G = = = M-11436 4 MR
6 23 = C C C A C C C C C C C C C C = = = M-05730 1 MR
6 24 24.0 A A A A A A A A A G A = = G = = = M-09852 1 MR
6 24 24.0 A T T A = = A A A A T = = = = = = M-09852 2 MR
6 24 = G G = G G G G G G C G = = C = = = M-09928 1 MR
6 24 = A A A A A A A A A G A = = G = = = M-09928 2 MR
6 24 = T T T T T T T T T C T = = C = = = M-09928 3 MR
6 24 = G G G G G G G G G T G = = T = = = M-09928 4 MR
6 26.28 = T T = = = = = = = = = = = = = = = M22115_322B 1 R
6 29.5 30.6 C C C C C C C C C T C = = T = = = M-07388 1 MR
6 29.5 = G G T T G T T G G T G = = T = = = M-08429 1 MR
6 30.5 = T T T C T T T C = C = C C = = = = M12052 1 R
6 31.7 = A A = A = = A T A A = = = = = = = D6Mit365 1 M
6 31.7 = G G = G = = G G G C G = = = = = = D6Mit365 2 M
6 31.7 = G G G = G G = G G = = = = C = = = D6Mit365_1 1 R
6 31.7 = A A A A A A A T A A = A A A = = = D6Mit365_3 1 R
6 31.7 = C C C C G C C C C C G = = C = = = M-05772 1 MR
6 31.7 = C C C C C C C C C A C = = A = = = M-11407 1 MR
6 37.2 = A A A = A A = A A = = = = G = = = M-07525 1 R
6 37.2 = A A A = A A = A A = = = = G = = = M-07525 2 R
6 37.2 = A A A = A A = A A = = = = G = = = M-07525 3 R
6 38.0 = G A = = A = = = = = = = = = = = = NM_013471_FH80 1 R
6 40.011 33.9 T C C C C C C C C T C = = = = = = M-01918 1 MR
6 40.011 33.9 C T T T T T T T T C T = = = = = = M-01918 2 MR
6 40.011 33.9 A T T A A T T A A T A A A A = = = M-08559 1 MR
6 40.011 33.9 G A A G G A A G G A G G G G = = = M-08559 2 MR
6 40.011 33.9 C A A C C A A C C A C C C C = = = M-08559 3 MR
6 40.4 40.4 G G G G G G G G G A G = = A = = = M-00722 1 MR
6 40.4 40.4 G T T T = T T T T G T = = = = = = M-01639 1 MR
6 40.4 40.4 T C C C C C C C C T C = = = = = = M-01639 2 MR
6 40.4 40.4 G A A A A A A A A A A = = A = = = M-01782 1 MR
6 40.4 = C C C C T C C C T C C C C C = = = M-07649 1 MR
6 40.4 24.0 C C C C C C C C C A C = = A = = = M-10427 1 MR
6 40.4 40.4 C T T = = T = T = = T = = = = = = M-10686 1 MR
6 40.4 40.4 G G G G G G G G G A G = = A = = = M-10686 2 MR
6 40.4 40.4 G A A A A A A A A A A = = A = = = M-10686 3 MR
6 40.4 24.0 G G G G G G G G G A G = = A = = = M-10845 1 MR
6 41.5 = G G G G G G G G G C G = = C = = = M-10392 1 MR
6 41.5 = C C C C C C C C C T T C T C = = = M-10392 2 MR
6 41.5 43.7 G G G G C G G G C G G G G G G = = M-10701 1 MR
6 41.5 43.7 A A G G G A A G G G G = = G = = = M-10701 2 MR
6 41.5 43.7 A A A A A A A A A G A = = G = = = M-10701 3 MR
6 41.5 43.7 T T T T T T T T T G T = = G = = = M-10701 4 MR
6 41.5 43.7 C C C C C C C C C T C = = T = = = M-10701 5 MR
6 41.5 43.7 A A A A A A A A A G A = = G = = = M-10701 6 MR
6 43.7 = A A A A A A A A T A A = = A = = = M-05657 1 MR
6 43.7 = A A A A G A A A G G A A A A = = = M-05657 2 MR
6 43.7 = A G = G A = = G G A = = = A = = = M-05784 1 MR
6 43.7 = C T C C T T T T C C T = = = = = = M-05784 2 MR
6 43.7 = C T C C T T T T C C T = = C = = = M-05784 3 MR
6 43.7 44.8 C C C C C C C C C T C = = T = = = M-05848 1 MR
6 43.7 44.8 T T T T T T T T T C T = = C = = = M-05848 2 MR
6 43.7 44.8 T T T T T T T T T C T = = C = = = M-05848 3 MR
6 43.7 44.8 C C C C C C C C C T C = = T = = = M-05848 4 MR
6 45.9 = G G G G G G G G G T G = = T = = = M-00341 1 MR
6 45.9 = T T T C T T T C T C T C T T = = = M-00341 2 MR
6 47 = T T T C T T T C T C T C T T = = = M-09043 1 MR
6 47 = C C C T C C C T C T C T C C = = = M-09965 1 MR
6 47 = C C C A C C C A C C C A C C = = = M-09965 2 MR
6 47 = T T T C T T T C T C T C T T = = = M-11549 1 MR
6 49.2 = T T T T T T T T T A T = = A = = = M-05081 1 MR
6 49.2 = C C T T T C C T T T T = = T = = = M-09793 1 MR
6 49.2 = A C = C C C C C C C C = = C = = = M-09793 2 MR
6 51.4 = C C C C T C C C T C = C C T = = = D6Mit337 1 MR
6 51.4 = C C C C C C C C C T = = = T = = = D6Mit338 1 MR
6 51.4 = G G G G G G G G A G G = = G = = = MUSPRPC2 1 MR
6 54.4 = G G G G T G T G = = = G G = = = = X64070_130 1 R
6 54.4 = C C C C T C T C = = = C C = = = = X64070_158 1 R
6 62.3 63.4 G G G G G G G G A A G = = A = = = M-05234 1 MR
6 62.3 63.4 A A A A A A A A G G A = = G = = = M-11232 1 MR
6 62.3 63.4 T T T T C T A T C C C T C C = = = M-11232 2 MR
6 62.3 63.4 T T T T G T T T G G G = = G = = = M-11232 3 MR
6 62.3 63.4 G G G G A G G G G G A = = G = = = M-11232 4 MR
6 63.4 = A A A G A A A A A G A G A G = = = D6Mit371 1 MR
6 63.4 = A A A G A A A A A G A G A G = = = D6Mit371 2 MR
6 63.4 66.7 T T C C T T T T C C T = = C = = = M-01699 1 MR
6 63.4 66.7 G G G G G G G G G T G = = T = = = M-01699 2 MR
6 63.4 66.7 T T T C C T T T C C T C T C = = = M-01699 3 MR
6 63.4 66.7 G G G G G G G G G A G = = A = = = M-01699 4 MR
6 63.4 63.4 G G G T G G G T G G = T T T = = = M-09224 1 MR
6 63.4 63.4 C C C T C C C T C C T T T T = = = M-11201 1 MR
6 65.0 = A A A = A A = A G = = = = G = = = M-11694 1 R
6 65.6 = G G G G G G G G G A = = = A = = = D6Mit201 1 MR
6 65.6 = A A G G A A A A G G = = = G = = = D6Mit201 2 MR
6 65.6 = A G G A A G G A A G A A A = = = = M-09923 1 MR
6 65.6 = T C C T T C C T T C T T T = = = = M-09923 2 MR
6 66.7 = G G G A A G G G A G G A G G G = = M-08293 1 MR
6 66.7 = G G G G G G G G G A G = = A = = = M-08293 2 MR
6 74 = T T = = C = = = = = = = = = = = = M60056_256 1 R
7 F3 = C C = = C C = C C = = = = T = = = M-07001 1 R
7 1.0 = T T T = G T = G T = = = = T = = = M-05782 1 R
7 1.1 1.1 T T T T T T T T T C T = = C = = = M-09995 1 MR
7 1.1 1.1 T A T T = A A T T A T = = A = = = M-09995 2 MR
7 2.2 = A G G G G = G G G A G = = = = = = M-09986 1 MR
7 2.2 = G A A A A = A A A G A = = = = = = M-09986 2 MR
7 4.0 = C T T = T T = C C = = = = C = = = M-07677 1 R
7 4.0 = T T T = T T = A A = = = = A = = = M-07677 2 R
7 4.0 = C C C = C C = C C = = = = T = = = M-07677 3 R
7 4.4 5.5 T T T T T T T T T C T = = C = = = M-02191 1 MR
7 4.4 5.5 C C C C C C C C C T C = = T = = = M-02191 2 MR
7 5.0 = C C C = T T = C C = = = = C = = = M-06959 1 R
7 5.0 = G G G = G G = G G = = = = A = = = M-06959 2 R
7 5.5 = T A A A T A A A A T = = = T = = = M-04565 1 MR
7 5.5 = C C C C G C C C C G G = = G = = = M-05401 1 MR
7 5.5 = A A A A A A A A A G A = = G = = = M-10806 1 MR
7 5.5 = T T T T T T T T T A T = = A = = = M-10806 2 MR
7 6.0 = G G G = G G = G G = = = = A = = = M-07376 1 R
7 6.5 = G G G = G G = G G = = = = A = = = M-07521 1 R
7 12 = A C C C A C C C C A A = = A = = = M-01308 1 MR
7 12 = A A A A A A A A A G G A G G = = = M-06931 1 MR
7 12 = T C C C C C C C C C C T C C = = = M-09299 1 MR
7 12 = C A A A C A A C C C C = = C = = = M-09299 2 MR
7 12 = A A A A G A A G G G G A G G = = = M-09441 1 MR
7 12 = G G G G G G G G G T G = = T = = = M-09441 2 MR
7 13.1 = G G G G G G G G G A G = = A = = = M-07134 1 MR
7 13.1 = T A T T T A A A A T T = = T = = = M-08295 1 MR
7 13.1 = G A A G A A A A A G A A A A = = = M-08295 2 MR
7 13.1 = A G G A G G G G G A G G G G = = = M-08295 3 MR
7 15.3 = T C C C T C C T T T T = = T = = = M-04027 1 MR
7 15.3 = A A A A A A A A A G A = = G = = = M-04027 2 MR
7 15.3 = A G G G A G G A A A A = = A = = = M-04027 3 MR
7 15.3 = T G T T T G G T T T T = = T = = = M-07145 1 MR
7 15.3 = C G G G C G G C C C C = = C = = = M-08396 1 MR
7 15.3 = G T T T G T T G G G G = = G = = = M-08396 2 MR
7 18.6 = T A A A A A A A A T A A A T = = = M-03828 1 MR
7 18.6 = A G G G G G G G G G G = = G = = = M-03828 2 MR
7 18.6 = C T T T T T T T T T T T T C = = = M-03828 3 MR
7 18.6 = A A A A A A A A A C A = = C = = = M-03828 4 MR
7 18.6 = A A A A A A A A A G A = = G = = = M-03830 1 MR
7 18.6 = T C C C C C C C C T C C C T = = = M-03830 2 MR
7 18.6 = C T T T T T T T T T T T T C = = = M-04280 1 MR
7 18.6 24.0 G A A A G A A A A G = = = G = = = M-07044 1 MR
7 18.6 = T C C C C C C C C C C C C T = = = M-07629 1 MR
7 18.6 = A T T T T T T T T A = T A A = = = MUSKAL07 1 MR
7 20.8 21.9 T A A A A A A A A T A A A T = = = M-10389 1 MR
7 21.9 23.0 G G G G G G G G T G G = = G = = = M-01545 1 MR
7 23.5 = G G G = G G = G G = = = = A = = = M-04538 1 R
7 23.5 = C T T = T T = T T = = = = C = = = M-04538 2 R
7 23.5 = C C C = C C = C C = = = = G = = = M-07255 1 R
7 24.0 = C T T T T T T T T C T = = = = = = M-05864 1 MR
7 25.1 = G G G G G G G G G A G = = A = = = D7Mit195 1 MR
7 25.1 = G A A A A A A A A G G A G G = = = D7Mit195 2 MR
7 25.1 = C T T T T T T T T C T T T C = = = M-09656 1 MR
7 25.1 = G G G G G G G G G A G = = A = = = M-09656 2 MR
7 25.1 = G G G G G G G G G C G = = C = = = M-09656 3 MR
7 25.1 = G A A A A A A A A T A = = = = = = M-09656 4 MR
7 25.1 = C T T T T T T T T T T T T C = = = M-09656 5 MR
7 25.1 = T T T T T T T T T C T = = C = = = M-09656 6 MR
7 25.1 = T T T T T T T T T A T = = A = = = M-09656 7 MR
7 26.2 = T C C C T C C C C C T = = C = = = M-01792 1 MR
7 26.2 = G G G G G G G G G T G = = T = = = M-01792 2 MR
7 26.2 = G G G G G T T G G G T G T G = = = M-02291 1 MR
7 26.2 = A A A A A G G A A A G A G A = = = M-02291 2 MR
7 26.2 = A G G A A A A A A A A G A A = = = M-05491 1 MR
7 26.2 = T T T C C C C C C T C T C T = = = M-05491 2 MR
7 26.2 = G T T T G T T T T G G = = G = = = M-05776 1 MR
7 26.2 = C T T T C C C T C C C = = C = = = M-10015 1 MR
7 26.2 = C G G G C C C G C G C = = G = = = M-10015 2 MR
7 26.2 = T T T T T T T T T C T = = C = = = M-10051 1 MR
7 26.2 = A G G G A A A G G A A = = A = = = M-10051 2 MR
7 26.2 = G A A A A G G A A G G A G A = = = M-10051 3 MR
7 26.2 = A G G G G A A G G A A G A G A = = M-10051 4 MR
7 27.3 26.2 T T T T T T T T T A T = = A = = = M-02755 1 MR
7 27.8 = T C C C C C C C = T = C C = T = = AF033620_1594 6 R
7 27.8 = T T T T T T T T = T = T T = C = = AF033620_339 2 R
7 28.2 = A A A = A A = A G = = = = A = = = M-07386 1 R
7 28.2 = C C C = C C = C T = = = = C = = = M-07386 2 R
7 28.2 = A G G = G G = G G = = = = G = = = M-07386 3 R
7 28.4 = G G G G G G G G G A G = = A = = = D7Mit252 1 MR
7 28.4 = C C C C C C C C C T C = = T = = = D7Mit252 2 MR
7 28.4 = G G G G G G G G G A G = = A = = = D7Mit252 3 MR
7 28.4 = C C C C C C C C C A C = = A = = = M-00928 1 MR
7 28.4 = A A A A A A A A A G A = = G = = = M-08398 1 MR
7 28.4 = A A A A A A A A A G A = = G = = = M-08398 2 MR
7 28.4 = C C C C C C C C C T C = = T = = = M-11367 1 MR
7 28.4 = A G G G = = G G G A G = = = = = = M-11367 2 MR
7 29.5 = C A A C C A A A C C A = A C = = = M-00973 1 MR
7 29.5 = G G G G G G G G G A G = = A = = = M-10260 1 MR
7 29.5 = T T T T T T T T T T C T C T = = = M-10260 2 MR
7 29.5 = C C C C C C C C C C A C A C = = = M-10260 3 MR
7 30.6 = G T T T G T T T G G T T T T = = = M-02677 1 MR
7 30.6 = A G G G G G G G A A G = = A = = = M-02677 2 MR
7 30.6 = G G G G G G G G G A G = = A = = = M-02677 3 MR
7 30.6 = A A A A A A A A A G A = = G = = = M-02761 1 MR
7 30.6 = C C C C C C C T C = T T T T = = = M-04373 1 MR
7 30.6 = T T T T T T T T C T T = = T = = = M-04814 1 MR
7 30.6 = A A A A A A A A A G A = = G = = = M-09397 1 MR
7 30.6 = C C C C C C C C C T C = = T = = = M-09397 2 MR
7 30.6 = C C = = C = = = C T = = = T = = = M-10625 1 MR
7 33.9 = C C C C T C C C T C C C C C = = = M-00295 1 MR
7 33.9 = T T T T T T T T T C T = = C = = = M-00295 2 MR
7 33.9 = G A A A A A A A A G A = = G = = = M-09035 1 MR
7 33.9 = G G G G G G G G G A G = = A = = = M-09035 2 MR
7 33.9 = A G G G G = G G G A G = = A = = = M-09035 3 MR
7 33.9 = C T T T T T T T T C T = = C = = = M-09035 4 MR
7 33.9 = A A A A A A A G A G G A G A = = = M-09484 1 MR
7 35 = G G G G G G G A G = A G A G = = = M-01803 1 MR
7 35 = A A A A G A A G G = G = = = = = = M-01803 2 MR
7 35 = C C C C T C T C = C = C C = C = = S46665 1 R
7 37.2 = A A A A A A A A A T A = = T = = = M-02057 1 MR
7 37.2 = T T T T T T T T T G T = = G = = = M-05395 1 MR
7 37.2 = G A G G A G G G G G A = = G = = = M-10019 1 MR
7 37.2 = T T T T T T T C T T C T C T = = = M-11193 1 MR
7 37.2 = A A A A G A A G A G G = = G = = = M-11193 2 MR
7 37.2 = G G G G A G G A G G A = = G = = = M-11193 3 MR
7 38.3 39.3 C C C C C C C C C T C = = T = = = M-08301 1 MR
7 38.3 39.3 A A A A A A A A A C A = = C = = = M-08301 2 MR
7 38.3 39.3 G G G G G G G G G A G = = A = = = M-09131 1 MR
7 39.3 42.6 G G G G A G G G A G G G G G = = = M-09671 1 MR
7 39.3 42.6 T T T T C T T C C T C T C T = = = M-09671 2 MR
7 39.3 42.6 T T T T T T T C T T C T C T = = = M-09671 3 MR
7 41.5 = T G G G G G G G G T G = = T = = = M-05726 1 MR
7 41.5 = A G G G G G G G G A G = = A = = = M-05726 2 MR
7 41.5 = C T T C T C C C T C C C C C = = = M-08779 1 MR
7 41.5 = G G A A G G G G G G G = = G = = = M-08779 2 MR
7 41.5 = A C C A C A A A C A A A A A A = = M-08779 3 MR
7 41.5 = C C C C C C C C C T C = = T = = = M-08779 4 MR
7 41.5 = C G G G G G G G G = G = = = = = = M-10002 1 MR
7 41.5 = G A A A A A A A A G A = = G = = = M-10002 2 MR
7 42.6 = G C C C G C C G C C G = = C = = = M-04132 1 MR
7 42.6 = T C C C C C C T C C T C T C = = = M-04132 2 MR
7 42.6 = C T T T T T T T T C T = = C = = = M-09312 1 MR
7 42.6 = G T T T T T T T T G T = = G = = = M-09312 2 MR
7 43.7 = G G G G G G G G G T G = = T = = = M-01558 1 MR
7 43.7 = A G G A A G G G A G G A G A G = = M-10217 1 MR
7 44.8 45.9 G G G G G G G G G A G = = A = = = M-10694 1 MR
7 44.8 45.9 T T T T T T T T T A T = = A = = = M-10694 2 MR
7 44.8 45.9 C C C C C C C C C A C = = A = = = M-10694 3 MR
7 45.9 = A A A A A A A A A G A = = G = = = M-04677 1 MR
7 45.9 = T C T T T T T T T = T = = = = = = M-07123 1 MR
7 45.9 49.2 A G G A A A A A A A A A A A = = = M-11763 1 MR
7 49.2 = C T T T T T T T T C T = = C = = = M-09929 1 MR
7 49.2 50.3 A G G G G G G G G A G G G A = = = M-10707 1 MR
7 49.2 50.3 T C C C C C C C C T C C C T = = = M-10707 2 MR
7 51.4 = T T T T T T T T T G T = = G = = = M-07086 1 MR
7 51.4 = C C C C C C C C C T C = = T = = = M-07086 2 MR
7 51.4 = G G G G G G G G G C G = = C = = = M-07086 3 MR
7 54.6 = A A A A A A A A A G A = = G = = = M-07004 1 MR
7 59 = T C C T T T T T = T = T T = T = = M62551_146 1 R
7 59 = T T T C C C C C = C = C C = C = = M62551_219 1 R
7 59 = T T = = = = = = = = = = = = = = = M62551_258 2 R
7 59 = = A = = = = = = = = = = = = = = = M62551_258 3 R
7 59 = G G G A A A A A = A = A A = A = = M62553_298 1 R
7 62 = T C C T C T C C = C = T C = C = = M64879_201 1 R
7 68.0 = A A A = A A = A A = = = = G = = = M-07640 1 R
7 68.0 = G G T = G G = G G = = = = C = = = M-07640 2 R
7 69.2 = C C C = C = = T C = = = = C = = = M-04696 1 R
7 72.4 = C C C = C C = C C = = = = A = = = M-07659 1 R
X 2.2 = C C C C C C C C C T C = = T = = = M-09239 1 MR
X 2.2 = A A A A A A A A A G A = = G = = = M-09239 2 MR
X 6.6 6.6 G G = G G G G G G A G = = A = = = M-11048 1 MR
X 6.6 6.6 G G = G G G G G G C G = = C = = = M-11048 2 MR
X 6.6 6.6 T T = T T T T T T C T = = C = = = M-11048 3 MR
X 9.8 = G G G G G G G G G T G = = T = = = DXMit191 1 MR
X 17.5 = T T T T T T T T T C T = = C = = = M-05201 1 MR
X 18.6 = A A A A A A A A A G A = = G = = = DXMit225 1 MR
X 18.6 = G G G G G G G G G A G = = A = = = M-11215 1 MR
X 21.9 = C T T T C T T T T C C = = C = = = M-05810 1 MR
X 21.9 = A A A A A A A A A G A = = G = = = M-05810 2 MR
X 24.0 = T T T T T T T T T G T = = G = = = DXMit145 1 MR
X 24.0 = C T = = T = = = T C T = = = = = = DXMit227 1 MR
X 24.0 = C T C C C T T T C C C = = C = = = M-05846 1 MR
X 25.1 = A A A A A A A A A G A = = G = = = M-02832 1 MR
X 29.5 = C C C C C C C C C T C = = T = = = M-07020 1 MR
X 29.5 30.6 T T = T = = T T T C T = = = = = = M-08546 1 M
X 29.5 = A A G G A A A A G G = = = G = = = M-11758 1 MR
X 29.5 = C A = A A = A A A C A = = = = = = M-11758 2 MR
X 29.5 = A A A A A A A A A G A = = G = = = M-11758 3 MR
X 29.5 30.6 A A A A A A A A A G A = = G = = = M-11772 1 MR
X 29.5 = C C C C C C C C C T C = = T = = = MUSCCE 1 MR
X 31.7 = T T T T T T T T T G T = = G = = = MMPGK5R 1 MR
X 36 = G G G G G A G G = G = G G = G = = X59591_SNP51A 1 R
X 42.4 = = T T = = T = = T = = = = C = = = M-00331 1 R
X 43.7 45.9 T T T T T T T T T G T = = G = = = M-05577 1 MR
X 51.4 = C C C C C C C C C T C = = T = = = DXMit33 1 MR
X 56.4206 = C T C C T T T T T T T = = T = = = M-11198 1 MR
X 56.8 = C C C C C C C C C T C = = T = = = MUSGRPBOM 1 MR
X 57.9 = T T T T T T T T T G T = = G = = = DXMit122 1 MR
ploticus-2.42/pltestsuite/tree1.htm 0000644 0001750 0001750 00000000715 10743161017 016417 0 ustar colin colin tree1

How to download and try this example
Usage: pl -gif tree1.htm
// yrange is one unit per tree leaf
// xrange depends on the distance values in your newick file
#proc areadef
rectangle: 1 1 5 5
xrange: 0 1.5
yrange: 0 18
#proc tree
newickfile: ycase.newick
// squaredoff: no
ploticus-2.42/pltestsuite/data7 0000644 0001750 0001750 00000000614 07342723143 015613 0 ustar colin colin browseform 20
collab 2
cr 3
dataguide 4
details 110
form 6
future 2
gen 23
genscat 5
gentips 2
gettinginvolved 3
home 69
indexpage 5
introducing 5
involvsearch 7
kwindex 5
list 63
listall 10
listpar 3
liststudies 12
measlist 5
measnumhelp 3
measplot 25
monellanimal 4
phenomelist 13
plin 2
plothelp 5
projstrainlist 6
recommendations 10
sexdiff 4
stats 2
statshelp 3
steeringcomm 4
twostrains 29
ploticus-2.42/pltestsuite/data6b 0000644 0001750 0001750 00000003321 07751766342 015766 0 ustar colin colin 0.017
0.269
0.178
0.075
0.150
0.144
0.157
0.140
0.171
0.091
-0.418
-0.439
0.062
0.096
0.051
-0.299
0.048
-0.485
-0.336
0.115
0.123
0.185
0.204
-0.350
-0.234
0.375
0.277
0.493
-0.117
0.034
-0.040
-0.040
0.421
0.239
-0.037
0.281
0.252
-0.113
0.095
0.088
0.222
0.466
0.136
0.380
0.049
0.454
0.224
-0.372
0.286
0.063
0.370
0.261
0.462
0.360
0.298
0.362
0.128
0.029
-0.031
0.032
-0.200
-0.328
0.295
0.331
0.231
0.229
0.209
-0.031
0.325
0.153
-0.062
0.168
0.110
-0.149
0.170
0.153
0.029
0.155
-0.030
0.242
0.135
-0.100
-0.320
0.183
0.125
-0.286
-0.081
0.042
-0.022
-0.208
-0.072
0.289
0.380
-0.018
0.080
0.214
0.044
-0.143
0.030
-0.345
0.167
0.264
0.153
0.057
-0.109
-0.222
0.444
0.094
0.350
0.104
0.302
-0.014
-0.040
0.113
-0.108
0.153
0.181
0.101
-0.150
-0.124
0.247
0.106
0.139
0.152
0.131
0.096
0.096
0.219
-0.104
0.065
0.126
0.134
0.075
0.113
0.146
0.229
-0.018
0.293
0.065
0.071
-0.031
0.100
0.037
0.124
0.320
0.247
-0.010
-0.184
-0.066
-0.117
0.052
0.371
-0.058
-0.208
-0.400
0.109
-0.066
-0.232
0.120
-0.171
-0.108
-0.136
-0.160
-0.116
0.326
-0.073
0.110
0.174
0.235
-0.128
-0.266
-0.105
0.322
0.101
-0.407
-0.045
0.037
0.116
-0.026
-0.117
0.204
-0.162
0.345
0.038
0.406
-0.041
0.169
-0.110
-0.161
-0.036
0.237
-0.053
-0.263
0.312
-0.027
-0.096
0.011
-0.111
0.089
-0.194
0.227
-0.010
-0.204
0.080
-0.095
0.246
-0.253
-0.038
-0.077
-0.077
0.170
-0.045
0.090
-0.355
0.189
0.217
0.122
0.069
-0.038
0.179
-0.042
-0.265
-0.222
0.028
0.104
-0.141
-0.143
-0.017
0.290
0.475
0.461
-0.097
0.289
0.335
-0.102
0.181
-0.417
-0.414
0.205
-0.188
-0.193
0.145
0.124
0.013
0.195
0.034
0.100
0.114
0.491
0.172
0.176
-0.136
-0.148
0.414
0.539
0.561
0.538
0.564
0.502
-0.271
0.562
0.561
0.419
0.645
-0.591
0.599
0.575
0.406
0.506
0.550
-0.528
0.519
-0.258
0.541
ploticus-2.42/Makefile 0000644 0001750 0001750 00000001417 11765717536 013762 0 ustar colin colin ##
## Top level Makefile for ploticus and libploticus
##
DESTDIR=
BIN =$(DESTDIR)/usr/bin
LIB =$(DESTDIR)/usr/lib
INC =$(DESTDIR)/usr/include
all:
cd src; $(MAKE); $(MAKE) libploticus-static; $(MAKE) clean; \
$(MAKE) FPIC=-fPIC libploticus-so; $(MAKE) clean;
clean:
(cd src; $(MAKE) distclean);
(cd pltestsuite; $(MAKE) distclean);
rm -f configure-stamp build-stamp
rm -f pltestsuite/out
install:
install -d -m 755 $(BIN)
install -m 755 src/pl $(BIN)/ploticus
install -d -m 755 $(DESTDIR)/usr/share/man/man1
install -m 644 man/man1/pl.1 $(DESTDIR)/usr/share/man/man1/ploticus.1
install -d -m 755 $(LIB)
install -m 644 src/libploticus.a $(LIB)
install -m 644 src/libploticus.so.0.0.0 $(LIB)
install -d -m 755 $(INC)
install -m 644 src/libploticus.h $(INC)
ploticus-2.42/debian/ 0000755 0001750 0001750 00000000000 12144246232 013517 5 ustar colin colin ploticus-2.42/debian/libploticus0-dev.files 0000644 0001750 0001750 00000000035 11765717536 017750 0 ustar colin colin usr/include/*
usr/lib/lib*.a
ploticus-2.42/debian/libploticus0-dev.links 0000644 0001750 0001750 00000000064 11765717536 017770 0 ustar colin colin usr/lib/libploticus.so.0.0.0 usr/lib/libploticus.so
ploticus-2.42/debian/libploticus0.files 0000644 0001750 0001750 00000000022 11765717536 017170 0 ustar colin colin usr/lib/lib*.so.*
ploticus-2.42/debian/ploticus.dirs 0000644 0001750 0001750 00000000116 11765717536 016264 0 ustar colin colin usr/bin
usr/share/man/man1
usr/share/ploticus
usr/share/doc/ploticus/examples
ploticus-2.42/debian/compat 0000644 0001750 0001750 00000000002 11766421327 014726 0 ustar colin colin 5
ploticus-2.42/debian/libploticus0.links 0000644 0001750 0001750 00000000066 11765717536 017216 0 ustar colin colin usr/lib/libploticus.so.0.0.0 usr/lib/libploticus.so.0
ploticus-2.42/debian/libploticus0-dev.dirs 0000644 0001750 0001750 00000000024 11765717536 017605 0 ustar colin colin usr/lib
usr/include
ploticus-2.42/debian/libploticus0.debhelper.log 0000644 0001750 0001750 00000000017 12144244512 020561 0 ustar colin colin dh_installdirs
ploticus-2.42/debian/ploticus.examples 0000644 0001750 0001750 00000000016 11765717536 017140 0 ustar colin colin pltestsuite/*
ploticus-2.42/debian/source/ 0000755 0001750 0001750 00000000000 11765717536 015041 5 ustar colin colin ploticus-2.42/debian/source/format 0000644 0001750 0001750 00000000004 11765717536 016246 0 ustar colin colin 1.0
ploticus-2.42/debian/ploticus.debhelper.log 0000644 0001750 0001750 00000000017 12144244512 020012 0 ustar colin colin dh_installdirs
ploticus-2.42/debian/ploticus/ 0000755 0001750 0001750 00000000000 12144244512 015360 5 ustar colin colin ploticus-2.42/debian/ploticus/usr/ 0000755 0001750 0001750 00000000000 12144244512 016171 5 ustar colin colin ploticus-2.42/debian/ploticus/usr/share/ 0000755 0001750 0001750 00000000000 12144244512 017273 5 ustar colin colin ploticus-2.42/debian/ploticus/usr/share/doc/ 0000755 0001750 0001750 00000000000 12144244512 020040 5 ustar colin colin ploticus-2.42/debian/ploticus/usr/share/doc/ploticus/ 0000755 0001750 0001750 00000000000 12144244512 021702 5 ustar colin colin ploticus-2.42/debian/ploticus/usr/share/doc/ploticus/examples/ 0000755 0001750 0001750 00000000000 12144244512 023520 5 ustar colin colin ploticus-2.42/debian/ploticus/usr/share/man/ 0000755 0001750 0001750 00000000000 12144244512 020046 5 ustar colin colin ploticus-2.42/debian/ploticus/usr/share/man/man1/ 0000755 0001750 0001750 00000000000 12144244512 020702 5 ustar colin colin ploticus-2.42/debian/ploticus/usr/share/ploticus/ 0000755 0001750 0001750 00000000000 12144244512 021135 5 ustar colin colin ploticus-2.42/debian/ploticus/usr/bin/ 0000755 0001750 0001750 00000000000 12144244512 016741 5 ustar colin colin ploticus-2.42/debian/libploticus0.manpages 0000644 0001750 0001750 00000000027 11765717536 017666 0 ustar colin colin man/man3/libploticus.3
ploticus-2.42/debian/changelog 0000644 0001750 0001750 00000022733 12144243425 015401 0 ustar colin colin ploticus (2.41-6) unstable; urgency=low
* Add dpkg-buildflags to debian/rules
-- Colin Tuckley Mon, 13 May 2013 21:02:20 +0100
ploticus (2.41-5) unstable; urgency=low
* Upstream Bugfix: heatmap prefab wasn't obeying the legend=no parameter
* Upstream Bugfix: fixes to the error bars in chron prefab
-- Colin Tuckley Tue, 12 Jun 2012 21:03:31 +0100
ploticus (2.41-4) unstable; urgency=low
* Incorporate the NMU (2.41-3.1)
* Fix lintian warnings for:
Add ${misc:Depends} to libploticus0[-dev]'s dependencies
Add build-arch and build-indep to debian/rules
* Add a new debian/source/format file
* Bump Standards-Version to 3.9.3 (No changes required).
* Fix "Please Build-Depends on libpng-dev, change from libpng12-dev"
do as the bug report requests (closes: #662468).
-- Colin Tuckley Tue, 06 Mar 2012 21:03:31 +0000
ploticus (2.41-3.1) unstable; urgency=low
* Non-maintainer upload.
* Fix "FTBFS Please Build-Depends on libjpeg-dev, not libjpeg62-dev":
do as the bug report requests (closes: #635488).
-- gregor herrmann Tue, 13 Sep 2011 18:04:51 +0200
ploticus (2.41-3) unstable; urgency=low
* Fix manpages.
* Upstream Bugfix: fix problems building apitest.
* Bump Standards-Version to 3.8.3 (No changes required).
* Fix unresolved symbols in shared libraries Closes: #558949.
-- Colin Tuckley Fri, 11 Dec 2009 23:31:55 +0000
ploticus (2.41-2) unstable; urgency=low
* Fix bashism in run_script_test again
and push upstream this time Closes: #530163
* Upstream Bugfix: for the 'legendlabel' attribute
-- Colin Tuckley Wed, 10 Jun 2009 20:15:28 +0100
ploticus (2.41-1) unstable; urgency=low
* New Upstream version.
* Upstream Bugfix: proc boxplot - bug fix - incorrect error messages
* Bump Standards-Version (No changes required).
-- Colin Tuckley Fri, 10 Apr 2009 18:28:51 +0100
ploticus (2.40-4) unstable; urgency=low
* Upstream Bugfix: Clickmap area tags not XHTML conformant.
* Upstream Bugfix: Controlling the last stub in a chron prefab plot.
-- Colin Tuckley Thu, 19 Feb 2009 18:25:44 +0000
ploticus (2.40-3) unstable; urgency=low
* Upstream Bugfix: Closes: #502869
Fix "lines" prefab wasn't working when cats=yes in prefabs/lines.pl
-- Colin Tuckley Tue, 21 Oct 2008 11:12:49 +0100
ploticus (2.40-2) unstable; urgency=low
* Fix bashism in run_script_test Closes: #489642.
* Bump standards-version to 3.8.0 (no changes required).
* Replace obsolete-package build-depends: x-dev with x11proto-core-dev
* Upstream Bugfix:
Fix proc processdata bug in datasets.c
-- Colin Tuckley Fri, 11 Jul 2008 17:13:23 +0100
ploticus (2.40-1) unstable; urgency=low
* New Upstream version.
* Update maintainer Email address.
* Bump Standards-Version (No changes required).
* Add Homepage field to debian/control.
* Incorporate fix to proc_axis.c from upstream.
* Incorporate fix to gd13.c from upstream to fix compiler errors.
* Incorporate fix to execline.c from upstream.
-- Colin Tuckley Wed, 20 Feb 2008 09:54:35 +0000
ploticus (2.33-3) unstable; urgency=low
* upstream bugfixes
proc_getdata.c filter attribute - # data fields
glroutines.c clickmap urls - certain punct chars dropped
cumufrac.pl cumufrac prefab - no curve produced for certain input data
proc_bars.c floating segment bars glitches
chunk_title prefab title align giving incorrect results
stub.c crosshatch fill weird linewidth interaction with -scale
* packaged libploticus Closes: #420735
* added homepage refs to descriptions in debian/control
-- Colin Tuckley Sat, 09 Jun 2007 11:29:57 +0100
ploticus (2.33-2) unstable; urgency=low
* Fixed possible 64-bit problem in svg.c
* Modified X11 paths in src/Makefile for Xorg transition
* Fixed compiler warnings about redefinition of stricmp and strnicmp
* Reverted upstream change of char * to unsigned char * in various
places to fix "differ in signedness" compiler warnings
* Include patch from Thomer M. Gil to fix segfault in swf.c Closes: #372511
* Added a Recommends for ploticus-doc
-- Colin Tuckley Sat, 10 Jun 2006 17:03:18 +0100
ploticus (2.33-1) unstable; urgency=low
* New Upstream release Closes: #262971
* Updated standards version to 3.7.2 (No package changes required)
* modified src/Makefile configuration options see debian/README.Debian
-- Colin Tuckley Sun, 4 Jun 2006 10:05:28 +0100
ploticus (2.20-4) unstable; urgency=low
* New Maintainer. closes: #361016
* updated the FSF address in debian/copyright
* removed debian/prerm which was for ploticus-doc
* updated standards version to 3.6.2 (No package changes required).
* changed depends for debhelper to >= 5.0.0
* added debian/compat (set to 5)
* clean up debian/rules
* install run_prefabs_test.bat without execute privs
* corrected section number in man page .TH entry
* fixed compiler warnings due to implict library
function definitions (causes segfaults on 64bit) closes: #284080
* build with debug info, incorporated patch from
Peter Palfrader closes: #284069
-- Colin Tuckley Thu, 27 Apr 2006 10:12:54 +0100
ploticus (2.20-3.1) unstable; urgency=low
* Non-maintainer upload.
* Remove Build-Dependency on xlibs-dev (Closes: #347101).
* Credit and Big Thanks to Justin Pryzby
for the patch and testing.
-- Amaya Rodrigo Sastre Sat, 21 Jan 2006 21:03:28 +0100
ploticus (2.20-3) unstable; urgency=low
* Add "late fix" for errbarfields. Fix found in
http://groups.yahoo.com/group/ploticus/message/691.
Solves a problem with asymetric error bands.
* Add "late fix" for proc_axis.c. Fix found in
http://groups.yahoo.com/group/ploticus/message/722
This solves a problem with cumulative rounding of
days in graphs with days stubs.
* Add "late fix" version of chunk_area. Fix from
http://ploticus.sourceforge.net/download/chunk_area
This solves a problem with dates with no day number,
as mm/yyyy.
* Add "late fix" version of heatarea.pl. Fix from
http://ploticus.sourceforge.net/download/heatmap.pl
* Add "late fix" version of proc_getdata.c. Fix found at
http://ploticus.sourceforge.net/download/proc_getdata.c
This permits comma delimited files with more than 255 characters
per row to be processed.
* Add "late fix" version of proc_lineplot.c. This is from
http://ploticus.sourceforge.net/download/proc_lineplot.c
It clips labels, and handles the degenerate case of no points
in the range properly.
* Add pltestsuite to debian package as
/usr/share/doc/ploticus/examples
* Remove recommends of libming-fonts-openoffice. The package has been
removed from debian. closes: Bug#240560
-- James W. Penny Wed, 4 Apr 2004 22:12:00 -0500
ploticus (2.20-2) unstable; urgency=low
* libming has been removed from the distribution, drop swf
support. closes: Bug#228983
-- James W. Penny Wed, 21 Jan 2004 22:33:00 -0500
ploticus (2.20-1) unstable; urgency=low
* New upstream. closes: Bug #197293
-- James W. Penny Thu, 25 Dec 2003 10:41:14 -0500
ploticus (2.0.4-4) unstable; urgency=low
* Switch build-depends to libpng12-dev. closes: Bug #164994
* Switch to libgd-noxpm. Build fails with libgd-xpm.
-- James W. Penny Tue, 25 Oct 2002 22:49:31 -0400
ploticus (2.0.4-3) unstable; urgency=low
* Rebuild due to problem with shlibs. Switch to libgd2-dev.
-- James W. Penny Tue, 25 Oct 2002 22:49:31 -0400
ploticus (2.0.4-2) unstable; urgency=low
* Caught in libpng2/libpng3 transition. Changed for libpng3 and
libpng3-dev. closes: Bug#164994
-- James W. Penny Tue, 20 Aug 2002 23:18:51 -0400
ploticus (2.0.4-1) unstable; urgency=low
* New upstream release
* Include "late fixes" execplfile.c, proc_processdata.c.
These are buffer overflow related.
* Include "late fixes" proc_process_data.c, proc_bars.c.
These affect primarily cosmetic issues.
-- James W. Penny Mon, 12 Aug 2002 00:20:04 -0400
ploticus (2.0.3-1) unstable; urgency=low
* The "That Tears it, Now You Have to Update Docs Package" Release.
* New upstream release (well, not so new :-( ) closes: Bug#137578
* Correct missing libpng2-dev in build-depends. closes: Bug#142205
* Use correct syntax to:
* close URL type. closes: Bug#137577
* fix Architecture closes: Bug#141657
* close ITP closes: Bug#132878
-- James W. Penny Wed, 10 Apr 2002 23:02:04 -0400
ploticus (2.0.2-2) unstable; urgency=low
* Correct packaging mistakes.
* First, missing : in http: close: Bug#137577
* Second, should be Architecture: any. close: Bug#141657
-- James W. Penny Mon, 4 Apr 2002 23:45:15 -0500
ploticus (2.0.2-1) unstable; urgency=low
* Initial Debian package. close: Bug#132878
-- James W. Penny Mon, 18 Feb 2002 22:24:15 -0500
ploticus-2.42/debian/libploticus0/ 0000755 0001750 0001750 00000000000 12144244512 016127 5 ustar colin colin ploticus-2.42/debian/libploticus0/usr/ 0000755 0001750 0001750 00000000000 12144244512 016740 5 ustar colin colin ploticus-2.42/debian/libploticus0/usr/lib/ 0000755 0001750 0001750 00000000000 12144244512 017506 5 ustar colin colin ploticus-2.42/debian/copyright 0000644 0001750 0001750 00000016537 11765717536 015510 0 ustar colin colin This package was debianized by Colin Tuckley on
Sat, 03 June 2006 15:28:51 +0100.
It was downloaded from http://ploticus.sourceforge.net
Upstream Author: Stephen C. Grubb (stevegrubb@gmail.com)
== Begin ploticus 2.40 copyright notice ==
ploticus 2.40 data display engine. Software, documentation, and examples.
Copyright 1998-2008 Stephen C. Grubb (stevegrubb@gmail.com)
The home page for PLOTICUS is http://ploticus.sourceforge.net
The source code, binaries for some platforms, documentation, and examples
may be freely downloaded from that site.
http://ploticus.sourceforge.net/steve.html About the author
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
http://www.gnu.org/copyleft/gpl.html GNU General Public License
On Debian systems a copy of the GNU General Public License is present in file
/usr/share/common-licenses/GPL-2.
A copy of the GNU General Public License should be present with the code, in
file GPL.txt. A copy of the GNU General Public License may also be obtained
from: Free Software Foundation, Inc., 51 Franklin St - Fifth Floor,
Boston, MA 02110-1301, USA.
Clarifications:
The following clarifications are based on my understanding of the GPL.
In case of contradiction, the GPL is the final authority on all of these
matters.
Q1. Can I make modifications to ploticus code?
Yes, but any derivatives must be made freely available as GPL code.
This is because your modifications might be good ones that would be useful to
the ploticus user community. This makes things fair for all the developers
who have contributed to ploticus code thus far.
You must keep the GPL.txt and Copyright files intact in the source code
directory (add your own "Modifications made by" language to the top of
the Copyright file). It must be stated in an end-user-accessible copyright or
acknowledgements area that the package is "a GPL derivative of Ploticus
data display engine (c) 1998-2008 Stephen Grubb, freely available from
http://ploticus.sourceforge.net". I request notification of the availability
of all such derivatives (stevegrubb@gmail.com) so that I can link to them from
the ploticus home page and consider possible inclusion in the main fork.
Q2. Can ploticus be used as part of a commercial (for-profit) product or service?
The GPL allows you to use ploticus to produce graphs for any lawful commercial or
noncommercial purpose, including providing services (automated or by hand) for a fee.
For example, there's no problem with executing a standard unmodified version of ploticus
on your server to produce graphs as part of a fee-based service.
Q3. Can ploticus be included/distributed as part of a non-GPL product?
Selling or distributing ploticus as a non-GPL product offering is prohibited.
Combining or intermingling of ploticus source code with non-GPL source code is
prohibited (thus the libploticus API cannot be used in this context).
However it is possible to distribute ploticus "along side of" non-GPL code if it is
partitioned ("kept at arm's length") from the non-GPL code. The GPL addresses this issue
here. http://www.gnu.org/licenses/gpl-faq.html#GPLInProprietarySystem
Partitioning is likely to be sufficient if all of these conditions are met:
1) ploticus (or GPL derivative) must be invoked as an executable, not via the libploticus API;
2) your product must be viable in its own right and essentially usable with or without ploticus;
3) ploticus-supported graphics capability may not be sold as an additional cost option;
4) if you've made modifications to the ploticus code you must abide by section Q1 above.
5) ploticus source code is kept in a separate directory, and the GPL.txt and Copyright files therein kept intact;
6) ploticus identity and authorship must be clearly stated and visible.
It must be stated in a end-user-accessible copyright or acknowledgements area that the product
utilizes "Ploticus data display engine (c) 1998-2008 Stephen Grubb, GPL, freely available
from http://ploticus.sourceforge.net".
I request notification of the availability of all such products (stevegrubb@gmail.com)so that
I can monitor compliance and link to them from the ploticus home page.
If you have questions or need clarification please contact me (stevegrubb@gmail.com) ....
I take an active interest in seeing that these rules are
adhered to, and request notification of any suspected violations.
Q4. How should ploticus be cited if it was used in the production of a published work?
Citation is always appreciated. Language like this is suggested:
Graphical data displays were produced using Ploticus software (ploticus.sf.net).
== end of clarifications ==
SVG driver copyright 2001 Bill Traill bill@traill.demon.co.uk
SWF driver copyright 2003 Bill Traill bill@traill.demon.co.uk
Ploticus generates PNG and run-length-encoded GIF-compatible
output using portions of Thomas Boutell's gd library versions
1.6.3 and 1.3. ploticus does not read GIF files.
GD 1.6.3 and 1.3 (www.boutell.com) carry the following statements:
|
| Portions copyright 1994, 1995, 1996, 1997, 1998, 1999 by
| Cold Spring Harbor Laboratory. Funded under Grant
| P41-RR02188 by the National Institutes of Health.
|
| Portions copyright 1996, 1997, 1998, 1999, by Boutell.Com, Inc.
|
| Portions relating to GD2 format copyright 1999 Philip Warner.
|
| Portions relating to PNG copyright 1999, Greg Roelofs.
|
| Portions relating to libttf copyright 1999, John Ellson
| (ellson@lucent.com).
|
| (Although his LZW compression code no longer appears
| in gd, the authors wish to thank David Rowley for the
| original LZW-based GIF compression code, which has been
| removed due to patent concerns.)
|
| Non-LZW-based GIF compression code copyright 1998, by
| Hutchison Avenue Software Corporation (http://www.hasc.com/,
| info@hasc.com).
|
| Permission has been granted to copy and distribute gd
| in any context, including a commercial application,
| provided that this notice is present in user-accessible
| supporting documentation.
|
| This does not affect your ownership of the derived work
| itself, and the intent is to assure proper credit for the
| authors of gd, not to interfere with your productive use
| of gd. If you have questions, ask. "Derived works" includes
| all programs that utilize the library. Credit must be
| given in user-accessible documentation.
|
| Permission to use, copy, modify, and distribute gd
| and its documentation for any purpose and without fee is
| hereby granted, provided that the above copyright notice
| appear in all copies and that both that copyright notice
| and this permission notice appear in supporting documentation.
| This software is provided "as is" without express or implied
| warranty.
|
== End of ploticus 2.40 Copyright Notice ==
NOTE:
On Debian systems the binary the author refers to as 'pl' is
installed as 'ploticus'.
ploticus-2.42/debian/libploticus0.dirs 0000644 0001750 0001750 00000000010 11765717536 017024 0 ustar colin colin usr/lib
ploticus-2.42/debian/libploticus0-dev.debhelper.log 0000644 0001750 0001750 00000000017 12144244512 021335 0 ustar colin colin dh_installdirs
ploticus-2.42/debian/control 0000644 0001750 0001750 00000005545 12144243766 015144 0 ustar colin colin Source: ploticus
Section: misc
Priority: optional
Maintainer: Colin Tuckley
Homepage: http://ploticus.sourceforge.net
Build-Depends: debhelper (>= 9), zlib1g-dev, libgd2-noxpm-dev, libjpeg-dev, libfreetype6-dev, libx11-dev, x11proto-core-dev, libpng-dev, dpkg-dev (>= 1.16.1~)
Standards-Version: 3.9.3
Package: ploticus
Section: misc
Recommends: ploticus-doc
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: script driven business graphics package
Ploticus is script-driven, which makes it suitable for automated,
unattended uses, or for applications that will be run again and again.
In general, ploticus is good at making graphs like you would see in
newspapers and news magazines, business publications, journals for
medical and social sciences, and so on.
.
Ploticus is not a function or mathematical plotting package like
gnuplot, nor would it be a good choice for applications where
mathematical formulas or scientific notations are to be rendered
as an integral part of the data display. Ploticus is also not
intended as a "marketing" graphics package. Its goal is to
display data crisply without extra decoration and distracting
"dingbats" that cloud the picture.
.
Ploticus supports a wide range of output options, including jpeg
(Joint Photographics Experts Group format), png (Portable Network
Graphics format), svg (Simple Vector Graphics), bmp (Microsoft BitMaP),
ps (PostScript), swf (Flash), and X11.
Package: libploticus0
Section: libs
Architecture: any
Depends: ${misc:Depends}, ${shlibs:Depends}
Description: script driven business graphics library
libploticus is not a function or mathematical plotting package like
gnuplot, nor would it be a good choice for applications where
mathematical formulas or scientific notations are to be rendered
as an integral part of the data display. libploticus is also not
intended as a "marketing" graphics package. Its goal is to
display data crisply without extra decoration and distracting
"dingbats" that cloud the picture.
.
libploticus supports a wide range of output options, including jpeg
(Joint Photographics Experts Group format), png (Portable Network
Graphics format), svg (Simple Vector Graphics), bmp (Microsoft BitMaP),
ps (PostScript), swf (Flash), and X11.
Package: libploticus0-dev
Section: libdevel
Architecture: any
Depends: ${misc:Depends}, libploticus0 (= ${binary:Version})
Description: Development files for the ploticus library
libploticus is not a function or mathematical plotting package like
gnuplot, nor would it be a good choice for applications where
mathematical formulas or scientific notations are to be rendered
as an integral part of the data display. libploticus is also not
intended as a "marketing" graphics package. Its goal is to
display data crisply without extra decoration and distracting
"dingbats" that cloud the picture.
ploticus-2.42/debian/ploticus.files 0000644 0001750 0001750 00000000037 11765717536 016427 0 ustar colin colin usr/bin/*
usr/share/man/man1/*
ploticus-2.42/debian/libploticus0-dev/ 0000755 0001750 0001750 00000000000 12144244512 016703 5 ustar colin colin ploticus-2.42/debian/libploticus0-dev/usr/ 0000755 0001750 0001750 00000000000 12144244512 017514 5 ustar colin colin ploticus-2.42/debian/libploticus0-dev/usr/lib/ 0000755 0001750 0001750 00000000000 12144244512 020262 5 ustar colin colin ploticus-2.42/debian/libploticus0-dev/usr/include/ 0000755 0001750 0001750 00000000000 12144244512 021137 5 ustar colin colin ploticus-2.42/debian/README.Debian 0000644 0001750 0001750 00000001331 11765717536 015600 0 ustar colin colin ploticus for Debian
-------------------
The prefabs (templates for some common chart types) are installed
in /usr/share/ploticus.
In Debian, the ploticus binary is /usr/bin/ploticus. Upstream
calls it pl, but there is a conflict with a package already part
of Debian, so this could not be used.
No support for any .gif format is provided in Debian. Support
is offered for .ps, .eps, .svg, .svgz, .png, .bmp, .x11 files.
FreeType2 font support is also compiled in.
Locale support has been compiled in.
libploticus support is offered by this source package.
I strongly urge that you install ploticus-doc. This package will
be hard to use without it.
-- Colin Tuckley , Sun, 17 Feb 2008 12:23:35 +0100
ploticus-2.42/debian/ploticus.install 0000644 0001750 0001750 00000000035 11765717536 016771 0 ustar colin colin prefabs/* usr/share/ploticus
ploticus-2.42/debian/rules 0000755 0001750 0001750 00000002461 12144244421 014600 0 ustar colin colin #!/usr/bin/make -f
# Uncomment this to turn on verbose mode.
export DH_VERBOSE=1
DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/buildflags.mk
# CFLAGS values required are set in src/Makefile
configure: configure-stamp
configure-stamp:
dh_testdir
touch configure-stamp
build: build-stamp
build-stamp: configure-stamp
dh_testdir
$(MAKE)
touch build-stamp
clean:
dh_testdir
dh_testroot
rm -f build-stamp configure-stamp
[ ! -f Makefile ] || $(MAKE) clean
dh_clean
install: build
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
$(MAKE) install DESTDIR=$(CURDIR)/debian/tmp
build-arch: build
build-indep: build
# Build architecture-independent files here.
binary-indep: build install
# We have nothing to do by default.
# Build architecture-dependent files here.
binary-arch: build install
dh_testdir
dh_testroot
dh_movefiles
dh_install
dh_installchangelogs
dh_installdocs -A
dh_installexamples
dh_installman
chmod 644 $(CURDIR)/debian/ploticus/usr/share/doc/ploticus/examples/run_script_test.bat
dh_link
dh_strip
dh_compress
dh_fixperms
dh_makeshlibs -V
dh_installdeb
dh_shlibdeps -L libploticus0 -l debian/libploticus0/usr/lib/
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure
ploticus-2.42/debian/tmp/ 0000755 0001750 0001750 00000000000 12144244513 014317 5 ustar colin colin ploticus-2.42/debian/tmp/usr/ 0000755 0001750 0001750 00000000000 12144244513 015130 5 ustar colin colin ploticus-2.42/debian/tmp/usr/bin/ 0000755 0001750 0001750 00000000000 12144244513 015700 5 ustar colin colin ploticus-2.42/src/ 0000755 0001750 0001750 00000000000 12144520024 013056 5 ustar colin colin ploticus-2.42/src/lib.c 0000644 0001750 0001750 00000027142 11154273232 014004 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
#include "pl.h"
static int Supress_convmsg = 0;
static int N_convmsg = 0;
static int beginnum();
static int dump_ok = 0;
/* ====================== */
int
PL_lib_initstatic()
{
Supress_convmsg = 0;
N_convmsg = 0;
dump_ok = 0;
return( 0 );
}
/* ====================== */
/* GETYN */
int
PL_getyn( val )
char *val;
{
if( strnicmp( val, "y", 1 )==0 ) return( 1 );
else return( 0 );
}
/* ====================== */
/* FDA - access D as a 2-D array; return as double;
For non-plottables 0.0 is returned, but Econv_error may be called to see if
there was a conversion error */
double
PL_fda( r, c, ax )
int r, c;
char ax;
{
return( Econv( ax, da( r, c ) ) );
}
/* ====================== */
/* NUM - convert string to double, and ensure that it is proper numeric
Result is s converted to double.
Return is 0 on ok, 1 on non-numeric. */
int
PL_num( s, result )
char s[];
double *result;
{
int nt;
nt = sscanf( s, "%lf", result );
if( nt > 0 ) return( 0 );
else {
*result = 0.0;
return( 1 );
}
}
/* ============================= */
/* GETCOORDS - extract a coordinate pair (two posex's) from val */
int
PL_getcoords( parmname, val, x, y )
char *parmname, *val;
double *x, *y;
{
char px[40], py[40];
int nt;
int stat;
nt = sscanf( val, "%s %s", px, py );
if( nt < 2 ) return( Eerr( 55, "Two values expected", parmname ) );
stat = Eposex( px, X, x );
stat += Eposex( py, Y, y );
if( stat != 0 ) return( Eerr( 201, "Error on coord pair", parmname ) );
else return( 0 );
}
/* ============================= */
/* GETBOX - extract two coordinate pairs (four posex's) from val */
int
PL_getbox( parmname, val, x1, y1, x2, y2 )
char *parmname, *val;
double *x1, *y1, *x2, *y2;
{
char px1[40], py1[40], px2[40], py2[40];
int nt;
int stat;
nt = sscanf( val, "%s %s %s %s", px1, py1, px2, py2 );
if( nt < 4 ) return( Eerr( 55, "Four values expected", parmname ) );
stat = Eposex( px1, X, x1 );
stat += Eposex( py1, Y, y1 );
stat += Eposex( px2, X, x2 );
stat += Eposex( py2, Y, y2 );
if( stat != 0 ) return( Eerr( 201, "Error on box specification", parmname ) );
else return( 0 );
}
/* ================== */
/* GETRANGE - get a low/high range */
int
PL_getrange( lineval, lo, hi, ax, deflo, defhi )
char *lineval;
double *lo, *hi;
char ax;
double deflo, defhi;
{
char s1[80], s2[80];
int nt;
nt = sscanf( lineval, "%s %s", s1, s2 );
if( nt == 2 ) {
*lo = Econv( ax, s1 );
*hi = Econv( ax, s2 );
return( 0 );
}
else if( nt == 1 ) {
*lo = Econv( ax, s1 );
*hi = defhi;
return( 0 );
}
else if( nt <= 0 ) {
*lo = deflo;
*hi = defhi;
return( 0 );
}
return( 0 );
}
/* =============================== */
/* FILE_TO_BUF - read file or execute command and place contents into buf.
Shell expandable file name is ok.
Returns 0 if ok, 1 if file not available */
int
PL_file_to_buf( filename, mode, result, buflen )
char *filename;
int mode; /* 1 = file 2 = command */
char *result;
int buflen;
{
FILE *fp, *popen();
char buf[1000];
if( mode == 1 ) fp = fopen( filename, "r" );
else {
if( PLS.noshell ) return( Eerr( 7203, "-noshell prohibits shell command", "" ));
fp = popen( filename, "r" );
}
if( fp == NULL ) return( 1 );
strcpy( result, "" );
while( fgets( buf, 999, fp ) != NULL ) {
if( strlen( result ) + strlen( buf ) >= buflen ) {
Eerr( 7254, "warning: truncated, capacity reached", filename );
return( 2 );
}
strcat( result, buf );
}
if( mode == 1 ) fclose( fp );
else pclose( fp );
return( 0 );
}
/* ========================= */
/* SETFLOATVAR - set a TDH var to a double value */
int
PL_setfloatvar( varname, f, fmt )
char *varname, *fmt;
double f;
{
char buf[80];
int stat;
sprintf( buf, fmt, f );
stat = TDH_setvar( varname, buf );
if( stat != 0 ) return( Eerr( stat, "Error on setting variable", varname ) );
return( 0 );
}
/* ========================= */
/* SETINTVAR - set a TDH var to an integer value */
int
PL_setintvar( varname, n )
char *varname;
int n;
{
char buf[80];
int stat;
sprintf( buf, "%d", n );
stat = TDH_setvar( varname, buf );
if( stat != 0 ) return( Eerr( stat, "Error on setting variable", varname ) );
return( 0 );
}
/* ========================== */
/* SETCHARVAR - set a TDH var to a char string value */
int
PL_setcharvar( varname, s )
char *varname;
char *s;
{
int stat;
stat = TDH_setvar( varname, s );
if( stat != 0 ) return( Eerr( stat, "Error on setting variable", varname ) );
return( 0 );
}
/* =========================== */
/* CONV_MSG - print a message to errfp for a data item of invalid type */
int
PL_conv_msg( row, col, aname )
int row, col;
char *aname;
{
char progname[80];
N_convmsg++;
if( Supress_convmsg ) return( 0 );
TDH_geterrprog( progname );
fprintf( PLS.errfp, "%s: warning, %s skipping unplottable '%s' (rec=%d field=%d)\n",
progname, aname, da(row,col), row+1, col+1 );
return( 0 );
}
/* =========================== */
/* SUPPRESS_CONVMSG - suppress invalid type messages */
int
PL_suppress_convmsg( mode )
int mode;
{
Supress_convmsg = mode;
return( 0 );
}
/* ============================= */
/* ZERO_CONVMSGCOUNT - zero out the conv msg counter */
int
PL_zero_convmsgcount()
{
N_convmsg = 0;
return( 0 );
}
/* ============================= */
/* REPORT_CONVMSGCOUNT - report on what the conv msg count is.. */
int
PL_report_convmsgcount()
{
return( N_convmsg );
}
/* ========================== */
/* SCALEBEENSET - return 1 if scaling has been set, 0 if not */
int
PL_scalebeenset()
{
if( EDXhi - EDXlo > 0.0000001 ) return( 1 );
else return( 0 );
}
/* ======================== */
/* DEFAULTINC - given a min and a max, estimate a reasonable default inc (linear or log numeric data)
*
* Improvements contributed by Dan Pelleg peldan@yahoo.com :
* we want to find a number that is:
* - the same order of magnitude of h, and greater than h
* - is either 1, 2, or 5, multiplied by the appropriate units
* - is the smallest such number
* For example, all numbers between 10000 and 19999 are mapped to 20000.
* Numbers 20000 - 49999 are mapped to 50000.
* Numbers 50000 - 99999 are mapped to 100000.
* Numbers 100000 - 199999 are mapped to 200000. And so on.
*
* Remaining scg code deleted 10/1/03...
*/
int
PL_defaultinc( min, max, inc )
double min, max, *inc;
{
double diff, h, fabs();
double ret, mult, mant;
diff = max - min;
diff = fabs( diff );
h = diff / 10.0; /* we want to have about 10 tics on an axis.. */
/* normalize and write h = mant * mult, for 1 <= mant 10 */
mult = pow( 10.0, floor( log10(h) ) );
mant = h / mult;
/* find the next step and multiply */
if(mant < 2.0) ret = 2.0 * mult;
else if(mant < 5.0) ret = 5.0 * mult;
else ret = 10.0 * mult;
*inc = ret;
return( 0 );
}
/* ======================== */
/* REWRITENUMS - rewrite numbers, supplying a spacer (comma in US)
every 3 zeros in large numbers. If spacer is dot (.), European
mode is presumed, decimal point is written as a comma, and
large numbers are spaced using dot.
Numbers in scientific notation are returned unaltered.
Parameter num is modified.
*/
int
PL_rewritenums( num )
char *num;
{
int i, j, k, decplace, len;
char s[40], tmp[40];
if( PLS.bignumspacer == '\0' ) return( 0 ); /* do nothing */
sscanf( num, "%s", s ); /* strip off any leading spaces */
/* find any dec pt; convert it; put result into 'tmp'.. */
k = -1;
decplace = -1;
for( i = 0, len = strlen( s ); i < len; i++ ) {
if( s[i] == 'e' ) return( 0 ); /* scientific notation detected - leave it alone - scg 11/26/02 */
/* remember the char where number begins.. */
if( k < 0 && beginnum( s, i ) ) k = i;
/* ( isdigit( s[i] ) || (( s[i] == '.' || s[i] == '-' ) && isdigit( s[i+1]) ) ) ) k = i; */
if( s[i] == '.' ) {
decplace = i - k;
if( PLS.bignumspacer == '.' ) tmp[i] = ',';
else tmp[i] = '.';
}
else tmp[i] = s[i];
}
tmp[i] = '\0';
if( decplace < 0 ) {
for( ; i >= 0; i-- ) if( isdigit( (int) s[i] ) || s[i] == '.' ) { i++; break; } /* added scg 3/25/02 */
decplace = i - k;
}
if( decplace > PLS.bignumthres ) { /* add spacers.. */
/* process tmp; put result back in 's'.. */
for( i = -1, j = 0, k = 0; i < decplace; k++ ) {
/* just copy over any leading alpha portion.. */
if( i < 0 && !beginnum( tmp, k ) ) {
/* ( ! isdigit( tmp[k] ) && tmp[k] != '.' && tmp[k] != '-' ) ) { */
s[j++] = tmp[k];
continue; /* scg 2/28/02 */
}
i++;
if( i > 0 && decplace-i > 0 && (decplace-i) % 3 == 0 ) { /* insert 000 separator.. */
s[j++] = PLS.bignumspacer;
s[j++] = tmp[k];
}
else s[j++] = tmp[k];
}
s[j] = '\0';
if( k < strlen( tmp ) ) strcat( s, &tmp[k] ); /* append decimal point and rightward */
}
else strcpy( s, tmp );
strcpy( num, s );
return( 0 );
}
static int
beginnum( s, i )
char *s;
int i;
{
if( ( isdigit( (int) s[i] ) || (( s[i] == '.' || s[i] == '-' ) && isdigit( (int) s[i+1]) ) ) ) return( 1 );
else return( 0 );
}
/* ============================= */
/* CONVERTNL - change all occurrances of "\n" (backslash followed by n) to a newline character */
/* (Result is always shorter than input) */
int
PL_convertnl( str )
char *str; /* str is always updated... you can't pass a string constant to convertnl() */
{
int i, j, len;
for( i = 0, j = 0, len = strlen( str ); i < len; i++ ) {
if( str[i] == '\\' && str[i+1] == 'n' ) {
str[j] = '\n';
i++;
}
else str[j] = str[i];
j++;
}
str[j] = '\0';
return( 0 );
}
/* ============================== */
/* MEASURETEXT - count the number of lines present in txt and find the length of longest line. */
int
PL_measuretext( txt, nlines, maxlen )
char *txt;
int *nlines, *maxlen;
{
int i, len, tlen;
char line[256];
i = 0;
*nlines = 0;
*maxlen = 0;
tlen = strlen( txt );
while( 1 ) {
if( i >= tlen ) break;
GL_getseg( line, txt, &i, "\n" );
len = strlen( line );
if( len > *maxlen ) *maxlen = len;
(*nlines)++;
}
return( 0 );
}
/* ================================= */
/* DO_X_BUTTON */
int
PL_do_x_button( label )
char *label;
{
#ifndef NOX11
double x, y;
double sx, sy;
int e;
PLG_getglobalscale( &sx, &sy ); /* turn off global scaling while we draw button.. */
PLG_setglobalscale( 1.0, 1.0 );
while( 1 ) {
if( PL_clickmap_getdemomode() ) clickmap_show( 'x' ); /* added scg 11/23/01 */
Elinetype( 0, 0.5, 1.0 );
Ecblock( 0.1, 0.1, 1.0, 0.3, "yellow", 0 );
Emov( 0.5, 0.12 );
Etextsize( 12 );
Ecolor( "black" );
Ecentext( label );
Ecblockdress( 0.1, 0.1, 1.0, 0.3, 0.06, "0.6", "0.8", 0.0, "" );
Eflush();
Esavewin();
Egetkey( &x, &y, &e );
if( e < 1000 || (y < 0.3 && x < 1.0 )) {
Ecblock( 0.1, 0.1, 1.0, 0.3, "black", 0 );
Eflush();
if( e == 'q' ) PLS.skipout = 1;
break;
}
else if( PLS.usingcm ) fprintf( PLS.diagfp, "%g %g\n", x*2.54, y*2.54 ); /* in cm */
else fprintf( PLS.diagfp, "%g %g\n", x, y ); /* mouse click location in inches from lower-left */
}
PLG_setglobalscale( sx, sy ); /* restore global scaling.. */
#endif
return( 0 );
}
#ifdef HOLD
/* ======================================================= */
/* temporary debug routine */
PLG_dump_on()
{
dump_ok = 1;
return( 0 );
}
PLG_dumpdata()
{
int i, j;
if( !dump_ok ) return( 0 );
for( i = 0; i < Nrecords; i++ ) {
for( j = 0; j < Nfields; j++ ) printf( "[%s]", da( i, j ) );
printf( "\n" );
}
printf( "---------------\n" );
return( 0 );
}
#endif
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/variable.c 0000644 0001750 0001750 00000010121 10713653774 015025 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* VARIABLE.C - assign/ get value of a variable */
#include "tdhkit.h"
#define NAMEMAX 30
static int Ns = 0;
static char Name[MAXVAR][NAMEMAX];
static char Value[MAXVAR][VARMAXLEN+1];
static int badvarwarn = 0;
static int Lasti = 0; /* remember which slot was set / gotten most recently .. */
/* =================================== */
int
TDH_setvar_initstatic()
{
Ns = 0;
badvarwarn = 0;
Lasti = 0;
return( 0 );
}
/* =================================== */
/* SETVAR - set the named variable to the given value.
Allocates a space in the vars list if necessary.
scg 11/5/07 - robusticated with respect to varname lengths and NAMEMAX
*/
int
TDH_setvar( name, value )
char *name, *value;
{
int i;
for( i = 0; i < Ns; i++ ) if( strncmp( Name[i], name, NAMEMAX-1 )==0 ) break;
if( i == Ns ) {
/* if not found, allocate a space in vars list.. scg 2/15/01 */
if( Ns >= MAXVAR ) {
for( i = 0; i < Ns; i++ ) printf( "[%s] \n", Name[i] );
printf( "(%d/%d)\n", Ns, MAXVAR );
return( err( 1324, "Sorry, var table full", name ) );
}
strncpy( Name[Ns], name, NAMEMAX-1 ); Name[Ns][NAMEMAX] = '\0';
Lasti = Ns;
Ns++;
}
if( strlen( value ) > VARMAXLEN ) return( 1321 ); /* value too long */
strcpy( Value[i], value );
return( 0 );
}
/* =================================== */
/* GETVAR - get the value of the named variable */
int
TDH_getvar( name, value )
char *name, *value;
{
int i;
/* for( i = 0; i < Ns; i++ ) if( strcmp( Name[i], name )==0 ) break; */
for( i = Ns-1; i >= 0; i-- ) if( strcmp( Name[i], name )==0 ) break; /* search, beginning with most recently set scg 11/5/07 */
if( i < 0 ) {
if( badvarwarn ) err( 1322, "Undeclared variable", name ); /* we don't always want a message */
return( 1322 ); /* variable not declared */
}
strcpy( value, Value[i] );
Lasti = i;
return( 0 );
}
/* =================================== */
/* GETVARP - return a pointer to the value of the named variable */
char *
TDH_getvarp( name )
char *name;
{
int i;
if( name == NULL ) return( NULL );
/* for( i = 0; i < Ns; i++ ) if( strcmp( Name[i], name )==0 ) break; */
for( i = Ns-1; i >= 0; i-- ) if( strcmp( Name[i], name )==0 ) break; /* search, beginning with most recently set scg 11/5/07 */
if( i < 0 ) return( NULL );
return( Value[i] );
}
/* =================================== */
/* CLEARALLVAR - clear the list of variables. */
int
TDH_clearallvar( )
{
Ns = 0;
return( 0 );
}
/* ===================================== */
/* WARN_ON_BADVAR - turn on warning when undeclared vars are encountered. */
int
TDH_warn_on_badvar()
{
badvarwarn = 1;
return( 0 );
}
/* ===================================== */
/* SETVARCON - do a setvar() but perhaps do shsql field conversions first */
int
TDH_setvarcon( name, value, convert )
char *name, *value;
int convert; /* if 1 do conversion */
{
int i;
if( convert ) {
if( strcmp( value, TDH_dbnull )==0 ) return( TDH_setvar( name, "" ) );
for( i = 0; value[i] != '\0'; i++ ) if( value[i] == '_' ) value[i] = ' ';
return( TDH_setvar( name, value ) );
}
return( TDH_setvar( name, value ) );
}
/* ====================================== */
/* GET_VAR_I - get Lasti */
int
TDH_get_var_i()
{
return( Lasti );
}
/* ====================================== */
/* SHOWVARS - print a list of existing variable names to stdout */
int
TDH_showvars( mode )
int mode;
{
int i;
if( mode == 1 ) { /* show var names and values */
for( i = 0; i < Ns; i++ ) printf( "[%s:%s] \n", Name[i], Value[i] );
}
else for( i = 0; i < Ns; i++ ) printf( "[%s] \n", Name[i] );
printf( "... (%d/%d)\n", Ns, MAXVAR );
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2007 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/pl.h 0000644 0001750 0001750 00000042175 12144516272 013665 0 ustar colin colin /* ploticus data display engine. Software, documentation, and examples.
* Copyright 1998-2008 Stephen C. Grubb (scg@jax.org).
* Covered by GPL; see the file ./Copyright for details. */
#ifndef PLHEAD
#define PLHEAD 1
#include
#include "plg.h"
#define PREFABS_DIR "" /* INSTALLERS can set this to a valid pathname, so that users don't need to set PLOTICUS_PREFABS env var */
#define PLVERSION "2.42-May2013" /* see also the Copyright page, and page headers and footers */
/* =========== working limits.. ============ */
#define CPULIMIT 30 /* default max amount of cpu (seconds) - setrlimit() - may be overridden */
#define MAXD 200000 /* default max total # of data fields - may be overridden using -maxfields */
#define MAXDROWS 10000 /* default max # data rows - may be overridden using -maxrows */
#define MAXDAT 100000 /* default max # of members in PLV vector - may be overridden */
#define MAXPROCLINES 5000 /* max # of proc lines in current proc plus all #saved
procs - may be overridden using -maxproclines */
#define MAXBIGBUF 10000 /* size of PL_bigbuf (chars) (was 100K .. scg 11/27/07) */
/* #define MAXNCATS 250 */ /* raising this... can't get 'listsize' to work.. scg 4/2013*/
#define MAXNCATS 600 /* default max # of categories - may be overriden using proc categories listsize */
#define MAXOBJ 40 /* max # of currently "active" procs.. includes all #saved procs and #proc getdata with inline data */
#define MAXDS 5 /* max # of stacked datasets in memory - maintain code instances when raising */
#define MAXCLONES 5 /* max # of #clone that may be used in one proc */
#define MAXPATH 256 /* pathname max */
#define MAXURL 256 /* url max */
#define MAXTT 1500 /* max size of a tooltip text chunk */
#define NORMAL 0
#define NAMEMAXLEN 50 /* also in tdhkit.h */
/* ============ other defines ============= */
#define dat2d(i,j) (PLV[((i)*2)+(j)]) /* access PLV vector as an Nx2 array */
#define dat3d(i,j) (PLV[((i)*3)+(j)]) /* access PLV vector as an NX3 array */
#define Nfields PLD.nfields[ PLD.curds ]
#define Nrecords PLD.nrecords[ PLD.curds ]
#ifndef Eerr
#define Eerr(a,b,c) TDH_err(a,b,c)
#endif
#define X 'x'
#define Y 'y'
#define PIVOTYEAR 70
#define PLHUGE 999999999999999.0
#define NEGHUGE -999999999999999.0
/* legend entry types */
#define LEGEND_COLOR 1
#define LEGEND_LINE 2
#define LEGEND_SYMBOL 4
#define LEGEND_TEXT 8
#define LEGEND_LINEMARK 16
#ifndef URL_ENCODED
#define URL_ENCODED 2
#endif
/* ============ pathname portability ============ */
#ifdef WIN32
#define TMPDIR "c:\\temp"
#define PATH_SLASH '\\'
#else
#define TMPDIR "/tmp" /* temp file directory */
#define PATH_SLASH '/' /* slash as used in path name; unix uses '/' */
#endif
/* ================ structures ====================== */
struct plstate {
int debug; /* indicates extra diagnostic output should be generated */
char device; /* c p e g or x */
char *prefabsdir; /* set from env var PLOTICUS_PREFABS */
int npages; /* page count */
char outfile[MAXPATH]; /* output file as specified by user */
char mapfile[MAXPATH]; /* clickmap file name */
char cmdlineparms[300]; /* command line parms that need to override proc page settings */
int eready; /* indicates that Einit has been called */
int usingcm; /* indicates that units are centimeters */
int skipout; /* indicates fatal error and remainder of current script should be skipped */
int landscape; /* allows -landscape to be set on command line before Einit() */
int bkcolorgiven; /* needed so that we know whether or not to Eclr in certain places */
int winsizegiven; /* accomodate specification of window size on command line */
double winw, winh; /* accomodate specification of window size on command line */
int winx, winy; /* accomodate specification of window location on command line */
int clickmap; /* indicates whether we are doing a clickmap or not */
char viewer[80]; /* viewer program as specified by user, eg ghostscript */
int bignumspacer; /* character to use in making large numbers readable (usually comma) */
int bignumthres;
char tmpname[MAXPATH]; /* base name for generating temp file names */
FILE *diagfp; /* diagnostic output stream */
FILE *errfp; /* error message stream */
char *cgiargs; /* CGI args */
int echolines; /* echo evaluated script lines to 1 = stdout 2 = stderr */
int noshell; /* 1 if shell command deployment is prohibited */
};
struct proclines {
char **procline; /* array of pointers to lines of proc code */
int maxproclines; /* total malloc'ed size of procline array */
int nlines; /* next available cell when filling procline array */
int curline; /* next available cell when getting from procline array */
int nobj; /* current number of objects being stored */
char objname[ MAXOBJ ][ 30 ]; /* list of object names for clone/saveas */
int objstart[ MAXOBJ ]; /* which cell in procline array the object starts in */
int objlen[ MAXOBJ ]; /* number of lines in procline array the object occupies */
};
struct pldata {
char **datarow; /* array of pointers to malloc'ed data row buffers */
int currow; /* current number of members in datarow array */
int maxrows; /* total malloc'ed size of datarow array */
/* note: in-script data is stored in persistent proclines, not data rows */
char **df; /* array of field pointers */
int curdf; /* next available field pointer in df array */
int maxdf; /* total malloc'ed size of df array; */
/* note: field pointers point into datarows (or into proclines for in-script data) */
/* data sets are managed as a stack of up to MAXDS elements. proc getdata always clears the stack and fills at ds=0. */
int curds; /* identifies the current dataset (or stack size). First is 0 */
int dsfirstdf[MAXDS]; /* where a dataset begins in the df array */
int dsfirstrow[MAXDS]; /* where a dataset begins in the datarow array.. if data set in procline array this is -1 */
int nrecords[ MAXDS ]; /* number of records in a dataset */
int nfields[ MAXDS ]; /* number of fields in a dataset */
};
/* ================ global vars ================================= */
extern struct plstate PLS;
extern struct pldata PLD;
extern struct proclines PLL;
extern double *PLV;
extern int PLVsize, PLVhalfsize, PLVthirdsize;
extern char PL_bigbuf[];
/* ================ function redefines =========================== */
/* internally, functions usually don't use the PL_ prefix.. */
#define getmultiline(firstline,mode) PL_getmultiline(firstline,mode)
#define getnextattr(flag,attr,valpos) PL_getnextattr(flag,attr,valpos)
#define tokncpy(val,lineval,maxlen) PL_tokncpy(val,lineval,maxlen)
#define itokncpy(lineval) PL_itokncpy(lineval)
#define ftokncpy(lineval) PL_ftokncpy(lineval)
#define newattr(lineval,len) PL_newattr(lineval,len)
#define da( r, c ) PL_da( r, c )
#define fda( r, a, ax ) PL_fda( r, a, ax )
#define num( s, result ) PL_num( s, result )
#define getcoords( p, v, x, y ) PL_getcoords( p, v, x, y )
#define getbox( p, v, x1, y1, x2, y2 ) PL_getbox( p, v, x1, y1, x2, y2 )
#define getrange( v, l, h, ax, dl, dh ) PL_getrange( v, l, h, ax, dl, dh )
#define getyn( s ) PL_getyn( s )
#define file_to_buf( f, m, r, b ) PL_file_to_buf( f, m, r, b )
#define setfloatvar( v, f, m ) PL_setfloatvar( v, f, m )
#define setintvar( v, n ) PL_setintvar( v, n )
#define setcharvar( v, s ) PL_setcharvar( v, s )
#define conv_msg( r, c, a ) PL_conv_msg( r, c, a )
#define suppress_convmsg( m ) PL_suppress_convmsg( m )
#define zero_convmsgcount() PL_zero_convmsgcount()
#define report_convmsgcount() PL_report_convmsgcount()
#define scalebeenset() PL_scalebeenset()
#define catitem( s, d, avail ) PL_catitem( s, d, avail )
#define defaultinc( min, max, inc ) PL_defaultinc( min, max, inc )
#define rewritenums( num ) PL_rewritenums( num )
#define convertnl( s ) PL_convertnl( s )
#define measuretext( txt, nlines, maxlen ) PL_measuretext( txt, nlines, maxlen )
#define clickmap_init( nbytes, debug ) PL_clickmap_init( nbytes, debug )
#define clickmap_inprogress() PL_clickmap_inprogress()
#define clickmap_debug() PL_clickmap_debug()
#define clickmap_setdefaulturl( url ) PL_clickmap_setdefaulturl( url )
#define clickmap_seturlt( url ) PL_clickmap_seturlt( url )
#define clickmap_entry( t, u, p, x1, y1, x2, y2, tp, cm, tit ) PL_clickmap_entry( t, u, p, x1, y1, x2, y2, tp, cm, tit )
#define clickmap_out( tx, ty ) PL_clickmap_out( tx, ty )
#define clickmap_show( dev ) PL_clickmap_show( dev )
#define textdet( p, s, a, adjx, adjy, szh, sth, seph ) PL_textdet( p, s, a, adjx, adjy, szh, sth, seph )
#define linedet( p, s, d ) PL_linedet( p, s, d )
#define symdet( p, s, sc, r ) PL_symdet( p, s, sc, r )
#define devavail( dev ) PL_devavail( dev )
#define devnamemap( s, t, mode ) PL_devnamemap( s, t, mode )
#define makeoutfilename( s, o, d, p ) PL_makeoutfilename( s, o, d, p )
#define definefieldnames( list ) PL_definefieldnames( list )
#define fref( name ) PL_fref( name )
#define getfname( n, result ) PL_getfname( n, result )
#define fref_error() PL_fref_error()
#define fref_showerr( mode ) PL_fref_showerr( mode )
#define do_select( selectex, row, result ) PL_do_select( selectex, row, result )
#define do_subst( out, in, row, mode ) PL_do_subst( out, in, row, mode )
#define Esetunits( axis, s ) PL_setunits( axis, s )
#define Egetunits( axis, s ) PL_getunits( axis, s )
#define Egetunitsubtype( axis, result ) PL_getunitsubtype( axis, result )
#define Esetscale( axis, alo, ahi, scalelo, scalehi ) PL_setscale( axis, alo, ahi, scalelo, scalehi )
#define Econv( axis, s ) PL_conv( axis, s )
#define Econv_error() PL_conv_error()
#define Euprint( result, axis, f, format ) PL_uprint( result, axis, f, format )
#define Eposex( val, axis, result ) PL_posex( val, axis, result )
#define Elenex( val, axis, result ) PL_lenex( val, axis, result )
#define Eevalbound( val, axis, result ) PL_evalbound( val, axis, result )
#define Esetdatesub( tok, desc ) PL_setdatesub( tok, desc )
#define Esetcatslide( axis, amount ) PL_setcatslide( axis, amount )
#define Es_inr( axis, val ) PL_s_inr( axis, val )
#define Ef_inr( axis, val ) PL_f_inr( axis, val )
/* ================ non-int functions ======================= */
extern char *PL_da();
extern double PL_fda(), PL_conv(), PL_u();
extern char *PL_getnextattr();
extern double PL_ftokncpy();
extern char *PL_newattr();
extern char *PL_getmultiline();
extern char *PL_get_legent();
extern char *PL_get_legent_rg();
/* ================ int functions =========================== */
extern int PL_tokncpy();
extern int PL_itokncpy();
extern int PL_num();
extern int PL_getcoords();
extern int PL_getbox();
extern int PL_getrange();
extern int PL_file_to_buf();
extern int PL_setfloatvar();
extern int PL_setintvar();
extern int PL_setcharvar();
extern int PL_conv_msg();
extern int PL_suppress_convmsg();
extern int PL_zero_convmsgcount();
extern int PL_report_convmsgcount();
extern int PL_scalebeenset();
extern int PL_catitem();
extern int PL_defaultinc();
extern int PL_rewritenums();
extern int PL_convertnl();
extern int PL_measuretext();
extern int PL_clickmap_init();
extern int PL_clickmap_inprogress();
extern int PL_clickmap_debug();
extern int PL_clickmap_setdefaulturl();
extern int PL_clickmap_seturlt();
extern int PL_clickmap_entry();
extern int PL_clickmap_out();
extern int PL_clickmap_show();
extern int PL_textdet();
extern int PL_linedet();
extern int PL_symdet();
extern int PL_devavail();
extern int PL_devnamemap();
extern int PL_makeoutfilename();
extern int PL_definefieldnames();
extern int PL_fref();
extern int PL_getfname();
extern int PL_fref_error();
extern int PL_fref_showerr();
extern int PL_do_select();
extern int PL_do_subst();
extern int PL_setunits();
extern int PL_getunits();
extern int PL_getunitsubtype();
extern int PL_setscale();
extern int PL_conv_error();
extern int PL_uprint();
extern int PL_posex();
extern int PL_lenex();
extern int PL_evalbound();
extern int PL_setdatesub();
extern int PL_setcatslide();
extern int PL_s_inr();
extern int PL_f_inr();
extern int PL_addcat();
extern int PL_begin();
extern int PL_catfree();
extern int PL_clickmap_demomode();
extern int PL_clickmap_free();
extern int PL_clickmap_getdemomode();
extern int PL_clickmap_inprogress();
extern int PL_clickmap_out();
extern int PL_clickmap_adjust();
extern int PL_custom_function();
extern int PL_devstring();
extern int PL_do_preliminaries();
extern int PL_do_x_button();
extern int PL_encode_fnames();
extern int PL_enddatarow();
extern int PL_exec_scriptfile();
extern int PL_execline();
extern int PL_execline_initstatic();
extern int PL_fieldnames_initstatic();
extern int PL_findcat();
extern int PL_free();
extern int PL_getcat();
extern int PL_holdmem();
extern int PL_init_mem();
extern int PL_lib_initstatic();
extern int PL_ncats();
extern int PL_nextcat();
extern int PL_parsedata();
extern int PL_process_arg();
extern int PL_setcatparms();
extern int PL_setcats();
extern int PL_sharedsettings();
extern int PL_smoothfit();
extern int PL_startdatarow();
extern int PL_units_initstatic();
extern int PL_value_subst();
extern int PL_add_legent();
extern int PL_resetstacklist();
extern int PL_getyn();
extern int PL_cleardatasets();
extern int PL_begindataset();
extern int PL_finishdataset();
extern int PL_popdataset();
extern int PLP_annotate();
extern int PLP_areadef();
extern int PLP_autorange();
extern int PLP_axis();
extern int PLP_bars();
extern int PLP_bars_initstatic();
extern int PLP_breakaxis();
extern int PLP_categories();
extern int PLP_catlines();
extern int PLP_curvefit();
extern int PLP_defineunits();
extern int PLP_drawcommands();
extern int PLP_getdata();
extern int PLP_getdata_initstatic();
extern int PLP_image();
extern int PLP_legend();
extern int PLP_legend_initstatic();
extern int PLP_legendentry();
extern int PLP_line();
extern int PLP_lineplot();
extern int PLP_page();
extern int PLP_pie();
extern int PLP_print();
extern int PLP_processdata();
extern int PLP_processdata_initstatic();
extern int PLP_boxplot();
extern int PLP_rangesweep();
extern int PLP_rect();
extern int PLP_scatterplot();
extern int PLP_settings();
extern int PLP_symbol();
extern int PLP_tabulate();
extern int PLP_tree();
extern int PLP_usedata();
extern int PLP_vector();
extern int PLP_venndisk();
extern int PLP_findnearest();
extern int PLP_pvalue();
extern int GL_addmember();
extern int GL_changechars();
extern int GL_close_to();
extern int GL_commonmembers();
extern int GL_contains();
extern int GL_deletechars();
extern int GL_deletemember();
extern int GL_encode();
extern int GL_getcgiarg();
extern int GL_getchunk();
extern int GL_getseg();
extern int GL_goodnum();
extern int GL_initstatic();
extern int GL_make_unique_string();
extern int GL_member();
extern int GL_ranger();
extern int GL_slmember();
extern int GL_smember();
extern int GL_smemberi();
extern int GL_substitute();
extern int GL_substring();
extern int GL_sysdate();
extern int GL_systime();
extern int GL_varsub();
extern int GL_wildcmp();
extern int GL_wraptext();
extern double GL_numgroup();
extern int GL_urlencode();
extern int GL_urldecode();
extern int DT_build_dt();
extern int DT_checkdatelengths();
extern int DT_datefunctions();
extern int DT_datetime2days();
extern int DT_datetime_initstatic();
extern int DT_days2datetime();
extern int DT_formatdate();
extern int DT_formatdatetime();
extern int DT_formattime();
extern int DT_frame_mins();
extern int DT_fromjul();
extern int DT_frommin();
extern int DT_getdatefmt();
extern int DT_gethms();
extern int DT_getmdy();
extern int DT_getwin();
extern int DT_initstatic();
extern int DT_jdate();
extern int DT_makedate();
extern int DT_maketime();
extern int DT_setdatefmt();
extern int DT_setdateparms();
extern int DT_setdatetimefmt();
extern int DT_setdtsep();
extern int DT_setlazydates();
extern int DT_settimefmt();
extern int DT_time_initstatic();
extern int DT_timefunctions();
extern int DT_tomin();
extern int DT_weekday();
extern int DT_suppress_twin_warn();
extern int DT_reasonable();
extern int DT_getdtparts();
extern int DT_dateadd();
extern int TDH_condex();
extern int TDH_condex_initstatics();
extern int TDH_condex_listsep();
extern int TDH_dequote();
extern int TDH_err();
extern int TDH_err_initstatic();
extern int TDH_errfile();
extern int TDH_errmode();
extern int TDH_errprog();
extern int TDH_errprogsticky();
extern int TDH_function_call();
extern int TDH_function_listsep();
extern int TDH_functioncall_initstatic();
extern int TDH_geterrprog();
extern int TDH_getvalue();
extern int TDH_getvar();
extern int TDH_readconfig();
extern int TDH_readconfig_initstatic();
extern int TDH_reslimits();
extern int TDH_secondaryops();
extern int TDH_setvalue();
extern int TDH_setvar();
extern int TDH_setvar_initstatic();
extern int TDH_setvarcon();
extern int TDH_shell_initstatic();
extern int TDH_shellclose();
extern int TDH_shellcommand();
extern int TDH_shellresultrow();
extern int TDH_shfunctions();
extern int TDH_sinterp();
extern int TDH_sinterp_open();
extern int TDH_sinterp_openmem();
extern int TDH_sqlcommand();
extern int TDH_sqlnames();
extern int TDH_sqlrow();
extern int TDH_value_subst();
extern int TDH_valuesubst_initstatic();
extern int TDH_valuesubst_settings();
extern int TDH_setspecialincdir();
extern int TDH_prohibit_shell();
#endif /* PLHEAD */
ploticus-2.42/src/localef.c 0000644 0001750 0001750 00000001743 10171304401 014631 0 ustar colin colin /* LOCALE stuff - contributed code. */
#include
#include
#include
int strnicoll(char *s1, char *s2, int maxlen) {
int len1, len2, len, i, c;
unsigned char t1[2],t2[2];
len1=strlen(s1);
len2=strlen(s2);
len=len1;
if (len2 < len1) len=len2;
if (maxlen < len) len=maxlen;
t1[1]='\0';
t2[1]='\0';
for (i=0; i len2) return ( 1);
return (0);
}
int stricoll(char *s1, char *s2) {
int len1, len2, len, i, c;
unsigned char t1[2],t2[2];
/* printf (">> %s %s\n",s1,s2); */
len1=strlen(s1);
len2=strlen(s2);
len=len1;
if (len2 < len1) len=len2;
t1[1]='\0';
t2[1]='\0';
for (i=0; i len2) return ( 1);
return (0);
}
ploticus-2.42/src/pcode.c 0000644 0001750 0001750 00000074260 12144512117 014331 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PCODE - Draw operations.
All draw operations use pcode() except initialization (done in init.c),
and doing filled GD rectangles which use gifrect().
Bounding box, overall output scaling, and other low level operations should
be done here if possible rather than in the individual device interfaces.
Many E function calls such as Emov and Elin are actually macros defined in
plg.h, which call pcode with a single character op code and perhaps some
parameters. Others go thru a routine in stub.c.
==========================================================================
Device codes (Edev):
p postscript
x X11
g GD (png, gif, jpeg, etc.)
s SVG
f swf (flash format)
Op codes:
L lineto
M moveto
P path to
T, C, J left-adusted Text, Centered text, right Justified text
r set pending current color - color change actually occurs on next line/text or 'v'
v force color change immediately (can be done by app code)
k execute set current color (recursive call from pcode - never done by app code)
s Fill (color)
I set text size
F set text font
D set text direction
Y set line properties
. direct pixel data point (gd and x11 only)
z clear screen / set background color
H squelch display (s = "on" or s = "off" ) added 8/5/04 scg
Q end of file (tells drivers to finish up)
These codes are used by paginated postscript only (paper control):
O paper orientation (ps only)
Z print/eject (ps only)
These codes are used by x11 only (interactive context):
U flush (x11 only)
W wait for a key or mouse click (x11 only)
w cycle notifier from within a loop (x11 only)
b save window to backing store (x11 only)
B restore window from backing store (x11 only)
d make window disappear (x11 only)
a make window re-appear (x11 only)
e set text scale factor (x11 only, when user resizes window)
==========================================================================
*/
#include "plg.h"
extern int PL_clickmap_inprogress(), PL_clickmap_out();
extern int GL_member(), GL_member_nullmode();
#ifndef NOX11
extern int PLGX_pointsize(), PLGX_stroke(), PLGX_moveto(), PLGX_lineto(), PLGX_path(), PLGX_text(), PLGX_color(), PLGX_fill();
extern int PLGX_savewin(), PLGX_restorewin(), PLGX_centext(), PLGX_rightjust(), PLGX_wait(), PLGX_linetype(), PLGX_async();
extern int PLGX_disappear(), PLGX_appear(), PLGX_scaletext(), PLGX_flush(), PLGX_dot(), PLGX_pixpt();
#endif
#ifndef NOGD
extern int PLGG_lineto(), PLGG_moveto(), PLGG_pathto(), PLGG_text(), PLGG_centext(), PLGG_font(), PLGG_rightjust();
extern int PLGG_fill(), PLGG_color(), PLGG_textsize(), PLGG_chardir(), PLGG_linetype(), PLGG_eof(), PLGG_rect();
extern int PLGG_imload(), PLGG_implace(), PLGG_pixpt();
#endif
#ifndef NOSVG
extern int PLGS_stroke(), PLGS_moveto(), PLGS_lineto(), PLGS_path(), PLGS_text(), PLGS_fill(), PLGS_color();
extern int PLGS_pointsize(), PLGS_font(), PLGS_chardir(), PLGS_linetype(), PLGS_trailer();
extern int PLGS_showimg(), PLGS_setimg();
#endif
#ifndef NOSWF
extern int PLGF_stroke(), PLGF_moveto(), PLGF_lineto(), PLGF_path(), PLGF_text(), PLGF_fill(), PLGF_color();
extern int PLGF_pointsize(), PLGF_font(), PLGF_chardir(), PLGF_linetype(), PLGF_trailer();
#endif
#ifndef NOPS
extern int PLGP_stroke(), PLGP_moveto(), PLGP_lineto(), PLGP_path(), PLGP_text(), PLGP_fill(), PLGP_color();
extern int PLGP_pointsize(), PLGP_font(), PLGP_chardir(), PLGP_linetype(), PLGP_show(), PLGP_paper(), PLGP_trailer(), PLGP_newpage();
#endif
static int line_new = 0, line_drawing = 0; /* used by postscript section */
static int vertchar = 0; /* true if character direction is vertical..*/
/* ..used only by x11 */
#ifndef NOX11
static double txt_curx; /* real starting place of centered &rt justified text */
#endif
static double txt_width; /* width of most recently drawn text line. */
static char prev_op; /* previous op */
static int squelched = 0; /* is output being squelched? 1=yes, 0=no */
static int pagenum = 1; /* current page # */
static int virginpage = 1; /* 1 when nothing has yet been drawn on current page */
static int keeping_bb = 1;
static double bb_x1 = 999; /* coords of bounding box for entire run */
static double bb_y1 = 999;
static double bb_x2 = -999;
static double bb_y2 = -999;
static double bb2_x1 = 999; /* coords of "sub" bounding box available to app */
static double bb2_y1 = 999;
static double bb2_x2 = -999;
static double bb2_y2 = -999;
static int keep_bb2 = 0;
static int tightbb = 0;
static double scx1, scy1, scx2, scy2; /* specified crop zone */
static int specifycrop = 0; /* 0 = no 1 = absolute values 2 = values relative to bounding box */
static double globalscale = 1.0;
static double globalscaley = 1.0;
static double posterxo = 0.0;
static double posteryo = 0.0;
static int postermode = 0;
static double lmlx = 0.0, lmly = 0.0; /* last move local x and y
(saves location of last 'MOVE', including any effects of globalscale and poster ofs */
static int pcodedebug = 0;
static FILE *pcodedebugfp = NULL;
static int in_obj = 0;
static int colorchg_pending = 0;
static FILE *dumpfp = NULL;
static int dumpfp_closable = 0;
static int dumpmax = 0;
static int ndumplines = 0;
static int susp_dump = 0;
/* static double xsanemax, ysanemax;
* static int sanezone = 0;
*/
static int verttextsim();
/* ======================= */
int
PLG_pcode_initstatic()
{
line_new = 0; line_drawing = 0;
vertchar = 0;
squelched = 0;
pagenum = 1;
virginpage = 1;
keeping_bb = 1;
bb_x1 = 999; bb_y1 = 999; bb_x2 = -999; bb_y2 = -999;
bb2_x1 = 999; bb2_y1 = 999; bb2_x2 = -999; bb2_y2 = -999;
keep_bb2 = 0;
tightbb = 0;
specifycrop = 0;
globalscale = 1.0;
globalscaley = 1.0;
posterxo = posteryo = 0.0;
postermode = 0;
lmlx = lmly = 0.0;
pcodedebug = 0;
in_obj = 0;
colorchg_pending = 0;
pcodedebugfp = NULL;
dumpfp = NULL;
dumpfp_closable = 0;
dumpmax = 0;
ndumplines = 0;
susp_dump = 0;
/* sanezone = 0; */
return( 0 );
}
/* ======================= */
int
PLG_pcode( op, x, y, s )
char op; /* op code */
double x, y; /* coordinates */
char s[]; /* optional character string */
{
char buf[512];
int stat;
/* postscript: inform driver we're beginning a new page.. */
if( Edev == 'p' && virginpage && !GL_member( op, "Q" ) ) {
#ifndef NOPS
PLGP_newpage( pagenum );
#endif
virginpage = 0;
}
if( pcodedebug == 2 ) fprintf( stderr, "%c %g %g %s\n", op, x, y, s );
/* use this chunk to step thru one op code at a time - press any key to continue */
/* // if( op != 'w' )
* fprintf( stderr, "%c %g %g %s\n", op, x, y, s );
* PLGX_flush();
* PLGX_wait();
*/
/* lazy color set .. only execute a color change when line, text, or fill is imminent.. scg 6/18/04 */
if( op == 'r' ) {
strcpy( Enextcolor, s );
if( strcmp( Enextcolor, Ecurcolor ) !=0 ) colorchg_pending = 1;
else colorchg_pending = 0;
return( 0 );
}
else if( colorchg_pending && GL_member( op, "LTCJszv." )) { /* v added scg 5/10/05 */
PLG_pcode( 'k', 0.0, 0.0, Enextcolor );
colorchg_pending = 0;
if( op == 'v' ) return( 0 ); /* added scg 5/10/05 */
}
if( op == 'k' ) strcpy( Ecurcolor, s );
/* For clear op: do it then return; don't include in bounding box calculations */
if( op == 'z' ) {
keeping_bb = 0;
susp_dump = 1;
/* compensate EWinw and EWiny by globalscale because this op will
be doubly affected by globalscale.. */
Ecblock( 0.0, 0.0, EWinx/globalscale, EWiny/globalscaley, s, 0 );
susp_dump = 0;
keeping_bb = 1;
if( dumpfp != NULL ) fprintf( dumpfp, "z 0.0 0.0 %s\n", s );
return( 0 );
}
if( op == 'M' ) { Ex1 = x; Ey1 = y; } /* remember most recent 'move', untainted
by globalscale or posterofs.. */
/* scale x, y according to global scale, for all move, draw and text size ops */
/* if( globalscale != 1.0 ) { ... changed scg 3/28/06 */
if( globalscale != 1.0 || globalscaley != 1.0 ) {
if( GL_member( op, "LMPI." )) { x *= globalscale; y *= globalscaley; }
if( op == 'Y' ) y *= globalscale; /* dash scale */
}
/* if poster offset specified, translate */
if( postermode ) {
if( GL_member( Edev, "pcx" ) && GL_member( op, "LMP." )) {
x += posterxo;
y += posteryo;
}
}
if( op == 'Q' ) {
#ifdef PLOTICUS
/* allow clickmap to be generated on any device.. */
if( Edev != 'g' && Edev != 's' && PL_clickmap_inprogress() ) PL_clickmap_out( 0, 0 ); /* GD & SWF handled in drivers.. */
#endif
if( pcodedebug ) fprintf( pcodedebugfp, "Done with page. Bounding box is: %-5.2f, %-5.2f to %-5.2f, %-5.2f\n",
bb_x1, bb_y1, bb_x2, bb_y2 );
}
/* reject endobj's without companion beginobj */
if( op == '<' ) in_obj = 1;
else if( op == '>' ) {
if( ! in_obj ) return( 0 );
else in_obj = 0;
}
/* dump file */
if( dumpfp != NULL && !susp_dump ) {
if( GL_member( op, "UWwbBdae" )) ; /* do nothing for these interactive-context ops.. */
else if( dumpmax > 0 && ndumplines > dumpmax ) ; /* # output lines exceeded */
else if( op == 'Q' && dumpfp_closable ) fclose( dumpfp );
else if( op == 'k' ) fprintf( dumpfp, "r 0.0 0.0 %s\n", s ); /* write an r instead.. (color change optim) */
else fprintf( dumpfp, "%c %.3f %.3f %s\n", op, x, y, s );
}
if( op == 'H' ) { /* moved up - scg 8/12/05 */
if( strcmp( s, "on" )==0 ) squelched = 1;
else squelched = 0;
return( 0 );
}
/*********** squelch mode: suppress all operations that actually draw something.. */
if( squelched && GL_member( op, "LMPTCJs." )) ; /* scg 10/16/05 */
/*********** interface to X11 xlib driver.. */
else if( Edev == 'x' ) {
#ifndef NOX11
/* this section changed scg 5/4/04 to improve line dashing on lineplots */
if( op != 'L' ) {
if( line_drawing ) PLGX_stroke();
line_drawing = 0;
}
switch (op) {
case 'L' : if( line_new ) PLGX_moveto( lmlx, lmly );
PLGX_lineto( x, y );
line_new = 0;
line_drawing = 1;
break;
case 'M' : line_new = 1; break;
case 'P' : if( line_new ) PLGX_moveto( lmlx, lmly );
PLGX_path( x, y );
line_new = 0;
break;
case 'T' : if( vertchar ) break;
PLGX_moveto( lmlx, lmly );
PLGX_text( s, &txt_width );
break;
case 'k' : PLGX_color( s ); return( 0 );
case 's' : PLGX_fill( ); return( 0 );
case 'U' : PLGX_flush(); return( 0 );
case 'b' : PLGX_savewin(); return( 0 );
case 'B' : PLGX_restorewin(); return( 0 );
case 'I' : PLGX_pointsize( (int)(x), &Ecurtextwidth ); return( 0 );
case 'C' : if( !vertchar ) {
PLGX_moveto( lmlx-6.0, lmly );
PLGX_centext( s, 12.0, &txt_curx, &txt_width );
}
break;
case 'J' : if( !vertchar ) {
PLGX_moveto( lmlx-12.0, lmly );
PLGX_rightjust( s, 12.0, &txt_curx, &txt_width );
}
break;
case 'W' : PLGX_wait(); return( 0 );
case 'Y' : PLGX_linetype( s, x, y ); return( 0 );
case 'D' : if( x == 90 || x == 270 ) vertchar = 1;
else vertchar = 0;
return( 0 );
case 'w' : PLGX_async(); return( 0 );
case '.' : PLGX_pixpt( x, y, s ); break; /* scg 5/25/06 */
case 'd' : PLGX_disappear(); return( 0 );
case 'a' : PLGX_appear(); return( 0 );
case 'e' : PLGX_scaletext( x ); return( 0 );
}
#endif
}
/*************** interface to GD driver.. */
else if( Edev == 'g' ) {
#ifndef NOGD
switch (op) {
case 'L' : PLGG_lineto( x, y ); break;
case 'M' : PLGG_moveto( x, y ); break;
case 'P' : PLGG_pathto( x, y ); break;
case '.' : PLGG_pixpt( x, y, s ); break; /* scg 5/25/06 */
case 'T' : PLGG_text( s ); break;
case 'C' : PLGG_centext( s ); break;
case 'F' : PLGG_font( s ); break;
case 'J' : PLGG_rightjust( s ); break;
case 's' : PLGG_fill(); return( 0 );
case 'k' : PLGG_color( s ); return( 0 );
case 'I' : PLGG_textsize( (int)x ); return( 0 );
case 'D' : PLGG_chardir( (int)x );
if( (int)x != 0 ) vertchar = 1;
else vertchar = 0;
return( 0 );
case 'Y' : PLGG_linetype( s, x, y ); return( 0 );
case 'Q' : PLG_getoutfilename( buf );
if( buf[0] == '\0' ) strcpy( buf, "unnamed_result_image" ); /* fallback */
/* see if anything has been drawn, if not, return */
if ( bb_x2 < -998 && bb_y2 < -998 ) return( 0 );
if( tightbb ) stat = PLGG_eof( buf, bb_x1, bb_y1, bb_x2, bb_y2 );
else if( specifycrop == 1 )
stat = PLGG_eof( buf, scx1, scy1, scx2, scy2 );
else if( specifycrop == 2 )
stat = PLGG_eof( buf, (bb_x1)-scx1, (bb_y1)-scy1, (bb_x2)+scx2, (bb_y2)+scy2 );
else stat = PLGG_eof( buf, bb_x1-0.2, bb_y1-0.2, bb_x2+0.2, bb_y2+0.2 );
Eresetbb();
return( stat );
}
#endif
}
/*************** interface to svg driver */
else if( Edev == 's' ) {
#ifndef NOSVG
if( op != 'L' ) {
if( line_drawing ) PLGS_stroke();
line_drawing = 0;
}
switch( op ) {
case 'L' : if( line_new ) PLGS_moveto( lmlx, lmly );
PLGS_lineto( x, y );
line_new = 0;
line_drawing = 1;
break;
case 'M' : line_new = 1; break;
case 'P' : if( line_new ) PLGS_moveto( lmlx, lmly );
PLGS_path( x, y );
line_new = 0;
break;
case 'T' : PLGS_text( op, lmlx, lmly, s, 0.0 ); break;
case 'C' : if( !vertchar ) PLGS_text( op, lmlx , lmly, s, 0.0 );
else if( vertchar ) PLGS_text( op, lmlx, lmly , s, 0.0 );
break;
case 'J' : if( !vertchar ) PLGS_text( op, lmlx, lmly, s, 0.0 );
else if( vertchar ) PLGS_text( op, lmlx, lmly , s, 0.0 );
break;
case 's' : PLGS_fill( ); return( 0 );
case 'k' : PLGS_color( s ); return( 0 );
case 'I' : PLGS_pointsize( (int)x ); return( 0 );
case 'F' : PLGS_font( s ); return( 0 );
case 'D' : PLGS_chardir( (int)x );
if( x == 90 || x == 270 ) vertchar = 1;
else vertchar = 0;
return( 0 );
case 'Y' : PLGS_linetype( s, x, y ); return( 0 );
/* case '<' : PLGS_objbegin( s ); return( 0 );
* case '>' : PLGS_objend(); return( 0 );
*/
case 'Z' : pagenum++; virginpage = 1; return( 0 );
case 'Q' : if( !virginpage ) pagenum++;
if( tightbb )
stat = PLGS_trailer( bb_x1-0.05, bb_y1-0.05, bb_x2+0.05, bb_y2+0.05 );
else if( specifycrop == 1 )
stat = PLGS_trailer( scx1, scy1, scx2, scy2 );
else if( specifycrop == 2 ) {
stat = PLGS_trailer( (bb_x1-0.05)-scx1, (bb_y1-0.05)-scy1, (bb_x2+0.05)+scx2, (bb_y2+0.05)+scy2 );
}
else
/* add 0.2" margin to be generous in cases of fat lines, etc. */
stat = PLGS_trailer( bb_x1-0.2, bb_y1-0.2, bb_x2+0.2, bb_y2+0.2 );
Eresetbb();
return( stat );
}
#endif
}
/*************** interface to swf driver */
else if( Edev == 'f' ) {
#ifndef NOSWF
if( op != 'L' ) {
if( line_drawing ) PLGF_stroke();
line_drawing = 0;
}
switch( op ) {
case 'L' : if( line_new ) PLGF_moveto( lmlx, lmly );
PLGF_lineto( x, y );
line_new = 0;
line_drawing = 1;
break;
case 'M' : line_new = 1; break;
case 'P' : if( line_new ) PLGF_moveto( lmlx, lmly );
PLGF_path( x, y );
line_new = 0;
break;
case 'T' : PLGF_text( op, lmlx, lmly, s, 0.0 ); break;
case 'C' : if( !vertchar ) PLGF_text( op, lmlx , lmly, s, 0.0 );
else if( vertchar ) PLGF_text( op, lmlx, lmly , s, 0.0 );
break;
case 'J' : if( !vertchar ) PLGF_text( op, lmlx, lmly, s, 0.0 );
else if( vertchar ) PLGF_text( op, lmlx, lmly , s, 0.0 );
break;
case 's' : PLGF_fill( ); return( 0 );
case 'k' : PLGF_color( s ); return( 0 );
case 'I' : PLGF_pointsize( (int)x ); return( 0 );
case 'F' : PLGF_font( s ); return( 0 );
case 'D' : PLGF_chardir( (int)x );
if( x == 90 || x == 270 ) vertchar = 1;
else vertchar = 0;
return( 0 );
case 'Y' : PLGF_linetype( s, x, y ); return( 0 );
/* case '<' : PLGF_objbegin( s ); return( 0 );
* case '>' : PLGF_objend(); return( 0 );
*/
case 'Z' : pagenum++; virginpage = 1; return( 0 );
case 'Q' : if( !virginpage ) pagenum++;
if( tightbb )
stat = PLGF_trailer( bb_x1-0.05, bb_y1-0.05, bb_x2+0.05, bb_y2+0.05 );
else if( specifycrop == 1 )
stat = PLGF_trailer( scx1, scy1, scx2, scy2 );
else if( specifycrop == 2 ) {
stat = PLGF_trailer( (bb_x1-0.05)-scx1, (bb_y1-0.05)-scy1, (bb_x2+0.05)+scx2, (bb_y2+0.05)+scy2 );
}
else
/* add 0.2" margin to be generous in cases of fat lines, etc. */
stat = PLGF_trailer( bb_x1-0.2, bb_y1-0.2, bb_x2+0.2, bb_y2+0.2 );
Eresetbb();
return( stat );
}
#endif
}
/* interface to postscript driver */
else if( Edev == 'p' ) {
#ifndef NOPS
if( op != 'L' ) {
if( line_drawing ) PLGP_stroke();
line_drawing = 0;
}
switch( op ) {
case 'L' : if( line_new ) PLGP_moveto( lmlx, lmly );
PLGP_lineto( x, y );
line_new = 0;
line_drawing = 1;
break;
case 'M' : line_new = 1; break;
case 'P' : if( line_new ) PLGP_moveto( lmlx, lmly );
PLGP_path( x, y );
line_new = 0;
break;
case 'T' : PLGP_text( op, lmlx, lmly, s, 0.0 ); break;
case 'C' : if( !vertchar ) PLGP_text( op, lmlx - 6.0, lmly, s, 12.0 );
else if( vertchar ) PLGP_text( op, lmlx, lmly - 6.0, s, 12.0 );
break;
case 'J' : if( !vertchar ) PLGP_text( op, lmlx-12.0, lmly, s, 12.0 );
else if( vertchar ) PLGP_text( op, lmlx, lmly - 12.0, s, 12.0 );
break;
case 's' : PLGP_fill( ); return( 0 );
case 'k' : PLGP_color( s ); return( 0 );
/* case 'c' : PLGP_closepath(); return( 0 ); */
case 'I' : PLGP_pointsize( (int)x ); return( 0 );
case 'F' : PLGP_font( s ); return( 0 );
case 'D' : PLGP_chardir( (int)x );
if( x == 90 || x == 270 ) vertchar = 1;
else vertchar = 0;
return( 0 );
case 'Y' : PLGP_linetype( s, x, y ); return( 0 );
case 'Z' : PLGP_show(); pagenum++; virginpage = 1; return( 0 );
case 'O' : PLGP_paper( (int)x ); return( 0 );
case 'Q' : if( !virginpage ) { PLGP_show(); pagenum++; }
if( tightbb )
PLGP_trailer( pagenum - 1, bb_x1-0.05, bb_y1-0.05, bb_x2+0.05, bb_y2+0.05 );
else if( specifycrop == 1 )
PLGP_trailer( pagenum - 1, scx1, scy1, scx2, scy2 );
else if( specifycrop == 2 ) {
PLGP_trailer( pagenum - 1, (bb_x1-0.05)-scx1, (bb_y1-0.05)-scy1,
(bb_x2+0.05)+scx2, (bb_y2+0.05)+scy2 );
}
else
/* add 0.2" margin to be generous in cases of fat lines, etc. */
PLGP_trailer( pagenum - 1, bb_x1-0.2, bb_y1-0.2, bb_x2+0.2, bb_y2+0.2 );
Eresetbb();
return( 0 );
}
#endif
}
else if( Edev == 'n' ) ; /* null device.. do nothing */
else {
if( Edev == '\0' ) return( Eerr( 12021, "Graphics subsystem never initialized", "" ) );
else {
char sdev[8];
sprintf( sdev, "%c", Edev );
return( Eerr( 12022, "Unrecognized graphic device code", sdev ) );
}
}
if( op == 'M' ) { lmlx = x; lmly = y; } /* remember most recent 'move' */
/* figure approximate text dimensions */
/* if( Edev != 'x' && GL_member( op, "TCJ" )) { */ /* why not x? scg 8/12/05 */
if( GL_member( op, "TCJ" )) {
txt_width = strlen( s ) * Ecurtextwidth;
txt_width *= globalscale;
}
if( keeping_bb ) {
/* keep bounding box info (minima and maxima) */
if( GL_member( op, "LP." ) ) {
if( prev_op == 'M' ) Ebb( lmlx, lmly );
Ebb( x, y );
}
/* normal (horizontal) text operations. (vertical text below) */
else if( op == 'T' && !vertchar ) {
if( prev_op == 'M' ) Ebb( lmlx, lmly );
Ebb( lmlx + txt_width+0.05, lmly + (Ecurtextheight*globalscale) );
}
else if( op == 'C' && !vertchar ) {
Ebb( lmlx - ((txt_width/2.0)+0.05), lmly );
Ebb( lmlx + ((txt_width/2.0)+0.05), lmly + (Ecurtextheight*globalscale) );
}
else if( op == 'J' && !vertchar ) {
Ebb( lmlx - (txt_width+0.05), lmly );
Ebb( lmlx, lmly + (Ecurtextheight*globalscale) );
}
}
prev_op = op;
/* handle vertical text .. must be simulated for x windows;
also gets bounding box for vertical text operations (all devices) */
if( vertchar && GL_member( op, "TCJ" )) verttextsim( op, s );
return( 0 );
}
#ifdef NOX11
int
PLG_getclick()
{
if( Edev == 'p' ) {
Eshow(); /* eject page and return.. */
return(0);
}
else if( Edev == 'g' ) {
Eendoffile();
return( 0 );
}
return( 0 );
}
#endif
/* ============================================= */
/* BB - keep an overall bounding box for the entire image.
Also call Echeckbb() to maintain nested object bounding boxes.. */
int
PLG_bb( x, y )
double x, y;
{
if( keeping_bb ) {
/* if( ( x < bb_x1 && x < 0.0 ) || (x > bb_x2 && x > 8.0 ) ) fprintf( pcodedebugfp, "draw out X = %g\n", x );
* if( ( y < bb_y1 && y < 0.0 ) || (y > bb_y2 && y > 8.0 ) ) fprintf( pcodedebugfp, "draw out Y = %g\n", y );
* }
*/
if( x < bb_x1 ) { bb_x1 = x; if( pcodedebug == 2 ) { fprintf( pcodedebugfp, "(new x min %g)\n", x ); }}
if( x > bb_x2 ) { bb_x2 = x; if( pcodedebug == 2 ) { fprintf( pcodedebugfp, "(new x max %g)\n", x ); }}
if( y < bb_y1 ) { bb_y1 = y; if( pcodedebug == 2 ) { fprintf( pcodedebugfp, "(new y min %g)\n", y ); }}
if( y > bb_y2 ) { bb_y2 = y; if( pcodedebug == 2 ) { fprintf( pcodedebugfp, "(new y max %g)\n", y ); }}
}
if( keep_bb2 ) {
if( x < bb2_x1 ) bb2_x1 = x;
if( x > bb2_x2 ) bb2_x2 = x;
if( y < bb2_y1 ) bb2_y1 = y;
if( y > bb2_y2 ) bb2_y2 = y;
}
return( 0 );
}
/* ============================================== */
/* RESETBB - needed for multiple pages */
int
PLG_resetbb()
{
bb_x1 = 999;
bb_y1 = 999;
bb_x2 = -999;
bb_y2 = -999;
return( 0 );
}
/* ============================================= */
/* GETBB - get current bounding box.. */
int
PLG_getbb( xlo, ylo, xhi, yhi )
double *xlo, *ylo, *xhi, *yhi;
{
*xlo = bb_x1 / globalscale;
*ylo = bb_y1 / globalscaley;
*xhi = bb_x2 / globalscale;
*yhi = bb_y2 / globalscaley;
return( 0 );
}
/* ============================================== */
/* GETTEXTSIZE - get width and height of last text item.. */
int
PLG_gettextsize( w, h )
double *w, *h;
{
*w = txt_width;
*h = Ecurtextheight;
return( 0 );
}
/* ================================================ */
/* VERTTEXTSIM - vertical text bounding box, also simulation for X11 displays */
static int
verttextsim( op, s )
char op, s[];
{
double dist, y1, y2, x, y;
int len;
len = strlen( s );
if( Edev == 'x' ) dist = len * (Ecurtextheight * globalscale);
else dist = len * (Ecurtextwidth * globalscale);
if( op == 'T' ) { y1 = lmly; y2 = lmly + dist; }
else if( op == 'C' ) { y1 = lmly - (dist/2); y2 = lmly + (dist/2); }
else if( op == 'J' ) { y1 = lmly - dist; y2 = lmly; }
if( Edev == 'x' ) x = lmlx - (Ecurtextwidth * globalscale);
else x = lmlx;
y = y2;
#ifndef NOX11
if( Edev == 'x' ) {
int i;
char let[4];
double w;
for( i = 0; i < len; i++ ) {
sprintf( let, "%c", s[i] );
PLGX_moveto( x, y );
PLGX_text( let, &w );
y -= (Ecurtextheight * globalscale);
}
}
#endif
Ebb( x-(Ecurtextheight*globalscale), y1 );
Ebb( x-(Ecurtextheight*globalscale), y2 );
return( 0 );
}
#ifdef SUSPENDED
/* ==================================================== */
/* SQUELCH_DISPLAY - 1 = squelch all display activity, 0 restore to normal */
/* Used to calculate bounding box without displaying */
/* handles nested calls. */
int
PLG_squelch_display( mode )
int mode;
{
static int snest = 0;
if( mode == 1 ) {
snest++;
squelched = 1;
}
else if( mode == 0 ) {
if( snest > 0 ) snest--;
if( snest == 0 )squelched = 0;
}
}
#endif
/* ==================================================== */
/* INIT_BB2 - a second bounding box available to app */
int
PLG_init_bb2( )
{
keep_bb2 = 1;
bb2_x1 = 999.0; bb2_y1 = 999.0; bb2_x2 = -999.0; bb2_y2 = -999.0;
return( 0 );
}
/* ==================================================== */
/* GET_BB2 - get the second bounding box */
int
PLG_get_bb2( x1, y1, x2, y2 )
double *x1, *y1, *x2, *y2;
{
*x1 = bb2_x1/globalscale; *y1 = bb2_y1/globalscaley; *x2 = bb2_x2/globalscale; *y2 = bb2_y2/globalscaley;
/* keep_bb2 = 0; */
return( 0 );
}
/* ==================================================== */
/* TIGHTBB - switch ON=don't add margin when doing final BB crop */
int
PLG_tightbb( mode )
int mode;
{
tightbb = mode;
return( 0 );
}
/* ==================================================== */
/* SPECIFYCROP - application may use this to specify crop rectangle */
int
PLG_specifycrop( mode, x1, y1, x2, y2 )
int mode; /* 0=off 1=absolute values 2=relative to tightcrop values */
double x1, y1, x2, y2;
{
specifycrop = mode;
if( specifycrop ) { scx1 = x1; scy1 = y1; scx2 = x2; scy2 = y2; }
return( 0 );
}
#ifdef HOLD
/* ==================================================== */
/* SANEZONE - application may use this to specify a sane zone. If pcode gets
a request to draw outside of the sane zone, the draw operation is cancelled
before calling the device drivers. This addresses the issue where a wild
draw request gets thru to GD which in turn creates an enormous image. Added scg 5/8/06 */
int
PLG_sanezone( x1, y1, x2, y2 )
double x1, y1, x2, y2;
{
/* currently only keeping x2,y2, since they seem to be the main problem (in GD anyway..) */
xsanemax = x2; ysanemax = y2;
sanezone = 1;
return( 0 );
}
#endif
/* ==================================================== */
/* GIFRECT - direct interface to GD driver for better efficiency on rectangles */
int
PLG_gifrect( xlo, yhi, xhi, ylo, color )
double xlo, yhi, xhi, ylo;
char *color;
{
#ifndef NOGD
char oldcolor[COLORLEN];
strcpy( oldcolor, Ecurcolor );
strcpy( Ecurcolor, color ); /* so that Ecolor() knows to change back below.. scg 6/18/04 */
/* if( globalscale != 1.0 ) { .... changed scg 3/28/06 */
if( globalscale != 1.0 || globalscaley != 1.0 ) {
xlo *= globalscale; ylo *= globalscaley;
xhi *= globalscale; yhi *= globalscaley;
}
PLGG_rect( xlo, yhi, xhi, ylo, color );
Ebb( xlo, ylo );
Ebb( xhi, yhi );
Ecolor( oldcolor );
#endif
return( 0 );
}
/* ==================================================== */
/* IMLOAD - for GD this loads the named image file...
* - for SVG this tells the svg driver to remember image filename for later
*/
int
PLG_imload( filename, width, height )
char *filename;
int width, height; /* optional, may be given if known here but not known at time of implace() (eg. symboldetails)... otherwise 0, 0 */
{
int stat;
stat = 1;
if( globalscale != 1.0 || globalscaley != 1.0 ) {
width = (int) (width * globalscale); height = (int) (height * globalscaley);
}
if( Edev == 'g' ) {
#ifndef NOGD
stat = PLGG_imload( filename, width, height );
#endif
}
else if( Edev == 's' && width != 0 && height != 0 ) {
#ifndef NOSVG
stat = PLGS_setimg( filename, width, height );
#endif
}
return( stat );
}
/* ==================================================== */
/* IMPLACE - for GD this places the currently loaded image file at x,y (filename not used).
* - for SVG this adds an tag to the svg output file (image filename
*/
int
PLG_implace( x, y, filename, align, width, height )
double x, y;
char *filename; /* image file, used by svg only .. but not required if filename was set earlier using imload() */
char *align; /* alignment, used by gd and svg */
int width, height; /* render the image in this width and height (in pixels) */
{
int stat;
stat = 1;
if( globalscale != 1.0 || globalscaley != 1.0 ) {
x *= globalscale; y *= globalscaley;
width = (int) (width * globalscale); height = (int) (height * globalscaley);
}
if( Edev == 'g' ) {
#ifndef NOGD
stat = PLGG_implace( x, y, align, width, height );
#endif
}
else if( Edev == 's' ) {
#ifndef NOSVG
if( line_drawing ) PLGS_stroke();
line_drawing = 0;
width = (int) (width * 0.72 ); /* svg wants image dimensions in svg pixels (72 per inch) */
height = (int) (height * 0.72 );
stat = PLGS_showimg( filename, x, y, align, width, height );
#endif
}
return( stat );
}
/* ===================================================== */
/* SETGLOBALSCALE - set global scale factor */
int
PLG_setglobalscale( sx, sy )
double sx, sy;
{
if( sx < 0.01 || sx > 20.0 ) return( Eerr( 20815, "Invalid global scaling", "" ) );
if( sy < 0.01 || sy > 20.0 ) return( Eerr( 20815, "Invalid global scaling", "" ) );
globalscale = sx;
globalscaley = sy;
Estandard_lwscale = 1.0 * sx;
return( 0 );
}
/* ===================================================== */
/* GETGLOBALSCALE - get global scale factor */
int
PLG_getglobalscale( sx, sy )
double *sx, *sy;
{
*sx = globalscale;
*sy = globalscaley;
return( 0 );
}
/* ======================================= */
/* SETPOSTEROFS - set poster offset (paginated postscript only).
x, y are in absolute units, and are where the lower-left of the page will be.
So if I have a poster made of 4 8.5x11 sheets held portrait style,
the lowerleft would use 0,0
the lowerright would use 8,0
the upperleft would use 0,10.5
the lowerright would use 8,10.5
(8 and 10.5 are used because of print margins).
The four pages can then be trimmed w/ a paper cutter and butted up against
one another to create a poster.
*/
int
PLG_setposterofs( x, y )
double x, y;
{
postermode = 1;
posterxo = x * (-1.0);
posteryo = y * (-1.0);
return( 0 );
}
/* ========================================== */
/* PCODEDEBUG - turn on/off local debugging */
int
PLG_pcodedebug( mode, fp )
int mode;
FILE *fp; /* stream for diagnostic output */
{
pcodedebug = mode;
pcodedebugfp = fp;
return( 0 );
}
/* =========================================== */
int
PLG_pcodeboundingbox( mode )
int mode;
{
keeping_bb = mode;
return( 0 );
}
/* =========================================== */
int
PLG_setdumpfile( dumpfile, filemode )
char *dumpfile;
char *filemode;
{
dumpfp_closable = 0;
if( strcmp( dumpfile, "stdout" )==0 ) dumpfp = stdout;
else {
dumpfp = fopen( dumpfile, filemode );
if( dumpfp == NULL ) return( Eerr( 57202, "cannot open dump file", dumpfile ) );
dumpfp_closable = 1;
fprintf( dumpfp, "A 0 0 init-graphics\n" ); /* added scg 5/24/07 */
}
ndumplines = 0;
return( 0 );
}
/* ========================================= */
int
PLG_closedumpfile()
{
if( dumpfp_closable && dumpfp != NULL ) fclose( dumpfp );
dumpfp = NULL; /* can't assume on linux */
return( 0 );
}
/* ========================================= */
int
PLG_setdumpmaxlines( nlines )
int nlines;
{
dumpmax = nlines;
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/preliminaries.c 0000644 0001750 0001750 00000025461 12124630765 016111 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2006 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
#include "pl.h"
#include "tdhkit.h"
#ifndef CONFIGFILE
#define CONFIGFILE ""
#endif
#ifdef LOCALE
#include
#endif
extern int PLGS_setparms(), PLGF_setparms();
extern int fchmod(), chdir();
extern int TDH_inquisp;
extern int PLGG_initstatic(), PLGP_initstatic(), PLGS_initstatic(), PLGF_initstatic();
/* =========================================== */
/* DO_PRELIMINARIES - set defaults, read config file, etc. */
int
PL_do_preliminaries()
{
char buf[512];
FILE *fp;
char *filename, *getenv();
char attr[80];
char val[512];
char *lineval;
int ix;
int valused, found;
int i, stat, j;
int projectrootfound;
char pathslash;
char uniq[80];
char configfile[MAXPATH];
char cgierrfile[80];
TDH_errprog( "pl" );
/* set pre-config (hard-coded) defaults.. */
PLS.debug = 0;
PLS.echolines = 0;
PLS.skipout = 0;
PLS.eready = 0;
PLS.prefabsdir = NULL;
strcpy( PLS.outfile, "" );
PLS.winx = 100; PLS.winy = 0; PLS.winw = 8.0; PLS.winh = 8.0;
PLS.winsizegiven = 0;
PLS.bkcolorgiven = 0;
PLS.clickmap = 0;
PLS.usingcm = 0;
strcpy( PLS.viewer, "" );
strcpy( PLS.mapfile, "" );
PLS.noshell = 0;
TDH_prohibit_shell( 0 );
#ifndef WIN32
TDH_reslimits( "cpu", CPULIMIT );
#endif
#ifdef LOCALE
setlocale(LC_CTYPE, "" );
setlocale(LC_COLLATE, "" );
#endif
#ifdef NOX11
PLS.device = 'e';
#else
PLS.device = 'x';
#endif
PLD.maxrows = MAXDROWS;
PLD.maxdf = MAXD;
PLL.maxproclines = MAXPROCLINES;
PLVsize = MAXDAT;
PLG_set_early_defaults();
PLS.errfp = stderr; /* portability? */
PLS.diagfp = stderr; /* portability? */
PLS.bignumspacer = '\0'; /* use standard number notation */
PLS.bignumthres = 4;
suppress_convmsg( 1 ); /* suppress unplottable data msgs by default - user can turn on */
DT_checkdatelengths( 0 ); /* don't be strict about the length of date items */
setintvar( "CM_UNITS", 0 );
projectrootfound = 0;
strcpy( TDH_tmpdir, TMPDIR );
pathslash = PATH_SLASH;
/* set this now, but it might be updated depending on what's in config file.. */
GL_make_unique_string( uniq, 0 );
sprintf( PLS.tmpname, "%s%cplo%s", TDH_tmpdir, pathslash, uniq );
/* make cgierrfile (default /tmp/plcgi_err) for cgi errors */
sprintf( cgierrfile, "%s%cplcgi_err", TDH_tmpdir, PATH_SLASH );
/* reads and process config file, if any.. */
if( PLS.cgiargs != NULL ) {
/* determine name of config file.. (can't use PLOTICUS_CONFIG in CGI context) */
char *cgiprogname;
strcpy( buf, "file=" );
strcat( buf, CONFIGFILE );
if( strlen( buf ) == 5 ) { /* CONFIGFILE not set.. retrieve prog name from CGI environment and
build config file name from that.. */
cgiprogname = getenv( "SCRIPT_FILENAME" );
if( cgiprogname == NULL ) {
PLS.errfp = fopen( cgierrfile, "w" );
if( PLS.errfp != NULL ) {
fprintf( PLS.errfp, "cgi var SCRIPT_FILENAME not found.\n" );
#ifdef UNIX
fchmod( fileno( PLS.errfp ), 00666 );
#endif
}
TDH_errfile( PLS.errfp ); /* set it for TDH */
return( 1 );
}
strcat( buf, cgiprogname );
j = strlen( buf ) -4;
if( strcmp( &buf[ j ], ".cgi" )==0 ) buf[ j ] = '\0';
else if( strcmp( &buf[ j ], ".exe" )==0 ) buf[ j ] = '\0';
strcat( buf, ".cnf" );
}
strcpy( configfile, buf );
}
else {
/* command line usage.. check PLOTICUS_CONFIG.. */
filename = getenv( "PLOTICUS_CONFIG" );
if( filename == NULL ) goto SKIPCONFIG;
sprintf( configfile, "file=%s", filename );
}
if( strlen( configfile ) == 5 ) {
if( PLS.cgiargs != NULL ) goto BAD_CGI_CONFIG;
else goto SKIPCONFIG; /* no config file given.. */
}
stat = TDH_readconfig( configfile );
/* no point in checking return stat.. */
/* do this again because TDH_tmpdir might have been updated.. */
GL_make_unique_string( uniq, 0 );
sprintf( PLS.tmpname, "%s%cplo%s", TDH_tmpdir, pathslash, uniq );
/* now read it again to get pl-specific items.. */
fp = fopen( &configfile[5], "r" );
if( fp == NULL ) {
if( PLS.cgiargs != NULL ) {
BAD_CGI_CONFIG:
PLS.errfp = fopen( cgierrfile, "w" );
if( PLS.errfp != NULL ) {
fprintf( PLS.errfp, "cgi mode: cannot open config file (%s).\n", &configfile[5] );
#ifdef UNIX
fchmod( fileno( PLS.errfp ), 00666 );
#endif
}
return( 1 );
}
else Eerr( 15060, "Cannot open ploticus config file", &configfile[5] );
return( 0 );
}
/* get user settings.. */
while( fgets( buf, 511, fp ) != NULL ) {
buf[ strlen( buf ) -1 ] = '\0';
ix = 0;
strcpy( attr, GL_getok( buf, &ix ) );
if( attr[0] == '\0' ) continue;
if( attr[0] == '#' || attr[0] == '/' ) continue; /* skip comments of various kinds */
while( isspace( (int) buf[ix] ) )ix++;
lineval = &buf[ix];
strcpy( val, GL_getok( buf, &ix ) );
if( attr[ strlen( attr ) -1 ] == ':' ) attr[ strlen( attr ) - 1 ] = '\0';
/* attributes that exist in config file, but not proc settings, go here: */
if( strcmp( attr, "projectroot" )==0 ) {
stat = chdir( val );
if( stat != 0 ) goto CGI_BAD_CHDIR;
projectrootfound = 1;
if( PLS.debug ) fprintf( PLS.diagfp, "config: found projectroot.. chdir to %s..\n", val );
}
else if( strcmp( attr, "option" )==0 ) {
val[0] = '\0';
sscanf( buf, "%*s %s %s", attr, val );
/* check for embedded '=' in attr.. if found indicates prefab parm setting.. send lineval as attr.. */
for( i = 0, found = 0; attr[i] != '\0'; i++ ) if( attr[i] == '=' ) { found = 1; break; }
if( found ) { strcpy( attr, lineval ); strcpy( val, "" ); }
if( PLS.debug ) fprintf( PLS.diagfp, "config file: got option: %s %s\n", attr, val );
PL_process_arg( attr, val, &valused, &found );
if( !found ) Eerr( 2784, "invalid 'option:' in config file", attr );
}
/* shared settings takes care of settings that can be set in config file OR proc settings */
else {
stat = PL_sharedsettings( attr, lineval );
/*was: stat = PL_sharedsettings( attr, val, lineval ); */
if( stat == 0 && PLS.debug ) fprintf( PLS.diagfp, "config: setting %s to %s\n", attr, lineval );
}
/* don't forget that there are other settings (tmpdir, date-related, etc.)
* that were handled by the TDH config file reader !!
*/
}
fclose( fp );
SKIPCONFIG:
if( PLS.cgiargs != NULL && !projectrootfound ) {
CGI_BAD_CHDIR:
PLS.errfp = fopen( cgierrfile, "w" );
if( PLS.errfp != NULL ) {
fprintf( PLS.errfp, "cgi mode: no projectroot in config file, or could not chdir to projectroot\n" );
#ifdef UNIX
fchmod( fileno( PLS.errfp ), 00666 );
#endif
}
return( 1 );
}
/* get prefabs directory name if available.. */
/* this must come after config file is read, because in cgi mode PLOTICUS_PREFABS is set via config file. */
PLS.prefabsdir = getenv( "PLOTICUS_PREFABS" );
/* maybe PREFABS_DIR was set in pl.h ... */
if( PLS.prefabsdir == NULL ) PLS.prefabsdir = PREFABS_DIR ;
else if( PLS.prefabsdir[0] == '\0' ) PLS.prefabsdir = PREFABS_DIR ;
if( PLS.prefabsdir[0] == '\0' ) PLS.prefabsdir = NULL;
if( PLS.prefabsdir != NULL ) {
TDH_setspecialincdir( PLS.prefabsdir ); /* set special include directory (#include $foo) */
/* note: prefabsdir must reference static storage, either via getenv() or constant */
}
return( 0 );
}
/* ====================================== */
/* BEGIN - initializations that are done AFTER config file and args are looked at.. */
int
PL_begin()
{
char buf[128];
/* graphcore initializations.. */
Esetsize( PLS.winw, PLS.winh, PLS.winx, PLS.winy );
EDXlo = 0.0; EDXhi = 0.0; EDYlo = 0.0; EDYhi = 0.0;
PLS.eready = 0;
#ifndef NOSVG
if( PLS.device == 's' ) PLGS_setparms( PLS.debug, PLS.tmpname, PLS.clickmap );
#endif
#ifndef NOSWF
if( PLS.device == 'f' ) PLGF_setparms( PLS.debug, PLS.tmpname, Estandard_font ); /* pass user selected -font if any */
#endif
/* initialize the data structures.. */
PL_init_mem();
if( PLS.debug ) {
fprintf( PLS.diagfp, "Version: pl %s\n", PLVERSION );
if( PLS.cgiargs != NULL ) fprintf( PLS.diagfp, "operating in CGI mode\n" );
Epcodedebug( 1, PLS.diagfp ); /* tell pcode.c to output diagnostics too */
}
/* set PLVERSION variable.. */
sprintf( buf, "ploticus %s http://ploticus.sourceforge.net (GPL)", PLVERSION );
TDH_setvar( "PLVERSION", buf );
if( PLS.clickmap ) { /* .map filename */
if( PLS.mapfile[0] == '\0' ) {
if( PLS.clickmap == 2 ) strcpy( PLS.mapfile, "stdout" ); /* csmap defaults to stdout.. scg 8/26/04 */
else if( PLS.outfile[0] != '\0' ) makeoutfilename( PLS.outfile, PLS.mapfile, 'm', 1);
else strcpy( PLS.mapfile, "unnamed.map" );
}
PL_clickmap_init();
}
return( 0 );
}
/* ================================== */
/* INIT_STATICS - initialize static variables */
int
PL_init_statics()
{
PLG_cblock_initstatic();
PLG_init_initstatic();
PLG_mark_initstatic();
PLG_pcode_initstatic();
PLG_stub_initstatic();
PL_execline_initstatic();
PL_fieldnames_initstatic();
PL_units_initstatic();
PL_lib_initstatic();
PLP_bars_initstatic();
/* PLP_getdata_initstatic(); */
PLP_legend_initstatic();
PLP_processdata_initstatic();
#ifndef NOGD
PLGG_initstatic() ;
#endif
#ifndef NOPS
PLGP_initstatic();
#endif
#ifndef NOSVG
PLGS_initstatic();
#endif
#ifndef NOSWF
PLGF_initstatic();
#endif
/* no initstatic for X11 .. doesn't seem necessary now */
/* the following static initializations shouldn't be done if ploticus is being invoked
from environments (eg quisp) where the TDH stuff is already in action.. */
if ( ! TDH_inquisp ) {
GL_initstatic();
TDH_condex_initstatics();
TDH_err_initstatic();
TDH_functioncall_initstatic();
TDH_valuesubst_initstatic();
TDH_setvar_initstatic();
TDH_shell_initstatic();
DT_initstatic();
DT_time_initstatic();
DT_datetime_initstatic();
TDH_readconfig_initstatic(); /* some doubt on this one */
}
return( 0 );
}
/* ================================== */
/* INIT_MEM - initialize pl data structures */
int
PL_init_mem()
{
/* data array stuff.. */
PLD.datarow = (char **) malloc( PLD.maxrows * sizeof( char * ) );
PLD.df = (char **) malloc( PLD.maxdf * sizeof( char * ) );
PLD.currow = 0;
PL_cleardatasets();
PLL.procline = (char **) malloc( PLL.maxproclines * sizeof( char * ) );
PLV = (double *) malloc( PLVsize * sizeof( double ));
PLVhalfsize = PLVsize / 2;
PLVthirdsize = PLVsize / 3;
return( 0 );
}
/* ================================== */
/* FREE - free all mallocated memory. */
int
PL_free( )
{
int i;
PL_clickmap_free();
PL_catfree();
free( PLD.df );
for( i = 0; i < PLD.currow; i++ ) free( PLD.datarow[ i ] );
free( PLD.datarow );
for( i = 0; i < PLL.nlines; i++ ) free( PLL.procline[ i ] );
free( PLL.procline );
free( PLV ); /* scg 5/16/03 */
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/gdfontt.h 0000644 0001750 0001750 00000000637 06736024172 014717 0 ustar colin colin
#ifndef _GDFONTT_H_
#define _GDFONTT_H_ 1
/*
This is a header file for gd font, generated using
bdftogd version 0.5 by Jan Pazdziora, adelton@fi.muni.cz
from bdf font
-Misc-Fixed-Medium-R-Normal--8-80-75-75-C-50-ISO8859-2
at Thu Jan 8 13:49:54 1998.
The original bdf was holding following copyright:
"Libor Skarvada, libor@informatics.muni.cz"
*/
#include "gd.h"
extern gdFontPtr gdFontTiny;
#endif
ploticus-2.42/src/NOTES_sharedlib_python 0000644 0001750 0001750 00000003734 11226666671 017341 0 ustar colin colin
pyPloticus is a python wrapper for libploticus. On my Mandriva 2009.1 system I was having trouble
with an undefined symbol error after compiling libploticus 2.41 and then installing pyPloticus.
It all compiled and installed OK but on importing the python module from inside the python
interpreter I would get and "undefined symbol PLGG_pixpt" error.
A small change to the ploticus Makefile has fixed this. As Steve says in his Makefile the shared
library part of the Makefile hasn't been tested - well on Mandriva 2009.1 at least, it now has.
The key changes to Makefile are
1. Select option 5 by commenting out line 28 (option 1) and uncommenting lines 74 to 78.
2. Lines 223 to 226 should look like this
libploticus-static: $(OBJ) api.o gd00files gd16files
$(RMCOM) libploticus.$(LIBEXT)
$(ARCOM) libploticus.$(LIBEXT) $(OBJ) api.o $(GD16) $(GD)
3. Add $(FPIC) to the compilation of gd00files and gd16files [THIS HAS BEEN DONE IN THE MAKEFILE -SG]
4. Now "make clean" then "make"
5. Copy your squeaky new libploticus.a file to /usr/lib (or if like me you have a 64 bit machine then
/usr/lib64) but in the process rename the file to libploticus.so.0.0 (you have actually created a
shared library but I think pyPloticus compilation expects a file with a ".a" extension).
6. Run ldconfig -n /usr/lib (ldconfig -n /usr/lib64 for 64 bitters)
7. You can now go to pyPloticus and first edit the setup.py file changing the plot_src_path to point to
the location of the newly created libploticus.a file (something like plot_src_path="../pl241src/src/")
8. Run "python setup.py install"
You should now have it all set to go.
Testing
1. Start the python interpreter "python"
2. try to import the ploticus module "import ploticus"
You should get no errors at this point
3. You can now try the pyPloticus examples "python plot.py graph.html"
I get some errors listed but the graph srcc.png still get produced.
Hope this help someone please tell me if you have other errors of if this works for you.
ploticus-2.42/src/process_arg.c 0000644 0001750 0001750 00000024635 11155516576 015565 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROCESS_ARG - process one command line argument from pl */
#include "pl.h"
extern char TDH_tmpdir[];
extern int PLGS_showtag(), PLGS_zlevel(), PLGS_setxmlparms(), PLGG_setimpixsize();
extern int chmod(), fchmod(), chdir();
int
PL_process_arg( opt_in, val, valused, found )
char *opt_in; /* option */
char *val; /* argument that follows option */
int *valused; /* 1 if val was used, 0 if not */
int *found; /* 1 if option found here, 0 if not */
{
int j, nt, slen, rtnstat, olen, vardec;
char buf[256], opt[256];
if( PLS.debug ) { fprintf( PLS.diagfp, "Got command line arg(s): %s ", opt_in ); fflush( PLS.diagfp ); }
*found = 1;
rtnstat = 0;
vardec = 0;
/* all parameters and args processed herein are truncated silently to length 255. changed, scg 5/30/06 */
if( opt_in[0] == '-' ) strncpy( opt, &opt_in[1], 255 );
else strncpy( opt, opt_in, 255 );
opt[255] = '\0';
/* see if it is a var=value parameter.. if so get it, we're done */
if( opt_in[0] != '-' ) { /* condition added scg 5/30/06 */
for( j = 0, slen = strlen( opt ); j < slen; j++ ) {
if( opt[j] == '=' ) { /* yes, its a var=value parameter */
int ix;
char varname[40];
strcpy( buf, opt );
ix = 0;
GL_getseg( varname, buf, &ix, "=" );
TDH_setvar( varname, &buf[ix] );
if( PLS.debug ) fprintf( PLS.diagfp, " ...setting var %s to: %s.\n", varname, &buf[ix] );
*valused = 0;
return( rtnstat );
}
}
}
/* add to list of parameters set on command line.. */
olen = strlen( opt );
if( olen < 40 ) { /* length check added.. scg 3/16/06 */
if( (strlen( PLS.cmdlineparms ) + olen) < 290 ) {
strcat( PLS.cmdlineparms, opt );
strcat( PLS.cmdlineparms, " " );
}
}
*valused = 1;
if( GL_slmember( opt, "x11 gif png jpeg wbmp ps bwps eps svg svgz swf" )) {
rtnstat = devnamemap( &(PLS.device), opt, 1 );
*valused = 0;
}
else if( strcmp( opt, "debug" )==0) {
PLS.debug = 1;
*valused = 0;
if( PLS.cgiargs != NULL ) {
/* -debug in cgi mode writes stuff to fixed temp dir files.. */
sprintf( buf, "%s%cplcgi_diag", TDH_tmpdir, PATH_SLASH );
PLS.diagfp = fopen( buf, "w" );
if( PLS.diagfp == NULL ) PLS.diagfp = stderr;
#ifdef UNIX
else fchmod( fileno( PLS.diagfp ), 00666 );
#endif
sprintf( buf, "%s%cplcgi_err", TDH_tmpdir, PATH_SLASH );
PLS.errfp = fopen( buf, "w" );
if( PLS.errfp == NULL ) PLS.errfp = stderr;
#ifdef UNIX
else fchmod( fileno( PLS.errfp ), 00666 );
#endif
}
}
else if( strcmp( opt, "bbdebug" )==0 ) {
Epcodedebug( 2, stderr ); /* tell pcode.c to output bounding box diagnostics */
*valused = 0;
}
else if( strcmp( opt, "tightcrop" )==0 ) { Etightbb(1); *valused = 0; }
else if( strcmp( opt, "crop" )==0 || strcmp( opt, "croprel" ) ==0 ) {
double cropx1, cropy1, cropx2, cropy2;
nt = sscanf( val, "%lf,%lf,%lf,%lf", &cropx1, &cropy1, &cropx2, &cropy2 );
if( nt != 4 )
fprintf( PLS.errfp, "pl argument error, correct usage is: -crop x1,y1,x2,y2 OR -croprel left,bottom,right,top\n" );
else {
if( PLS.usingcm ) { cropx1 /= 2.54; cropy1 /= 2.54; cropx2 /= 2.54; cropy2 /= 2.54; }
if( strcmp( opt, "croprel" )==0 ) Especifycrop( 2, cropx1, cropy1, cropx2, cropy2 ); /* relative to tight */
else Especifycrop( 1, cropx1, cropy1, cropx2, cropy2 ); /* absolute */
}
}
else if( strcmp( opt, "pagesize" )==0 ) {
nt = sscanf( val, "%lf,%lf", &(PLS.winw), &(PLS.winh) );
if( nt != 2 ) fprintf( PLS.errfp, "pl argument error, correct usage is: -pagesize width,height (in inches or cm)\n" );
else PLS.winsizegiven = 1;
if( PLS.usingcm ) { PLS.winw /= 2.54; PLS.winh /= 2.54; }
}
else if( strcmp( opt, "pixsize" )==0 ) { /* added scg 1/9/08 */
int reqwidth, reqheight;
nt = sscanf( val, "%d,%d", &reqwidth, &reqheight );
if( nt != 2 ) fprintf( PLS.errfp, "pl argument error, correct usage is: -pixsize width,height (in pixels)\n" );
#ifndef NOGD
PLGG_setimpixsize( reqwidth, reqheight );
#endif
if( PLS.device != 'g' ) fprintf( PLS.errfp, "-pixsize ignored.. it's only applicable when generating png/gif/jpeg images\n" );
}
else if( strcmp( opt, "winloc" )==0 ) {
nt = sscanf( val, "%d,%d", &(PLS.winx), &(PLS.winy) );
if( nt != 2 ) {
PLS.winx = 100; PLS.winy = 0;
fprintf( PLS.errfp, "pl argument error, correct usage is: -winloc x,y\n" );
}
}
else if( strcmp( opt, "o" )==0 ) {
strncpy( PLS.outfile, val, MAXPATH-2 );
PLS.outfile[MAXPATH-2] = '\0';
}
else if( strcmp( opt, "scale" )==0) {
double sx, sy;
nt = sscanf( val, "%lf,%lf", &sx, &sy );
if( nt == 1 ) Esetglobalscale( sx, sx );
else if( nt == 2 ) Esetglobalscale( sx, sy );
}
else if( strcmp( opt, "posteroffset" )==0) {
double x, y;
nt = sscanf( val, "%lf,%lf", &x, &y );
if( nt != 2 ) fprintf( PLS.errfp, "pl argument error, correct usage is -posteroffset x,y\n" );
else {
if( PLS.usingcm ) { x /= 2.54; y /= 2.54; }
Esetposterofs( x, y );
}
}
else if( strcmp( opt, "maxrows" )==0 ) { if( atoi( val ) > 1000 ) PLD.maxrows = atoi( val ); }
else if( strcmp( opt, "maxfields" )==0 ) { if( atoi( val ) > 10000 ) PLD.maxdf = atoi( val ); }
else if( strcmp( opt, "maxproclines" )==0 ) { if( atoi( val ) > 500 ) PLL.maxproclines = atoi( val ); }
else if( strcmp( opt, "maxvector" )==0 ) { if( atoi( val ) > 500 ) PLVsize = atoi( val ); }
else if( strcmp( opt, "maxdrawpoints" )==0 ) { PLG_setmaxdrivervect( atoi( val )); }
else if( strcmp( opt, "dir" )==0 ) chdir( val );
else if( strcmp( opt, "outlabel" )==0 ) Esetoutlabel( val );
else if( strcmp( opt, "map" )==0 ) { /* server side map */
PLS.clickmap = 1; *valused = 0;
fprintf( PLS.errfp, "warning, server-side clickmaps (-map) are deprecated in 2.40 in favor of client-side (-csmap)\n" );
}
else if( strcmp( opt, "mapdemo" )==0 ) {
PLS.clickmap = 1; *valused = 0;
PL_clickmap_demomode( 1 );
fprintf( PLS.errfp, "warning, server-side clickmaps (-map) are deprecated in 2.40 in favor of client-side (-csmap)\n" );
}
else if( strcmp( opt, "csmap" )==0 ) { PLS.clickmap = 2; *valused = 0; } /* client side map */
else if( strcmp( opt, "csmapdemo" )==0 ) { PLS.clickmap = 2; *valused = 0; PL_clickmap_demomode( 1 ); } /* client side map */
else if( strcmp( opt, "mapfile" )==0 ) {
strcpy( PLS.mapfile, val );
if( PLS.clickmap == 0 ) PLS.clickmap = 1;
*valused = 1;
}
else if( strcmp( opt, "landscape" )==0 ) { PLS.landscape = 1; *valused = 0; }
else if( strcmp( opt, "portrait" )==0 ) { PLS.landscape = 0; *valused = 0; PLS.winw = 8.5; PLS.winh = 11.0; }
else if( strcmp( opt, "showbad" )==0 ) { suppress_convmsg( 0 ); *valused = 0; }
else if( strcmp( opt, "noshell" )==0 || strcmp( opt, "nosh" )==0 ) { PLS.noshell = 1; TDH_prohibit_shell( 1 ); *valused = 0; }
else if( strcmp( opt, "font" )==0) strcpy( Estandard_font, val );
else if( strcmp( opt, "textsize" )==0) Estandard_textsize = atoi( val );
else if( strcmp( opt, "linewidth" )==0) Estandard_lwscale = atof( val );
else if( strcmp( opt, "color" )==0) strcpy( Estandard_color, val );
else if( strcmp( opt, "cm" )==0) { PLS.usingcm = 1; *valused = 0; setintvar( "CM_UNITS", 1 ); }
else if( strcmp( opt, "inches" )==0) { PLS.usingcm = 0; *valused = 0; setintvar( "CM_UNITS", 0 ); }
else if( strcmp( opt, "backcolor" )==0) {
strcpy( Estandard_bkcolor, val );
Ebackcolor( val );
PLS.bkcolorgiven = 1;
}
else if( strcmp( opt, "viewer" )==0 || strcmp( opt, "v" )==0 ) { if( PLS.cgiargs == NULL ) strcpy( PLS.viewer, val ); }
else if( strcmp( opt, "errmsgpre" )==0 ) TDH_errprogsticky( val ); /* added 3/25/04 - scg */
else if( strcmp( opt, "drawdump" )==0 ) {
PLG_setdumpfile( val, "w" ); /* added 8/5/04 - scg */
PLS.device = 'n'; /* null device */
}
else if( strcmp( opt, "drawdumpa" )==0 ) {
PLG_setdumpfile( val, "a" ); /* added 8/5/04 - scg */
PLS.device = 'n'; /* null device (added 6/7/05 - scg) */
}
#ifndef NOSVG
else if( strcmp( opt, "tag" )==0) { PLGS_showtag( 1 ); *valused = 0; }
else if( strcmp( opt, "zlevel" )==0) PLGS_zlevel( atoi( val ) );
else if( strcmp( opt, "xml_encoding" )==0 ) PLGS_setxmlparms( "encoding", val );
else if( strcmp( opt, "omit_xml_declaration" )==0 ) { PLGS_setxmlparms( "xmldecl", "0" ); *valused = 0; }
else if( strcmp( opt, "svg_tagparms" )==0 ) PLGS_setxmlparms( "svgparms", val );
#endif
else if( strcmp( opt, "diagfile" )==0 ) {
if( PLS.cgiargs != NULL ) goto FINISH; /* don't allow this in cgi mode.. scg 2/8/02 */
if( GL_smemberi( val, "stderr" )) PLS.diagfp = stderr; /* portability */
else if( GL_smemberi( val, "stdout" )) PLS.diagfp = stdout; /* portability */
else {
PLS.diagfp = fopen( val, "w" ); /* diagnostics */
if( PLS.diagfp == NULL ) {
fprintf( PLS.errfp, "warning, cannot open -diagfile %s.. using stderr\n", val );
PLS.diagfp = stderr;
}
}
}
else if( strcmp( opt, "errfile" )==0 ) {
if( PLS.cgiargs != NULL ) goto FINISH; /* don't allow this in cgi mode.. scg 2/8/02 */
if( GL_smember( val, "stderr STDERR" )) { PLS.errfp = stderr; TDH_errmode( "stderr" ); }
else if( GL_smember( val, "stdout STDOUT" )) { PLS.errfp = stdout; TDH_errmode( "cgi" ); }
else {
PLS.errfp = fopen( val, "w" ); /* diagnostics */
if( PLS.errfp == NULL ) {
fprintf( stderr, "warning, cannot open -errfile %s, using stderr\n", val );
PLS.errfp = stderr;
}
else TDH_errfile( PLS.errfp ); /* set it for TDH */
}
}
else if( strcmp( opt, "echo" )==0 ) {
if( strcmp( val, "stdout" )==0 ) PLS.echolines = 1;
else if( strcmp( val, "diag" )==0 ) PLS.echolines = 2;
else { PLS.echolines = 2; *valused = 0; }
}
#ifndef WIN32
else if( strcmp( opt, "cpulimit" )==0 ) TDH_reslimits( "cpu", atoi( val ) );
#endif
else if( strcmp( opt, "ping" )==0 ) {
printf( "ploticus %s \n", PLVERSION );
exit(0);
}
else { *found = 0; *valused = 0; }
FINISH:
if( PLS.debug ) {
if( *valused ) fprintf( PLS.diagfp, " %s\n", val );
else fprintf( PLS.diagfp, "\n" );
}
return( rtnstat );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/gd_io.c 0000644 0001750 0001750 00000005562 06736545060 014334 0 ustar colin colin /*
* io.c
*
* Implements the imple I/O 'helper' routines.
*
* Not really essential, but these routines were used extensively in GD,
* so they were moved here. They also make IOCtx calls look better...
*
* Written (or, at least, moved) 1999, Philip Warner.
*
*/
#include
#include
#include
#include "gd.h"
/* Use this for commenting out debug-print statements. */
/* Just use the first '#define' to allow all the prints... */
/*#define IO_DBG(s) (s) */
#define IO_DBG(s)
/*
* Write out a word to the I/O context pointer
*/
void
Putword(int w, gdIOCtx *ctx)
{
unsigned char buf[2];
buf[0] = w & 0xff;
buf[1] = (w / 256) & 0xff;
(ctx->putBuf)( ctx, (char *) buf, 2);
}
void
Putchar(int c, gdIOCtx *ctx)
{
(ctx->putC)( ctx, c & 0xff );
}
void gdPutC(const unsigned char c, gdIOCtx *ctx)
{
(ctx->putC)(ctx, c);
}
void
gdPutWord(int w, gdIOCtx *ctx)
{
IO_DBG(printf("Putting word...\n"));
(ctx->putC)(ctx, (unsigned char)(w >> 8));
(ctx->putC)(ctx, (unsigned char)(w & 0xFF));
IO_DBG(printf("put.\n"));
}
void gdPutInt(int w, gdIOCtx *ctx)
{
IO_DBG(printf("Putting int...\n"));
(ctx->putC)(ctx, (unsigned char)(w >> 24));
(ctx->putC)(ctx, (unsigned char)((w >> 16) & 0xFF));
(ctx->putC)(ctx, (unsigned char)((w >> 8) & 0xFF));
(ctx->putC)(ctx, (unsigned char)(w & 0xFF));
IO_DBG(printf("put.\n"));
}
int gdGetC(gdIOCtx *ctx)
{
return ((ctx->getC)(ctx));
}
int gdGetByte(int *result, gdIOCtx *ctx)
{
int r;
r = (ctx->getC)(ctx);
if (r == EOF) {
return 0;
}
*result = r;
return 1;
}
int gdGetWord(int *result, gdIOCtx *ctx)
{
int r;
r = (ctx->getC)(ctx);
if (r == EOF) {
return 0;
}
*result = r << 8;
r = (ctx->getC)(ctx);
if (r == EOF) {
return 0;
}
*result += r;
return 1;
}
int gdGetInt(int *result, gdIOCtx *ctx)
{
int r;
r = (ctx->getC)(ctx);
if (r == EOF) {
return 0;
}
*result = r << 24;
r = (ctx->getC)(ctx);
if (r == EOF) {
return 0;
}
*result += r << 16;
r = (ctx->getC)(ctx);
if (r == EOF) {
return 0;
}
*result += r << 8;
r = (ctx->getC)(ctx);
if (r == EOF) {
return 0;
}
*result += r;
return 1;
}
int gdPutBuf(const void *buf, int size, gdIOCtx* ctx)
{
IO_DBG(printf("Putting buf...\n"));
return (ctx->putBuf)(ctx, buf, size);
IO_DBG(printf("put.\n"));
}
int gdGetBuf(void *buf, int size, gdIOCtx* ctx)
{
return (ctx->getBuf)(ctx, buf, size);
}
int gdSeek(gdIOCtx *ctx, int pos)
{
IO_DBG(printf("Seeking...\n"));
return ((ctx->seek)(ctx, pos));
IO_DBG(printf("Done.\n"));
}
long gdTell(gdIOCtx *ctx)
{
IO_DBG(printf("Telling...\n"));
return ((ctx->tell)(ctx));
IO_DBG(printf("told.\n"));
}
ploticus-2.42/src/proc_rect.c 0000644 0001750 0001750 00000005320 11153557162 015216 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
#include "pl.h"
int
PLP_rect()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
char *color, *lowbevelcolor, *hibevelcolor, *shadowcolor, *outline, *mapurl, *maplabel;
double xlo, ylo, xhi, yhi, bevelsize, shadowsize;
int gotrect, ioutline;
TDH_errprog( "pl proc rect" );
/* initialize */
outline = ""; mapurl = ""; maplabel = "";
color = "dullyellow";
lowbevelcolor = "0.6"; hibevelcolor = "0.8"; shadowcolor = "black";
bevelsize = 0.0; shadowsize = 0.0;
ioutline = 0; gotrect = 0;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "rectangle" )==0 ) { getbox( "box", lineval, &xlo, &ylo, &xhi, &yhi ); gotrect = 1; }
else if( strcmp( attr, "color" )==0 ) color = lineval;
else if( strcmp( attr, "bevelsize" )==0 ) bevelsize = ftokncpy( lineval );
else if( strcmp( attr, "shadowsize" )==0 ) shadowsize = ftokncpy( lineval );
else if( strcmp( attr, "lowbevelcolor" )==0 ) lowbevelcolor = lineval;
else if( strcmp( attr, "hibevelcolor" )==0 ) hibevelcolor = lineval;
else if( strcmp( attr, "shadowcolor" )==0 ) shadowcolor = lineval;
else if( strcmp( attr, "clickmapurl" )==0 ) mapurl = lineval;
else if( strcmp( attr, "clickmaplabel" )==0 ) maplabel = lineval;
else if( strcmp( attr, "clickmaplabeltext" )==0 ) maplabel = getmultiline( lineval, "get" );
else if( strcmp( attr, "outline" )==0 ) { outline = lineval; if( GL_smember( lineval, "no none" )==0 ) ioutline = 1; }
else Eerr( 1, "attribute not recognized", attr );
}
/* now do the plotting work.. */
if( !gotrect ) return( Eerr( 695, "No rectangle specified", "" ));
if( strcmp( color, "none" )==0 ) strcpy( color, "" );/* "none" added scg 1/21/05 */
linedet( "outline", outline, 0.5 );
Ecblock( xlo, ylo, xhi, yhi, color, ioutline );
if( bevelsize > 0.0 || shadowsize > 0.0 )
Ecblockdress( xlo, ylo, xhi, yhi, bevelsize, lowbevelcolor, hibevelcolor, shadowsize, shadowcolor);
if( PLS.clickmap && ( mapurl[0] != '\0' || maplabel[0] != '\0' )) clickmap_entry( 'r', mapurl, 0, xlo, ylo, xhi, yhi, 0, 0, maplabel );
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/apitest.c 0000644 0001750 0001750 00000003642 11220176405 014704 0 ustar colin colin /* simple example using ploticus API to run 2 jobs */
/* compile and load w/ libploticus, libpng, libz, and -lm */
/* scg uses: gcc apitest.c /home/scg/ploticus/src/libploticus.a /home/scg/lib/libpng.a /home/scg/lib/libz.a -lm -o apitest */
#include
#include
#include
#define RESULT_TYPE "png"
main( argc, argv )
int argc;
char **argv;
{
int stat;
char buf[256], outfile[80], memcommand[80];
if( argc != 2 ) {
fprintf( stderr, "usage: api_examp plscriptfile\n" );
exit( 1 );
}
printf( "This test will run two tests, with -debug on. Memory footprint will be shown before, after, and between tests.\n" );
sprintf( memcommand, "ps -p %d -o vsz -o rss >&2", getpid() );
/* show preliminary mem usage */
system( memcommand );
/* test 1. executing a script file... */
sprintf( outfile, "apitest1.%s", RESULT_TYPE );
stat = ploticus_init( RESULT_TYPE, outfile );
if( stat ) { fprintf( stderr, "error %d on ploticus_init\n", stat ); exit(1); }
stat = ploticus_arg( "-debug", "" );
if( stat ) { fprintf( stderr, "error %d on ploticus_arg\n", stat ); exit(1); }
stat = ploticus_execscript( argv[1], 0 );
if( stat ) { fprintf( stderr, "error %d on ploticus_execscript\n", stat ); exit(1); }
stat = ploticus_end();
if( stat ) { fprintf( stderr, "error %d on ploticus_end\n", stat ); exit(1); }
/* show another mem usage */
system( memcommand );
/* test 2. embedded script lines... */
sprintf( outfile, "apitest2.%s", RESULT_TYPE );
ploticus_init( RESULT_TYPE, outfile );
stat = ploticus_arg( "-debug", "" );
strcpy( buf, "#proc annotate" ); ploticus_execline( buf );
strcpy( buf, "location: 2 2" ); ploticus_execline( buf );
strcpy( buf, "text: test of embedded script lines" ); ploticus_execline( buf );
strcpy( buf, "and multiple lines" ); ploticus_execline( buf );
strcpy( buf, "such as this..." ); ploticus_execline( buf );
ploticus_end();
/* show another mem usage */
system( memcommand );
}
ploticus-2.42/src/proc_catlines.c 0000644 0001750 0001750 00000025575 11341534227 016075 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* proc catlines generates one lineplot per category */
/* category scaling must be in effect in X */
/* input records must be clustered by category then subcategory. */
#include "pl.h"
#define MAXSUBCATLEN 40
#define MAXSUBCATS 20
#define LINES 0
#define BARS 1
#define SYMONLY 2
int
PLP_catlines()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
int i, j, catfield, subcatfield, valfield, errfield, stat, result, nsubcats, ix, gapmissing, curj, doing_alt;
char *selectex, *linedet, *errlinedet, *symdet, *altsym, *altwhen;
char *barcolor, *crossover, *plotwidth;
char buf[256], symcode[40];
char subcatlist[MAXSUBCATS][MAXSUBCATLEN];
char subcat[MAXSUBCATLEN], curcat[MAXSUBCATLEN];
char cat[MAXSUBCATLEN];
char colorlist[MAXSUBCATS][COLORLEN];
char axis;
double xcenter, yval; double tf, ofs, radius; double errval; double panelwidth, halfwidth; double taillen, halftail;
int plotmode;
double ymin, barlinewidth;
int ncolorlist;
TDH_errprog( "pl proc catlines" );
catfield = -1;
subcatfield = -1;
valfield = -1;
errfield = -1;
selectex = "";
linedet = ""; errlinedet = "";
symdet = "style=filled color=gray(0.7) shape=circle radius=0.02";
altsym = "";
altwhen = "";
nsubcats = 0;
gapmissing = 1;
taillen = 0.04;
doing_alt = 0;
plotmode = LINES;
crossover = "";
barlinewidth = 2.0;
ncolorlist = 0;
barcolor = "green";
for( i = 0; i < MAXSUBCATS; i++ ) strcpy( colorlist[i], "green" );
plotwidth = "auto";
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "plotmode" )==0 ) {
if( lineval[0] == 'b' ) plotmode = BARS;
else if( lineval[0] == 's' ) plotmode = SYMONLY;
else plotmode = LINES;
}
else if( strcmp( attr, "catfield" )==0 ) catfield = fref( lineval ) - 1;
else if( strcmp( attr, "subcatfield" )==0 ) subcatfield = fref( lineval ) - 1;
else if( strcmp( attr, "valfield" )==0 ) valfield = fref( lineval ) - 1;
else if( strcmp( attr, "subcats" )==0 ) { /* a list of subcats, or "auto" */
for( i = 0; lineval[i] != '\0'; i++ ) if( lineval[i] == ',' ) lineval[i] = ' ';
ix = 0;
for( i = 0; i < MAXSUBCATS; i++ ) {
strcpy( subcatlist[i], GL_getok( lineval, &ix ));
if( subcatlist[i][0] == '\0' ) break;
}
nsubcats = i;
}
else if( strcmp( attr, "errfield" )==0 ) errfield = fref( lineval ) - 1;
else if( strcmp( attr, "select" )==0 ) selectex = lineval;
else if( strcmp( attr, "linedetails" )==0 ) linedet = lineval;
else if( strcmp( attr, "errbardetails" )==0 ) errlinedet = lineval;
else if( strcmp( attr, "dpsymbol" )==0 ) symdet = lineval;
else if( strcmp( attr, "gapmissing" )==0 ) gapmissing = getyn( lineval );
else if( strcmp( attr, "plotwidth" )==0 ) plotwidth = lineval;
else if( strcmp( attr, "taillen" )==0 ) taillen = ftokncpy( lineval );
else if( strcmp( attr, "altsymbol" )==0 ) altsym = lineval;
else if( strcmp( attr, "altwhen" )==0 ) altwhen = lineval;
else if( strcmp( attr, "crossover" )==0 ) crossover = lineval;
else if( strcmp( attr, "barlinewidth" )==0 ) barlinewidth = ftokncpy( lineval );
else if( strcmp( attr, "barcolor" )==0 ) barcolor = lineval;
else if( strcmp( attr, "barcolorlist" )==0 ) {
for( i = 0; lineval[i] != '\0'; i++ ) if( lineval[i] == ',' ) lineval[i] = ' ';
ix = 0;
for( i = 0; i < MAXSUBCATS; i++ ) {
strcpy( colorlist[i], GL_getok( lineval, &ix ));
if( colorlist[i][0] == '\0' ) break;
}
ncolorlist = i;
}
else Eerr( 1, "attribute not recognized", attr );
}
/* -------------------------- */
/* overrides and degenerate cases */
/* -------------------------- */
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) );
if( !scalebeenset() )
return( Eerr( 51, "No scaled plotting area has been defined yet w/ proc areadef", "" ) );
PL_getunits( 'x', buf );
if( strcmp( buf, "categories" ) != 0 )
return( Eerr( 57, "Category scaletype required in order to use proc catlines", "" ) );
if( (catfield < 0 || catfield >= Nfields )) return( Eerr( 601, "catfield out of range", "" ) );
if( (subcatfield < 0 || subcatfield >= Nfields )) return( Eerr( 601, "subcatfield out of range", "" ) );
if( (valfield < 0 || valfield >= Nfields )) return( Eerr( 601, "valfield out of range", "" ) );
if( nsubcats < 1 ) return( Eerr( 601, "mandatory attribute 'subcats' not specified", "" ) );
/* -------------------------- */
/* now do the plotting work.. */
/* -------------------------- */
if( plotmode == BARS ) {
axis = 'y';
if( crossover[0] == '\0' ) ymin = Elimit( axis, 'l', 's' );
else ymin = Econv( axis, crossover );
if( ymin < Elimit( axis, 'l', 's' )) ymin = Elimit( axis, 'l', 's' ); /* be sure crossover is in range */
if( ymin > Elimit( axis, 'h', 's' )) ymin = Elimit( axis, 'h', 's' ); /* be sure crossover is in range */
}
/* if subcats was given as 'auto' ... scan data to build subcat list (subcats will be in order encountered)... */
if( nsubcats == 1 && strcmp( subcatlist[0], "auto" )==0 ) {
nsubcats = 0;
for( i = 0; i < Nrecords; i++ ) {
strcpy( subcat, da( i, subcatfield ));
for( j = 0; j < nsubcats; j++ ) {
if( strcmp( subcat, subcatlist[j] )==0 ) break;
}
if( j == nsubcats ) strcpy( subcatlist[nsubcats++], subcat );
}
}
if( nsubcats < 1 ) return( Eerr( 602, "not enough subcategories", "" ) );
/* determine panelwidth (width of one plot not including margin area on either side) */
if( strncmp( plotwidth, "auto", 4 )==0 ) {
if( plotmode == LINES ) panelwidth = 0.6;
else { /* bars and symonly */
panelwidth = (double)nsubcats*0.1;
if( panelwidth > 0.8 ) panelwidth = 0.8;
}
}
else panelwidth = atof( plotwidth );
/* normalize subcatlist over plotwidth */
halfwidth = panelwidth/2.0;
if( nsubcats == 1 ) tf = panelwidth;
else tf = panelwidth/((double)nsubcats-1.0);
/* input records must be clustered by category, and then in plot (left-to-right) order within category */
/* do error bars if errfield was given.. do these first so they appear "on bottom"... */
if( errfield > -1 ) {
linedet( "errbardetails", errlinedet, 0.3 );
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &result );
if( stat != 0 ) { Eerr( stat, "Select error", selectex ); continue; }
if( result == 0 ) continue;
}
xcenter = fda( i, catfield, X );
strcpy( cat, da( i, catfield ));
strcpy( subcat, da( i, subcatfield ) );
yval = fda( i, valfield, Y );
errval = fda( i, errfield, Y );
/* look up subcat in list.. */
for( j = 0; j < nsubcats; j++ ) {
if( strcmp( subcatlist[j], subcat )== 0 ) break;
}
if( j == nsubcats ) continue;
ofs = (j*tf)-halfwidth;
Emovu( xcenter+ofs, yval-errval );
Elinu( xcenter+ofs, yval+errval );
/* tails.. (taillen is in absolute units).. */
halftail = Edx(EXlo+(taillen/2.0));
Emovu( (xcenter+ofs)-halftail, yval+errval );
Elinu( (xcenter+ofs)+halftail, yval+errval );
/* bottom tail.. */
Emovu( (xcenter+ofs)-halftail, yval-errval );
Elinu( (xcenter+ofs)+halftail, yval-errval );
}
}
/* render the curves (or bars)... */
if( plotmode == LINES ) linedet( "linedetails", linedet, 0.3 );
strcpy( curcat, "" );
curj = -1;
if( plotmode != SYMONLY ) {
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &result );
if( stat != 0 ) { Eerr( stat, "Select error", selectex ); continue; }
if( result == 0 ) continue;
}
xcenter = fda( i, catfield, X );
strcpy( cat, da( i, catfield ));
strcpy( subcat, da( i, subcatfield ) );
yval = fda( i, valfield, Y );
/* look up subcat in list.. */
for( j = 0; j < nsubcats; j++ ) {
if( strcmp( subcatlist[j], subcat )== 0 ) break;
}
if( j == nsubcats ) { Eerr( 2759, "encountered a subcat value that wasn't listed in 'subcats'", subcat ); continue; }
ofs = (j*tf)-halfwidth;
/* fprintf( stderr, "[%s %s %g %g]\n", cat, subcat, xcenter, ofs ); */
if( plotmode == LINES ) {
if( strcmp( cat, curcat ) != 0 ) Emovu( xcenter+ofs, yval ); /* category break */
else if( gapmissing && j-1 != curj ) Emovu( xcenter+ofs, yval ); /* missing data - skip */
else Elinu( xcenter+ofs, yval );
}
else if( plotmode == BARS ) {
if( ncolorlist > 0 ) barcolor = colorlist[j];
sprintf( buf, "width=%g color=%s", barlinewidth, barcolor );
linedet( "barlinedetails", buf, 0.3 );
Emovu( xcenter+ofs, ymin );
Elinu( xcenter+ofs, yval );
if( altwhen[0] != '\0' ) { /* if alternative sym specified, render it w/ bars ... added 2/25/10 */
stat = do_select( altwhen, i, &doing_alt );
if( stat != 0 ) { Eerr( stat, "Select error", altwhen ); continue; }
if( doing_alt == 1 ) {
symdet( "altsym", altsym, symcode, &radius );
Emark( Eax( xcenter+ofs ), Eay( yval ), symcode, radius );
}
}
}
strcpy( curcat, cat );
curj = j;
}
}
/* do data points if required... */
if( plotmode != BARS && strcmp( symdet, "none" ) != 0 ) {
radius = 0.02;
symdet( "dpsymbol", symdet, symcode, &radius );
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &result );
if( stat != 0 ) { Eerr( stat, "Select error", selectex ); continue; }
if( result == 0 ) continue;
}
xcenter = fda( i, catfield, X );
strcpy( cat, da( i, catfield ));
strcpy( subcat, da( i, subcatfield ) );
yval = fda( i, valfield, Y );
/* look up subcat in list.. */
for( j = 0; j < nsubcats; j++ ) {
if( strcmp( subcatlist[j], subcat )== 0 ) break;
}
if( j == nsubcats ) continue;
ofs = (j*tf)-halfwidth;
if( altwhen[0] != '\0' ) { /* check for alternate */
stat = do_select( altwhen, i, &doing_alt );
if( stat != 0 ) { Eerr( stat, "Select error", altwhen ); continue; }
if( doing_alt == 1 ) symdet( "altsym", altsym, symcode, &radius );
}
Emark( Eax( xcenter+ofs ), Eay( yval ), symcode, radius );
if( doing_alt == 1 ) symdet( "symbol", symdet, symcode, &radius ); /* restore */
}
}
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/datasets.c 0000644 0001750 0001750 00000021643 10757272361 015060 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* management of multiple data sets */
#include "pl.h"
#include
static int buflen;
static int nfields, prevnfields;
/* ====================== */
/* DA - return contents of a cell in the current data set using a row and column location. */
char *
PL_da( r, c )
int r, c; /* row, col */
{
int base;
base = PLD.dsfirstdf[ PLD.curds ];
if( r >= Nrecords ) { Eerr( 72035, "out-of-bounds data access", "" ); return( "" ); }
if( c >= Nfields ) { Eerr( 72036, "out-of-bounds data access", "" ); return( "" ); }
return( PLD.df[ base + ( r * Nfields ) + c ] );
}
/* ========================= */
/* CLEARDATASETS - free any/all previously malloc'ed datarow memory, and initialize counters */
int
PL_cleardatasets()
{
int i;
for( i = 0; i < PLD.currow; i++ ) free( PLD.datarow[i] ); /* free rows */
PLD.curds = -1;
PLD.curdf = 0;
PLD.currow = 0;
if( PLS.debug ) fprintf( PLS.diagfp, "Clearing all data sets.\n" );
return( 0 );
}
/* ========================= */
/* POPDATASET - pop back to previous dataset on stack, or all the way back to original data set;
* also free all datarow memory associated with the higher level datasets which will no longer be available.
*/
int
PL_popdataset( npop )
int npop; /* 0 = pop all... go back to the original data set ...or... number of stack elements to pop */
{
int i, newds;
if( npop ) newds = PLD.curds-npop;
else newds = 0;
if( newds < 0 ) newds = 0;
if( PLD.curds > 0 ) {
for( i = PLD.dsfirstrow[ newds+1 ]; i < PLD.currow; i++ ) free( PLD.datarow[i] ); /* free all rows in datasets 1 and up */
PLD.currow = PLD.dsfirstrow[ newds+1];
PLD.curdf = PLD.dsfirstdf[ newds+1 ];
}
PLD.curds = newds;
setintvar( "NRECORDS", PLD.nrecords[ PLD.curds ] );
setintvar( "NFIELDS", PLD.nfields[ PLD.curds ] );
if( PLS.debug ) fprintf( PLS.diagfp, "Popping back to dataset %d which has %d rows and %d fields.\n",
PLD.curds+1, PLD.nrecords[PLD.curds], PLD.nfields[PLD.curds] );
return( 0 );
}
/* ========================= */
/* BEGINDATASET - begin the process of creating a new data set. Data will later be added to the data set
* using startdatarow(), catitem(), and enddatarow() (which allocate PLD rows) * ..or.. by proc_getdata() for in-script data,
* where we don't allocate PLD rows but do allocate df pointers into proclines.
* This routine can be used even if it's not definite that a new data set will eventually be created.
*/
int
PL_begindataset()
{
int newds;
newds = PLD.curds + 1;
if( newds >= MAXDS ) { PLS.skipout = 1; return( Eerr( 2358, "too many data sets in memory", "" )); }
PLD.nrecords[ newds ] = 0;
PLD.dsfirstdf[ newds ] = PLD.curdf;
PLD.dsfirstrow[ newds ] = PLD.currow;
return( 0 );
}
/* ========================== */
/* FINISHDATASET - finish the process of creating a new data set.
* When this routine returns, dataaccess will be ready to get data from the newly created data set.
*/
int
PL_finishdataset( nrows, nfields )
int nrows, nfields; /* these may be specified if known or passed as 0, 0 which means figure it out here.. */
{
int newds;
newds = PLD.curds+1;
if( nrows == 0 && nfields == 0 ) {
PLD.nrecords[ newds ] = PLD.currow - PLD.dsfirstrow[ newds ];
/* turns out we can't do the following.. for example processdata action: breaks a dataset of nrows=0 is valid */
/* if( PLD.nrecords[ newds ] < 1 ) return( 0 ); */ /* no data.. abort */
if( PLD.nrecords[newds] < 1 ) PLD.nfields[ newds ] = 0;
else PLD.nfields[ newds ] = (PLD.curdf - PLD.dsfirstdf[ newds ]) / PLD.nrecords[ newds ];
}
else {
PLD.nrecords[ newds ] = nrows;
PLD.nfields[ newds ] = nfields;
}
PLD.curds = newds;
setintvar( "NRECORDS", PLD.nrecords[ PLD.curds ] );
setintvar( "NFIELDS", PLD.nfields[ PLD.curds ] );
if( PLS.debug ) fprintf( PLS.diagfp, "Creating dataset %d which has %d rows and %d fields.\n",
PLD.curds+1, PLD.nrecords[newds], PLD.nfields[newds] );
return( 0 );
}
/* ================================ */
/* STARTDATAROW - when building a new data set directly, (eg. proc processdata)
this is used to indicate the start of a new data row.
*/
int
PL_startdatarow()
{
buflen = 0;
nfields = 0;
prevnfields = 0;
return( 0 );
}
/* ================================ */
/* CATITEM - when building a new data set directly, (eg. proc processdata)
this is used to append a new piece of data to the current row.
*/
int
PL_catitem( item )
char *item;
{
int len;
if( PLS.skipout ) return( 1 );
len = strlen( item );
strcpy( &PL_bigbuf[ buflen ], item );
buflen += len;
strcpy( &PL_bigbuf[ buflen ], "\t" );
buflen++;
nfields++;
return( 0 );
}
/* ================================ */
/* ENDDATAROW - when building a new data set directly, (eg. proc processdata)
this is used to terminate a data row. The row is actually
added to the pl data structures at this point..
*/
int
PL_enddatarow()
{
int i, state;
char *r;
if( PLS.skipout ) return( 1 );
r = (char *) malloc( buflen+1 );
if( r == NULL ) { PLS.skipout = 1; return( Eerr( 2378, "malloc error", "" )); }
if( PLD.currow >= (PLD.maxrows-1)) { PLS.skipout = 1; return( Eerr( 2380, "new data set truncated, too many rows", "" )); }
PLD.datarow[ PLD.currow++ ] = r;
strcpy( r, PL_bigbuf );
/* parse fields and assign data field pointers.. */
for( i = 0, state = 0; i < buflen; i++ ) {
if( state == 0 ) {
if( PLD.curdf >= PLD.maxdf ) {
PLS.skipout = 1;
return( Eerr( 2381, "new data set truncated, too many fields overall", "" ));
}
PLD.df[ PLD.curdf++ ] = &r[i];
state = 1;
}
if( r[i] == '\t' ) {
r[i] = '\0';
state = 0;
}
}
/* update nrecords and nfields */
/* (PLD.nrecords[ newds ])++; */
if( prevnfields > 0 && nfields != prevnfields ) {
PLS.skipout = 1;
return( Eerr( 2379, "build data row: inconsistent nfields across rows", "" ));
}
prevnfields = nfields;
/* PLD.nfields[ newds ] = nfields; */
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
#ifdef HOLD
struct pldata {
char **datarow; /* array of pointers to malloc'ed data row buffers */
int currow; /* current number of members in datarow array */
int maxrows; /* total malloc'ed size of datarow array */
/* note: in-script data is stored in persistent proclines, not data rows */
char **df; /* array of field pointers */
int curdf; /* next available field pointer in df array */
int maxdf; /* total malloc'ed size of df array; */
/* note: field pointers point into datarows (or into proclines for in-script data) */
/* data sets are managed as a stack of up to MAXDS elements. proc getdata always clears the stack and fills at ds=0. */
int curds; /* identifies the current dataset (or stack size). First is 0 */
int dsfirstdf[MAXDS]; /* where a dataset begins in the df array */
int dsfirstrow[MAXDS]; /* where a dataset begins in the datarow array.. if data set in procline array this is -1 */
int nrecords[ MAXDS ]; /* number of records in a dataset */
int nfields[ MAXDS ]; /* number of fields in a dataset */
};
/* ================================ */
/* NEWDATASET - when building a new data set directly (eg. proc processdata), to initialize.
*
* Note, this doesn't advance PLD.curds. This must be done after the
* new data set has been completely built.
*/
int
PL_newdataset( )
{
newds = PLD.curds + 1;
if( newds >= MAXDS ) { PLS.skipout = 1; return( Eerr( 2358, "max number of data sets exceeded", "" )); }
PL_checkds( newds );
PLD.nrecords[ newds ] = 0;
PLD.dsfirstdf[ newds ] = PLD.curdf;
PLD.dsfirstrow[ newds ] = PLD.currow;
return( 0 );
}
/* ================================= */
/* CHECKDS - indicate that the ds will be used, and check if ds has been used previously.
* If ds has been used previously, free datarow memory and set currow and curdf back.
* We don't attempt to free procline memory for embedded data sets.
*/
int
PL_checkds( ds )
int ds;
{
int i;
if( ds <= highwater ) {
if( PLS.debug ) fprintf( PLS.diagfp, "Obliterating data sets %d thru %d.\n", ds, highwater );
if( PLD.dsfirstrow[ ds ] >= 0 ) { /* it can be -1 when using inline data (see proc_getdata.c) */
for( i = PLD.dsfirstrow[ ds ]; i < PLD.currow; i++ ) free( PLD.datarow[i] ); /* free rows */
PLD.currow = PLD.dsfirstrow[ ds ];
}
if( ds == 0 ) { /* added this condition.. scg 11/15/07 */
PLD.curdf = PLD.dsfirstdf[ ds ];
}
}
if( ds > highwater ) highwater = ds;
return( 0 );
}
#endif
ploticus-2.42/src/cats.c 0000644 0001750 0001750 00000023621 12144506734 014174 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* routines related to categories.. */
#include
#include "pl.h"
#define CONTAINS 0
#define EXACT -1
static char **cats[2] = { NULL, NULL }; /* category list backbone (X, Y) */
static int ncats[2] = { 0, 0 }; /* number of categories in list (X, Y) */
static int nextcat[2] = { 0, 0 }; /* used by nextcat() for looping across categories (not widely used)*/
static int dont_init_ncats[2] = { 0, 0 }; /* for when items have been prepended */
static int catcompmethod[2] = { CONTAINS, CONTAINS }; /* category comparison method:
0 = contains -1 = exact >0 = compare 1st n characters */
static int sys_init[2] = { 0, 0 }; /* 1 if category list malloced and ready to go.. */
static int req_ncats[2] = { MAXNCATS, MAXNCATS }; /* size of category lists */
static int check_uniq[2] = { 1, 1 }; /* 1 = ensure unique cats 0 don't ensure uniqueness (faster, but dups will cause trouble) */
static int roundrobin[2] = { 1, 1 }; /* used with roundrobin category lookup */
static int curcat[2] = { 0, 0 }; /* used with roundrobin category lookup */
/* ================================================= */
/* CATFREE - free all malloced storage and initialize to original state.. */
int
PL_catfree()
{
int i, j;
for( i = 0; i < 2; i++ ) {
if( sys_init[i] ) {
for( j = 0; j < ncats[i]; j++ ) free( cats[i][j] );
free( cats[i] );
}
}
/* these values must match the initializations at top */
cats[0] = NULL; cats[1] = NULL;
ncats[0] = 0; ncats[1] = 0;
nextcat[0] = 0; nextcat[1] = 0;
dont_init_ncats[0] = 0; dont_init_ncats[1] = 0;
catcompmethod[0] = CONTAINS; catcompmethod[1] = CONTAINS;
sys_init[0] = 0; sys_init[1] = 0;
req_ncats[0] = MAXNCATS; req_ncats[1] = MAXNCATS;
check_uniq[0] = 1; check_uniq[1] = 1;
roundrobin[0] = 1; roundrobin[1] = 1;
curcat[0] = 0; curcat[1] = 0;
return( 0 );
}
/* ================================================= */
/* SETCATS - fill categories list */
int
PL_setcats( ax, inbuf )
char ax;
const char *inbuf;
{
int df;
int axi, textloc;
int i, j;
char buf[200];
char fname[NAMEMAXLEN];
int inbuflen, buflen, ix, ixhold;
char fieldspec[80], selex[256];
int stat, result;
char *s, *t;
int tlen;
if( ax == 'x' ) axi = 0;
else axi = 1;
if( !sys_init[axi] ) {
/* malloc the backbone - done only once per script */
cats[axi] = (char **) malloc( req_ncats[axi] * sizeof( char *) );
if( PLS.debug ) fprintf( PLS.diagfp, "categories in %c: list of size=%d malloced\n", ax, req_ncats[axi] );
sys_init[axi] = 1;
ncats[axi] = 0;
}
else if( ncats[axi] > 0 && !dont_init_ncats[axi] ) {
/* free malloced category labels */
for( i = 0; i < ncats[axi]; i++ ) free( cats[axi][i] );
ncats[axi] = 0;
}
strcpy( selex, "" );
if( strnicmp( inbuf, "datafield", 9 )==0 ) { /* fill cats list from a data field.. */
if( Nrecords < 1 )
return( Eerr( 3895, "cannot get categories from data field, no data has been read yet", "" ) );
else {
ix = 0;
/* datafield=xxxxx */
strcpy( fieldspec, GL_getok( inbuf, &ix ) );
if( GL_smember( fieldspec, "datafield datafields" )) /* handle old syntax 'datafield[s] xxx' */
strcpy( fname, GL_getok( inbuf, &ix ) );
else strcpy( fname, &fieldspec[10] );
/* optional selectrows=xxx xx xxx */ /* scg 2/28/02 */
while( isspace( (int) inbuf[ix] ) && inbuf[ix] != '\0' ) ix++ ; /* advance */
ixhold = ix;
strcpy( buf, GL_getok( inbuf, &ix ) );
if( strnicmp( buf, "selectrows=", 11 )==0 ) strcpy( selex, &inbuf[ixhold+11] );
df = fref( fname );
if( !dont_init_ncats[ axi ] ) ncats[ axi ] = 0;
for( i = 0; i < Nrecords; i++ ) {
if( selex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selex, i, &result );
if( stat != 0 ) { Eerr( stat, "selectrows error", selex ); continue; }
if( result == 0 ) continue; /* reject */
}
t = da( i, df-1 );
tlen = strlen( t );
if( check_uniq[ axi ] ) {
/* make sure we don't have it already.. */
for( j = 0; j < ncats[ axi ]; j++ ) {
if( stricmp( cats[ axi ][j], t ) ==0 ) break;
}
}
else j = ncats[ axi ];
if( j == ncats[ axi ] ) { /* only add it if not yet seen.. */
if( ncats[ axi ] >= req_ncats[ axi ] )
return( Eerr( 4824, "category list is full, some entries ignored (use proc categories to raise)", "" ));
s = (char *) malloc( tlen+1 );
cats[ axi ][ ncats[ axi ]] = s;
strcpy( s, t );
ncats[ axi ]++;
}
}
}
}
else { /* fill cats list from literal text chunk.. */
if( !dont_init_ncats[ axi ] ) ncats[ axi ] = 0;
textloc = 0;
inbuflen = strlen( inbuf );
while( 1 ) {
if( textloc >= inbuflen ) break;
GL_getseg( buf, inbuf, &textloc, "\n" );
buflen = strlen( buf );
if( check_uniq[ axi ] ) {
/* make sure we don't have it already.. added scg 6/1/06 */
for( j = 0; j < ncats[ axi ]; j++ ) {
if( stricmp( cats[ axi ][j], buf ) ==0 ) break;
}
}
else j = ncats[ axi ];
if( j == ncats[ axi ] ) { /* only add it if not yet seen.. */ /* added scg 6/1/06 */
if( ncats[ axi ] >= MAXNCATS )
return( Eerr( 4825, "category list is full, some entries ignored (use proc categories to raise)", "" ));
s = (char *) malloc( buflen+1 );
cats[ axi ][ ncats[ axi ]] = s;
strcpy( s, buf );
ncats[ axi ]++;
}
}
}
dont_init_ncats[ axi ] = 0; /* for future go-rounds */
nextcat[ axi ] = 0;
curcat[ axi ] = 0;
if( PLS.debug ) fprintf( PLS.diagfp, "categories in %c: setting up %d categories\n", ax, ncats[axi] );
/* fprintf( PLS.diagfp, "[cat axis=%d ncats=%d]", axi, ncats[axi] );
* for( i = 0; i < ncats[axi]; i++ ) fprintf( PLS.diagfp, "[%s]", cats[axi][i] );
* fprintf( PLS.diagfp, "\n" );
*/
return( 0 );
}
/* ======================================================= */
/* ADDCAT - prepend or append a category to the cat list */
/* If prepend, this must be called before main cats list is set up */
int
PL_addcat( ax, pos, name )
char ax; /* 'x' or 'y' */
char *pos; /* "pre" or "post" */
char *name; /* category name */
{
int axi, buflen;
char *s;
if( ax == 'x' ) axi = 0;
else axi = 1;
buflen = strlen( name );
if( strcmp( pos, "pre" )==0 ) {
if( !sys_init[axi] ) {
cats[axi] = (char **) malloc( req_ncats[axi] * sizeof( char *) );
sys_init[axi] = 1;
ncats[axi] = 0;
}
if( ! dont_init_ncats[ axi ] ) ncats[ axi ] = 0;
dont_init_ncats[ axi ] = 1;
}
if( strcmp( pos, "post" )==0 ) dont_init_ncats[ axi ] = 0;
s = (char *) malloc( buflen+1 );
cats[ axi ][ ncats[ axi ]] = s;
strcpy( s, name );
ncats[ axi ]++;
return( 0 );
}
/* =============================================== */
/* NEXTCAT - for getting categories sequentially.. get next category in list.
nextcat var maintains current position. */
int
PL_nextcat( ax, result, maxlen )
char ax;
char *result;
int maxlen;
{
int axi;
if( ax == 'x' ) axi = 0;
else axi = 1;
if( nextcat[ axi ] >= ncats[ axi ] ) { strcpy( result, "" ); return( 0 ); }
strncpy( result, cats[ axi ][ nextcat[ axi] ], maxlen );
result[maxlen] = '\0';
nextcat[ axi ]++;
return( 0 );
}
/* ================================================ */
/* GETCAT - get category name for slot n */
int
PL_getcat( ax, n, result, maxlen )
char ax;
int n;
char *result; /* changed to strcpy into a buffer, scg 8/4/04 */
int maxlen;
{
int axi;
if( ax == 'x' ) axi = 0;
else axi = 1;
if( n >= ncats[ axi ] ) return( 1 );
else strncpy( result, cats[ axi ][ n ], maxlen );
result[ maxlen ] = '\0';
return( 0 );
}
/* ================================================ */
/* NCATS - return number of categories for an axis */
int
PL_ncats( ax )
char ax;
{
int axi;
if( ax == 'x' ) axi = 0;
else axi = 1;
return( ncats[ axi ] );
}
/* ================================================ */
/* FINDCAT - category look up. Return slot (0 .. max) or -1 if not found */
/* roundrobin search option is more efficient when categories will tend to be accessed in order */
int
PL_findcat( ax, s )
char ax, *s;
{
int axi, j, slen, recurs;
if( ax == 'x' ) axi = 0;
else axi = 1;
recurs = 0;
slen = strlen( s );
if( roundrobin[ axi ] ) {
j = curcat[ axi ];
if( j == -1 ) { recurs = 1; j = curcat[axi] = 0; }
}
else j = 0;
/* contains */
if( catcompmethod[axi] == CONTAINS ) { for( ; j < ncats[ axi ]; j++ ) { if( strnicmp( s, cats[axi][j], slen )==0 ) break; }}
/* exact */
else if( catcompmethod[axi] == EXACT ) { for( ; j < ncats[ axi ]; j++ ) { if( stricmp( s, cats[axi][j] )==0 ) break; }}
/* specified length */
else if( catcompmethod[axi] > 0 ) { for( ; j < ncats[ axi ]; j++ ) { if( strnicmp( s, cats[axi][j], catcompmethod[axi] )==0 ) break; }}
if( j >= ncats[ axi ] ) {
if( roundrobin[ axi ] && !recurs ) {
/* if working in round robin mode and we reach the end of the list,
we need to search ONE more time from beginning of list.. */
curcat[ axi ] = -1;
return( PL_findcat( ax, s ) );
}
return( -1 );
}
else {
curcat[ axi ] = j;
return( j );
}
}
/* ================================================ */
/* SETCATPARMS - set the category comparison method */
int
PL_setcatparms( ax, what, parm )
char ax;
char *what;
int parm;
{
int axi;
if( ax == 'x' ) axi = 0;
else axi = 1;
if( strcmp( what, "compmethod" )==0 ) catcompmethod[axi] = parm;
else if( strcmp( what, "listsize" )==0 ) {
if( sys_init[axi] ) return( Eerr( 2750, "categories already defined; listsize ignored", "" ));
req_ncats[axi] = parm;
}
else if( strcmp( what, "checkuniq" )==0 ) check_uniq[axi] = parm;
else if( strcmp( what, "roundrobin" )==0 ) roundrobin[axi] = parm;
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_pie.c 0000644 0001750 0001750 00000030374 11153556365 015051 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC PIE - render a pie graph */
/* 7/12/01 - scg - now renders each entire slice as a single polygon */
#include "pl.h"
#define TORAD 0.0174532
#define MAXSLICE 80
#define LEGEND 1
#define LABEL 2
#define LINELABEL 3
int
PLP_pie()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
char *labels, *outlinedetails, *lablinedetails, *labelmode, *mapurl, *maplabel, *textdetails;
char *pctfmt, *labelback, *lblfmtstring, *expandedurl, *expandedlabel, *color1;
char buf[256], color[MAXSLICE][40], lbl[256], pctstr[80];
int j, align, df, lblfld, ncolors, nexpl, ibb, colorfield, nlines;
int maxlen, irow, ilabmode, labelbackoutline, exactcolorfield, wraplen;
double expl[MAXSLICE];
double adjx, adjy, cx, cy, radius, theta, total, ux, uy, stop, starttheta, sin(), cos();
double fval, x, y, oldx, oldy, stheta, lblfarout, boxwid, boxhi, labx, laby, dval;
TDH_errprog( "pl proc pie" );
/* initialize */
labels = ""; outlinedetails = ""; lablinedetails = ""; textdetails = ""; mapurl = ""; maplabel = "";
labelback = ""; lblfmtstring = "";
ncolors = 0; labelbackoutline = 0; wraplen = 0; nexpl = 0;
theta = 0.0;
cx = cy = -1.0;
radius = -1.0;
labelmode = "legend";
starttheta = 90.0 * TORAD;
total = 0.0;
lblfarout = 0.0;
pctfmt = "%.1f";
lblfld = -1;
colorfield = -1;
exactcolorfield = -1;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "datafield" )==0 ) df = fref( lineval ) -1 ;
else if( strcmp( attr, "center" )==0 ) getcoords( "center", lineval, &cx, &cy );
else if( strcmp( attr, "radius" )==0 ) Elenex( lineval, X, &radius );
else if( strcmp( attr, "firstslice" )==0 ) starttheta = ((360-ftokncpy( lineval )) * TORAD ) + 90.0 * TORAD;
else if( strcmp( attr, "total" )==0 ) total = ftokncpy( lineval );
else if( strcmp( attr, "clickmapurl" )==0 ) mapurl = lineval;
else if( strcmp( attr, "clickmaplabel" )==0 ) maplabel = lineval;
else if( strcmp( attr, "clickmaplabeltext" )==0 ) maplabel = getmultiline( lineval, "get" );
else if( strcmp( attr, "colors" )==0 ) {
int i, ix;
for( i = 0, ix = 0; i < MAXSLICE; i++ ) {
strcpy( color[i], GL_getok( lineval, &ix ) );
if( color[i][0] == '\0' ) break;
}
ncolors = i;
}
else if( strcmp( attr, "labels" )==0 ) labels = getmultiline( lineval, "get" );
else if( strcmp( attr, "labelfield" )==0 ) lblfld = fref( lineval ) - 1;
else if( strcmp( attr, "labelfmtstring" )==0 ) lblfmtstring = lineval;
else if( strcmp( attr, "colorfield" )==0 ) colorfield = fref( lineval ) - 1;
else if( strcmp( attr, "exactcolorfield" )==0 ) exactcolorfield = fref( lineval ) - 1;
else if( strcmp( attr, "outlinedetails" )==0 ) outlinedetails = lineval;
else if( strcmp( attr, "lablinedetails" )==0 ) lablinedetails = lineval;
else if( strcmp( attr, "textdetails" )==0 ) textdetails = lineval;
else if( strcmp( attr, "labelmode" )==0 ) labelmode = lineval;
else if( strcmp( attr, "labelfarout" )==0 ) lblfarout = ftokncpy( lineval );
else if( strcmp( attr, "labelback" )==0 ) labelback = lineval;
else if( strcmp( attr, "labelbackoutline" )==0 ) labelbackoutline = getyn( lineval );
else if( strcmp( attr, "pctformat" )==0 ) pctfmt = lineval;
else if( strcmp( attr, "explode" )==0 ) {
int i, ix;
for( i = 0, ix = 0; i < MAXSLICE; i++ ) {
strcpy( buf, GL_getok( lineval, &ix ));
if( buf[0] == '\0' ) break;
else expl[i] = atof( buf );
}
nexpl = i;
}
else if( strcmp( attr, "wraplen" )==0 ) wraplen = itokncpy( lineval );
else Eerr( 1, "attribute not recognized", attr );
}
/* overrides and degenerate cases */
/* -------------------------- */
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) );
if( df < 0 || df >= Nfields ) return( Eerr( 2840, "invalid datafield", "" ) );
if( cx < 0.0 || cy < 0.0 ) return( Eerr( 2841, "invalid center", "" ) );
if( radius < 0.0 || radius > 5.0 ) return( Eerr( 2842, "invalid radius", "" ) );
if( lblfarout < 0.001 && strncmp( labelmode, "label", 5 )==0 ) lblfarout = 0.67;
if( lblfarout < 0.001 && strncmp( labelmode, "line", 4 )==0 ) lblfarout = 1.3;
if( labelbackoutline && labelback[0] == '\0' ) labelback = Ecurbkcolor;
/* now do the plotting work.. */
/* -------------------------- */
/* compute total.. */
if( total <= 0.0 ) {
total = 0.0;
for( irow = 0; irow < Nrecords; irow++ ) {
total += atof( da( irow, df ) );
}
}
ibb = 0;
if( strncmp( labelmode, "legend", 6 )==0 ) ilabmode = LEGEND;
else if( strncmp( labelmode, "labelonly", 5 ) ==0 ) ilabmode = LABEL;
else if( strncmp( labelmode, "line+label", 4 ) ==0 ) ilabmode = LINELABEL;
else ilabmode = 0;
for( j = 0; j < 2; j++ ) { /* first time - colors; 2nd time, lines */
theta = starttheta + 6.28319;
if( j == 1 ) {
/* set line details for outline.. */
linedet( "outlinedetails", outlinedetails, 0.5 );
}
for( irow = 0; irow < Nrecords; irow++ ) {
/* take val as % of total and convert to rads */
dval = atof( da( irow, df ) );
if( dval == 0.0 ) continue; /* prevent slice attempt on degenerate case - scg 7/21/03 */
fval = ( dval / total ) * 6.28319;
stop = theta - fval;
/* find (ux,uy), the point at the wedge of the slice, normalized to 0,0 center.. */
if( nexpl <= 0 ) { /* don't explode any slices */
ux = 0.0;
uy = 0.0;
}
else if( irow >= nexpl ) { /* explode slice according to last explode value */
ux = (expl[nexpl-1]*radius) * cos( theta+(fval/-2.0) );
uy = (expl[nexpl-1]*radius) * sin( theta+(fval/-2.0) );
}
else if( irow < nexpl ) { /* explode slice according to explode value [i] */
ux = (expl[irow]*radius) * cos( theta+(fval/-2.0) );
uy = (expl[irow]*radius) * sin( theta+(fval/-2.0) );
}
first = 1;
stheta = theta;
if( j == 1 && strncmp( outlinedetails, "no", 2 )==0 ) /* break; */ goto DOLAB; /* changed again, scg 4/29/05 */
for( ; theta > stop; theta -= 0.03 ) {
if( theta - stop < 0.03 ) theta = stop;
x = cx + (radius * cos( theta ));
y = cy + (radius * sin( theta ));
if( j == 0 ) {
if( first ) {
first = 0; oldx = x; oldy = y;
Emov( cx+ux, cy+uy );
Epath( x+ux, y+uy );
continue;
}
Epath( x+ux, y+uy );
oldx = x; oldy = y;
}
else if( j == 1 ) {
if( first ) { Emov( cx+ux, cy+uy ); Elin( x+ux, y+uy ); first = 0; }
Elin( x+ux, y+uy );
}
}
if( j == 1 ) Elin( cx+ux, cy+uy );
color1 = "";
if( j == 0 ) {
Epath( cx+ux, cy+uy );
if( colorfield >=0 ) {
color1 = PL_get_legent( da( irow, colorfield ) );
Ecolorfill( color1 );
}
else if( exactcolorfield >= 0 ) {
color1 = da( irow, exactcolorfield );
Ecolorfill( color1 );
}
else if( strcmp( color[0], "auto" )==0 ) {
color1 = Eicolor( irow );
Ecolorfill( color1 );
}
else if( irow < ncolors ) Ecolorfill( color[irow] );
else if( ncolors > 0 ) Ecolorfill( color[ncolors-1] );
else Ecolorfill( "0.8" );
}
/* labeling */ /* if doing legend, handle this during j == 0 because color is available;
otherwise do labeling during j == 1 to avoid color fill obliterating labels.. */
DOLAB:
if( ( j == 0 && ilabmode == LEGEND ) || ( j == 1 && ilabmode != 0 ) ) {
strcpy( lbl, "");
sprintf( pctstr, pctfmt, (atof( da( irow, df ) ) / total)*100.0 );
if( PLS.bignumspacer ) rewritenums( pctstr ); /* added 4/5/03 */
if( lblfld >= 0 ) strcpy( lbl, da( irow, lblfld ) );
else if( labels[0] != '\0' ) GL_getseg( lbl, labels, &ibb, "\n" );
else if( lblfmtstring[0] != '\0' ) { /* added scg 8/20/04 */
strcpy( buf, lblfmtstring );
GL_varsub( buf, "@PCT", pctstr ); /* buf[256] */
do_subst( lbl, buf, irow, NORMAL );
}
GL_varsub( lbl, "@PCT", pctstr ); /* lbl[256] */
convertnl( lbl );
/* allow @field substitutions into url */
if( PLS.clickmap && ( mapurl[0] != '\0' || maplabel[0] != '\0' )) {
expandedurl = PL_bigbuf;
expandedlabel = &PL_bigbuf[2000];
do_subst( expandedurl, mapurl, irow, URL_ENCODED );
do_subst( expandedlabel, maplabel, irow, NORMAL );
}
/* if( ilabmode == LEGEND ) */ /* changed 7/14/03 scg */
if( j == 0 && ilabmode == LEGEND ) {
if( color1[0] != '\0' ) PL_add_legent( LEGEND_COLOR, lbl, "", color1, "", "" );
else PL_add_legent( LEGEND_COLOR, lbl, "", color[irow], "", "" );
}
else if( j == 1 && ilabmode == LABEL ) {
double htheta;
double x1, y1, x2, y2;
int centerit = 0;
htheta = stop + ((stheta - stop) / 2.0 );
x = cx + ( (radius * lblfarout) * cos( htheta ) );
y = cy + ( (radius * lblfarout) * sin( htheta ) );
if( wraplen ) GL_wraptext( lbl, wraplen ); /* added scg 8/16/05 */
measuretext( lbl, &nlines, &maxlen );
labx = x+ux;
laby = y+uy;
boxhi = nlines * Ecurtextheight;
boxwid = (maxlen * Ecurtextwidth);
if( (htheta >= 7.7 && htheta <= 8.2 ) || (htheta >= 4.5 && htheta <= 5.0 )) centerit = 1;
if( centerit ) { x1 = labx-(boxwid/2.0); x2 = labx+(boxwid/2.0); }
else if( x < cx ) { x1 = labx - boxwid; x2 = labx; }
else { x1 = labx; x2 = labx + boxwid; }
y1 = laby-boxhi; y2 = laby;
if( labelback[0] != '\0' ) Ecblock( x1-0.1, y1+(Ecurtextheight*0.6), x2+0.1, y2+Ecurtextheight, labelback, labelbackoutline );
textdet( "textdetails", textdetails, &align, &adjx, &adjy, -2,"R", 1.0 );
Emov( labx, laby );
if( !centerit && x < cx ) Erightjust( lbl );
else if( !centerit && x >= cx ) Etext( lbl );
else Ecentext( lbl );
if( PLS.clickmap && ( mapurl[0] != '\0' || maplabel[0] != '\0' ))
clickmap_entry( 'r', expandedurl, 0, x1, y1+Ecurtextheight, x2, y2+Ecurtextheight, 1, 0, expandedlabel );
linedet( "linedetails", outlinedetails, 0.5 ); /* restore */
}
/* else if( ilabmode == LINELABEL ) */ /* changed 7/14/03 scg */
else if( j == 1 && ilabmode == LINELABEL ) {
double htheta, px, py, w, z;
if( wraplen ) GL_wraptext( lbl, wraplen ); /* added scg 8/16/05 */
measuretext( lbl, &nlines, &maxlen );
boxwid = maxlen * Ecurtextwidth;
boxhi = nlines * Ecurtextheight;
w = radius * lblfarout;
if( w < (1.1 * radius) ) z = lblfarout;
else z = 1.1;
htheta = stop + ((stheta - stop) / 2.0 );
px = cx + ( (radius * 0.9 ) * cos( htheta ) );
py = cy + ( (radius * 0.9 ) * sin( htheta ) );
x = cx + ( (radius * z ) * cos( htheta ) );
y = cy + ( (radius * z ) * sin( htheta ) );
linedet( "lablinedetails", lablinedetails, 0.5 );
Emov( px+ux, py+uy );
Elin( x+ux, y+uy );
if( x+ux < cx ) {
Elin( (cx+ux)-w, y+uy );
textdet( "textdetails", textdetails, &align, &adjx, &adjy, -2,"R", 1.0 );
labx = ((cx+ux)-w)-0.1;
laby = y+uy;
if( labelback[0] != '\0' )
Ecblock( labx-boxwid-0.1, laby-boxhi+(Ecurtextheight*0.6),
labx+0.1, laby+Ecurtextheight, labelback, labelbackoutline );
Emov( labx, laby );
Erightjust( lbl );
if( PLS.clickmap && ( mapurl[0] != '\0' || maplabel[0] != '\0' ))
clickmap_entry( 'r', expandedurl, 0, labx-boxwid, laby-boxhi+Ecurtextheight,
labx, laby+Ecurtextheight, 1, 0, expandedlabel );
}
else {
Elin( (cx+ux)+w, y+uy );
textdet( "textdetails", textdetails, &align, &adjx, &adjy, -2,"R", 1.0 );
labx = cx+ux+w+0.1;
laby = y+uy;
if( labelback[0] != '\0' )
Ecblock( labx-0.1, laby-boxhi+(Ecurtextheight*0.6),
labx+boxwid+0.1, laby+Ecurtextheight, labelback, labelbackoutline );
Emov( labx, laby );
Etext( lbl );
if( PLS.clickmap && ( mapurl[0] != '\0' || maplabel[0] != '\0' ))
clickmap_entry( 'r', expandedurl, 0, labx, laby-boxhi+Ecurtextheight,
labx+boxwid, laby+Ecurtextheight, 1, 0, expandedlabel );
}
linedet( "outlinedetails", outlinedetails, 0.5 ); /* restore */
}
}
theta = stop;
}
}
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/nearest.c 0000644 0001750 0001750 00000026235 10741424460 014703 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2006 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
#include "pl.h"
/* Given smin, smax, and nearest, determine minval and maxval.
Smin and Smax are string reps of numerics, dates, times, etc.
Pass identical smin and smax to get a $dategroup() or $numgroup() operation.
Function returns 1 if the 'nearest' mode was recognized and a nearest range computed.
Function returns 0 otherwise.
*/
int
PLP_findnearest( smin, smax, axis, nearest, minval, maxval )
char *smin, *smax, axis, *nearest, *minval, *maxval;
{
int stat;
char datepart[40], timepart[40], unittyp[40];
Egetunits( axis, unittyp );
if( strncmp( nearest, "month", 5 )== 0 || strncmp( nearest, "quarter", 7 )==0 || strncmp( nearest, "3month", 6 )==0 ) {
/* nearest month boundary / quarter-year boundary.. */
int mon, day, yr, newmon;
long l;
if( !GL_smember( unittyp, "date datetime" ))
Eerr( 2892, "autorange 'nearest=month' or 'nearest=quarter' only valid with date or datetime scaletype", unittyp );
/* min */
stat = DT_jdate( smin, &l );
DT_getmdy( &mon, &day, &yr );
if( nearest[0] == 'q' || nearest[0] == '3' ) {
if( mon >= 10 ) mon = 10;
else if( mon >= 7 ) mon = 7;
else if( mon >= 4 ) mon = 4;
else if( mon >= 1 ) mon = 1;
}
DT_makedate( yr, mon, 1, "", datepart );
if( strcmp( unittyp, "datetime" )==0 ) {
DT_maketime( 0, 0, 0.0, timepart );
DT_build_dt( datepart, timepart, minval );
}
else strcpy( minval, datepart );
/* max */
stat = DT_jdate( smax, &l );
DT_getmdy( &mon, &day, &yr );
if( nearest[0] == 'q' || nearest[0] == '3' ) {
if( mon <= 3 ) mon = 4;
else if( mon <= 6 ) mon = 7;
else if( mon <= 9 ) mon = 10;
else if( mon <= 12 ) mon = 13;
}
else mon ++;
/* wrap around year.. */
newmon = ((mon-1) % 12 ) +1;
yr += ((mon-1) / 12);
mon = newmon;
DT_makedate( yr, mon, 1, "", datepart );
if( strcmp( unittyp, "datetime" )==0 ) {
DT_maketime( 0, 0, 0.0, timepart );
DT_build_dt( datepart, timepart, maxval );
}
else strcpy( maxval, datepart );
return( 1 );
}
else if( strncmp( nearest, "year", 4 )== 0 || strncmp( nearest, "2year", 5 )==0 ||
strncmp( nearest, "5year", 5 )==0 || strncmp( nearest, "10year", 6 )==0 ) {
int mon, day, yr;
long l;
int yearsblock; /* 0 5 or 10 */
if( !GL_smember( unittyp, "date datetime" ))
Eerr( 2892, "autorange 'nearest=year' only valid with date or datetime scaletype", unittyp );
if( nearest[0] != 'y' ) { /* this section scg 1/28/05 */
yearsblock = nearest[0] - '0';
if( yearsblock == 1 ) yearsblock = 10;
}
else yearsblock = 0;
/* min */
stat = DT_jdate( smin, &l );
DT_getmdy( &mon, &day, &yr );
if( yearsblock ) yr = (yr / yearsblock) * yearsblock; /* scg 1/28/05 */
DT_makedate( yr, 1, 1, "", datepart );
if( strcmp( unittyp, "datetime" )==0 ) {
DT_maketime( 0, 0, 0.0, timepart );
DT_build_dt( datepart, timepart, minval );
}
else strcpy( minval, datepart );
/* max */
stat = DT_jdate( smax, &l );
DT_getmdy( &mon, &day, &yr );
if( yearsblock ) yr = ((yr / yearsblock)+1) * yearsblock; /* scg 1/28/05 */
else yr++;
DT_makedate( yr, 1, 1, "", datepart );
if( strcmp( unittyp, "datetime" )==0 ) {
DT_maketime( 0, 0, 0.0, timepart );
DT_build_dt( datepart, timepart, maxval );
}
else strcpy( maxval, datepart );
return( 1 );
}
else if( strncmp( nearest, "day", 3 )== 0 || strcmp( nearest, "monday" )==0 || strcmp( nearest, "sunday" )==0 ) {
int mon, day, yr;
double days, mins;
if( !GL_smember( unittyp, "date datetime" ))
Eerr( 2892, "autorange 'nearest=day' only valid with date or datetime scaletype", unittyp );
/* min */
if( strcmp( unittyp, "datetime" )==0 ) DT_getdtparts( smin, datepart, timepart );
else strcpy( datepart, smin ); /* if and else added scg 8/10/05 */
if( nearest[0] == 'm' || nearest[0] == 's' ) { /* adjust datepart back to a monday or sunday */
int iwk; char rbuf[40];
DT_weekday( datepart, rbuf, &iwk ); /* rbuf not used */
if( nearest[0] == 'm' ) { if( iwk == 1 ) iwk = 8; DT_dateadd( datepart, 2 - iwk, rbuf ); }
else if( nearest[0] == 's' ) DT_dateadd( datepart, 1 - iwk, rbuf );
strcpy( datepart, rbuf );
}
/* this is just a way to get the dt parts (?) ...
* DT_datetime2days( smin, &days );
* DT_getmdy( &mon, &day, &yr );
* DT_makedate( yr, mon, day, "", datepart );
*/
if( strcmp( unittyp, "date" )==0 )
/* check for biz day window.. scg 7/21/04 */
mins = 0.0;
DT_frame_mins( &mins ); /* adjust to any biz day window.. */
DT_frommin( mins, timepart );
if( strcmp( unittyp, "date" )==0 ) strcpy( minval, datepart );
else DT_build_dt( datepart, timepart, minval );
/* max */
if( strcmp( unittyp, "datetime" )==0 ) DT_getdtparts( smax, datepart, timepart );
else strcpy( datepart, smax ); /* if and else added scg 8/10/05 */
if( nearest[0] == 'm' || nearest[0] == 's' ) { /* adjust datepart to next monday or sunday */
int iwk; char rbuf[40];
DT_weekday( datepart, rbuf, &iwk ); /* rbuf not used */
if( nearest[0] == 'm' ) { if( iwk == 1 ) iwk = 8; DT_dateadd( datepart, 9 - iwk, rbuf ); }
else if( nearest[0] == 's' ) DT_dateadd( datepart, 8 - iwk, rbuf );
DT_build_dt( rbuf, timepart, smax );
}
DT_datetime2days( smax, &days );
if( fabs( days - floor( days )) < 0.0001 ) ; /* avoid spurious extra day when data max is on date boundary added scg 7/21/04 */
else days++;
DT_days2datetime( days, smax );
DT_datetime2days( smax, &days ); /* set next day's date for getmdy below */
DT_getmdy( &mon, &day, &yr );
DT_makedate( yr, mon, day, "", datepart );
DT_maketime( 0, 0, 0.0, timepart );
if( strcmp( unittyp, "date" )==0 ) strcpy( maxval, datepart );
else DT_build_dt( datepart, timepart, maxval );
return( 1 );
}
else if( strncmp( nearest, "hour", 4 )== 0 || strncmp( nearest, "3hour", 5 )==0 ||
strncmp( nearest, "6hour", 5 )==0 || strncmp( nearest, "12hour", 6 )==0 ) {
int hour, minute;
double sec;
int hoursblock; /* 0, 3, 6, or 12 */
if( !GL_smember( unittyp, "time datetime" ))
Eerr( 2892, "autorange 'nearest=hour' is incompatible with scaletype", unittyp );
if( nearest[0]!= 'h' ) { /* this section scg 1/28/05 */
hoursblock = nearest[0] - '0';
if( hoursblock == 1 ) hoursblock = 12;
}
else hoursblock = 0;
if( strcmp( unittyp, "time" )==0 ) {
/* min */
DT_tomin( smin, &sec ); /* sec not used */
DT_gethms( &hour, &minute, &sec );
if( hoursblock ) hour = (hour / hoursblock) * hoursblock; /* scg 1/28/05 */
DT_maketime( hour, 0, 0.0, minval );
/* max */
DT_tomin( smax, &sec ); /* sec not used */
DT_gethms( &hour, &minute, &sec );
if( hoursblock ) hour = ((hour / hoursblock)+1) * hoursblock; /* scg 1/28/05 */
if( minute != 0 || sec != 0.0 ) hour++; /* bug, scg 12/13/05 */
DT_maketime( hour, 0, 0.0, maxval );
}
else if( strcmp( unittyp, "datetime" )==0 ) {
double days;
int mon, day, yr;
/* min */
DT_datetime2days( smin, &days );
/* time part */
DT_gethms( &hour, &minute, &sec );
if( hoursblock ) hour = (hour / hoursblock) * hoursblock; /* scg 1/28/05 */
DT_maketime( hour, 0, 0.0, timepart );
/* date part */
DT_getmdy( &mon, &day, &yr );
DT_makedate( yr, mon, day, "", datepart );
DT_build_dt( datepart, timepart, minval );
/* max */
DT_datetime2days( smax, &days );
/* time part */
DT_gethms( &hour, &minute, &sec );
if( hour == 23 ) {
DT_days2datetime( days+1.0, smax ); /* set next day's date for getmdy below*/
DT_datetime2days( smax, &days ); /* set next day's date for getmdy below*/
DT_maketime( 0, 0, 0.0, timepart ); /* ok for any hoursblock */
}
else {
if( hoursblock ) hour = ((hour / hoursblock)+1) * hoursblock; /* scg 1/28/05 */
else hour++;
DT_maketime( hour, 0, 0.0, timepart );
}
/* date part */
DT_getmdy( &mon, &day, &yr );
DT_makedate( yr, mon, day, "", datepart );
DT_build_dt( datepart, timepart, maxval );
}
return( 1 );
}
/* else if( strcmp( nearest, "minute" )==0 || strcmp( nearest, "10minute" )==0 ||
* strcmp( nearest, "20minute" )==0 || strcmp( nearest, "30minute" )==0 ) {
*/
else if( stricmp( nearest, "minute" )==0 || /* handles minute or Nminute or NNminute, contributed by Chris Demetriou 1/9/08 */
( nearest[0] >= '0' && nearest[0] <= '9' && stricmp( nearest + 1, "minute" )==0 ) ||
( nearest[0] >= '0' && nearest[0] <= '9' && nearest[1] >= '0' && nearest[1] <= '9' && stricmp( nearest + 2, "minute" )==0 ) ) {
int hour, minute, minblock;
double sec;
if( strcmp( unittyp, "time" )!= 0 ) Eerr( 2892, "autorange 'nearest=minute' is incompatible with scaletype", unittyp );
/* if( nearest[0] != 'm' ) minblock = (nearest[0] - '0') * 10; // changed 1/9/08 */
if( tolower( (int) nearest[0] ) != 'm' ) {
minblock = atoi(nearest);
if( minblock < 0 || minblock >= 60 || ( 60 % minblock )!=0 ) {
Eerr( 2892 /*???*/, "invalid number of minutes in 'nearest' autorange specification", nearest );
}
}
else minblock = 0;
/* min */
DT_tomin( smin, &sec ); /* sec not used */
DT_gethms( &hour, &minute, &sec );
if( minblock ) minute = (minute / minblock) * minblock;
DT_maketime( hour, minute, 0.0, minval );
/* max */
DT_tomin( smax, &sec ); /* sec not used */
DT_gethms( &hour, &minute, &sec );
if( minblock ) minute = ((minute / minblock)+1) * minblock;
else minute++;
if( minute >= 60 ) { minute = minute % 60; hour++; }
DT_maketime( hour, minute, 0.0, maxval );
return( 1 );
}
else if( stricmp( nearest, "second" )==0 || /* handles second or Nsecond or NNsecond, contributed by Chris Demetriou 1/9/08 */
( nearest[0] >= '0' && nearest[0] <= '9' && stricmp( nearest + 1, "second" )==0 ) ||
( nearest[0] >= '0' && nearest[0] <= '9' && nearest[1] >= '0' && nearest[1] <= '9' && stricmp( nearest + 2, "second" )==0 ) ) {
int hour, minute, isec, secblock;
double sec;
if( strcmp( unittyp, "time" )!= 0 ) Eerr( 2892, "autorange 'nearest=second' is incompatible with scaletype", unittyp );
if( tolower( (int) nearest[0] ) != 's' ) {
secblock = atoi(nearest);
if( secblock < 0 || secblock >= 60 || ( 60 % secblock )!=0 ) {
Eerr( 2892 /*???*/, "invalid number of minutes in 'nearest' autorange specification", nearest );
}
}
else secblock = 0;
/* min */
DT_tomin( smin, &sec );
DT_gethms( &hour, &minute, &sec );
isec = (int)floor(sec);
if( secblock ) isec = (isec / secblock) * secblock;
DT_maketime( hour, minute, isec * 1.0, minval );
/* max */
DT_tomin( smax, &sec );
DT_gethms( &hour, &minute, &sec );
isec = (int)ceil(sec); /* will round up to "60" at most. */
if( secblock ) isec = ((isec + secblock - 1) / secblock) * secblock;
if( isec >= 60 ) { minute++; isec = 0; }
if( minute >= 60 ) { minute = minute % 60; hour++; }
DT_maketime( hour, minute, isec * 1.0, maxval );
return( 1 );
}
return( 0 );
}
ploticus-2.42/src/proc_vector.c- 0000644 0001750 0001750 00000025744 11202301714 015635 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* windbarb features contributed by Andrew Phillips */
/* PROC VECTOR - render a display of vectors */
#include "pl.h"
#define TWOPI 6.2831854
#define HALFPI 1.5707963
int
PLP_vector()
{
char attr[NAMEMAXLEN], *line, *lineval;
int first, lvp;
int i, stat;
int xfield, yfield, dirfield, magfield, colorfield, exactcolorfield, clip;
double dirrange, lenscale, x, y, newx, newy, len, dir, ahlen, ahwid;
double sin(), cos(), basedir, constantlen, holdx, holdy;
char *acolor, *linedetails, *selex;
char legendlabel[256];
double barblimitbig, barblimitmedium, barblimitsmall, barblimittiny, barbdir, mag;
char dirunits, zeroat, clockdir, lenunits, type;
int x2field, y2field;
double taillen;
TDH_errprog( "pl proc vector" );
xfield = -1; yfield = -1; dirfield = -1; magfield = -1; colorfield = -1; exactcolorfield = -1; x2field = -1; y2field = -1;
dirrange = 360.0;
ahlen = 0.15;
ahwid = 0.4;
acolor = ""; selex = ""; linedetails = "";
strcpy( legendlabel, "" );
dirunits = 'd'; /* degrees */
zeroat = 't'; /* top */
clockdir = '+'; /* clockwise */
lenunits = 'a'; /* absolute */
type = 'a'; /* arrow */
lenscale = 1.0;
constantlen = 0.0;
taillen = 0.1;
barblimitbig = 50.0; /* Magnitude limits */
barblimitmedium = 10.0;
barblimitsmall = 5.0;
barblimittiny = 2.0;
barbdir = 120;
clip = 1;
mag = 0;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "xfield" )==0 ) xfield = fref( lineval ) -1;
else if( strcmp( attr, "yfield" )==0 ) yfield = fref( lineval ) -1;
else if( strcmp( attr, "dirfield" )==0 ) dirfield = fref( lineval ) -1;
else if( strcmp( attr, "x2field" )==0 ) x2field = fref( lineval ) -1;
else if( strcmp( attr, "y2field" )==0 ) y2field = fref( lineval ) -1;
else if( strcmp( attr, "dirrange" )==0 ) dirrange = atof( lineval );
else if( strcmp( attr, "dirunits" )==0 ) dirunits = lineval[0];
else if( strcmp( attr, "clockdir" )==0 ) clockdir = lineval[0];
else if( strcmp( attr, "zeroat" )==0 ) zeroat = lineval[0];
else if( strcmp( attr, "magfield" )==0 || strcmp( attr, "lenfield" )==0 ) magfield = fref( lineval ) -1;
else if( strcmp( attr, "lenunits" )==0 ) lenunits = lineval[0];
else if( strcmp( attr, "lenscale" )==0 ) lenscale = ftokncpy( lineval );
else if( strcmp( attr, "constantlen" )==0 ) constantlen = ftokncpy( lineval );
else if( strcmp( attr, "colorfield" )==0 ) colorfield = fref( lineval ) -1;
else if( strcmp( attr, "exactcolorfield" )==0 ) exactcolorfield = fref( lineval ) -1;
else if( strcmp( attr, "linedetails" )==0 ) linedetails = lineval;
else if( strcmp( attr, "arrowheadlength" )==0 ) ahlen = ftokncpy( lineval );
else if( strcmp( attr, "arrowheadwidth" )==0 ) ahwid = ftokncpy( lineval );
else if( strcmp( attr, "arrowheadcolor" )==0 ) acolor = lineval;
else if( strcmp( attr, "select" )==0 ) selex = lineval;
else if( strcmp( attr, "legendlabel" )==0 ) tokncpy( legendlabel, lineval, 256 );
else if( strcmp( attr, "taillen" )==0 ) taillen = ftokncpy( lineval );
else if( strcmp( attr, "clip" )==0 ) clip = getyn( lineval );
else if( strcmp( attr, "type" )==0 ) type = lineval[0];
else if( strcmp( attr, "barblimits" )==0 ) {
sscanf( lineval, "%lf %lf %lf %lf", &barblimitbig, &barblimitmedium, &barblimitsmall, &barblimittiny );
}
else if( strcmp( attr, "barbdir" )==0 ) barbdir = ftokncpy( lineval );
else Eerr( 1, "attribute not recognized", attr );
}
/* overrides and degenerate cases */
/* -------------------------- */
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) );
if( !scalebeenset() )
return( Eerr( 51, "No scaled plotting area has been defined yet w/ proc areadef", "" ) );
if( type == 'e' ) type = 'i';
if( xfield < 0 || yfield < 0 ) return( Eerr( 2205, "xfield and yfield are both required", "" ));
if( dirfield < 0 && ( x2field < 0 || y2field < 0 )) return( Eerr( 2205, "dirfield or x2field&y2field required", "" ));
if( magfield < 0 && constantlen == 0.0 && (x2field < 0 || y2field < 0 ))
return( Eerr( 2205, "magfield, constantlen, or x2field&y2field required", "" ));
if( magfield < 0 && type == 'b' && (x2field < 0 || y2field < 0 ))
return( Eerr( 2205, "magfield oe x2field/y2field required when type is barb", "" ));
if( barblimitbig <= 0 || barblimitmedium <= 0 || barblimitsmall <= 0 ) return( Eerr( 2205, "barblimits must be grater then 0", ""));
if( strncmp( legendlabel, "#usefname", 9 )==0 ) getfname( dirfield+1, legendlabel ); /* legendlabel[256] */
if( !GL_member( type, "abelit" )) type = 'a';
/* now do the plotting work.. */
/* -------------------------- */
if( dirunits == 'r' ) dirrange = TWOPI;
if( zeroat == 't' ) basedir = TWOPI * 0.25; /* top */
else if( zeroat == 'b' ) basedir = TWOPI * 0.75; /* bottom */
else if( zeroat == 'l' ) basedir = TWOPI * 0.5; /* left */
linedet( "linedetails", linedetails, 0.5 );
barbdir = (barbdir/dirrange) * TWOPI;
for( i = 0; i < Nrecords; i++ ) {
if( selex[0] != '\0' ) { /* process against selection condition if any.. */
int result;
stat = do_select( selex, i, &result );
if( stat != 0 ) { Eerr( stat, "Select error", selex ); continue; }
if( result == 0 ) continue; /* reject */
}
/* get x value.. */
x = fda( i, xfield, 'x' );
if( Econv_error() ) { conv_msg( i, xfield, "xfield" ); continue; }
/* get y value.. */
y = fda( i, yfield, 'y' );
if( Econv_error() ) { conv_msg( i, yfield, "yfield" ); continue; }
/* if colorfield used, get color.. */
if( colorfield >= 0 ) {
char *ldet; /* to get it to compile.. */
linedetails = "";
ldet = PL_get_legent( da( i, colorfield ) );
linedet( "colorfield", linedetails, 0.5 );
}
else if( exactcolorfield >= 0 ) {
linedetails = da( i, exactcolorfield );
linedet( "exactcolorfield", linedetails, 0.5 );
}
/* convert x,y to absolute units.. */
x = Eax( x );
y = Eay( y );
/* added scg 12/19/03 */
if( x2field >= 0 && y2field >=0 ) {
newx = Eax( fda( i, x2field, 'x' ) );
newy = Eay( fda( i, y2field, 'y' ) );
}
else {
/* dir and len.. */
dir = atof( da( i, dirfield ) );
if( magfield >= 0 ) mag = atof( da( i, magfield ) );
if( constantlen > 0.0 ) len = constantlen;
/* else len = atof( da( i, magfield ) ); */
else len = mag;
if( clockdir == '+' ) dir *= -1.0;
/* normalize dir and len.. */
dir = basedir + ((dir / dirrange) * TWOPI );
len *= lenscale;
if( lenunits == 'x' || lenunits == 'd' || lenunits == 'u' ) len = Eax( len ) - Eax( 0.0 );
else if( lenunits == 'y' ) len = Eay( len ) - Eay( 0.0 );
newx = x + (len * cos( dir ));
newy = y + (len * sin( dir ));
}
/* skip degenerate cases.. added scg 5/24/05 */
if( x == newx && y == newy ) continue;
if( clip ) {
holdx = newx; holdy = newy;
stat = Elineclip( &x, &y, &newx, &newy, EXlo, EYlo, EXhi, EYhi );
if( stat ) continue; /* entire vector is out of range */
else if( ! GL_close_to( newx, holdx, 0.000001 ) || !GL_close_to( newy, holdy, 0.000001 ) ) {
/* end is out of range, just draw line.. */
Emov( x, y );
Elin( newx, newy );
continue;
}
}
/* arrow */
if( type == 'a' ) {
Earrow( x, y, newx, newy, ahlen, ahwid, acolor );
}
/* line or error bar */
else if( type == 'l' || type == 'i' || type == 't' ) {
Emov( x, y );
Elin( newx, newy );
if( type == 'i' ) PLG_perptail( x, y, newx, newy, taillen );
if( type == 'i' || type == 't' ) PLG_perptail( newx, newy, x, y, taillen );
}
/* windbarb */
else if( type == 'b' ) {
/* contributed by Andrew Phillips */
int bigBarbCount, mediumBarbCount, smallBarbCount, curBarb, b;
double x1, x2, x3, y1, y2, y3, newMag, barbLen, barbSpace, barbAdjust;
bigBarbCount = 0;
mediumBarbCount = 0;
smallBarbCount = 0;
curBarb = 0;
newMag = mag;
/* length of barbs and the space betwen them */
barbLen = len/3;
barbSpace = len/6;
/* used to make small and medium barbs come from the
end of them stem */
barbAdjust = 0;
if( newMag >= barblimittiny) {
/* Draw the stem */
Emov( x, y );
Elin( newx, newy );
/* Count how many barbs to draw. Since barblimitbig
and friends arn't always going to be integers we
have to do this insted of some modulo fun. */
while(newMag > barblimitbig) {
bigBarbCount++;
newMag -= barblimitbig;
}
while(newMag > barblimitmedium) {
mediumBarbCount++;
newMag -= barblimitmedium;
}
while(newMag > barblimitsmall) {
smallBarbCount++;
newMag -= barblimitsmall;
}
/* Draw the big (triangle) barbs */
for (b = 0; b < bigBarbCount && curBarb < 8; b++) {
x1 = x + ((len - curBarb*barbSpace) * cos( dir ));
y1 = y + ((len - curBarb*barbSpace) * sin( dir ));
x2 = x + ((len - (curBarb+0.5)*barbSpace) * cos( dir )) - (barbLen * cos(dir+barbdir));
y2 = y + ((len - (curBarb+0.5)*barbSpace) * sin( dir )) - (barbLen * sin(dir+barbdir));
x3 = x + ((len - (curBarb+1)*barbSpace) * cos( dir ));
y3 = y + ((len - (curBarb+1)*barbSpace) * sin( dir ));
Emov(x1, y1);
Epath(x2, y2);
Epath(x3, y3);
Epath(x1, y1);
Ecolorfill( Ecurcolor );
curBarb++;
}
if (bigBarbCount > 0) barbAdjust = 0.5;
/* Draw the medium barbs */
for (b = 0; b < mediumBarbCount && curBarb < 8; b++) {
x1 = x + ((len - (curBarb+barbAdjust)*barbSpace) * cos( dir ));
y1 = y + ((len - (curBarb+barbAdjust)*barbSpace) * sin( dir ));
x2 = x1 - (barbLen * cos(dir+barbdir));
y2 = y1 - (barbLen * sin(dir+barbdir));
Emov(x1, y1);
Elin(x2, y2);
curBarb++;
}
/* Draw the small barbs */
for (b = 0; b < smallBarbCount && curBarb < 8; b++) {
x1 = x + ((len - (curBarb+barbAdjust)*barbSpace) * cos( dir ));
y1 = y + ((len - (curBarb+barbAdjust)*barbSpace) * sin( dir ));
x2 = x1 - (barbLen/2 * cos(dir+barbdir));
y2 = y1 - (barbLen/2 * sin(dir+barbdir));
Emov(x1, y1);
Elin(x2, y2);
curBarb++;
}
}
else {
/* Tiny barbs should just be half length stems */
newx = x + (len/2 * cos( dir ));
newy = y + (len/2 * sin( dir ));
/* Draw the mini stem */
Emov( x, y );
Elin( newx, newy );
}
} /* end of barbs */
} /* end data rows loop */
if( legendlabel[0] != '\0' ) PL_add_legent( LEGEND_LINE, legendlabel, "", linedetails, "", "" );
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_scatterplot.c 0000644 0001750 0001750 00000045203 11202300171 016606 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
#include "pl.h"
/* constants for clustering.. */
#define NOFS
static double xofst[38] = { 0, 0, 4, 0, -4, 4, -4, -4, 4,
0, -8, 0, 8, 4, -8, 4, 8, -4, -8, -4, 8,
0, 0, 12, -12, 4, 4, 12, -12, -4, -4, 12, -12,
8, -8, -8, 8 };
static double yofst[38] = { 0, 4, 0, -4, 0, 4, -4, 4, -4,
-8, 0, 8, 0, -8, 4, 8, 4, -8, -4, 8, -4,
12, -12, 0, 0, 12, -12, 4, 4, 12, -12, -4, -4,
8, -8, 8, -8 };
#ifdef NONANSI
static int ptcompare();
#else
static int ptcompare(const void *a, const void *b);
#endif
int
PLP_scatterplot()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
int i, nt, stat, align, result, cluster, dupcount, subdupcount, clustevery, verttext, nrow, realrow;
int clustermeth, symfield_userange, dupsleg, irow, dorect, rectoutline, flop2, maxdups, doing_alt;
int xfield, yfield, lblfield, sizefield, symfield;
char *symbol, *linedetails, *text, *textdetails, *selex, *xrange, *yrange;
char *mapurl, *maplabel, *expandedurl, *expandedlabel, *labelword, *altsym, *altwhen, *qcolor;
char buf[512], symcode[80], rhi[40], rlo[40];
char linedir, reqlinedir;
char legendlabel[256];
int colorfield;
char symtmp[80];
double adjx, adjy, linelen, xloc, yloc, radius, x, y, cx, cy, hlinelen, sizescale;
double ox[38], oy[38], clusterfact, oldx, oldy, xlo, xhi, ylo, yhi, clusterdiff, ptx, pty, hw, txhi, rectw, recth, vennden;
TDH_errprog( "pl proc scatterplot" );
/* initialize */
xfield = -1; yfield = -1;
symbol = ""; linedetails = ""; text = ""; textdetails = ""; selex = ""; xrange = ""; yrange = "";
mapurl = ""; maplabel = ""; altsym = ""; altwhen = "";
strcpy( legendlabel, "" );
labelword = "@VAL";
linelen = -1.0;
xloc = 0.0; yloc = 0.0;
vennden = 0.0;
sizescale = 0.5/72.0; /* correspond roughly with pt size */
clusterfact = 0.01;
clusterdiff = 0.001;
lblfield = -1;
sizefield = -1;
colorfield = -1;
symfield = -1;
cluster = 0; /* changed and added to "breakers" in docs, scg 5/29/06 */
verttext = 0; clustevery = 0; clustermeth = 0; dupsleg = 0; symfield_userange = 0; dorect = 0; rectoutline = 0; doing_alt = 0;
linedir = reqlinedir = '\0'; /* scg 3/4/03 */
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "xfield" )==0 ) xfield = fref( lineval ) -1;
else if( strcmp( attr, "yfield" )==0 ) yfield = fref( lineval ) -1;
else if( strcmp( attr, "labelfield" )==0 ) lblfield = fref( lineval ) -1;
else if( strcmp( attr, "sizefield" )==0 ) sizefield = fref( lineval ) -1;
else if( strcmp( attr, "colorfield" )==0 ) colorfield = fref( lineval ) -1;
else if( strcmp( attr, "symbol" )==0 ) symbol = lineval;
else if( strcmp( attr, "text" )==0 ) text = lineval;
else if( strcmp( attr, "textdetails" )==0 ) textdetails = lineval;
else if( strcmp( attr, "sizescale" )==0 ) sizescale = ftokncpy( lineval ) * 0.5/72.0;
else if( strcmp( attr, "xrange" )==0 ) xrange = lineval;
else if( strcmp( attr, "yrange" )==0 ) yrange = lineval;
else if( strcmp( attr, "clickmapurl" )==0 ) mapurl = lineval;
else if( strcmp( attr, "clickmaplabel" )==0 ) maplabel = lineval;
else if( strcmp( attr, "clickmaplabeltext" )==0 ) maplabel = getmultiline( lineval, "get" );
else if( strcmp( attr, "linelen" )==0 ) {
if( lineval[0] == '\0' ) linelen = -1.0;
else { linelen = ftokncpy( lineval ); if( PLS.usingcm ) linelen /= 2.54; }
}
else if( strcmp( attr, "linedir" )==0 ) reqlinedir = lineval[0];
else if( strcmp( attr, "linedetails" )==0 ) linedetails = lineval;
else if( strcmp( attr, "xlocation" )==0 ) {
Eposex( lineval, X, &xloc ); /* val -> lineval scg 5/3/99 */
if( Econv_error() ) Eerr( 2394, "invalid xlocation", lineval );
}
else if( strcmp( attr, "ylocation" )==0 ) {
Eposex( lineval, Y, &yloc ); /* val -> lineval 5/3/99 */
if( Econv_error() ) Eerr( 2395, "invalid ylocation", lineval );
}
else if( strcmp( attr, "select" )==0 ) selex = lineval;
else if( strcmp( attr, "legendlabel" )==0 ) { strncpy( legendlabel, lineval, 255 ); legendlabel[255] = '\0'; }
else if( strcmp( attr, "cluster" )==0 ) cluster = getyn( lineval );
else if( strcmp( attr, "clusterdiff" )==0 ) { cluster = 1; clusterdiff = ftokncpy( lineval ); }
else if( strcmp( attr, "clustermethod" )==0 ) { cluster = 1; clustermeth = lineval[0]; } /* h, v, 2, u, r, .. */
else if( strcmp( attr, "clusterfact" )==0 ) { cluster = 1; clusterfact = ftokncpy( lineval ) * .01; }
else if( strcmp( attr, "clustevery" )==0 ) { cluster = 1; clustevery = itokncpy( lineval ); if( clustevery < 1 ) clustevery = 1; }
else if( strcmp( attr, "dupsleg" )==0 ) {
dupsleg = getyn( lineval );
if( dupsleg ) { cluster = 1; clustermeth = 'l'; symbol = "sym6a"; } /* symbol set here and below to guarantee symbol mode */
}
else if( strcmp( attr, "symfield" )==0 ) { symbol = "sym6a"; symfield = fref( lineval ) -1; symfield_userange = 0; }
else if( strcmp( attr, "symrangefield" )==0 ) { symbol = "sym6a"; symfield = fref( lineval ) -1; symfield_userange = 1; }
else if( strcmp( attr, "verticaltext" )==0 ) verttext = getyn( lineval );
else if( strcmp( attr, "rectangle" )==0 ) {
nt = sscanf( lineval, "%lf %lf %s", &rectw, &recth, buf );
if( nt == 3 ) rectoutline = 1;
rectw *= 0.5;
recth *= 0.5;
rectw = Eax( rectw ) - Eax( 0.0 );
recth = Eay( recth ) - Eay( 0.0 );
dorect = 1;
}
else if( strcmp( attr, "labelword" ) == 0 ) labelword = lineval;
else if( strcmp( attr, "vennden" ) == 0 ) vennden = ftokncpy( lineval );
else if( strcmp( attr, "altsymbol" )==0 ) altsym = lineval;
else if( strcmp( attr, "altwhen" )==0 ) altwhen = lineval;
else Eerr( 1, "attribute not recognized", attr );
}
/* overrides and degenerate cases */
/* -------------------------- */
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) );
if( !scalebeenset() )
return( Eerr( 51, "No scaled plotting area has been defined yet w/ proc areadef", "" ) );
if( xfield < 0 && yfield < 0 ) return( Eerr( 2205, "Niether xfield nor yfield defined", "" ));
if( lblfield >= 0 ) cluster = 0; /* added scg 12/21/00 */
if( strcmp( legendlabel, "#usexname" )==0 ) getfname( xfield+1, legendlabel ); /* legendlabel[256] */
if( strcmp( legendlabel, "#useyname" )==0 ) getfname( yfield+1, legendlabel ); /* legendlabel[256] */
if( dorect ) symbol = "";
/* now do the plotting work.. */
/* -------------------------- */
if( cluster ) {
/* make offsets */
for( i = 0; i < 38; i++ ) {
ox[i] = xofst[i] * clusterfact;
oy[i] = yofst[i] * clusterfact;
}
/* determine cluster method */
if( clustermeth == 0 ) {
if( yfield < 0 ) clustermeth = 'v'; /* 1-d horizontal - cluster vertically (was 'h'-scg 4/21/05) */
else if( xfield < 0 ) clustermeth = 'h'; /* 1-d vertical - cluster horizontally (was 'v'-scg 4/21/05) */
else clustermeth = '2'; /* 2-d cluster */
}
}
/* ranges */
xlo = EDXlo;
xhi = EDXhi;
ylo = EDYlo;
yhi = EDYhi;
if( xrange[0] != '\0' ) {
nt = sscanf( xrange, "%s %s", rlo, rhi );
xlo = Econv( X, rlo );
if( Econv_error() ) { Eerr( 3958, "xrange bad format", rlo ); xlo = EDXlo; }
if( nt == 2 ) xhi = Econv( X, rhi );
if( Econv_error() ) { Eerr( 3958, "xrange bad format", rhi ); xhi = EDXhi; }
}
if( yrange[0] != '\0' ) {
nt = sscanf( yrange, "%s %s", rlo, rhi );
ylo = Econv( Y, rlo );
if( Econv_error() ) { Eerr( 3958, "yrange bad format", rlo ); ylo = EDYlo; }
if( nt == 2 ) yhi = Econv( Y, rhi );
if( Econv_error() ) { Eerr( 3958, "yrange bad format", rhi ); yhi = EDYhi; }
}
nrow = 0;
for( i = 0; i < Nrecords; i++ ) {
if( selex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selex, i, &result );
if( stat != 0 ) { Eerr( stat, "Select error", selex ); continue; }
if( result == 0 ) continue; /* reject */
}
/* get x value.. */
if( xfield >= 0 ) {
x = fda( i, xfield, 'x' );
if( Econv_error() ) { conv_msg( i, xfield, "xfield" ); continue; }
if( x < xlo || x > xhi ) continue;
}
/* get y value.. */
if( yfield >= 0 ) {
y = fda( i, yfield, 'y' );
if( Econv_error() ) { conv_msg( i, yfield, "yfield" ); continue; }
if( y < ylo || y > yhi ) continue;
}
/* go to absolute units.. */
if( xfield < 0 ) x = xloc;
else x = Eax(x);
if( yfield < 0 ) y = yloc;
else y = Eay(y);
/* put (x,y) into PLV array so points can be sorted.. */
if( nrow >= PLVthirdsize ) {
fprintf( PLS.errfp, "point capacity exceeded, skipping data point (raise using -maxvector)\n" );
continue;
}
dat3d( nrow, 0 ) = x;
dat3d( nrow, 1 ) = y;
dat3d( nrow, 2 ) = (double)i; /* added scg 12/21/00 - went from dat2d to dat3d */
/* need to keep track of actual location in data array for labels, sizefield, etc.. */
nrow++;
}
/* if clustering and not using a label field, sort PLV array */
if( cluster && lblfield < 0 && sizefield < 0 && colorfield < 0 ) {
if( PLS.debug ) fprintf( PLS.diagfp, "sorting points for scatterplot\n" );
qsort( PLV, nrow, sizeof(double)*3, ptcompare );
}
if( verttext ) Etextdir( 90 );
/* these are used in clustering.. */
oldx = NEGHUGE;
oldy = NEGHUGE;
dupcount = 0;
subdupcount = 0;
maxdups = 0;
strcpy( symcode, "sym6a" );
radius = 0.04;
/* in the following, text must come before symbol.. */
if( text[0] != '\0' || lblfield >= 0 ) textdet( "textdetails", textdetails, &align, &adjx, &adjy, -3, "R", 1.0 );
if( symbol[0] != '\0' ) symdet( "symbol", symbol, symcode, &radius );
if( linelen > 0.0 || rectoutline ) linedet( "linedetails", linedetails, 0.5 );
cx = Ecurtextwidth * 0.3;
cy = Ecurtextheight * 0.3;
hlinelen = linelen * 0.5;
txhi = cy + cy;
if( text[0] != '\0' ) hw = strlen( text ) * Ecurtextwidth * 0.5;
if( colorfield >= 0 ) strcpy( symtmp, symcode );
/* now display points.. */
for( irow = 0; irow < nrow; irow++ ) {
x = dat3d( irow, 0 );
y = dat3d( irow, 1 );
realrow = (int)dat3d( irow, 2 ); /* added scg 12/21/00 */
/* in this loop, you MUST USE REALROW, NOT IROW for accessing ancillary data fields!! */
if( cluster ) {
if( GL_close_to( x, oldx, clusterdiff ) && GL_close_to( y, oldy, clusterdiff ) ) {
subdupcount++;
if( subdupcount >= clustevery ) {
dupcount++;
subdupcount = 0;
}
if( dupcount % 2 == 0 ) flop2 = 1;
else flop2 = -1;
if( clustermeth == '2' && dupcount > 37 ) {
maxdups = 37;
dupcount = 0; /* mod */
}
if( clustermeth == 'h' ) x += ((dupcount+1)/2) * clusterfact * 2.0 * flop2;
else if( clustermeth == 'v' ) y += ((dupcount+1)/2) * clusterfact * 2.0 * flop2;
else if( clustermeth == 'u' ) y += dupcount * clusterfact * 2.0; /* 1D upward */
else if( clustermeth == 'r' ) x += dupcount * clusterfact * 2.0; /* 1D rightward */
else if( clustermeth == 'l' ) ; /* legend lookup, no offset */
else if( clustermeth == '2' ) { x += ox[dupcount%38]; y += oy[dupcount%38]; } /* 2-D */
if( clustermeth == 'l' ) { /* if more duplicate points coming, skip.. */
if( irow < nrow-1 ) {
double nextx, nexty;
nextx = dat3d( irow+1, 0 );
nexty = dat3d( irow+1, 1 );
if( GL_close_to( x, nextx, clusterdiff ) &&
GL_close_to( y, nexty, clusterdiff ) ) continue;
}
}
}
else {
if( dupcount > maxdups ) maxdups = dupcount;
oldx = x;
oldy = y;
dupcount = 0;
subdupcount = 0;
}
}
/* allow @field substitutions into url */
if( PLS.clickmap && ( mapurl[0] != '\0' || maplabel[0] != '\0' )) {
expandedurl = &PL_bigbuf[0];
expandedlabel = &PL_bigbuf[2000];
do_subst( expandedurl, mapurl, realrow, URL_ENCODED );
do_subst( expandedlabel, maplabel, realrow, NORMAL );
}
/* render text, mark or line.. */
/* text can be combined with mark if text and symbol both specified */
/* symbol or rectangle.. */
if( symbol[0] != '\0' || dorect || ( text[0] == '\0' && linelen <= 0.0 && lblfield < 0 ) ) {
if( symfield >= 0 ) { /* look it up in legend list.. */
if( symfield_userange ) symbol = PL_get_legent_rg( atof( da( realrow, symfield ) ) );
else symbol = PL_get_legent( da( realrow, symfield ));
if( symbol[0] == '\0' ) Eerr( 7429, "warning: symfield: no matching legend entry tag found", da( realrow, symfield ) );
if( !dorect ) symdet( "symfield", symbol, symcode, &radius );
}
if( dupsleg ) { /* look it up in legend list.. */
symbol = PL_get_legent_rg( (double)dupcount+1 );
if( symbol[0] == '\0' ) Eerr( 7692, "warning: dupsleg: no appropriate legend entry tag\n", da( realrow, symfield ) );
if( !dorect ) symdet( "symfield", symbol, symcode, &radius );
/* note: currently all marks will be rendered; the last one will be on "top" */
}
if( sizefield >= 0 ) radius = sqrt((atof( da( realrow, sizefield ) ) * sizescale)/3.1415927); /* scale the area, not the diameter */
if( colorfield >= 0 ) {
qcolor = da( realrow, colorfield );
sprintf( symcode, symtmp, qcolor ); /* for filled.. build new symcode (symtmp contains %s) */
Ecolor( qcolor ); /* for symbols made up of lines.. */
}
if( dorect ) {
char *color;
color = ""; /* added scg 9/1/05 - heatmap bug */
if( symfield >=0 || dupsleg ) color = symbol; /* was: sscanf( symbol, "%s", color ); // strip off any trailing space */
if( colorfield >= 0 ) color = qcolor;
Ecblock( x-rectw, y-recth, x+rectw, y+recth, color, rectoutline );
symbol = "";
}
else if( vennden > 0.0 ) { /* vennden (undocumented) repeats the symbol progressively bigger (bullseye pattern),
(early attempt at venn diagram.. not sure if good for anything) */
double urad;
for( urad = 0.01; urad < radius; urad += vennden ) Emark( x, y, symcode, urad );
}
else { /* standard scatterplot data point is done here.. */
if( altwhen[0] != '\0' ) { /* check for alternate */
stat = do_select( altwhen, realrow, &doing_alt );
if( stat != 0 ) { Eerr( stat, "Select error", altwhen ); continue; }
if( doing_alt == 1 ) symdet( "altsym", altsym, symcode, &radius );
}
Emark( x, y, symcode, radius );
if( doing_alt == 1 ) symdet( "symbol", symbol, symcode, &radius ); /* restore */
}
if( PLS.clickmap && (mapurl[0] != '\0' || maplabel[0] != '\0' )) {
if( dorect ) clickmap_entry( 'r', expandedurl, 0, x-rectw, y-recth, x+rectw, y+recth, 0, 0, expandedlabel );
else clickmap_entry( 'r', expandedurl, 0, x-radius, y-radius, x+radius, y+radius, 0, 0, expandedlabel );
}
}
/* text */
if( text[0] != '\0' ) {
if( symbol[0] != '\0' ) /* set text color etc... */
textdet( "textdetails", textdetails, &align, &adjx, &adjy, -3, "R", 1.0 );
if( sizefield >= 0 ) Etextsize( (int) (atof( da( realrow, sizefield ) ) * sizescale) );
if( colorfield >= 0 ) Ecolor( da( realrow, colorfield ) );
if( verttext ) { ptx = (x+cy)+adjx; pty = y; } /* cy puts midheight of character on point */
else { ptx = x+adjx; pty = (y-cy)+adjy; }
convertnl( text ); /* caution (*text) but ok since result is always smaller than original */
Emov( ptx, pty );
if( align == '?' ) Edotext( text, 'C' );
else Edotext( text, align );
if( symbol[0] != '\0' ) /* restore symbol color etc... */
symdet( "symbol", symbol, symcode, &radius );
if( PLS.clickmap && ( mapurl[0] != '\0' || maplabel[0] != '\0' ))
clickmap_entry( 'r', expandedurl, 0, ptx-hw, pty, x+hw, y+txhi, 0, 0, expandedlabel );
}
/* label from data */
else if( lblfield >= 0 ) {
if( sizefield >= 0 ) Etextsize( (int) (atof( da( realrow, sizefield ) ) * sizescale) );
if( colorfield >= 0 ) Ecolor( da( realrow, colorfield ) );
if( verttext) { ptx = (x+cy)+adjx; pty = y+adjy; } /* cy puts midheight of character on point */
else { ptx = x+adjx; pty = (y-cy)+adjy; }
strcpy( buf, labelword );
GL_varsub( buf, "@VAL", da( realrow, lblfield ) ); /* buf[512] */
Emov( ptx, pty );
if( align == '?' ) Edotext( buf, 'C' );
else Edotext( buf, align );
if( PLS.clickmap && ( mapurl[0] != '\0' || maplabel[0] != '\0' )) {
hw = strlen( buf ) * Ecurtextwidth * 0.5;
if( GL_member( align, "C?" ))clickmap_entry( 'r', expandedurl, 0, ptx-hw, pty, x+hw, y+txhi, 0, 0, expandedlabel );
else if( align == 'L' ) clickmap_entry( 'r', expandedurl, 0, ptx, pty, x+(hw*2.0), y+txhi, 0, 0, expandedlabel );
else if( align == 'R' ) clickmap_entry( 'r', expandedurl, 0, ptx-(hw*2.0), pty, x, y+txhi, 0, 0, expandedlabel );
}
}
/* line */ /* (no clickmap support) */ /* no legend support either (?) */
else if( linelen > 0.0 ) {
if( sizefield >= 0 ) hlinelen = linelen * 0.5 * atof( da( realrow, sizefield ) );
/* sizefield acts as a scale factor to linelen */
if( colorfield >= 0 ) Ecolor( da( realrow, colorfield ) );
if( reqlinedir != '\0' ) linedir = reqlinedir;
else if( xfield >= 0 && yfield >= 0 ) linedir = 'h'; /* arbitrary .. scg 5/16/03 */
else if( xfield >= 0 ) linedir = 'v';
else linedir = 'h'; /* scg 3/5/03 */
if( linedir == 'v' ) { Emov( x, y-hlinelen ); Elin( x, y+hlinelen ); }
else if( linedir == 'u' ) { Emov( x, y ); Elin( x, y+(hlinelen*2.0) ); }
else if( linedir == 'r' ) { Emov( x, y ); Elin( x+(hlinelen*2.0), y ); }
else { Emov( x-hlinelen, y ); Elin( x+hlinelen, y ); }
}
}
if( verttext ) Etextdir( 0 );
if( legendlabel[0] != '\0' ) {
char s[40];
sprintf( s, "%d", nrow );
GL_varsub( legendlabel, "@NVALUES", s ); /* legendlabel[256] */
if( linelen <= 0.0 && lblfield < 0 && text[0] == '\0' )
PL_add_legent( LEGEND_SYMBOL, legendlabel, "", symbol, "", "" );
else if( symbol[0] != '\0' && text[0] != '\0' )
PL_add_legent( LEGEND_SYMBOL+LEGEND_TEXT, legendlabel, "", text, textdetails, symbol );
else if( linelen > 0.0 ) {
char dirstr[8];
sprintf( dirstr, "%c", linedir );
PL_add_legent( LEGEND_LINEMARK, legendlabel, "", linedetails, dirstr, "" );
}
}
setintvar( "NVALUES", nrow );
maxdups++;
setintvar( "MAXDUPS", maxdups );
return( 0 );
}
/* ======================= */
static int
ptcompare( a, b )
const void *a, *b;
/* static int ptcompare( f, g )
* double *f, *g;
*/ /* changed to eliminate gcc warnings scg 5/18/06 */
{
double *f, *g;
double *f2, *g2;
f = (double *)a;
g = (double *)b;
if( *f > *g ) return( 1 );
else if( *f < *g ) return( -1 );
else {
/* advance to Y component */
f2 = f+1;
g2 = g+1;
if( *f2 > *g2 ) return( 1 );
else if( *f2 < *g2 ) return( -1 );
else return( 0 ); /* same */
}
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_venndisk.c 0000644 0001750 0001750 00000014627 11155233426 016110 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC VENN - render a venn diagram */
#include "pl.h"
#define TWOPI 6.2831854
#define HALFPI 1.5707963
#define PI 3.141592653589793238462643
extern double GL_rand();
extern int PLG_circle();
static int do_disk();
int
PLP_venndisk()
{
char attr[NAMEMAXLEN], *line, *lineval;
int first, lvp;
char *color, *leglabel, *outline, *lbldet;
double cenx, ceny, area, radius, densfact, ofs, areascale, yloc, y, adjx, adjy;
int datadriven, xfld, areafld, clrfld, botflag, irow, solidfill, lblfld, align;
TDH_errprog( "pl proc venndisk" );
cenx = ceny = area = -1.0;
densfact = 1.0;
leglabel = "";
color = "red";
outline = "";
lbldet = "";
botflag = 0;
areascale = 1.0;
ofs = 0.0;
datadriven = xfld = areafld = clrfld = 0;
yloc = 0.5;
solidfill = 0;
lblfld = 0;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "location" )==0 ) getcoords( "location", lineval, &cenx, &ceny );
else if( strcmp( attr, "bottomlocation" )==0 ) { getcoords( "bottomlocation", lineval, &cenx, &ceny ); botflag = 1; }
else if( strcmp( attr, "area" )==0 ) area = ftokncpy( lineval ); /* square inches unless areascale given */
else if( strcmp( attr, "areascale" )==0 ) areascale = ftokncpy( lineval );
else if( strcmp( attr, "color" )==0 ) color = lineval;
else if( strcmp( attr, "legendlabel" )==0 || strcmp( attr, "label" )==0 ) leglabel = lineval;
else if( strcmp( attr, "labelfield" )==0 ) lblfld = fref( lineval );
else if( strcmp( attr, "labeldetails" )==0 ) lbldet = lineval;
else if( strcmp( attr, "density" )==0 ) densfact = ftokncpy( lineval );
else if( strcmp( attr, "outline" )==0 ) outline = lineval;
else if( strcmp( attr, "dotsize" )==0 ) ofs = ftokncpy( lineval );
else if( strcmp( attr, "areafld" )==0 ) { areafld = fref( lineval ); datadriven = 1; }
else if( strcmp( attr, "xfld" )==0 ) xfld = fref( lineval );
else if( strcmp( attr, "colorfld" )==0 ) clrfld = fref( lineval );
else if( strcmp( attr, "yloc" )==0 ) yloc = ftokncpy( lineval );
else if( strcmp( attr, "solidfill" )==0 ) solidfill = getyn( lineval );
else Eerr( 1, "attribute not recognized", attr );
}
/* sanity checks.. */
if( !datadriven ) {
if( cenx < 0.0 || ceny < 0.0 || area < 0.0 ) return( Eerr( 428, "The attributes x, y, and area must all be specified", "" ) );
}
if( datadriven && !scalebeenset() ) return( Eerr( 51, "datadriven requires scaled units.. no scaled plotting area has been defined yet w/ proc areadef", "" ));
/* overrides.. */
if( solidfill ) densfact = 0.0;
if( datadriven ) {
ceny = Ea( Y, yloc );
for( irow = 0; irow < Nrecords; irow++ ) {
area = atof( da( irow, areafld-1 ) );
area *= areascale;
if( area > 50.0 ) { Eerr( 72405, "skipping a very large disk", da( irow, areafld ) ); continue; }
radius = sqrt( area / PI );
if( xfld > 0 ) cenx = Ea( X, fda( irow, xfld-1, X ));
else cenx = Ea( X, (double)(irow+1) );
if( clrfld > 0 ) color = da( irow, clrfld-1 );
y = ceny + radius; /* so all disk bottoms are on the line.. */
do_disk( cenx, y, radius, color, densfact, ofs, outline, solidfill );
if( lblfld > 0 ) {
double labx, laby;
textdet( "labeldetails", lbldet, &align, &adjx, &adjy, -2, "R", 1.0 );
if( align == '?' ) align = 'C';
labx = cenx+adjx;
laby = (Elimit( Y, 'l', 'a' )-(Ecurtextheight*2.0))+adjy;
Emov( labx, laby );
Edotext( da( irow, lblfld-1 ), align );
}
}
}
else { /* individual disks */
/* now do the plotting work.. */
/* convert area to a radius in inches.. */
area *= areascale;
if( area > 50.0 ) return( Eerr( 72405, "disk area is too large.. reduce 'area' or reduce 'areascale'", "" ) );
radius = sqrt( area / PI );
if( PLS.usingcm ) { cenx /= 2.54; ceny /= 2.54; ofs /= 2.54; radius /= 2.54; }
if( botflag ) ceny += radius;
do_disk( cenx, ceny, radius, color, densfact, ofs, outline, solidfill );
if( leglabel[0] != '\0' ) PL_add_legent( LEGEND_COLOR, leglabel, "", color, "", "" );
}
return( 0 );
}
/* ----------------------------------------------------------- */
static int
do_disk( cenx, ceny, radius, color_in, densfact, ofs, outline_in, solidfill )
double cenx, ceny, radius, densfact, ofs;
char *color_in, *outline_in;
int solidfill;
{
int i, j, ndots;
char val[100];
double area, dotx, doty, dx, dy, sqrt();
char outline[100], color[40];
area = PI * radius * radius; /* standardize area into square inches.. we'll use it for dot density */
ndots = (int)(area * 2000 * densfact);
strcpy( outline, outline_in );
strcpy( color, color_in );
if( strcmp( color, "none" )==0 ) {
densfact = 0.0;
strcpy( color, "gray(0.7)" );
}
if( densfact > 0.0 ) {
sprintf( val, "color=%s width=0.3", color );
linedet( "dots", val, 1.0 );
if( Edev == 's' && ofs == 0.0 ) ofs = 0.008;
for( i = 0; i < ndots; i++ ) {
/* random location of candidate dot.. */
dotx = cenx - radius + (GL_rand() * radius * 2);
doty = ceny - radius + (GL_rand() * radius * 2);
/* if dot is outside the disk skip it.. */
dx = fabs( dotx - cenx );
dy = fabs( doty - ceny );
if( sqrt( (dx*dx) + (dy*dy) ) > (radius-ofs) ) continue;
if( ofs == 0.0 ) { Emov( dotx, doty ); Elin( dotx, doty+ofs ); }
else { /* randomized tiny line segment direction.. */
j = (int) (GL_rand() * 3.0);
if( j == 0 ) { Emov( dotx, doty ); Elin( dotx, doty+ofs ); }
else if( j == 1 ) { Emov( dotx, doty ); Elin( dotx+ofs, doty+ofs ); }
else if( j == 2 ) { Emov( dotx, doty ); Elin( dotx+ofs, doty-ofs ); }
}
}
}
if( solidfill ) PLG_circle( cenx, ceny, radius, color, 0, 60 );
if( strcmp( outline, "no" ) != 0 ) {
if( strcmp( outline, "yes" )==0 ) strcpy( outline, "" );
if( ! GL_slmember( outline, "*color=*" )) { sprintf( val, " color=%s ", color ); strcat( outline, val ); }
linedet( "outline", outline, 0.3 );
PLG_circle( cenx, ceny, radius, "", 1, 60 );
}
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_line.c 0000644 0001750 0001750 00000006472 10721644654 015224 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC LINE - draw arbitrary line(s) */
#include "pl.h"
#define ABSOLUTE 'a'
#define LOCVAL 'l'
#define SCALED 's'
int
PLP_line()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
char buf[256];
double x, y, ancx, ancy;
char *linedetails, *drawpoints;
char notation;
char a[40], b[40], c[40], d[40];
int nt, ix, buflen, ancgiven;
TDH_errprog( "pl proc line" );
/* initialize */
linedetails = "";
notation = LOCVAL;
x = 0.0; y = 0.0;
ancx = 0.0; ancy = 0.0;
ancgiven = 0;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "points" )==0 ) drawpoints = getmultiline( lineval, "get" );
else if( strcmp( attr, "linedetails" )==0 ) linedetails = lineval;
else if( strcmp( attr, "notation" )==0 ) notation = lineval[0];
else if( strcmp( attr, "anchor" )==0 ) { getcoords( "anchor", lineval, &ancx, &ancy ); ancgiven = 1; }
else Eerr( 1, "attribute not recognized", attr );
}
/* overrides & sanity checks.. */
if( notation != ABSOLUTE && notation != SCALED && notation != LOCVAL ) {
notation = LOCVAL;
Eerr( 479, "warning: invalid 'notation'.. using locval", "" );
}
if( ancgiven && notation == SCALED ) {
Eerr( 478, "warning, 'anchor' can't be used with notation=scaled .. ignored", "" );
ancx = ancy = 0.0;
}
/* now do the plotting work.. */
linedet( "linedetails", linedetails, 1.0 );
ix = 0;
first = 1;
buflen = strlen( drawpoints );
while( 1 ) {
GL_getchunk( buf, drawpoints, &ix, "\n" );
nt = sscanf( buf, "%s %s %s %s", a, b, c, d );
if( nt == 4 || first ) {
if( notation == ABSOLUTE ) {
Emov( atof( a )+ancx, atof( b )+ancy );
Elin( atof( c )+ancx, atof( d )+ancy );
}
else if( notation == SCALED ) {
Emov( PL_u( X, a ), PL_u( Y, b ) );
if( Econv_error() ) Eerr( 2945, "unplottable value(s) ", buf );
if( nt == 4 ) {
Elin( PL_u( X, c ), PL_u( Y, d ) );
if( Econv_error() ) Eerr( 2946, "unplottable value(s) ", buf );
}
}
else if( notation == LOCVAL ) {
Eposex( a, X, &x ); Eposex( b, Y, &y ); Emov( x+ancx, y+ancy );
if( Econv_error() ) Eerr( 2947, "unplottable value(s) ", buf );
Eposex( c, X, &x ); Eposex( d, Y, &y ); Elin( x+ancx, y+ancy );
if( Econv_error() ) Eerr( 2948, "unplottable value(s) ", buf );
}
}
else if( nt == 2 ) {
if( notation == ABSOLUTE ) Elin( atof( a )+ancx, atof( b )+ancy );
else if( notation == SCALED ) Elin( PL_u( X, a ), PL_u( Y, b ) );
else if( notation == LOCVAL ) { Eposex( a, X, &x ); Eposex( b, Y, &y ); Elin( x+ancx, y+ancy ); }
}
else if( nt <= 0 ) ;
else Eerr( 2959, "warning: points must have either 4 or 2 values per line", "" );
first = 0;
if( ix >= buflen ) break;
}
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/clickmap.c 0000644 0001750 0001750 00000034023 11155503011 015005 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* clickmap.c - generate a clickable imagemap. All related bookkeeping is here.
Feb 2002 scg client-side HTML clickmap supported
Mar 27 2002 scg SVG clickable map support added (PLS.device == 's') Not implemented here
but rather via SVG_beginobj and SVG_endobj.
Feb 4 2009 jqn added encodeurl config parameter so that clickmap URL targets with embedded spaces
will use '_' instead of '+' (because certain operating contexts need this)
*/
#include "pl.h"
#include
extern int chmod();
#define MAXENTRIES 500
#define SERVERSIDE 1
#define CLIENTSIDE 2
#define PLUS_TO_UNDERSCORE 1
static int imap;
static char *urls[MAXENTRIES];
static char *titles[MAXENTRIES];
static struct {
char typ;
int pmode;
int x1; int y1; int x2; int y2;
} box[MAXENTRIES];
static char defaulturl[MAXURL] = "";
static char tpurl[MAXURL] = ""; /* a url template */
static int mapstatus = 0; /* 1 if we are in the process of doing a map; 0 otherwise */
static int demomode = 0; /* 1 if we are in demo mode */
static int intersect = 0;
static double adjx = 0.0, adjy = 0.0;
extern int PLGS_clickregion();
static int get_targetstr();
/* ========================= */
/* INIT - initialize clickmap facility & make various settings */
int
PL_clickmap_init()
{
PL_clickmap_free(); /* free any previously alloc'ed stores.. */
strcpy( defaulturl, "" );
strcpy( tpurl, "" );
/* debugmode = PLS.debug; */
imap = 0;
intersect = 0;
mapstatus = 1;
adjx = 0.0; adjy = 0.0;
return( 0 );
}
/* ========================= */
/* ENTRY - add one map entry */
/* typs: 'r' = rectangle, lower left x,y and upper right x,y; 'p' = point */
int
PL_clickmap_entry( typ, url, pmode, x1, y1, x2, y2, textpad, clipmode, title )
/* mapentry */
char typ;
char *url;
int pmode; /* processing mode; 0 = none, 1 = sub into tpurl as x, 2 = sub into tpurl as y,
3 = intersect w/another then sub into tpurl as x, 4 = intersect then sub as y */
double x1, y1, x2, y2;
int textpad; /* add extra padding to text */
int clipmode; /* 0 = no clip; 1 = clip X to plotting area 2 = clip Y to plotting area */
char *title; /* client-side only.. this will be supplied as the title= attribute - can be large (MAXTT) */
{
int i;
double sx, sy;
if( imap >= MAXENTRIES-1 ) return( Eerr( 2706, "too many clickmap regions, ignoring", url ) );
if( !mapstatus ) return( Eerr( 2707, "-map or -csmap must be specified on command line", "" ) );
if( url[0] == '\0' && title[0] == '\0' ) return( 0 ); /* degenerate case */
/* if( PLS.device == 's' && url[0] == '\0' ) return( 0 ); */ /* mouseover not yet supported for svg */
/* do character conversions within url.. */
for( i = 0; url[i] != '\0'; i++ ) {
if( url[i] == ' ' || url[i] == '\n' ) url[i] = '_';
if( url[i] == '\\' && url[i+1] == 'n' ) { url[i++] = '_'; url[i] = '_'; }
}
urls[ imap ] = (char *) malloc( strlen( url ) + 1 );
strcpy( urls[ imap ], url );
titles[ imap ] = NULL;
if( title[0] != '\0' ) {
int tlen;
tlen = strlen( title );
if( tlen > 0 ) {
titles[ imap ] = (char *) malloc( strlen( title ) + 1 );
strcpy( titles[ imap ], title );
}
}
if( pmode > 2 ) intersect = 1;
box[ imap ].pmode = pmode;
box[ imap ].typ = typ;
if( typ == 'p' ) { x2 = x1; y2 = y1; }
if( pmode ) { x1 += adjx; x2 += adjx; y1 += adjy; y2 += adjy; } /* for grid regions, apply adjustment if any */
/* adjust for textpad, clip, and global scaling, if any.. */
if( textpad ) { x1 -= 0.15; x2 += 0.1; y1 -= 0.04; }
if( clipmode == 1 ) { if( x1 < EXlo ) x1 = EXlo; if( x2 > EXhi ) x2 = EXhi; }
if( clipmode == 2 ) { if( y1 < EYlo ) y1 = EYlo; if( y2 > EYhi ) y2 = EYhi; }
Egetglobalscale( &sx, &sy );
x1 *= sx; y1 *= sy; x2 *= sx; y2 *= sy;
if( PLS.device == 's' ) {
box[ imap ].x1 = (int)(x1*100); box[ imap ].y1 = (int)(y2*100);
box[ imap ].x2 = (int)(x2*100); box[ imap ].y2 = (int)(y1*100);
}
else {
box[ imap ].x1 = Exsca( x1 ); box[ imap ].y1 = PLG_ysca( y2 );
box[ imap ].x2 = Exsca( x2 ); box[ imap ].y2 = PLG_ysca( y1 );
}
imap++;
return( 0 );
}
/* ========================= */
/* OUT - write out the clickmap info */
/* Note: PLS.clickmap == 1 for server-side, 2 for client-side */
/* In gif/png/jpg image maps the "top" elements (from an overlap standpoint) need to be near the top of the list.
In SVG this is the opposite. Hence for SVG things have to be done in reverse order (see the gotos). */
int
PL_clickmap_out( tx, ty )
int tx, ty; /* translate vector - compensates for image cropping, etc. (pass as 0, 0 for svg) */
{
int i, j;
FILE *fp;
char buf[1024], targetstr[1024]; /* raised from 256 scg 11/5/07 */
int ox1, oy1, ox2, oy2;
int loopstart, loopend, loopinc;
if( imap < 1 ) return( Eerr( 2795, "Warning, no map regions were assigned", PLS.mapfile ) );
if( PLS.device != 's' ) {
if( strcmp( PLS.mapfile, "stdout" )==0 ) fp = stdout;
else if( strcmp( PLS.mapfile, "stderr" )==0 ) fp = stderr;
else fp = fopen( PLS.mapfile, "w" );
if( fp == NULL ) return( Eerr( 2705, "Cannot open mapfile", PLS.mapfile ));
if( PLS.debug ) fprintf( PLS.diagfp, "writing clickmap file %s, coords translated by %d,%d\n", PLS.mapfile, tx, ty );
if( PLS.clickmap == SERVERSIDE && defaulturl[0] != '\0' ) fprintf( fp, "default %s\n", defaulturl ); /*svg equivalent?*/
if( demomode && PLS.clickmap == CLIENTSIDE ) fprintf( fp, "\n
\n", PLS.outfile );
}
if( PLS.device != 's' && !GL_smember( PLS.mapfile, "stderr stdout" )) {
fclose( fp );
#ifndef WIN32
chmod( PLS.mapfile, 00644 );
#endif
}
return( 0 );
}
/* =========================== */
/* SHOW - display map regions using a green outline - for svg this is done in svg.c */
int
PL_clickmap_show( dev )
char dev;
{
int i;
extern int PLGX_color(), PLGX_linetype(), PLGX_rawline(), PLGG_color(), PLGG_linetype(), PLGG_rawline();
if( PLS.device == 's' ) return( 0 );
if( imap < 1 ) return( Eerr( 2937, "Warning, no map regions were assigned", PLS.mapfile ) );
if( dev == 'x' ) {
#ifndef NOX11
PLGX_color( "brightgreen" );
PLGX_linetype( "0", 0.5, 1.0 );
for( i = 0; i < imap; i++ ) {
if( box[i].typ == 'p' ) { box[i].x2 += 1; box[i].y2 += 1; }
PLGX_rawline( box[i].x1, box[i].y1, box[i].x2, box[i].y1 );
PLGX_rawline( box[i].x2, box[i].y1, box[i].x2, box[i].y2 );
PLGX_rawline( box[i].x2, box[i].y2, box[i].x1, box[i].y2 );
PLGX_rawline( box[i].x1, box[i].y2, box[i].x1, box[i].y1 );
}
#endif
;
}
else if( dev == 'g' ) {
#ifndef NOGD
PLGG_color( "brightgreen" );
PLGG_linetype( "1", 0.5, 1.0 );
for( i = 0; i < imap; i++ ) {
if( box[i].typ == 'p' ) { box[i].x2 += 1; box[i].y2 += 1; }
PLGG_rawline( box[i].x1, box[i].y1, box[i].x2, box[i].y1 );
PLGG_rawline( box[i].x2, box[i].y1, box[i].x2, box[i].y2 );
PLGG_rawline( box[i].x2, box[i].y2, box[i].x1, box[i].y2 );
PLGG_rawline( box[i].x1, box[i].y2, box[i].x1, box[i].y1 );
}
#endif
;
}
return( 0 );
}
/* ========================== */
int
PL_clickmap_free()
{
int i;
if( imap < 1 ) return( 0 );
for( i = 0; i < imap; i++ ) {
free( urls[i] );
if( titles[i] != NULL ) free( titles[i] );
}
imap = 0;
mapstatus = 0;
return( 0 );
}
/* ========================= */
/* INPROGRESS - return 1 if we are doing a clickmap, 0 otherwise */
int
PL_clickmap_inprogress()
{
return( mapstatus );
}
/* ========================= */
/* DEMOMODE - set demo mode */
int
PL_clickmap_demomode( mode )
int mode;
{
demomode = mode;
return( 0 );
}
/* ========================= */
/* GETDEMOMODE - return 1 if we are in demo mode, 0 otherwise */
int
PL_clickmap_getdemomode()
{
return( demomode );
}
/* ========================= */
/* SETDEFAULTURL - set the "default" url */
int
PL_clickmap_setdefaulturl( url )
char *url;
{
strcpy( defaulturl, url );
return( 0 );
}
/* ========================= */
/* ADJUST - for grid clickmaps, this allows a horizontal and vertical adjustment to be set. */
int
PL_clickmap_adjust( x, y )
double x, y;
{
adjx = x;
adjy = y;
return( 0 );
}
/* ========================== */
/* SETURLT - set the url template to be used for plot area grid mapping */
int
PL_clickmap_seturlt( url )
char *url;
{
strcpy( tpurl, url );
return( 0 );
}
/* =========================== */
static int
get_targetstr( buf, targetstr )
char *buf, *targetstr;
{
int j;
if( buf[0] == '[' ) {
for( j = 0; buf[j] != '\0'; j++ ) {
if( buf[j] == '[' ) buf[j] = ' ';
if( buf[j] == ']' ) {
buf[j] = ' ';
sscanf( buf, "%s", targetstr );
strcpy( buf, &buf[j+1] );
break;
}
}
}
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/plg.c 0000644 0001750 0001750 00000020537 10721647547 014036 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* small, lowlevel routines re: scaled units */
/* see also units.c which is a layer above this. */
#include "plg.h"
struct plgc PLG;
int
PLG_set_early_defaults()
{
/* overall settings - these can be set by application program before Einit() */
strcpy( Estandard_font, "/Helvetica" );
Estandard_textsize = 10;
Estandard_lwscale = 1.0;
strcpy( Estandard_color, "black" );
strcpy( Estandard_bkcolor, "white" );
/* current parameters.. */
strcpy( Ecurfont, "" );
Ecurtextsize = 0;
Ecurtextheight = 0.0;
Ecurtextwidth = 0.0;
Ecurtextdirection = 0;
Ecurpaper = -1;
Ecurlinewidth = -1.0;
Ecurlinetype = -1;
Ecurpatternfactor = 0.0;
strcpy( Ecurcolor, "" ); /* scg 6/18/04 */
EScale_x = 1; EScale_y = 1;
Escaletype_x = E_LINEAR;
Escaletype_y = E_LINEAR;
strcpy( Eprogname, "" );
Eflip = 0;
Eblacklines = 0;
Eflashdelay = 150000;
return( 0 );
}
/* ============================ */
/* SCALETYPE - select the scaling method */
int
PLG_scaletype( typ, axis )
char typ[];
char axis;
{
if( strcmp( typ, "linear" )==0 ) {
/* Esetunits( axis, "linear" ); */
if( axis == 'x' ) Escaletype_x = E_LINEAR;
else if( axis == 'y' ) Escaletype_y = E_LINEAR;
return( 0 );
}
#ifndef NOSCALE
else if( strcmp( typ, "log" )==0 ) {
/* Esetunits( axis, "linear" ); */ /* linear ok */
if( axis == 'x' ) Escaletype_x = E_LOG;
else if( axis == 'y' ) Escaletype_y = E_LOG;
return( 0 );
}
else if( strcmp( typ, "log+1" )==0 ) { /* log+1 added scg 11/29/00 */
if( axis == 'x' ) Escaletype_x = E_LOGPLUS1;
else if( axis == 'y' ) Escaletype_y = E_LOGPLUS1;
return( 0 );
}
else {
/* stat = Esetunits( axis, typ );
* if( stat != 0 ) {
* sprintf( buf, "Invalid scaling type for %c axis", axis );
* return( Eerr( 101, buf, typ ) );
* }
*/
/* special units always use linear as the basic units.. */
if( axis == 'x' ) Escaletype_x = E_LINEAR;
else Escaletype_y = E_LINEAR;
return( 0 );
}
#endif
}
#ifndef NOSCALE
/* =========================== */
/* SCALE_X - for setting up scaling in x */
int
PLG_scale_x( xlow, xhi, datalow, datahi )
double xlow, /* absolute x location of left side of the area */
xhi, /* absolute x location of the right side of the area */
datalow, /* data-units x at the left side */
datahi; /* data-units x at the right side */
{
char msgbuf[100];
EXlo = xlow;
EXhi = xhi;
EDXlo = datalow;
EDXhi = datahi;
if( datahi-datalow <= 0 ) return( Eerr( 100, "x range is invalid .. likely culprits: xautorange, or invalid date format" , "" ) );
if( xhi-xlow <= 0 ) {
sprintf( msgbuf, "Error in x absolute plot area dimensions (%g and %g)", xlow, xhi);
return( Eerr( 101, msgbuf, "" ) );
}
if( Escaletype_x == E_LINEAR ) EScale_x = (xhi-xlow) / (datahi-datalow) ;
else if( Escaletype_x == E_LOG ) {
/* if( datalow <= 0.0 ) datalow = 0.01; */ /* this line commented out 9/26/03 per paul labbe */
EScale_x = (xhi-xlow) / (log( datahi ) - log( datalow ));
}
else if( Escaletype_x == E_LOGPLUS1 ) {
if( (datalow) < 0.0 ) datalow = 0.0;
EScale_x = (xhi-xlow) / (log( datahi+1.0 ) - log( datalow+1.0 ));
}
return( 0 );
}
/* =========================== */
/* SCALE_Y - for setting up scaling in y */
int
PLG_scale_y( ylow, yhi, datalow, datahi )
double ylow, /* absolute y location of low side of the area */
yhi, /* absolute y location of high side of the area */
datalow, /* data-units y at the low side */
datahi; /* data-units y at the high side */
{
char msgbuf[100];
EYlo = ylow;
EYhi = yhi;
EDYlo = datalow;
EDYhi = datahi;
if( datahi-datalow <= 0 ) return( Eerr( 100, "y range is invalid .. likely culprit is yautorange or yrange", "" ) );
if( yhi-ylow <= 0 ) {
sprintf( msgbuf, "Error in y absolute plot area dimensions (%g and %g)", ylow, yhi);
return( Eerr( 101, msgbuf, "" ) );
}
if( Escaletype_y == E_LINEAR ) EScale_y = (yhi-ylow) / (datahi-datalow) ;
else if( Escaletype_y == E_LOG ) {
/* if( datalow <= 0.0 ) datalow = 0.01; */ /* this line commented out scg 9/26/03 per paul labbe */
EScale_y = (yhi-ylow) / (log( datahi ) - log( datalow ));
}
else if( Escaletype_y == E_LOGPLUS1 ) {
if( (datalow) < 0.0 ) datalow = 0.0;
EScale_y = (yhi-ylow) / (log( datahi+1.0 ) - log( datalow+1.0 ));
}
return( 0 );
}
/* =========================== */
/* A - Returns an absolute location from a data value in xory.
This is the preferred function to use because it handles flip. */
double
PLG_a( xory, d )
char xory;
double d;
{
if( Eflip ) {
if( xory == 'x' ) return( Eay( d ) );
else if( xory == 'y' ) return( Eax( d ) );
}
else {
if( xory == 'x' ) return( Eax( d ) );
else if( xory == 'y' ) return( Eay( d ) );
}
return( Eerr( 15, "Ea: nonsensical parameters", "" ) );
}
/* =========================== */
/* AX - returns an absolute x location from a data value */
double
PLG_ax( d )
double d;
{
if( Escaletype_x == E_LINEAR )
return( EXlo + (( d - EDXlo ) * EScale_x ));
else if( Escaletype_x == E_LOG ) {
if( d <= 0.0 ) return( EXlo );
else if( EDXlo <= 0.0 ) return( EXlo + (( log( d ) - log( 1.0 ) ) * EScale_x ) );
else return( EXlo + (( log( d ) - log( EDXlo ) ) * EScale_x ) );
}
else if( Escaletype_x == E_LOGPLUS1 ) {
if( d <= 0.0 ) return( EXlo );
else if( EDXlo <= 0.0 ) return( EXlo + (( log( d+1.0 ) - log( 1.0 ) ) * EScale_x ) );
else return( EXlo + (( log( d+1.0 ) - log( EDXlo ) ) * EScale_x ) );
}
return(0.0);
}
/* =========================== */
/* AY - returns an absolute y location from a data value */
double
PLG_ay( d )
double d;
{
if( Escaletype_y == E_LINEAR ) return( EYlo + (( d - EDYlo ) * EScale_y ));
else if( Escaletype_y == E_LOG ) {
if( d <= 0.0 ) return( EYlo );
else if( EDYlo <= 0.0 ) return( EYlo + (( log( d ) - log( 1.0 ) ) * EScale_y ) );
else return( EYlo + (( log( d ) - log( EDYlo ) ) * EScale_y ) );
}
else if( Escaletype_y == E_LOGPLUS1 ) {
if( d <= 0.0 ) return( EYlo );
else if( EDYlo <= 0.0 ) return( EYlo + (( log( d+1.0 ) - log( 1.0 ) ) * EScale_y ) );
else return( EYlo + (( log( d+1.0 ) - log( EDYlo ) ) * EScale_y ) );
}
return(0.0);
}
/* =========================== */
/* DX - given an abs coord in X, returns a value in data space */
double
PLG_dx( a )
double a;
{
double h;
if( Escaletype_x == E_LINEAR ) {
h = a - EXlo;
return( EDXlo + ( h / EScale_x ) );
}
else if( Escaletype_x == E_LOG ) {
if( a < EXlo ) return( EDXlo );
h = log( a ) - log( EDXlo );
return( EDXlo + ( h / EScale_x ) );
}
else if( Escaletype_x == E_LOGPLUS1 ) {
if( a < EXlo ) return( EDXlo );
h = log( a ) - log( EDXlo );
return( (EDXlo + ( h / EScale_x ) ) - 1.0 ); /* ??? */
}
return(0.0);
}
/* =========================== */
/* DY - given an abs coord in Y, returns a value in data space */
double
PLG_dy( a )
double a;
{
double h;
if( Escaletype_y == E_LINEAR ) {
h = a - EYlo;
return( EDYlo + ( h / EScale_y ) );
}
else if( Escaletype_y == E_LOG ) {
if( a < EYlo ) return( EDYlo );
h = log( a ) - log( EDYlo );
return( EDYlo + ( h / EScale_y ) );
}
else if( Escaletype_y == E_LOGPLUS1 ) {
if( a < EYlo ) return( EDYlo );
h = log( a ) - log( EDYlo );
return( (EDYlo + ( h / EScale_y ) ) - 1.0 ); /* ??? */
}
return(0.0);
}
/* ====================== */
/* LIMIT - Get minima or maxima of either axis,
in either absolute or scaled units.. */
double
PLG_limit( axis, end, units )
char axis;
char end; /* either 'l' == lo or 'h' == hi */
char units; /* either 'a' == absolute or 's' == scaled */
{
if( axis == 'x' ) {
if( end == 'l' && units == 's' ) return( EDXlo );
else if( end == 'h' && units == 's' ) return( EDXhi );
if( end == 'l' && units == 'a' ) return( EXlo );
else if( end == 'h' && units == 'a' ) return( EXhi );
}
if( axis == 'y' ) {
if( end == 'l' && units == 's' ) return( EDYlo );
else if( end == 'h' && units == 's' ) return( EDYhi );
if( end == 'l' && units == 'a' ) return( EYlo );
else if( end == 'h' && units == 'a' ) return( EYhi );
}
Eerr( 12015, "warning, bad values passed to Elimit", "" );
return( 0.0 );
}
#endif
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/grgd.c 0000644 0001750 0001750 00000070716 11147044422 014165 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/*
ploticus interface to Thomas Boutell's GD library (www.boutell.com)
Notes:
* For development, "make devgrgd" can be used
* This module supports these #defines:
GD13 (create GIF only using GD 1.3; no import)
GD16 (create PNG only using GD 1.6; also can import PNG)
GD18 (use GD 1.8+ to create PNG, JPEG, or WBMP; also can import these formats)
GDFREETYPE (use FreeType font rendering; may be used only when GD18 is in effect)
* GD renders text such that the TOP of the character box is at x, y
*/
#include
#include
#include
#include
#ifdef WIN32
#include /* for _O_BINARY */
#endif
#include "pixpt.h" /* circle ptlists */
extern double PLG_xsca_inv(), PLG_ysca_inv();
extern int TDH_err(), GL_member(), GL_goodnum();
extern int PLGG_color(), PLG_xsca(), PLG_ysca(), PLGG_linestyle(), PLGG_fill(), PLG_xrgb_to_rgb(), PLG_colorname_to_rgb();
extern int PLG_bb(), PL_clickmap_getdemomode(), PL_clickmap_show(), PL_clickmap_inprogress(), PL_clickmap_out();
extern int atoi(), chmod();
#define Exsca( h ) PLG_xsca( h )
#define Eysca( h ) PLG_ysca( h )
#define Exsca_inv( h ) PLG_xsca_inv( h )
#define Eysca_inv( h ) PLG_ysca_inv( h )
#define Eerr(a,b,c) TDH_err(a,b,c)
#define VERT 1.570796 /* 90 degrees, expressed in radians */
static char g_fmt[20] = "";
/* ================================= */
/* SETIMFMT - set the image format that we will be creating..
allowable values for fmt are "gif", "png", "jpeg", etc. */
int
PLGG_setimfmt( fmt )
char *fmt;
{
strcpy( g_fmt, fmt );
return( 0 );
}
/* ================================= */
/* GETIMFMT - allow other modules to find out the image format.
Format name is copied into fmt. */
int
PLGG_getimfmt( fmt )
char *fmt;
{
strcpy( fmt, g_fmt );
return( 0 );
}
/* =============================================================================== */
#ifndef NOGD
#include "gd.h"
#include "gdfontg.h"
#include "gdfontl.h"
#include "gdfontmb.h"
#include "gdfonts.h"
#include "gdfontt.h"
/* #define MAX_D_ROWS 1000 */
#define NBRUSH 8
#define CHARHW 1.75 /* 2.0 */
#define MINTEXTSIZE 4 /* anything less than this is rendered as a line for thumbnails */
#define stricmp(a,b) strcasecmp(a,b)
static gdImagePtr Gm; /* image */
static gdImagePtr Gm2 = NULL; /* secondary image */
static int Gm2height = 0, Gm2width = 0;
static gdFontPtr Gfont; /* current font */
static int Gxmax, Gymax; /* drawing area image size */
static double Goldx = 0.0, Goldy = 0.0; /* last passed x,y */
static double Gcharwidth;
static int Gvertchar = 0;
static int Gtextsize;
static char Gcurcolorname[40];
static int Gcurcolor;
/* static gdPoint Gptlist[MAX_D_ROWS]; */
static gdPoint *Gptlist = NULL;
static int Gmax_pts;
static int Gnpts = 0;
static int Gcurlinestyle = 0;
static double Gcurlinewidth = 1.0;
static double Gcurdashscale = 1.0;
static gdImagePtr Gbrush[NBRUSH]; /* brush images */
static int Gdash[10][6]= { {1}, {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} }; /* constants */
static int Gndash[10] = { 1, 2, 2, 2, 4, 4, 4, 6, 6, 6 }; /* constants */
static int Gdashpat[1000];
static int Ginitialized = 0;
static int Gtransparent_color = -1;
static int Gblack = 0;
static char GFTfont[80] = "";
#ifdef GDFREETYPE
static int GFTbox[8];
static double GFTsize;
#endif
static int Gpixelsinch;
static int Greqwidth = 0, Greqheight = 0;
/* ================================= */
int
PLGG_initstatic()
{
strcpy( g_fmt, "" );
Gm2 = NULL;
Gm2height = 0; Gm2width = 0;
Goldx = 0.0, Goldy = 0.0;
Gvertchar = 0;
Gnpts = 0;
Gcurlinestyle = 0;
Gcurlinewidth = 1.0;
Gcurdashscale = 1.0;
Ginitialized = 0;
Gtransparent_color = -1;
Gblack = 0;
strcpy( GFTfont, "" );
strcpy( Gcurcolorname, "" );
Greqwidth = 0, Greqheight = 0;
if( Gptlist != NULL ) { free( Gptlist ); Gptlist = NULL; } /* added scg 2/17/09 , joel reported Gptlist as a memory leak */
return( 0 );
}
/* ================================= */
/* GETIMG - allow API access to the image and its size */
gdImagePtr
PLGG_getimg( width, height )
int *width, *height; /* pixels */
{
if( !Ginitialized ) return( NULL );
*width = Gxmax;
*height = Gymax;
return( Gm );
}
/* =================================== */
/* SETIMPIXSIZE - set an exact pixel height and width for result (cropped) image */
int
PLGG_setimpixsize( width, height )
int width, height;
{
Greqwidth = width;
Greqheight = height;
return( 0 );
}
/* ================================ */
int
PLGG_setup( name, pixelsinch, ux, uy, upleftx, uplefty, maxdrivervect )
char *name;
int pixelsinch;
double ux, uy; /* size of image in inches x y */
int upleftx, uplefty; /* position of window - not used by this driver */
int maxdrivervect;
{
int i;
if( Ginitialized ) { /* could be if a late setsize was issued.. */
gdImageDestroy( Gm );
for( i = 0; i < NBRUSH; i++ ) gdImageDestroy( Gbrush[i] );
}
Ginitialized = 1;
Gpixelsinch = pixelsinch;
Gxmax = (int)(ux * pixelsinch );
Gymax = (int)(uy * pixelsinch );
/* Allocate pixels.. */
Gm = gdImageCreate( Gxmax, Gymax );
if( Gm == NULL ) return( Eerr( 12003, "Cannot create working image", "" ) );
for( i = 0; i < NBRUSH; i++ ) {
Gbrush[i] = gdImageCreate( i+1, i+1 );
if( Gbrush[i] == NULL ) return( Eerr( 12004, "Cannot create brush image", "" ) );
}
PLGG_color( "white" );
PLGG_color( "black" );
gdImageSetBrush( Gm, Gbrush[0] );
Gmax_pts = maxdrivervect;
if( Gptlist != NULL ) free( Gptlist );
Gptlist = (gdPoint *) malloc( Gmax_pts * sizeof( gdPoint ) );
return( 0 );
}
/* ================================ */
int
PLGG_moveto( x, y )
double x, y;
{
Goldx = x;
Goldy = y;
return( 0 );
}
/* ================================ */
int
PLGG_lineto( x, y )
double x, y;
{
int a, b, c, d;
a = Exsca( Goldx ); b = Eysca( Goldy ); c = Exsca( x ); d = Eysca( y );
/* gdImageLine( Gm, a, b, c, d, gdStyled ); */
gdImageLine( Gm, a, b, c, d, gdStyledBrushed );
Goldx = x;
Goldy = y;
return( 0 );
}
/* ================================ */
int
PLGG_rawline( a, b, c, d )
int a, b, c, d;
{
gdImageLine( Gm, a, b, c, d, gdStyledBrushed );
return( 0 );
}
/* ================================ */
int
PLGG_linetype( s, x, y )
char *s;
double x, y;
{
int style;
style = atoi( s );
return( PLGG_linestyle( style, x, y ) );
}
/* ================================ */
int
PLGG_linestyle( style, linewidth, dashscale )
int style;
double linewidth, dashscale;
{
int i, j, k, np, state, ds;
style = style % 9;
ds = (int)(dashscale*2.0);
if( ds < 1 ) { style = 0; ds = 1; }
np = 0;
/* build array p to indicate dash pattern, and set the dash style.. */
state = 1;
for( i = 0; i < Gndash[style]; i++ ) {
for( j = 0; j < Gdash[style][i]; j++ ) {
for( k = 0; k < ds; k++ ) {
if( np >= 1000 ) {
Eerr( 12005, "img dashscale out of range", "" );
return( 0 );
}
Gdashpat[np++] = state;
}
}
if( state == 1 ) state = 0;
else state = 1;
}
gdImageSetStyle( Gm, Gdashpat, np );
Gcurlinestyle = style;
Gcurdashscale = dashscale;
/* set the line width by setting pixels in the brush image.. */
i = (int) linewidth;
if( i > (NBRUSH-1) ) i = NBRUSH - 1;
gdImageSetBrush( Gm, Gbrush[i] );
Gcurlinewidth = linewidth;
return( 0 );
}
/* ================================ */
int
PLGG_pathto( px, py )
double px, py;
{
if( (Gnpts+2) > Gmax_pts ) PLGG_fill(); /* fill what we have so far, then start again. scg 5/4/04 */
if( Gnpts == 0 ) {
Gptlist[ Gnpts ].x = Exsca( Goldx );
Gptlist[ Gnpts ].y = Eysca( Goldy );
Gnpts++;
}
Gptlist[ Gnpts ].x = Exsca( px );
Gptlist[ Gnpts ].y = Eysca( py );
Gnpts++;
return( 0 );
}
/* ================================ */
int
PLGG_fill()
{
if( Gnpts < 3 ) {
Eerr( 12007, "warning, not enough points", "" );
return( 0 );
}
Gptlist[ Gnpts ].x = Gptlist[0].x;
Gptlist[ Gnpts ].y = Gptlist[0].y;
Gnpts++;
gdImageFilledPolygon( Gm, Gptlist, Gnpts, Gcurcolor );
Gnpts = 0;
return( 0 );
}
/* ================================ */
/* note: caller must restore previous color after this routine returns. */
int
PLGG_rect( x1, y1, x2, y2, color )
double x1, y1, x2, y2;
char *color;
{
int a, b, c, d;
a = Exsca( x1 );
b = Eysca( y1 );
c = Exsca( x2 );
d = Eysca( y2 );
PLGG_color( color );
gdImageFilledRectangle( Gm, a, b, c, d, Gcurcolor );
return( 0 );
}
/* ================================ */
/* set a freetype font */
int
PLGG_font( s )
char *s;
{
#ifdef GDFREETYPE
char *fontpath;
if( s[0] == '/' ) return( 0 ); /* ignore postscript fonts */
if( strcmp( s, "ascii" )==0 ) strcpy( GFTfont, "" );
else {
fontpath = getenv( "GDFONTPATH" );
if( fontpath == NULL ) Eerr( 12358, "warning: environment var GDFONTPATH not found. See ploticus fonts docs.", "" );
if( strcmp( &s[ strlen(s) - 4 ], ".ttf" )==0 ) s[ strlen( s)-4 ] = '\0'; /* strip off .ttf ending - scg 1/26/05 */
strcpy( GFTfont, s );
}
#endif
return( 0 );
}
/* ================================ */
int
PLGG_textsize( p )
int p;
{
#ifdef GDFREETYPE
if( GFTfont[0] ) {
GFTsize = (double)p;
Gtextsize = p;
Gcharwidth = 0.0; /* no top/bottom adjustment needed with FT */
return( 0 );
}
#endif
/* this logic is replicated in Etextsize() */
if( p <= 6 ) { Gfont = gdFontTiny; Gcharwidth = 0.05; }
else if( p >= 7 && p <= 9 ) { Gfont = gdFontSmall; Gcharwidth = 0.06; } /* was 0.0615384 */
else if( p >= 10 && p <= 12 ) { Gfont = gdFontMediumBold; Gcharwidth = 0.070; } /* was 0.0727272 */
else if( p >= 13 && p <= 15 ) { Gfont = gdFontLarge; Gcharwidth = 0.08; }
else if( p >= 15 ) { Gfont = gdFontGiant; Gcharwidth = 0.09; } /* was 0.0930232 */
Gtextsize = p;
return( 0 );
}
/* ================================ */
int
PLGG_chardir( d )
int d;
{
if( d == 90 ) Gvertchar = 1;
else Gvertchar = 0;
return( 0 );
}
/* ================================ */
int
PLGG_text( s )
char *s;
{
int a, b, c, d;
double x, y;
#ifdef GDFREETYPE
char *err;
#endif
a = Exsca( Goldx ); b = Eysca( Goldy );
if( Gvertchar ) {
if( Gtextsize < MINTEXTSIZE ) {
x = Goldx - (Gtextsize/90.0);
a = Exsca( x ); b = Eysca( Goldy );
c = Exsca( x ); d = Eysca( Goldy + (((double)Gtextsize/100.0)*strlen(s)));
gdImageLine( Gm, a, b, c, d, gdStyledBrushed );
}
else {
x = Goldx - (Gcharwidth*CHARHW); /* adjust for top loc */
a = Exsca( x ); b = Eysca( Goldy );
#ifdef GDFREETYPE
if( GFTfont[0] ) {
err = gdImageStringFT( Gm, GFTbox, Gcurcolor, GFTfont, GFTsize, VERT, a, b, s );
if( err ) { fprintf( stderr, "%s (%s)\n", err, GFTfont ); return( 1 ); }
}
#endif
if( GFTfont[0] == '\0' ) gdImageStringUp( Gm, Gfont, a, b, (unsigned char *)s, Gcurcolor );
}
}
else {
if( Gtextsize < MINTEXTSIZE ) {
a = Exsca( Goldx ); b = Eysca( Goldy );
c = Exsca( Goldx + (((double)Gtextsize/100.0) * strlen(s)) ); d = Eysca( Goldy );
gdImageLine( Gm, a, b, c, d, gdStyledBrushed );
}
else {
y = Goldy + (Gcharwidth*CHARHW); /* adjust for top loc */
a = Exsca( Goldx ); b = Eysca( y );
#ifdef GDFREETYPE
if( GFTfont[0] ) {
err = gdImageStringFT( Gm, GFTbox, Gcurcolor, GFTfont, GFTsize, 0.0, a, b, s );
if( err ) { fprintf( stderr, "%s (%s)\n", err, GFTfont ); return( 1 ); }
}
#endif
if( GFTfont[0] == '\0' ) gdImageString( Gm, Gfont, a, b, (unsigned char *)s, Gcurcolor );
}
}
Goldx = x;
Goldy = y;
return( 0 );
}
/* ================================ */
int
PLGG_centext( s )
char *s;
{
double halflen, x, y;
int a, b, c, d;
#ifdef GDFREETYPE
char *err;
#endif
halflen = (Gcharwidth * (double)(strlen( s ))) / 2.0;
if( Gvertchar ) {
if( Gtextsize < MINTEXTSIZE ) {
halflen = (double)(strlen(s))/2.0 * ((double)Gtextsize/100.0);
x = Goldx - (Gtextsize/90.0); /* adjust for top loc */
a = Exsca( x ); b = Eysca( Goldy - halflen );
c = Exsca( x ); d = Eysca( Goldy + halflen );
gdImageLine( Gm, a, b, c, d, gdStyledBrushed );
}
else {
#ifdef GDFREETYPE
if( GFTfont[0] ) {
a = Exsca( Goldx ); b = Eysca( Goldy );
err = gdImageStringFT( NULL, GFTbox, Gcurcolor, GFTfont, GFTsize, 0.0, a, b, s );
if( err ) { fprintf( stderr, "%s (%s) (width calc)\n", err, GFTfont ); return( 1 ); }
b += (GFTbox[4] - GFTbox[0])/2;
err = gdImageStringFT( Gm, GFTbox, Gcurcolor, GFTfont, GFTsize, VERT, a, b, s );
if( err ) { fprintf( stderr, "%s (%s)\n", err, GFTfont ); return( 1 ); }
}
#endif
if( GFTfont[0] == '\0' ) {
x = Goldx - (Gcharwidth*CHARHW); /* adjust for top loc */
y = Goldy - halflen;
a = Exsca( x ); b = Eysca( y );
gdImageStringUp( Gm, Gfont, a, b, (unsigned char *)s, Gcurcolor );
}
}
}
else {
if( Gtextsize < MINTEXTSIZE ) {
halflen = (double)(strlen(s))/2.0 * ((double)Gtextsize/100.0);
a = Exsca( Goldx - halflen ); b = Eysca( Goldy );
c = Exsca( Goldx + halflen ); d = Eysca( Goldy );
gdImageLine( Gm, a, b, c, d, gdStyledBrushed );
}
else {
#ifdef GDFREETYPE
if( GFTfont[0] ) {
a = Exsca( Goldx ); b = Eysca( Goldy );
err = gdImageStringFT( NULL, GFTbox, Gcurcolor, GFTfont, GFTsize, 0.0, a, b, s );
if( err ) { fprintf( stderr, "%s (%s) (width calc)\n", err, GFTfont ); return( 1 ); }
a -= (GFTbox[4] - GFTbox[0])/2;
err = gdImageStringFT( Gm, GFTbox, Gcurcolor, GFTfont, GFTsize, 0.0, a, b, s );
if( err ) { fprintf( stderr, "%s (%s)\n", err, GFTfont ); return( 1 ); }
}
#endif
if( GFTfont[0] == '\0' ) { /* ascii font */
x = (Goldx - halflen) + (Gcharwidth/4.0); /* not sure why the extra is needed..*/
y = Goldy + (Gcharwidth*CHARHW); /* adjust for top loc */
a = Exsca( x ); b = Eysca( y );
gdImageString( Gm, Gfont, a, b, (unsigned char *)s, Gcurcolor );
}
}
}
Goldx = x;
Goldy = y;
return( 0 );
}
/* ================================ */
int
PLGG_rightjust( s )
char *s;
{
double len, x, y;
int a, b, c, d;
#ifdef GDFREETYPE
char *err;
#endif
len = Gcharwidth * strlen( s );
if( Gvertchar ) {
if( Gtextsize < MINTEXTSIZE ) {
x = Goldx - (Gtextsize/90.0);
a = Exsca(x); b = Eysca( Goldy - (((double)Gtextsize/100.0)*strlen(s)));
c = Exsca(x); d = Eysca( Goldy );
}
else {
#ifdef GDFREETYPE
if( GFTfont[0] ) {
a = Exsca( Goldx ); b = Eysca( Goldy );
err = gdImageStringFT( NULL, GFTbox, Gcurcolor, GFTfont, GFTsize, 0.0, a, b, s );
if( err ) { fprintf( stderr, "%s (%s) (width calc)\n", err, GFTfont ); return( 1 ); }
b += (GFTbox[4] - GFTbox[0]);
/* err = gdImageStringFT( Gm, GFTbox, Gcurcolor, GFTfont, GFTsize, 0.0, a, b, s ); */
err = gdImageStringFT( Gm, GFTbox, Gcurcolor, GFTfont, GFTsize, VERT, a, b, s ); /* fixed 9/17/02 - Artur Zaprzala */
if( err ) { fprintf( stderr, "%s (%s)\n", err, GFTfont ); return( 1 ); }
}
#endif
if( GFTfont[0] == '\0' ) {
x = Goldx - (Gcharwidth*CHARHW); /* adjust for top loc */
y = Goldy - len;
a = Exsca( x ); b = Eysca( y );
gdImageStringUp( Gm, Gfont, a, b, (unsigned char *)s, Gcurcolor );
}
}
}
else {
if( Gtextsize < MINTEXTSIZE ) {
a = Exsca( Goldx - ((strlen(s))*(Gtextsize/100.0))); b = Eysca( Goldy );
c = Exsca( Goldx ); d = Eysca( Goldy );
gdImageLine( Gm, a, b, c, d, gdStyledBrushed );
}
else {
#ifdef GDFREETYPE
if( GFTfont[0] ) {
a = Exsca( Goldx ); b = Eysca( Goldy );
err = gdImageStringFT( NULL, GFTbox, Gcurcolor, GFTfont, GFTsize, 0.0, a, b, s );
if( err ) { fprintf( stderr, "%s (%s) (width calc)\n", err, GFTfont ); return( 1 ); }
a -= (GFTbox[4] - GFTbox[0]);
err = gdImageStringFT( Gm, GFTbox, Gcurcolor, GFTfont, GFTsize, 0.0, a, b, s );
if( err ) { fprintf( stderr, "%s (%s)\n", err, GFTfont ); return( 1 ); }
}
#endif
if( GFTfont[0] == '\0' ) {
x = Goldx - len;
y = Goldy + (Gcharwidth*CHARHW); /* adjust for top loc */
a = Exsca( x ); b = Eysca( y );
gdImageString( Gm, Gfont, a, b, (unsigned char *)s, Gcurcolor );
}
}
}
Goldx = x;
Goldy = y;
return( 0 );
}
/* ================================ */
/* find the width of the given txt using given freetype font and size */
/* added 8/5/05 - sugg by Erik Zachte */
int
PLGG_freetype_twidth( txt, font, size, twidth )
char *txt, *font;
double size;
double *twidth;
{
*twidth = 0.0;
#ifdef GDFREETYPE
if( font[0] ) {
char *err;
err = gdImageStringFT( NULL, GFTbox, 0, font, size, 0.0, 0, 0, txt );
if( err ) { fprintf( stderr, "%s (%s) (width calc)\n", err, font ); return( 0 ); }
*twidth = (GFTbox[2] - GFTbox[0]) / 100.0;
}
#endif
return(0);
}
/* ================================ */
int
PLGG_color( color )
char *color;
{
int i, n;
double r, g, b;
int ir, ig, ib, len;
int bc; /* brush color */
double atof();
/* request to load the color we currently have.. ignore - scg 6/18/04 */
/* this is necessary even with pcode lazy color change, because of rectangles */
if( strcmp( color, Gcurcolorname ) ==0 ) return( 0 );
else strcpy( Gcurcolorname, color );
/* parse graphcore color spec.. */
for( i = 0, len = strlen( color ); i < len; i++ ) {
if( GL_member( color[i], "(),/:|-" ) ) color[i] = ' ';
}
if( strncmp( color, "rgb", 3 )==0 ) {
n = sscanf( color, "%*s %lf %lf %lf", &r, &g, &b );
if( n != 3 ) { Eerr( 12008, "Invalid color", color ); return(1); }
}
else if( strncmp( color, "gray", 4 )==0 || strncmp( color, "grey", 4 )==0 ) {
n = sscanf( color, "%*s %lf", &r );
if( n != 1 ) { Eerr( 12008, "Invalid color", color ); return(1); }
g = b = r;
}
else if( strcmp( color, "transparent" )==0 ) { /* added scg 12/29/99 */
if( Gtransparent_color < 0 ) {
/* allocate transparent color.. */
Gtransparent_color = gdImageColorAllocate( Gm, 254, 254, 254 ); /* white fallbk */
/* gdImageColorTransparent( Gm, Gtransparent_color ); */
/* also keep brushes in sync.. */
for( i = 0; i < NBRUSH; i++ ) gdImageColorAllocate( Gbrush[i], 254, 254, 254 );
}
if( Gtransparent_color >= 0 ) Gcurcolor = Gtransparent_color;
/* Don't set brushes, etc, because we will never need to draw
transparent lines. Brushes remain set to previous color. */
return( 0 );
}
else if( strncmp( color, "xrgb", 4 )==0 ) {
if (PLG_xrgb_to_rgb( &color[5], &r, &g, &b)) return(1);
}
else if( color[0] == 'x' ) { /* added scg 5/31/07 */
if (PLG_xrgb_to_rgb( &color[1], &r, &g, &b)) return(1);
}
else if( GL_goodnum( color, &i ) ) {
r = atof( color );
g = b = r;
}
else PLG_colorname_to_rgb( color, &r, &g, &b );
ir = (int)(r * 255);
ig = (int)(g * 255);
ib = (int)(b * 255);
Gcurcolor = gdImageColorExact( Gm, ir, ig, ib );
if( Gcurcolor < 0 ) {
Gcurcolor = gdImageColorAllocate( Gm, ir, ig, ib );
if( Gcurcolor < 0 ) {
Gcurcolor = gdImageColorClosest( Gm, ir, ig, ib );
if( Gcurcolor < 0 ) return( 1 ); /* Eerr( 12009, "Error on img color allocation", color ); exit(1); */
}
}
if( ir + ig + ib == 0 ) Gblack = Gcurcolor; /* for wbmp */
/* also set all brushes to new color.. */
for( i = 0; i < NBRUSH; i++ ) {
/* first find color index or allocate new one.. */
bc = gdImageColorExact( Gbrush[i], ir, ig, ib );
if( bc < 0 ) {
bc = gdImageColorAllocate( Gbrush[i], ir, ig, ib );
if( bc < 0 ) {
bc = gdImageColorClosest( Gbrush[i], ir, ig, ib );
if( bc < 0 ) {
Eerr( 12010, "Error on img brush color alloc", color );
bc = 0;
}
}
}
/* next set color of each brush.. */
gdImageFilledRectangle( Gbrush[i], 0, 0, i+1, i+1, bc ); /* bc should == Gcurcolor */
}
/* This message occurs all the time with JPEG.. perhaps not needed..
* if( bc != Gcurcolor ) {
* Eerr( 12011, "warning, img brush color does not match current color", "" );
* }
*/
/* now, need to update brush image to new color using current linewidth */
i = (int) Gcurlinewidth;
if( i > (NBRUSH-1) ) i = NBRUSH - 1;
gdImageSetBrush( Gm, Gbrush[i] );
return( 0 );
}
/* ================================ */
/* PIXPT - pixel data point - clean data points rendered by setting GD pixels directly */
/* added 5/29/06 scg */
/* note: color already set by symboldet() */
int
PLGG_pixpt( x, y, symcode )
double x, y;
char *symcode;
{
int a, b;
int i, j, irow, icol, radius, iw, omode, scanend;
double atof();
/* Note - this code is essentially replicated in x11.c */
if( symcode[0] == 'o' ) { omode = 1; symcode[0] = 'p'; }
else omode = 0;
a = Exsca( x ); b = Eysca( y ); /* convert to pixel coordinates */
if( strncmp( symcode, "pixsquare", 9 )==0 ) {
radius = (int) (atof( &symcode[9] ) * Gpixelsinch);
if( radius < 1 ) radius = 3;
if( omode ) { /* do top and bottom lines */
irow = b-radius; for( icol = a-radius; icol < a+radius; icol++ ) gdImageSetPixel( Gm, icol, irow, gdStyledBrushed );
irow = b+radius; for( icol = a-radius; icol <= a+radius; icol++ ) gdImageSetPixel( Gm, icol, irow, gdStyledBrushed );
}
for( irow = b-radius; irow < b+radius; irow++ ) {
if( omode ) { gdImageSetPixel( Gm, a-radius, irow, gdStyledBrushed ); gdImageSetPixel( Gm, a+radius, irow, gdStyledBrushed ); }
else { for( icol = a-radius; icol < a+radius; icol++ ) gdImageSetPixel( Gm, icol, irow, gdStyledBrushed ); }
}
}
else if( strncmp( symcode, "pixcircle", 9 )==0 ) {
radius = (int) (atof( &symcode[9] ) * Gpixelsinch);
if( radius <= 2 ) goto DO_DIAMOND;
else if( radius > 9 ) radius = 9;
for( i = circliststart[radius]; ; i+= 2 ) {
scanend = circpt[i+1];
if( circpt[i] == 0 && scanend == 0 ) break;
for( j = 0; j <= scanend; j++ ) {
if( omode && !( j == scanend )) continue;
gdImageSetPixel( Gm, a-j, b+circpt[i], gdStyledBrushed );
if( j > 0 ) gdImageSetPixel( Gm, a+j, b+circpt[i], gdStyledBrushed );
gdImageSetPixel( Gm, a-j, b-circpt[i], gdStyledBrushed );
if( j > 0 ) gdImageSetPixel( Gm, a+j, b-circpt[i], gdStyledBrushed );
if( omode ) {
gdImageSetPixel( Gm, a+circpt[i], b-j, gdStyledBrushed );
if( j > 0 ) gdImageSetPixel( Gm, a+circpt[i], b+j, gdStyledBrushed );
gdImageSetPixel( Gm, a-circpt[i], b-j, gdStyledBrushed );
if( j > 0 ) gdImageSetPixel( Gm, a-circpt[i], b+j, gdStyledBrushed );
}
}
}
}
else if( strncmp( symcode, "pixdiamond", 10 )==0 ) {
radius = (int) (atof( &symcode[10] ) * Gpixelsinch);
DO_DIAMOND:
if( radius < 1 ) radius = 3;
radius++; /* improves consistency w/ other shapes */
for( irow = b-radius, iw = 0; irow <= (b+radius); irow++, iw++ ) {
scanend = a+abs(iw);
for( icol = a-abs(iw), j = 0; icol <= scanend; icol++, j++ ) {
if( omode && !( j == 0 || icol == scanend )) ;
else gdImageSetPixel( Gm, icol, irow, gdStyledBrushed );
}
if( irow == b ) iw = (-radius);
}
}
else if( strncmp( symcode, "pixtriangle", 11 )==0 ) {
radius = (int) (atof( &symcode[11] ) * Gpixelsinch);
if( radius < 1 ) radius = 3;
for( irow = b-radius, iw = 0; irow <= b+radius; irow++, iw++ ) {
scanend = a+abs(iw/2);
for( icol = a-abs(iw/2), j = 0; icol <= scanend; icol++, j++ ) {
if( omode && irow == b+radius ) gdImageSetPixel( Gm, icol, irow-1, gdStyledBrushed );
else if( omode && !( j == 0 || icol == scanend ));
else gdImageSetPixel( Gm, icol, irow-1, gdStyledBrushed );
}
}
}
else if( strncmp( symcode, "pixdowntriangle", 15 )==0 ) {
radius = (int) (atof( &symcode[15] ) * Gpixelsinch);
if( radius < 1 ) radius = 3;
for( irow = b+radius, iw = 0; irow >= (b-radius); irow--, iw++ ) {
scanend = a+abs(iw/2);
for( icol = a-abs(iw/2), j = 0; icol <= scanend; icol++, j++ ) {
if( omode && irow == b-radius ) gdImageSetPixel( Gm, icol, irow-1, gdStyledBrushed );
else if( omode && !(j == 0 || icol == scanend ));
else gdImageSetPixel( Gm, icol, irow, gdStyledBrushed );
}
}
}
return( 0 );
}
/* ============================== */
int
PLGG_imload( imgname, width, height )
char *imgname;
int width, height;
{
FILE *fp;
if( Gm2 != NULL ) {
gdImageDestroy( Gm2 );
Gm2 = NULL;
}
fp = fopen( imgname, "rb" );
if( fp == NULL ) return( -1 );
#ifdef GD13
Gm2 = gdImageCreateFromGif( fp );
#endif
#ifdef GD16
Gm2 = gdImageCreateFromPng( fp );
#endif
#ifdef GD18
if( strcmp( g_fmt, "png" )==0 ) Gm2 = gdImageCreateFromPng( fp );
else if( strcmp( g_fmt, "jpeg" )==0 ) Gm2 = gdImageCreateFromJpeg( fp );
else if( strcmp( g_fmt, "wbmp" )==0 ) Gm2 = gdImageCreateFromWBMP( fp );
#endif
if( width != 0 ) Gm2width = width;
if( height != 0 ) Gm2height = height;
fclose( fp );
return( 0 );
}
/* ================================ */
/* place secondary GIF image within main image at absolute x, y
* align may be one of: topleft topcenter center bottomleft
*/
int
PLGG_implace( x, y, align, width, height )
double x, y;
char *align;
int width, height; /* render the image using this width and height in pixels... if 0 0 then use natural size */
{
int gx, gy;
double PLG_xsca_inv(), PLG_ysca_inv();
fprintf( stderr, "in gd imcopy..\n" );
if( Gm2 == NULL ) return( -1 );
if( width < 1 ) width = Gm2width; /* as it may have been set in imload */
if( width < 1 ) width = Gm2->sx; /* fallback to image's natural size */
if( height < 1 ) height = Gm2height; /* as it may have been set in imload */
if( height < 1 ) height = Gm2->sy; /* fallback to image's natural size */
if( strncmp( align, "center", 6 )==0 ) { gx = Exsca( x ) - (width/2); gy = Eysca( y ) - (height/2); }
else if( strcmp( align, "topcenter" )==0 ) { gx = Exsca( x ) - (width/2); gy = Eysca( y ); }
else if( strcmp( align, "bottomleft" )==0 ) { gx = Exsca( x ); gy = Eysca( y ) - height; }
else { gx = Exsca( x ); gy = Eysca( y ); } /* default to top left */
if( gx < 0 ) gx = 0;
if( gy < 0 ) gy = 0;
gdImageCopyResized( Gm, Gm2, gx, gy, 0, 0, width, height, Gm2->sx, Gm2->sy );
/* add to app bounding box */
PLG_bb( Exsca_inv( gx ), Eysca_inv( gy ) );
PLG_bb( Exsca_inv( gx + width ), Eysca_inv( gy + height ) );
return( 0 );
}
/* ================================ */
/* EOF - crop image to bounding box size, and create output file */
/* scg 11/23/01 added click map support */
int
PLGG_eof( filename, x1, y1, x2, y2 )
char *filename;
double x1, y1, x2, y2; /* rectangle of the image that we will be copying into to do the final cropping */
{
int i, width, height, ux, uy;
gdImagePtr outim;
FILE *outfp;
int t;
if( x1 < 0.0 ) x1 = 0.0;
if( y1 < 0.0 ) y1 = 0.0;
/* if( x2 < 0.0 ) x2 = 0.0; */
/* if( y2 < 0.0 ) y2 = 0.0; */
/* final area may not be larger than originally defined 'pagesize' - added scg 5/8/06 */
if( x2 > (Gxmax/(double)Gpixelsinch) || x2 < 0.0 ) x2 = Gxmax/(double)Gpixelsinch ;
if( y2 > (Gymax/(double)Gpixelsinch) || y2 < 0.0 ) y2 = Gymax/(double)Gpixelsinch ;
#ifdef PLOTICUS
if( PL_clickmap_getdemomode() ) PL_clickmap_show( 'g' ); /* 11/23/01 */
#endif
if( Greqwidth > 0 && Greqheight > 0 ) {
width = Greqwidth;
height = Greqheight;
}
else {
width = Exsca( x2 ) - Exsca( x1 );
height = Eysca( y1 ) - Eysca( y2 );
}
if( height < 10 || width < 10 ) return( Eerr( 12012, "Result image is too small - not created", "" ) );
ux = Exsca( x1 );
uy = Eysca( y2 );
/* copy to smaller img sized by bounding box.. */
outim = gdImageCreate( width, height );
if( outim == NULL ) return( Eerr( 12013, "Error on creation of image output", "" ) );
gdImageCopy( outim, Gm, 0, 0, ux, uy, width, height );
/* fprintf( stderr, "new im w:%d h:%d ux:%d uy:%d\n", width, height, ux, uy ); */
/* if a transparent color was used, set it now in outim.. */
if( Gtransparent_color >= 0 ) {
t = gdImageColorExact( outim, 254, 254, 254 );
gdImageColorTransparent( outim, t );
}
/* Open a file for writing. "wb" means "write binary", important under MSDOS, harmless under Unix. */
if( strcmp( filename, "stdout" )==0 ) {
fflush( stdout );
#ifdef WIN32
_setmode( _fileno( stdout ), _O_BINARY ); /* use binary mode stdout */
#endif
outfp = stdout;
}
else outfp = fopen( filename, "wb");
if( outfp == NULL ) return( Eerr( 12014, "Cannot open for write", filename ) );
/* Output the image to the disk file. */
#ifdef GD13
gdImageGif( outim, outfp );
#endif
#ifdef GD16
gdImagePng( outim, outfp );
#endif
#ifdef GD18
if( strcmp( g_fmt, "png" )==0 ) gdImagePng( outim, outfp );
else if( strcmp( g_fmt, "jpeg" )==0 ) gdImageJpeg( outim, outfp, 75 );
else if( strcmp( g_fmt, "wbmp" )==0 ) gdImageWBMP( outim, Gblack, outfp );
#endif
if( strcmp( filename, "stdout" )!=0 ) {
fclose( outfp );
#ifndef WIN32
chmod( filename, 00644 );
#endif
}
else {
fflush( stdout );
#ifdef WIN32
_setmode( _fileno( stdout ), _O_TEXT ); /* if using stdout, restore stdout to text mode */
#endif
}
/* free memory (other ims freed in EGSetup() for subsequent pages) */
gdImageDestroy( Gm );
for( i = 0; i < NBRUSH; i++ ) gdImageDestroy( Gbrush[i] );
gdImageDestroy( outim );
Ginitialized = 0;
#ifdef PLOTICUS
/* write map file */
if( PL_clickmap_inprogress() ) PL_clickmap_out( ux, uy );
#endif
return( 0 );
}
#endif /* NOGD */
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_getdata.c 0000644 0001750 0001750 00000037213 12144506074 015675 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC GETDATA - get some data. Data may be specified literally, or gotten from a file or a command. */
/* scg 11/6/07 - removed the specialmode related to certain uses of proc processdata */
#include "pl.h"
#include "tdhkit.h"
#include
#define COMMANDMAX 1024
/* field delimitation methods */
#define WHITESPACE 0
#define SPACEQUOTE 1
#define TAB 2
#define CSV 3
#define BAR 4
#define AUTODETERMINE 5
static int do_filter();
/* =============================== */
int
PLP_getdata( )
{
int i, j, lvp, stat, first;
char attr[NAMEMAXLEN], *line, *lineval;
char buf[ MAXRECORDLEN ]; /* holds input data rows */
char tok[256];
char *datafile, *pathname, *command, *selectex, *fieldnamerows;
char *pfnames, *row;
char commentchar[12];
char datasource;
FILE *dfp, *popen();
int delim, standardinput, fieldnameheader, cclen, buflen, literaldata, reqnfields;
int datastart, ndatarows, irow, nrecords, nfields, totalitems, foo, sqlflag, doing_set, nfldnames;
int blankrow, hold_delim, nscriptrows, scriptstart, showdata;
int samplerate, readcount;
TDH_errprog( "pl proc getdata" );
/* initialize */
datafile = "";
pathname = "";
selectex = "";
command = "";
pfnames = "";
strcpy( commentchar, "//" );
delim = SPACEQUOTE;
showdata = standardinput = 0;
sqlflag = nfldnames = hold_delim = 0;
fieldnameheader = literaldata = nscriptrows = reqnfields = 0;
samplerate = 1;
definefieldnames( "" ); /* any existing field names will be wrong */
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "file" )==0 ) {
if( PLS.cgiargs != NULL ) pathname = lineval;
else {
#ifdef WIN32
pathname = lineval; /* to avoid invoking 'cat' .. */
#else
datafile = lineval;
#endif
}
}
else if( strcmp( attr, "pathname" )==0 ) pathname = lineval;
else if( strcmp( attr, "command" )==0 ) command = lineval;
else if( strcmp( attr, "commandmr" )==0 ) command = getmultiline( lineval, "get" );
else if( strcmp( attr, "sql" )==0 ) { command = lineval; sqlflag = 1; }
else if( strcmp( attr, "sqlmr" )==0 ) { command = getmultiline( lineval, "get" ); sqlflag = 1; }
else if( strncmp( attr, "delim", 5 )==0 ) {
if( lineval[0] == 'w' ) delim = WHITESPACE;
else if( lineval[0] == 't' ) delim = TAB;
else if( lineval[0] == 'c' ) delim = CSV;
else if( lineval[0] == 'b' ) delim = BAR;
else if( lineval[0] == 'a' ) delim = AUTODETERMINE;
}
else if( strcmp( attr, "commentchar" )==0 ) tokncpy( commentchar, lineval, 12 );
else if( strcmp( attr, "data" )==0 ) {
if( strcmp( lineval, "" )!=0 ) {
datastart = PLL.curline-1;
strcpy( PLL.procline[ PLL.curline-1 ], lineval ); /* remove 'data:' */
}
else datastart = PLL.curline;
getmultiline( lineval, "skip" );
ndatarows = (PLL.curline - datastart); /* was -1 */
literaldata = 1;
PL_holdmem( 1 ); /* tell execline() not to free this storage when the proc is done executing.. */
}
else if( strcmp( attr, "filter" )==0 ) {
if( strcmp( lineval, "" )!= 0 ) {
scriptstart = PLL.curline-1;
strcpy( PLL.procline[ PLL.curline-1 ], lineval ); /* remove 'filter:' */
}
else scriptstart = PLL.curline;
getmultiline( lineval, "skip" ); /* use this to skip over filter script */
nscriptrows = (PLL.curline - scriptstart); /* was -1 */
/* in all script lines, convert double pound signs (##) to single poundsign.. */
for( i = scriptstart; i < scriptstart+nscriptrows; i++ ) {
for( j = 0; PLL.procline[i][j] != '\0'; j++ ) {
if( PLL.procline[i][j] == '#' && PLL.procline[i][j+1] == '#' ) {
PLL.procline[i][j] = ' ';
break;
}
else if( !isspace( (int) PLL.procline[i][j] )) break; /* no need to search entire line.. scg 11/25/02 */
}
}
}
else if( strcmp( attr, "showdata" )==0 || strcmp( attr, "showresults" )==0 ) showdata = getyn( lineval );
else if( strcmp( attr, "standardinput" )==0 ) standardinput = getyn( lineval );
else if( strcmp( attr, "fieldnameheader" )==0 ) fieldnameheader = getyn( lineval );
else if( strcmp( attr, "select" )==0 ) selectex = lineval;
else if( strcmp( attr, "nfields" )==0 ) reqnfields = itokncpy( lineval );
else if( strcmp( attr, "samplerate" )==0 ) samplerate = itokncpy( lineval );
else if( strcmp( attr, "fieldnames" )==0 ) nfldnames = definefieldnames( lineval );
else if( strcmp( attr, "fieldnamerows" )==0 ) {
fieldnamerows = getmultiline( lineval, "get" );
nfldnames = definefieldnames( fieldnamerows );
}
else if( strcmp( attr, "pf_fieldnames" )==0 ) pfnames = lineval;
else Eerr( 1, "attribute not recognized", attr );
}
/* now do the work.. */
PLP_processdata_initstatic(); /* reset proc_processdata "break" pointer.. scg 8/4/04 */
/* determine source of data.. */
if( sqlflag ) datasource = 'q';
else if( command[0] != '\0' ) datasource = 'c'; /* shell command */
else if( literaldata ) {
if( nscriptrows > 0 ) Eerr( 5792, "Warning, filter ignored (it cannot be used with in-script data)", "" );
datasource = 'd'; /* in-script data statement */
}
else if( standardinput || strcmp( datafile, "-" ) ==0 || strcmp( pathname, "-" )==0 ) datasource = 's'; /* stdin */
else if( datafile[0] != '\0' ) { /* shell-expandable file name */
sprintf( buf, "cat \"%s\"", datafile );
command = buf;
datasource = 'c';
}
else if( pathname[0] != '\0' ) datasource = 'p'; /* explicit full pathname */
else { PLS.skipout = 1; return( Eerr( 407, "No data, file, or command was specified", "" ) ); }
/* get ready to loop thru data.. */
if( datasource != 'd' ) {
datastart = 0;
ndatarows = 99999999;
}
if( datasource == 'p' ) { /* 'pathname' given.. */
dfp = fopen( pathname, "r" );
if( dfp == NULL ) { PLS.skipout = 1; return( Eerr( 401, "Cannot open data file", pathname ) ); }
}
else if( datasource == 's' ) dfp = stdin;
else if( datasource == 'c' ) {
if( PLS.noshell ) return( Eerr( 401, "-noshell prohibits #proc getdata command", "" ) );
dfp = popen( command, "r" );
if( dfp == NULL ) { PLS.skipout = 1; return( Eerr( 401, "Cannot execute command", command ) ); }
}
/* get the PLD data structure ready.. */
/* when proc getdata gets a data set, it always becomes ds 0 */
PL_cleardatasets();
PL_begindataset();
/* handle embedded sql using db abstraction interface - see dbinterface.c */
if( sqlflag ) {
char *fields[128];
int blen, nf2;
/* config file must have already been read.. */
stat = TDH_sqlcommand( 0, command );
if( stat != 0 ) return( Eerr( stat, "error on sql command", command ));
/* get result field names and use these to set ploticus field names (what about joins?) */
stat = TDH_sqlnames( 0, fields, &nfields );
if( stat != 0 ) return( Eerr( stat, "error on sql result fieldnames", command ));
for( i = 0, blen = 0; i < nfields; i++ ) {
strcpy( &PL_bigbuf[blen], fields[i] ); blen += strlen( fields[i] );
strcpy( &PL_bigbuf[blen], " " ); blen++;
}
PL_bigbuf[blen] = '\0';
nfldnames = definefieldnames( PL_bigbuf );
for( nrecords = 0; ; nrecords++ ) {
if( PLD.curdf + nfields >= PLD.maxdf ) {
Eerr( 406, "Data capture truncated...too many data fields (try raising -maxfields)", "" );
break;
}
stat = TDH_sqlrow( 0, fields, &nf2 ); /* changed scg 6/30/06 */
if( stat > 1 ) return( Eerr( stat, "error on sql row retrieval", command ));
if( stat != 0 ) break;
if( nfields != nf2 ) return( Eerr( 461, "sql retrieval inconsistency", "" ));
/* copy fields from shsql space into pl data space .. added scg 6/30/06 */
PL_startdatarow();
for( j = 0; j < nf2; j++ ) PL_catitem( fields[j] );
PL_enddatarow();
}
goto READ_DONE; /* skip down to do the finish-up stuff.. */
}
/* all other means of getting data use the following.. */
/* loop thru lines of data.. */
first = 1;
nrecords = 0;
readcount = 0;
cclen = strlen( commentchar );
for( irow = datastart; irow < datastart+ndatarows; irow++ ) {
if( datasource != 'd' ) {
if( fgets( buf, MAXRECORDLEN-1, dfp ) == NULL ) break;
readcount++;
if( samplerate != 1 ) {
/* keep every Nth input row... reject the rest. scg 12/7/09 */
if( readcount % samplerate != 0 ) continue;
}
row = buf;
}
else row = PLL.procline[ irow ];
/* skip empty lines */
if( row[0] == '\n' || row[0] == '\0' ) continue;
/* note.. with comma-delimited data there can be very long lines with no whitespace */
/* skip lines containing nothing but whitespace chars.. and also skip comment lines */
for( j = 0, blankrow = 1; row[j] != '\0'; j++ ) if( !isspace( (int)row[j] )) { blankrow = 0; break; }
if( blankrow ) continue;
if( strncmp( &row[j], commentchar, strlen( commentchar ))==0 ) continue;
buflen = strlen( row );
if( datasource != 'd' && row[ buflen-2 ] == 13 ) strcpy( &buf[ buflen-2 ], "\n" ); /* DOS LF */
/* look for #set.. */
doing_set = 0;
for( j = 0; row[j] != '\0'; j++ ) if( strncmp( &row[j], "#set ", 5 )== 0 ) { doing_set = 1; break; }
/* #set var = value .. this can be used in data files.. - added scg 11/13/00 */
if( doing_set ) {
int ix, oldix;
char varname[40];
ix = 0;
GL_getchunk( tok, row, &ix, " " ); /* #set */
GL_getchunk( varname, row, &ix, " =" ); /* varname */
oldix = ix;
GL_getchunk( tok, row, &ix, " " ); /* optional = */
if( strcmp( tok, "=" ) != 0 ) ix = oldix;
row[ buflen - 1 ] = '\0'; /* strip off trailing newline - scg 7/27/01 */
buflen--;
if( row[ix+1] == '"' ) stat = TDH_setvar( varname, &row[ix+2] );
else stat = TDH_setvar( varname, &row[ix+1] );
if( stat ) { PLS.skipout = 1; return( Eerr( stat, "Fatal error, embedded #set statement, value is too long (max=250 chars)", "" )); }
continue;
}
if( delim == AUTODETERMINE ) { /* attempt to auto-detect the delim character.. scg 10/29/07 */
int ntabs, nbars, ncommas;
char *dword;
for( j = 0, ntabs = 0; row[j] != '\0'; j++ ) if( row[j] == '\t' ) ntabs++;
for( j = 0, nbars = 0; row[j] != '\0'; j++ ) if( row[j] == '|' ) nbars++;
for( j = 0, ncommas = 0; row[j] != '\0'; j++ ) if( row[j] == ',' ) ncommas++;
delim = WHITESPACE; dword = "whitespace";
if( ntabs > 2 && ntabs > nbars && ntabs > ncommas ) { delim = TAB; dword = "tab"; }
else if( nbars > 2 && nbars > ntabs && nbars > ncommas ) { delim = BAR; dword = "bar"; }
else if( ncommas > 2 && ncommas > ntabs && ncommas > nbars ) { delim = CSV; dword = "csv"; }
if( PLS.debug ) fprintf( PLS.diagfp, "automatic determination delim: looks like %s delimited\n", dword );
}
if( delim == BAR || hold_delim == BAR ) { /* added scg 10/25/07 */
for( j = 0; row[j] != '\0'; j++ ) if( row[j] == '|' ) row[j] = '\t';
hold_delim = BAR;
delim = TAB;
}
/* field name header.. */
if( first && fieldnameheader ) {
nfldnames = definefieldnames( row ); /* takes whitespace or comma delimited.. */
first = 0;
continue;
}
first = 0;
/* if field names given and nfields not given, set expected # fields using # field names.. scg 3/15/06 */
/* but not if we're doing a filter.. */
if( reqnfields <= 0 && nfldnames > 0 && nscriptrows == 0 ) reqnfields = nfldnames;
/* optional select */
if( selectex[0] != '\0' ) {
stat = do_filter( row, selectex, delim, 1, scriptstart, nscriptrows ); /*doesn't modify row*/
if( ! stat ) continue;
}
/* optional filter data processing.. */
if( datasource != 'd' && nscriptrows > 0 ) {
do_filter( buf, "", delim, 0, scriptstart, nscriptrows ); /* modifies row */
if( buf[0] == '\0' ) continue; /* nothing printed, skip row.. added scg 3/19/03 */
buflen = strlen( buf ); /* because row has been modified above */
if( buf[ buflen -1 ] != '\n' ) strcpy( &buf[ buflen-1 ], "\n" );
}
/* if we reach here, keep the line.. */
if( datasource != 'd' ) {
/* copy the row into malloced storage.. */
if( PLD.currow >= PLD.maxrows ) {
Eerr( 429, "Data input truncated... too many data rows (try raising -maxrows)", "" );
break;
}
row = (char *) malloc( buflen+1 );
if( row == NULL ) return( err( 2480, "malloc error", "" ) );
strcpy( row, buf );
PLD.datarow[ PLD.currow++ ] = row;
}
/* parse the row into fields.. */
if( reqnfields > 0 ) nfields = reqnfields;
else if( nrecords == 0 ) nfields = 0;
stat = PL_parsedata( row, delim, commentchar, &(PLD.df[ PLD.curdf ]), MAXITEMS, &foo, &nfields, &totalitems );
if( stat != 0 ) { PLS.skipout = 1; return( Eerr( stat, "Parse error on input data.", "" )); }
PLD.curdf += nfields;
if( PLD.curdf + nfields >= PLD.maxdf ) {
Eerr( 406, "Data input truncated... too many data fields (try raising -maxfields)", "" );
break;
}
nrecords++;
}
if( datasource == 's' ) ;
else if( datasource == 'p' ) fclose( dfp );
else if( datasource == 'c' ) pclose( dfp );
READ_DONE:
PL_finishdataset( nrecords, nfields );
if( nscriptrows > 0 && pfnames[0] != '\0' ) definefieldnames( pfnames ); /* assign any post-filter field names.. */
if( showdata ) {
getfname( 1, buf ); /* buf[256] */
fprintf( PLS.diagfp, "// proc getdata has read & parsed these data:\n" );
if( buf[0] != '\0' ) {
fprintf( PLS.diagfp, "// field names are: " );
for( j = 0; j < Nfields; j++ ) { getfname( j+1, buf ); fprintf( PLS.diagfp, "%s|", buf ); } /* buf[256] */
fprintf( PLS.diagfp, "\n" );
}
else fprintf( PLS.diagfp, "// (no field names defined)\n" );
for( i = 0; i < Nrecords; i++ ) {
for( j = 0; j < Nfields; j++ ) fprintf( PLS.diagfp, "%s|", da(i,j) );
fprintf( PLS.diagfp, "\n" );
}
fprintf( PLS.diagfp, "// end of data set\n" );
}
return( 0 );
}
/* ======================================== */
/* DO_FILTER - implement 'select' and 'filter'.
This needs to be reworked again sometime for efficiency..
*/
static int
do_filter( buf, scriptname, delim, mode, scriptstart, nscriptrows )
char *buf;
char *scriptname;
int delim;
int mode; /* 0 = filter 1 = select */
int scriptstart, nscriptrows;
{
int stat;
char recordid[80];
char data[MAXITEMS][DATAMAXLEN+1];
char *df[MAXITEMS];
char str[MAXRECORDLEN], str2[MAXRECORDLEN]; /* size increased from 255 scg 6/27/01 */
int nfields, nrecords, nd;
int i;
char commentchar[12];
struct sinterpstate ss;
strcpy( recordid, "" ); /* not used */
strcpy( commentchar, "//" ); /* not used? */
/* split up buf into fields.. */
strcpy( str, buf );
nfields = 0;
PL_parsedata( str, delim, commentchar, df, MAXITEMS, &nrecords, &nfields, &nd );
if( mode == 1 ) { /* condex processing.. */
strcpy( str2, str );
stat = PL_value_subst( str2, scriptname, df, FOR_CONDEX );
if( stat > 1 ) Eerr( 2208, "value_subst error", scriptname );
stat = TDH_condex( str2, 0 );
return( stat );
}
/* for sinterp we need to copy data into array.. */
for( i = 0; i < MAXITEMS; i++ ) strcpy( data[i], "" ); /* null out data array.. added scg 11/15/00 */
for( i = 0; i < nfields; i++ ) strcpy( data[i], df[i] );
stat = TDH_sinterp_openmem( &(PLL.procline[ scriptstart ]), nscriptrows, &ss ); /* scriptstart & nscriptrows set above.. */
if( stat != 0 ) return( Eerr( stat, "filter script error", "" ) );
/* do filter processing.. */
strcpy( buf, "" );
while( 1 ) {
stat = TDH_sinterp( str, &ss, recordid, data );
if( stat > 255 ) return( Eerr( 169, "filter script error.. quitting..", "" ) );
else if( stat != SINTERP_MORE ) break;
strcat( buf, str ); /* strcat ok */
}
return( 0 ); /* return results in buf */
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_boxplot.c 0000644 0001750 0001750 00000026671 11160442755 015763 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC BOXPLOT - render boxplots */
/* 10/31/07 scg - in version 2.34 proc rangebar has been renamed and pared down. It now requires precomputed stats (always)
* Stats can be precomputed in 2.34+ using proc processdata (action: summaryplus).
* Options for log transform, display of outlier data points, #missing annotation,
* 1.5 IQR tails, and output of computed stats, are no longer supported.
* Ploticus variables such as RANGEBARMIN are no longer set.
*/
#include "pl.h"
#define MEDIANBASED 0
#define MEANBASED 1
#define LOWTAIL 0
#define LOWBOX 1
#define MIDBOX 2
#define HIBOX 3
#define HITAIL 4
#define N_OBS 0
#define MEAN 1
#define SD 2
#define MIN 3
#define MAX 4
#define PCTL5 2
#define PCTL25 3
#define MEDIAN 4
#define PCTL75 5
#define PCTL95 6
#define COLOR 0
#define SYM 1
/* ========================= */
int
PLP_boxplot()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
char baseax, axis;
char *statfields, *tailmode, *nlocation, *taildet, *outlinedet, *barcolor, *textdet;
char *medsym, *selectex, *meansym, *legendlabel;
char buf[256], symcode[50], sfbuf[80];
int i, stat, align, ix, locfield, printn, baroutline;
int pf[10], fnftics, trunc, result, npf, imeth, irow, legendtype; /* bug fix 3/20/09, was pf[6] */
double stats[20], h[5];
double adjx, adjy, nloc, barwidth, hb, r, ticsize, ticlen, radius, barloc;
TDH_errprog( "pl proc boxplot" );
/* initialize */
axis = 'y';
tailmode = "5/95";
nlocation = ""; textdet = ""; taildet = ""; outlinedet = ""; selectex = ""; meansym = ""; statfields = ""; legendlabel = "";
barcolor = "gray(0.8)";
medsym = "line";
printn = 1;
barwidth = 0.12;
baroutline = 1;
ticsize = 0.7; /* % of box width */
fnftics = 1;
trunc = 1;
locfield = -1;
imeth = MEDIANBASED;
npf = 0;
legendtype = COLOR;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "orientation" )==0 ) {
if( lineval[0] == 'h' ) axis = 'x';
else if( lineval[0] == 'v' ) axis = 'y';
}
else if( strcmp( attr, "barwidth" )==0 ) { barwidth = ftokncpy( lineval ); if( PLS.usingcm ) barwidth /= 2.54; }
else if( strcmp( attr, "basis" )==0 ) {
if( strncmp( lineval, "mean", 4 )==0 ) imeth = MEANBASED;
else if( strncmp( lineval, "median", 6 )==0 ) imeth = MEDIANBASED;
}
else if( strcmp( attr, "statfields" )==0 ) statfields = lineval;
else if( strcmp( attr, "locfield" )==0 ) locfield = fref( lineval ) -1; /* added 10/31/07 scg */
else if( strcmp( attr, "tailmode" )==0 ) tailmode = lineval;
else if( strcmp( attr, "95tics" )==0 ) fnftics = getyn( lineval );
else if( strcmp( attr, "mediansym" )==0 ) medsym = lineval;
else if( strcmp( attr, "taildetails" )==0 ) taildet = lineval;
else if( strcmp( attr, "outlinedetails" )==0 ) { outlinedet = lineval; baroutline = 1; }
else if( strcmp( attr, "color" )==0 ) barcolor = lineval;
else if( strcmp( attr, "outline" )==0 ) baroutline = getyn( lineval );
else if( strcmp( attr, "printn" )==0 ) printn = getyn( lineval );
else if( strcmp( attr, "nlocation" )==0 ) nlocation = lineval;
else if( strcmp( attr, "textdetails" )==0 ) textdet = lineval;
else if( strcmp( attr, "truncate" )==0 ) trunc = getyn( lineval );
else if( strcmp( attr, "ticsize" )==0 ) ticsize = ftokncpy( lineval ); /* a % of bar width */
else if( strcmp( attr, "select" )==0 ) selectex = lineval;
else if( strcmp( attr, "meansym" )==0 ) meansym = lineval;
else if( strcmp( attr, "legendlabel" )==0 ) legendlabel = lineval;
else if( strcmp( attr, "legendtype" )==0 ) {
if( lineval[0] == 'c' ) legendtype = COLOR;
else if( lineval[0] == 's' ) legendtype = SYM;
}
else Eerr( 1, "attribute not recognized", attr );
}
/* overrides and degenerate cases */
/* -------------------------- */
if( axis == 'x' ) baseax = 'y';
else baseax = 'x';
if( ! GL_smember( tailmode, "5/95 min/max" )) { Eerr( 582, "tailmode must be '5/95' or 'min/max'", tailmode ); tailmode = "5/95"; }
/* statfields.. */
if( imeth == MEDIANBASED && statfields[0] == '\0' ) {
if( tailmode[0] == '5' ) strcpy( sfbuf, "n_obs pctl5th pctl25th median pctl75th pctl95th " );
else if( tailmode[0] == 'm' ) strcpy( sfbuf, "n_obs min pctl25th median pctl75th max " );
if( meansym[0] != '\0' ) strcat( sfbuf, "mean" );
statfields = sfbuf;
}
else if( imeth == MEANBASED && statfields[0] == '\0' ) statfields = "n_obs mean sd min max";
for( ix = 0, i = 0; i < 7; i++ ) { /* fill pf */
strcpy( buf, GL_getok( statfields, &ix ));
if( buf[0] == '\0' ) break;
pf[i] = fref( buf ) - 1;
if( PL_fref_error() ) return( Eerr( 583, "invalid statfield", buf ) );
}
npf = i;
if( imeth == MEDIANBASED ) {
if( meansym[0] != '\0' && npf != 7 ) return( Eerr( 2749, "expecting 7 statfields for median-based boxplots including mean", "" ));
else if( meansym[0] == '\0' && npf != 6 ) return( Eerr( 2749, "expecting 6 statfields for median-based boxplots", "" )); /* bug fix 3/19/09 */
}
else if( imeth == MEANBASED ) {
if( npf != 5 ) return( Eerr( 2749, "expecting 5 statfields for mean-based boxplots", "" ));
}
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) );
if( !scalebeenset() ) return( Eerr( 51, "No scaled plotting area has been defined yet w/ proc areadef", "" ) );
if( nlocation[0] == '\0' ) nloc = Elimit( axis, 'l', 'a' ) + 0.05;
else Eposex( nlocation, axis, &nloc );
if( strcmp( medsym, "dot" )==0 || strcmp( medsym, "yes" )==0 ) medsym = "shape=pixcircle style=filled fillcolor=black radius=0.05";
/* render the boxplots */
/* ------------------- */
if( baseax == 'y' ) Eflip = 1;
hb = barwidth / 2.0;
ticlen = barwidth * ticsize * 0.5;
textdet( "textdetails", textdet, &align, &adjx, &adjy, -2, "R", 1.0 );
for( irow = 0; irow < Nrecords; irow++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, irow, &result );
if( result == 0 || stat ) continue; /* reject */
}
if( imeth == MEANBASED ) {
stats[N_OBS] = fda( irow, pf[0], axis );
stats[MEAN] = fda( irow, pf[1], axis );
stats[SD] = fda( irow, pf[2], axis );
stats[MIN] = fda( irow, pf[3], axis );
stats[MAX] = fda( irow, pf[4], axis );
}
else {
stats[N_OBS] = fda( irow, pf[0], axis );
stats[PCTL25] = fda( irow, pf[2], axis );
stats[MEDIAN] = fda( irow, pf[3], axis );
stats[PCTL75] = fda( irow, pf[4], axis );
if( tailmode[0] == '5' ) { stats[PCTL5] = fda( irow, pf[1], axis ); stats[PCTL95] = fda( irow, pf[5], axis ); }
else if( tailmode[0] == 'm' ) { stats[MIN] = fda( irow, pf[1], axis ); stats[MAX] = fda( irow, pf[5], axis ); }
if (meansym[0] != '\0') stats[MEAN] = fda( irow, pf[6], axis ); /* bug fix 3/19/09 */
}
/* bar location */
if( locfield >= 0 ) barloc = fda( irow, locfield, baseax );
else barloc = irow+1; /* as they fall */
if( !Ef_inr( baseax, barloc ) ) { fprintf( PLS.errfp, "warning, boxplot location out of %c plotting area\n", baseax ); continue; }
barloc = Ea(X,barloc); /* convert barloc to absolute units */
if( printn ) { /* print N= ... it appears even for degenerate or out of range cases */
sprintf( buf, "N=%g", stats[N_OBS] );
if( baseax == 'y' ) Emov( (barloc-(Ecurtextheight*0.3)) + adjx, nloc + adjy );
else Emov( barloc + adjx, nloc + adjy );
Ecentext( buf );
}
/* set drawing array h[] */
if( imeth == MEANBASED ) {
h[LOWTAIL] = stats[MIN];
h[LOWBOX] = stats[MEAN] - stats[SD];
h[MIDBOX] = stats[MEAN];
h[HIBOX] = stats[MEAN] + stats[SD];
h[HITAIL] = stats[MAX];
}
else {
if( tailmode[0] == '5' ) { h[LOWTAIL] = stats[PCTL5]; h[HITAIL] = stats[PCTL95]; }
else if( tailmode[0] == 'm' ) { h[LOWTAIL] = stats[MIN]; h[HITAIL] = stats[MAX]; }
h[LOWBOX] = stats[PCTL25];
h[MIDBOX] = stats[MEDIAN];
h[HIBOX] = stats[PCTL75];
}
/* if N=0, skip out (degenerate case) */
if( stats[N_OBS] <= 0.0 ) continue;
/* if entire bar is out of plotting area, skip out.. */
if( h[LOWTAIL] < Elimit( axis, 'l', 's' ) && h[HITAIL] < Elimit( axis, 'l', 's' ) )
{ fprintf( PLS.errfp, "warning, entire boxplot out of %c plotting area (under)\n", axis ); continue; }
if( h[LOWTAIL] > Elimit( axis, 'h', 's' ) && h[HITAIL] > Elimit( axis, 'h', 's' ) )
{ fprintf( PLS.errfp, "warning, entire boxplot out of %c plotting area (over)\n", axis ); continue; }
/* truncate values to be within range.. */
if( trunc && !Ef_inr( axis, h[LOWTAIL] )) h[LOWTAIL] = Elimit( axis, 'l', 's' );
if( trunc && !Ef_inr( axis, h[LOWBOX] )) h[LOWBOX] = Elimit( axis, 'l', 's' );
if( trunc && !Ef_inr( axis, h[HIBOX] )) h[HIBOX] = Elimit( axis, 'h', 's' );
if( trunc && !Ef_inr( axis, h[HITAIL] )) h[HITAIL] = Elimit( axis, 'h', 's' );
linedet( "taildetails", taildet, 0.5 );
Emov( barloc, Ea( Y, h[LOWTAIL] ) ); Elin( barloc, Ea( Y, h[LOWBOX] ) );
Emov( barloc, Ea( Y, h[HIBOX] ) ); Elin( barloc, Ea( Y, h[HITAIL] ) );
if( !trunc || Ef_inr( axis, h[LOWTAIL] ) ) { /* bottom tic */
if( h[LOWTAIL] < h[LOWBOX] ) { /* only do if below bottom of box - added scg 5/23/00 */
Emov( barloc-ticlen, Ea( Y, h[LOWTAIL] ) );
Elin( barloc+ticlen, Ea( Y, h[LOWTAIL] ) );
}
}
if( !trunc || Ef_inr( axis, h[HITAIL] ) ) { /* top tic */
if( h[HITAIL] > h[HIBOX] ) { /* only do if above top of box - added scg 5/23/00 */
Emov( barloc-ticlen, Ea( Y, h[HITAIL] ) ); /* slop added to hide line ending glitch */
Elin( barloc+ticlen, Ea( Y, h[HITAIL] ) );
}
}
if( tailmode[0] != '5' && fnftics && imeth == MEDIANBASED ) { /* add 5/95 ticks to min/max tails */
if( !trunc || Ef_inr( axis, stats[PCTL5] )) {
Emov( barloc-(ticlen*0.8), Ea( Y, stats[PCTL5] ) );
Elin( barloc+(ticlen*0.8), Ea( Y, stats[PCTL5] ) );
}
if( !trunc || Ef_inr( axis, stats[PCTL95] )) {
Emov( barloc-(ticlen*0.8), Ea( Y, stats[PCTL95] ) );
Elin( barloc+(ticlen*0.8), Ea( Y, stats[PCTL95] ) );
}
}
linedet( "outlinedetails", outlinedet, 0.5 );
Ecblock( barloc-hb, Ea(Y,h[LOWBOX]), barloc+hb, Ea(Y,h[HIBOX]), barcolor, baroutline );
/* do midbox */
if( strcmp( medsym, "line" ) ==0 && (!trunc || Ef_inr( axis, h[MIDBOX] ))) {
Emov( barloc-hb, Ea(Y,h[MIDBOX]) );
Elin( barloc+hb, Ea(Y,h[MIDBOX]) );
}
else if( medsym[0] != '\0' && (!trunc || Ef_inr( axis, h[MIDBOX] ))) {
symdet( "mediansym", medsym, buf, &r );
if( Eflip ) Emark( Ea(Y,h[MIDBOX]), barloc, buf, r );
else Emark( barloc, Ea(Y,h[MIDBOX]), buf, r );
}
/* display mean symbol on a median-based rangebar.. */
if( imeth == MEDIANBASED && meansym[0] != '\0' ) {
if( strcmp( meansym, "yes" )==0 || strcmp( meansym, "dot" )==0 ) meansym = "shape=circle style=filled fillcolor=black radius=0.02";
symdet( "meansym", meansym, symcode, &radius );
Emark( barloc, Ea(Y,stats[MEAN]), symcode, radius );
}
}
if( baseax == 'y' ) Eflip = 0;
if( legendlabel[0] != '\0' ) {
if( medsym[0] != '\0' && legendtype == SYM ) PL_add_legent( LEGEND_SYMBOL, legendlabel, "", medsym, "", "" );
else PL_add_legent( LEGEND_COLOR, legendlabel, "", barcolor, "", "" );
}
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/pixpt.h 0000644 0001750 0001750 00000005037 10435621206 014405 0 ustar colin colin
/* circles for direct pixel data point */
static int circliststart[] = { 0, 0, 0, 0, 10, 22, 36, 54, 54, 74, 74, 74 };
static int circpt[] = {
/* radius=3 */
/* *** */
/* ***** */
/* ******* */
/* ***o*** */ 0, 3, /* 0 */
/* ******* */ 1, 3,
/* ***** */ 2, 2,
/* *** */ 3, 1,
0, 0,
/* radius=4 */
/* ***** */
/* ******* */
/* ********* */
/* ********* */
/* ****o**** */ 0, 4, /* 5 x2 = 10 */
/* ********* */ 1, 4,
/* ********* */ 2, 4,
/* ******* */ 3, 3,
/* ***** */ 4, 2,
0, 0,
/* radius=5 */
/* ***** */
/* ********* */
/* ********* */
/* *********** */
/* *********** */
/* *****o***** */ 0, 5, /* 11 x2 = 22 */
/* *********** */ 1, 5,
/* *********** */ 2, 5,
/* ********* */ 3, 4,
/* ********* */ 4, 4,
/* ***** */ 5, 2,
0, 0,
/* radius=6 */
/* * */
/* ******* */
/* *********** */
/* *********** */
/* ************* */
/* ************* */
/* ************* */
/* *******o******* */ 0, 7, /* 18 x2 = 36 */
/* ************* */ 1, 6,
/* ************* */ 2, 6,
/* ************* */ 3, 6,
/* *********** */ 4, 5,
/* *********** */ 5, 5,
/* ******* */ 6, 3,
/* * */ 7, 0,
0, 0,
/* radius=7,8 */
/* ***** */
/* ********* */
/* *********** */
/* ************* */
/* *************** */
/* *************** */
/* ***************** */
/* ***************** */
/* ********o******** */ 0, 8, /* 27 x2 = 54 */
/* ***************** */ 1, 8,
/* ***************** */ 2, 8,
/* *************** */ 3, 7,
/* *************** */ 4, 7,
/* ************* */ 5, 6,
/* *********** */ 6, 5,
/* ********* */ 7, 4,
/* ***** */ 8, 2,
0, 0,
/* radius=9 */
/* ******* */
/* *********** */
/* ************* */
/* *************** */
/* ***************** */
/* ***************** */
/* ******************* */
/* ******************* */
/* ******************* */
/* *********o********* */ 0, 9, /* 37 x2 = 74 */
/* ******************* */ 1, 9,
/* ******************* */ 2, 9,
/* ******************* */ 3, 9,
/* ***************** */ 4, 8,
/* ***************** */ 5, 8,
/* *************** */ 6, 7,
/* ************* */ 7, 6,
/* *********** */ 8, 5,
/* ******* */ 9, 3,
0, 0 };
ploticus-2.42/src/gdfonts.c 0000644 0001750 0001750 00000135171 06736024172 014713 0 ustar colin colin
/*
This is a header file for gd font, generated using
bdftogd version 0.5 by Jan Pazdziora, adelton@fi.muni.cz
from bdf font
-misc-fixed-medium-r-semicondensed-sans-12-116-75-75-c-60-iso8859-2
at Thu Jan 8 14:13:20 1998.
No copyright info was found in the original bdf.
*/
#include "gdfonts.h"
char gdFontSmallData[] = {
/* Char 0 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 1 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
1,1,1,1,1,0,
0,1,1,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 2 */
0,0,0,0,0,0,
0,1,0,1,0,1,
1,0,1,0,1,0,
0,1,0,1,0,1,
1,0,1,0,1,0,
0,1,0,1,0,1,
1,0,1,0,1,0,
0,1,0,1,0,1,
1,0,1,0,1,0,
0,1,0,1,0,1,
1,0,1,0,1,0,
0,1,0,1,0,1,
1,0,1,0,1,0,
/* Char 3 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,1,0,0,0,
1,0,1,0,0,0,
1,1,1,0,0,0,
1,0,1,0,0,0,
1,0,1,0,0,0,
0,0,1,1,1,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,0,0,0,
/* Char 4 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,0,0,0,
1,0,0,0,0,0,
1,1,0,0,0,0,
1,0,0,0,0,0,
1,0,1,1,1,0,
0,0,1,0,0,0,
0,0,1,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
/* Char 5 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,1,1,1,0,0,
0,1,1,1,0,0,
0,1,0,0,1,0,
0,1,1,1,0,0,
0,1,0,1,0,0,
0,1,0,0,1,0,
0,0,0,0,0,0,
/* Char 6 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,0,0,0,
0,0,1,1,1,0,
0,0,1,0,0,0,
0,0,1,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
/* Char 7 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,0,0,0,
1,0,0,1,0,0,
1,0,0,1,0,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 8 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
1,1,1,1,1,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 9 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,1,0,0,1,0,
1,0,1,0,1,0,
1,0,0,1,1,0,
1,0,0,0,1,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,1,1,1,
0,0,0,0,0,0,
/* Char 10 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
/* Char 11 */
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
1,1,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 12 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
/* Char 13 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,1,1,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
/* Char 14 */
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,1,1,1,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 15 */
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
1,1,1,1,1,1,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
/* Char 16 */
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,1,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 17 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,1,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 18 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,1,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 19 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,1,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 20 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,1,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 21 */
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,1,1,1,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
/* Char 22 */
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
1,1,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
/* Char 23 */
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
1,1,1,1,1,1,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 24 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,1,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
/* Char 25 */
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
/* Char 26 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,0,0,0,1,0,
0,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 27 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,0,0,
0,1,0,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 28 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
1,0,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 29 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,1,0,
1,1,1,1,1,0,
0,0,1,0,0,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 30 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,1,0,
0,1,0,0,0,0,
1,1,1,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,1,0,
1,0,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 31 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 32 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 33 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 34 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 35 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
1,1,1,1,1,0,
0,1,0,1,0,0,
1,1,1,1,1,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 36 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,1,1,1,0,
1,0,1,0,0,0,
1,0,1,0,0,0,
0,1,1,1,0,0,
0,0,1,0,1,0,
0,0,1,0,1,0,
1,1,1,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
/* Char 37 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,0,1,0,
1,0,1,0,1,0,
0,1,0,1,0,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
0,1,0,1,0,0,
1,0,1,0,1,0,
1,0,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 38 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,0,0,0,
1,0,1,0,0,0,
1,0,1,0,0,0,
0,1,0,0,0,0,
1,0,1,0,0,0,
1,0,0,1,1,0,
1,0,0,1,0,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 39 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 40 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 41 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 42 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
1,0,1,0,1,0,
0,1,1,1,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
1,0,1,0,1,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 43 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
1,1,1,1,1,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 44 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
0,0,0,0,0,0,
/* Char 45 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 46 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,0,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 47 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 48 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 49 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,1,0,0,0,
1,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 50 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 51 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
0,0,0,0,1,0,
0,0,1,1,0,0,
0,0,0,0,1,0,
0,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 52 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,0,0,
0,0,1,1,0,0,
0,1,0,1,0,0,
1,0,0,1,0,0,
1,0,0,1,0,0,
1,1,1,1,1,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 53 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
0,0,0,0,1,0,
0,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 54 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,1,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 55 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 56 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 57 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
1,1,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 58 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,0,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,0,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 59 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,0,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
0,0,0,0,0,0,
/* Char 60 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
0,1,0,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 61 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 62 */
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,0,0,
0,1,0,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 63 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 64 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,1,1,0,0,
1,0,0,0,0,0,
0,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 65 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 66 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 67 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 68 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 69 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 70 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 71 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 72 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 73 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 74 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
1,0,0,1,0,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 75 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,0,0,
1,0,1,0,0,0,
1,1,1,0,0,0,
1,0,0,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 76 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 77 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,1,0,1,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 78 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,1,0,0,1,0,
1,1,0,0,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,0,1,1,0,
1,0,0,1,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 79 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 80 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 81 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,1,0,1,0,
0,1,1,1,0,0,
0,0,0,0,1,0,
0,0,0,0,0,0,
/* Char 82 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,0,0,
1,0,1,0,0,0,
1,0,0,1,0,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 83 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
0,1,1,0,0,0,
0,0,0,1,0,0,
0,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 84 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 85 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 86 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 87 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,1,0,1,1,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 88 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 89 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 90 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 91 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 92 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,0,1,0,
0,0,0,0,1,0,
0,0,0,0,0,0,
/* Char 93 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 94 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 95 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
/* Char 96 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 97 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,1,0,
0,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 98 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,1,1,0,0,
1,1,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,0,0,1,0,
1,0,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 99 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 100 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,1,0,
0,0,0,0,1,0,
0,1,1,0,1,0,
1,0,0,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 101 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 102 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,1,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
1,1,1,1,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 103 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,1,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
1,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
/* Char 104 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,1,1,0,0,
1,1,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 105 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,1,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 106 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
0,0,0,1,0,0,
1,0,0,1,0,0,
1,0,0,1,0,0,
0,1,1,0,0,0,
/* Char 107 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,1,0,0,
1,0,1,0,0,0,
1,1,0,0,0,0,
1,0,1,0,0,0,
1,0,0,1,0,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 108 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 109 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,0,1,0,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 110 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,1,1,0,0,
1,1,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 111 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 112 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,1,1,0,0,
1,1,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,0,0,1,0,
1,0,1,1,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
/* Char 113 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,0,1,0,
1,0,0,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,1,0,
0,0,0,0,1,0,
/* Char 114 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,1,1,0,0,
1,1,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 115 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
0,1,1,0,0,0,
0,0,0,1,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 116 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
1,1,1,1,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,1,0,
0,0,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 117 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 118 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 119 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 120 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 121 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
1,1,1,0,0,0,
/* Char 122 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 123 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
1,1,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,1,1,0,
0,0,0,0,0,0,
/* Char 124 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
/* Char 125 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,1,1,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
1,1,0,0,0,0,
0,0,0,0,0,0,
/* Char 126 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,0,1,0,
1,0,1,0,1,0,
1,0,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 127 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 128 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 129 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 130 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 131 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 132 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 133 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 134 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 135 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 136 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 137 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 138 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 139 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 140 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 141 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 142 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 143 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 144 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 145 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 146 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 147 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 148 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 149 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 150 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 151 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 152 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 153 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 154 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 155 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 156 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 157 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 158 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 159 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 160 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 161 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,1,0,0,
0,0,0,0,1,1,
/* Char 162 */
0,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 163 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,1,0,0,0,
0,1,0,0,0,0,
1,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 164 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 165 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
1,0,0,1,0,0,
1,0,1,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 166 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
0,1,1,0,0,0,
0,0,0,1,0,0,
0,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 167 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,1,0,
0,1,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,1,0,
0,1,0,0,1,0,
0,0,1,1,0,0,
0,0,0,0,1,0,
0,1,0,0,1,0,
0,0,1,1,0,0,
0,0,0,0,0,0,
/* Char 168 */
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,0,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 169 */
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
0,1,1,0,0,0,
0,0,0,1,0,0,
0,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 170 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
0,1,1,0,0,0,
0,0,0,1,0,0,
0,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
/* Char 171 */
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 172 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 173 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 174 */
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 175 */
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 176 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,1,0,0,
0,1,0,0,1,0,
0,1,0,0,1,0,
0,0,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 177 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,1,0,
0,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,1,0,0,
0,0,0,0,1,1,
/* Char 178 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,0,0,1,1,0,
/* Char 179 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,0,0,0,
0,0,1,0,0,0,
0,0,1,1,0,0,
0,0,1,0,0,0,
0,1,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 180 */
0,0,0,0,0,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 181 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,1,1,
0,1,1,0,0,1,
0,0,1,0,1,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 182 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
0,1,1,0,0,0,
0,0,0,1,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 183 */
0,0,0,0,0,0,
1,0,0,0,1,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 184 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,1,1,0,0,0,
/* Char 185 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
0,1,1,0,0,0,
0,0,0,1,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 186 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
0,1,1,0,0,0,
0,0,0,1,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
/* Char 187 */
0,0,0,0,0,0,
0,0,0,1,1,0,
0,0,0,0,1,0,
0,1,0,1,0,0,
0,1,0,0,0,0,
1,1,1,1,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,1,0,
0,0,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 188 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 189 */
0,0,0,0,0,0,
0,0,1,0,0,1,
0,1,0,0,1,0,
1,0,0,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 190 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 191 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
0,1,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 192 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,0,0,
1,0,1,0,0,0,
1,0,0,1,0,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 193 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 194 */
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 195 */
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 196 */
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 197 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 198 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 199 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,1,0,0,
0,1,1,0,0,0,
/* Char 200 */
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 201 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 202 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,1,0,0,0,
0,0,0,1,1,0,
/* Char 203 */
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 204 */
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 205 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 206 */
0,0,1,0,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 207 */
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 208 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,0,0,
0,1,0,0,1,0,
0,1,0,0,1,0,
1,1,1,0,1,0,
0,1,0,0,1,0,
0,1,0,0,1,0,
0,1,0,0,1,0,
1,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 209 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,1,0,0,1,0,
1,1,0,0,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,0,1,1,0,
1,0,0,1,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 210 */
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,1,0,0,1,0,
1,1,0,0,1,0,
1,0,1,0,1,0,
1,0,1,0,1,0,
1,0,0,1,1,0,
1,0,0,1,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 211 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 212 */
0,0,1,0,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 213 */
0,0,1,0,0,1,
0,1,0,0,1,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 214 */
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 215 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 216 */
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,0,0,
1,0,1,0,0,0,
1,0,0,1,0,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 217 */
0,0,1,0,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 218 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 219 */
0,0,1,0,0,1,
0,1,0,0,1,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 220 */
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 221 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 222 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
/* Char 223 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,1,0,0,1,0,
1,0,1,1,0,0,
1,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 224 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,0,1,1,0,0,
1,1,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 225 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,1,0,
0,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 226 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,1,0,
0,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 227 */
0,0,0,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,1,0,
0,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 228 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,0,1,0,
0,1,0,0,1,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,1,0,
0,1,1,1,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 229 */
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 230 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 231 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,1,0,0,
0,1,1,0,0,0,
/* Char 232 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 233 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 234 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,1,1,1,0,0,
0,0,1,0,0,0,
0,0,0,1,1,0,
/* Char 235 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 236 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,1,1,1,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 237 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 238 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,1,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 239 */
0,0,0,0,0,0,
0,0,0,0,1,1,
0,0,0,0,0,1,
0,0,0,1,1,0,
0,0,0,1,0,0,
0,1,0,1,0,0,
1,0,1,1,0,0,
1,0,0,1,0,0,
1,0,0,1,0,0,
1,0,0,1,0,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 240 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,1,0,
0,0,0,1,1,1,
0,0,0,0,1,0,
0,1,1,0,1,0,
1,0,0,1,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 241 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,0,1,1,0,0,
1,1,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 242 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,0,1,1,0,0,
1,1,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 243 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 244 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 245 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,0,1,0,
1,0,0,1,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 246 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
0,1,1,1,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
0,1,1,1,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 247 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,1,1,1,1,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 248 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
1,0,1,1,0,0,
1,1,0,0,1,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
1,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 249 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,1,0,1,0,0,
0,0,1,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 250 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 251 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,0,1,0,
1,0,0,1,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 252 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,1,0,0,
0,1,0,1,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
/* Char 253 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,1,1,0,
0,1,1,0,0,0,
0,0,0,0,0,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,0,1,0,
1,0,0,1,1,0,
0,1,1,0,1,0,
0,0,0,0,1,0,
0,0,0,1,0,0,
1,1,1,0,0,0,
/* Char 254 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
1,1,1,1,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,0,0,
0,1,0,0,1,0,
0,0,1,1,0,0,
0,0,0,1,0,0,
0,0,1,0,0,0,
/* Char 255 */
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,1,0,0,0,
0,0,1,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
};
gdFont gdFontSmallRep = {
256,
0,
6,
13,
gdFontSmallData
};
gdFontPtr gdFontSmall = &gdFontSmallRep;
/* This file has not been truncated. */
ploticus-2.42/src/proc_usedata.c 0000644 0001750 0001750 00000002715 10721646272 015715 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC USEDATA */
/* Note: if no attributes given, this does the same as the old 'proc originaldata' */
#include "pl.h"
int
PLP_usedata( )
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
int npop;
TDH_errprog( "pl proc usedata" );
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) );
npop = 0; /* pop: all */
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "pop" )== 0 ) {
if( strncmp( lineval, "all", 3 )==0 ) npop = 0;
else npop = itokncpy( lineval );
}
else if( strncmp( attr, "original", 8 )== 0 ) npop = 0;
else if( strcmp( attr, "fieldnames" )==0 ) definefieldnames( lineval );
else Eerr( 1, "attribute not recognized", attr );
}
PL_popdataset( npop );
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_page.c 0000644 0001750 0001750 00000021732 10741460672 015203 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC PAGE - set page-wide attributes, and do a "page" break for pp 2 and up */
#include "pl.h"
extern int PLGS_setparms(), PLGG_setimpixsize();
int
PLP_page( )
{
int lvp, first;
char attr[NAMEMAXLEN], *line, *lineval;
char buf[512], devval[20];
char *outfilename, *mapfilename, *titledet, *pagetitle, *url;
int stat, nt, align, nlines, maxlen, landscapemode, dobackground, dopagebox, pagesizegiven, clickmap_enabled_here, tight, map;
double adjx, adjy, scalex, scaley, sx, sy;
TDH_errprog( "pl proc page" );
/* initialize */
landscapemode = PLS.landscape; /* from command line */
titledet = "";
outfilename = "";
mapfilename = "";
pagetitle = "";
dobackground = 1;
dopagebox = 1;
if( GL_member( PLS.device, "gesf" )) dopagebox = 0; /* bounding box shouldn't include entire page for gif , eps */
if( PLS.device == 'e' ) dobackground = 0;
pagesizegiven = 0;
strcpy( devval, "" );
scalex = scaley = 1.0;
clickmap_enabled_here = 0;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
/* if an attribute is given on command line, it overrides anything here.. */
if( GL_slmember( attr, PLS.cmdlineparms )) continue;
if( strcmp( attr, "landscape" )==0 && GL_slmember( "portrait", PLS.cmdlineparms )) continue;
if( strcmp( attr, "outfilename" )==0 && GL_slmember( "o", PLS.cmdlineparms )) continue;
if( strcmp( attr, "landscape" )==0 ) landscapemode = getyn( lineval );
else if( strcmp( attr, "title" )==0 ) pagetitle = getmultiline( lineval, "get" );
else if( strcmp( attr, "titledetails" )==0 ) titledet = lineval;
else if( strcmp( attr, "color" )==0 ) tokncpy( Estandard_color, lineval, COLORLEN );
else if( strcmp( attr, "scale" )==0 ) {
nt = sscanf( lineval, "%lf %lf", &scalex, &scaley );
if( nt == 1 ) scaley = scalex;
}
else if( strcmp( attr, "backgroundcolor" )==0 ) {
tokncpy( Estandard_bkcolor, lineval, COLORLEN );
Ebackcolor( Estandard_bkcolor );
dobackground = 1; /* added scg 9/27/99 */
}
else if( strcmp( attr, "linewidth" )==0 ) Estandard_lwscale = ftokncpy( lineval );
else if( strcmp( attr, "textsize" )==0 ) Estandard_textsize = itokncpy( lineval );
else if( strcmp( attr, "font" )==0 ) tokncpy( Estandard_font, lineval, FONTLEN );
else if( strcmp( attr, "dobackground" )==0 ) dobackground = getyn( lineval );
else if( strcmp( attr, "dopagebox" )==0 ) dopagebox = getyn( lineval );
else if( strcmp( attr, "tightcrop" )==0 ) { tight = getyn( lineval ); Etightbb( tight ); }
else if( strncmp( attr, "crop", 4 )==0 ) {
double cropx1, cropy1, cropx2, cropy2;
nt = sscanf( lineval, "%lf %lf %lf %lf", &cropx1, &cropy1, &cropx2, &cropy2 );
if( nt != 4 ) Eerr( 2707, "usage: crop x1 y1 x2 y2 OR croprel left bottom right top", "" );
else {
if( PLS.usingcm ) { cropx1 /= 2.54; cropy1 /= 2.54; cropx2 /= 2.54; cropy2 /= 2.54; }
if( strcmp( attr, "croprel" )==0 ) Especifycrop( 2, cropx1, cropy1, cropx2, cropy2 ); /* relative to tight */
else Especifycrop( 1, cropx1, cropy1, cropx2, cropy2 ); /* absolute */
}
}
else if( strcmp( attr, "pixsize" ) ==0 ) { /* added scg 1/9/08 */
int reqwidth, reqheight;
nt = sscanf( lineval, "%d %d", &reqwidth, &reqheight );
if( nt != 2 ) Eerr( 57233, "pixsize ignored.. it requires width and height (in pixels)", "" );
#ifndef NOGD
PLGG_setimpixsize( reqwidth, reqheight );
#endif
if( PLS.device != 'g' ) Eerr( 24795, "pixsize ignored.. it's only applicable when generating png/gif/jpeg images", "" );
}
else if( strcmp( attr, "pagesize" )==0 ) {
getcoords( "pagesize", lineval, &(PLS.winw), &(PLS.winh) );
pagesizegiven = 1;
}
else if( strcmp( attr, "outfilename" )==0 ) {
outfilename = lineval;
if( strlen( outfilename ) > MAXPATH-1 ) { PLS.skipout = 1; return( Eerr( 57932, "outfilename too long", "" ) ); }
}
else if( strncmp( attr, "mapfile", 7 )==0 ) {
mapfilename = lineval;
if( strlen( mapfilename ) > MAXPATH-1 ) { Eerr( 57932, "mapfile name too long", "" ); mapfilename = ""; }
}
else if( strcmp( attr, "clickmapdefault" )==0 ) {
url = lineval;
if( strlen( url ) > MAXURL-1 ) Eerr( 57933, "clickmapdefault url too long", "" );
else clickmap_setdefaulturl( url );
}
else if( strcmp( attr, "map" )==0 ) { map = getyn( lineval ); if( map ) { PLS.clickmap = 1; clickmap_enabled_here = 1; }}
else if( strcmp( attr, "csmap" )==0 ){ map = getyn( lineval ); if( map ) { PLS.clickmap = 2; clickmap_enabled_here = 1; }}
else if( strcmp( attr, "outlabel" )==0 ) Esetoutlabel( lineval );
else Eerr( 1, "page attribute not recognized", attr );
}
/* -------------------------- */
/* Page break logic.. */
/* -------------------------- */
if( PLS.npages == 0 ) {
/* following 3 lines moved here from above - also replicated below. scg 10/31/00 */
if( scalex != 1.0 || scaley != 1.0 ) Esetglobalscale( scalex, scaley );
Egetglobalscale( &sx, &sy );
if( pagesizegiven ) Esetsize( PLS.winw * sx, PLS.winh * sy, PLS.winx, PLS.winy );
else if( landscapemode && !PLS.winsizegiven ) Esetsize( 11.0, 8.5, PLS.winx, PLS.winy ); /* landscape */
/* clickmap (must come before init for eg. svg - scg 2/7/05) */
if( clickmap_enabled_here ) {
if( mapfilename[0] == '\0' ) {
if( PLS.clickmap == 2 ) strcpy( PLS.mapfile, "stdout" ); /* csmap defaults to stdout.. scg 8/26/04 */
else if( PLS.outfile[0] != '\0' ) makeoutfilename( PLS.outfile, PLS.mapfile, 'm', 1);
else strcpy( PLS.mapfile, "unnamed.map" );
}
PL_clickmap_init();
#ifndef NOSVG
/* must update this now too.. scg 2/7/05 */
if( PLS.device == 's' ) PLGS_setparms( PLS.debug, PLS.tmpname, PLS.clickmap );
#endif
}
else if( mapfilename[0] != '\0' ) strcpy( PLS.mapfile, mapfilename ); /* PPP */
/* initialize and give specified output file name .. */
if( outfilename[0] != '\0' ) Esetoutfilename( outfilename );
stat = Einit( PLS.device );
if( stat ) { PLS.skipout = 1; return( stat ); }
/* set paper orientation */
if( landscapemode ) Epaper( 1 );
}
else if( PLS.npages > 0 ) {
if( GL_member( PLS.device, "gesf" )) {
/* finish up current page before moving on to next one.. */
Eshow();
stat = Eendoffile();
if( stat ) return( stat );
/* now set file name for next page.. */
if( outfilename[0] != '\0' ) Esetoutfilename( outfilename );
else {
makeoutfilename( PLS.outfile, buf, PLS.device, (PLS.npages)+1 );
if( PLS.debug ) fprintf( PLS.diagfp, "Setting output file name to %s\n", PLS.outfile );
Esetoutfilename( buf );
}
if( PLS.clickmap ) {
/* initialize a new click map file.. */
if( mapfilename[0] != '\0' ) strcpy( PLS.mapfile, mapfilename );
else makeoutfilename( PLS.outfile, PLS.mapfile, 'm', (PLS.npages)+1 );
PL_clickmap_init();
}
/* perhaps set global scaling and/or page size for next page.. */
/* following 3 lines copied here from above - scg 10/31/00 */
if( scalex != 1.0 || scaley != 1.0 ) Esetglobalscale( scalex, scaley );
Egetglobalscale( &sx, &sy );
if( pagesizegiven ) Esetsize( PLS.winw * sx, PLS.winh * sy, PLS.winx, PLS.winy );
else if( landscapemode && !PLS.winsizegiven ) Esetsize( 11.0, 8.5, PLS.winx, PLS.winy ); /* landscape */
/* initialize next page.. */
stat = Einit( PLS.device );
if( stat ) return( stat );
}
else if ( PLS.device == 'x' ) PL_do_x_button( "More.." );
else if ( GL_member( PLS.device, "pc" ) ) {
Eprint();
if( landscapemode ) Epaper( 1 ); /* added scg 2/29/00 */
Elinetype( 0, 0.6, 1.0 ); /* added scg 9/20/99 */
}
}
(PLS.npages)++;
/* -------------------------- */
/* now do other work.. */
/* -------------------------- */
/* do background.. */
/* if( dopagebox ) Ecblock( 0.0, 0.0, EWinx, EWiny, Ecurbkcolor, 0 ); */ /* does update bb */
if( dopagebox ) Ecblock( 0.0, 0.0, PLS.winw, PLS.winh, Ecurbkcolor, 0 ); /* does update bb */
else if( dobackground ) {
/* EPS color=transparent - best to do nothing.. */
if( PLS.device == 'e' && strcmp( Ecurbkcolor, "transparent" )==0 ) ;
else Eclr(); /* doesn't update bb */
}
if( pagetitle[0] != '\0' ) {
textdet( "titledetails", titledet, &align, &adjx, &adjy, 3, "B", 1.0 );
if( align == '?' ) align = 'C';
measuretext( pagetitle, &nlines, &maxlen );
if( align == 'L' ) Emov( 1.0 + adjx, (PLS.winh-0.8) + adjy );
else if ( align == 'C' ) Emov( (PLS.winw / 2.0 ) + adjx, (PLS.winh-0.8) + adjy );
else if( align == 'R' ) Emov( (PLS.winw-1.0) + adjx, (PLS.winh-0.8) + adjy );
Edotext( pagetitle, align );
}
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/times.c 0000644 0001750 0001750 00000024016 11177575147 014373 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* TIMES.C - time arithmetic and format conversion library */
#include
#include
#include
extern int TDH_err(), GL_systime(), DT_maketime();
/* Compile flag NO_DT may be used to disable all date/time functionality.
standard units = (double) minutes since 0:00:00.0
--seconds are expressed as decimal portion of 1 minute
input formats for which arithmetic is supported:
format input output
HHMM hh:mm or hh:mm:ss (output is hh:mm)
HHMMSS hh:mm or hh:mm:ss (output is hh:mm:ss)
MMSS mm:ss (output is mm:ss)
output formats: hh:mm hh:mma hh:mm:ss hh:mm:ssa mm:ss
(a=use am/pm notation; A yeilds capitals e.g. AM or PM)
For any arithmetic or output format, the decimal format of the seconds
component can be controlled by using a printf double format spec instead
of 'ss'. For example: hh:mm:%02.2f
To get current time in minutes past midnight, use tomin( "now", &sec );
To get current time in current format use frommin( -1.0, result );
*/
#ifndef NO_DT
#define HHMM 0
#define MMSS 1
#define HHMMSS 2
#define stricmp(s,t) strcasecmp(s,t)
#define strnicmp(s,t,u) strncasecmp(s,t,u)
#define err(a,b,c) TDH_err(a,b,c)
#define NUMBER 0
#define ALPHA 1
static int format = HHMM;
static int Hr = 0, Min = 0;
static double Sec = 0.0;
static char Dispfmt[30] = "%d:%02d";
static char Curfmt[30] = "hh:mm";
static int Nodaylimit = 0;
#endif
double atof();
/* ============================= */
int
DT_time_initstatic()
{
Hr = 0; Min = 0; Sec = 0.0;
strcpy( Dispfmt, "%d:%02d" );
strcpy( Curfmt, "hh:mm" );
return( 0 );
}
/* ============================= */
/* SETTIMEFMT - set the "current time format" */
int
DT_settimefmt( fmt )
char *fmt;
{
#ifdef NO_DT
return( err( 7950, "date/time support not included in this build", "" ));
}
#else
/* hhh = hours not limited to one day, eg. 32:00 or 122:44 would be valid - scg 6/18/03 */
if( strncmp( fmt, "hhh", 3 )==0 ) {
Nodaylimit = 1;
strcpy( fmt, &fmt[1] );
}
if( stricmp( fmt, "hh:mm" )==0 ) {
strcpy( Dispfmt, "%d:%02d" );
format = HHMM;
}
else if( strnicmp( fmt, "mm:", 3 )==0 ) {
format = MMSS;
if( fmt[3] == 's' ) strcpy( Dispfmt, "%d:%02g" ); /* added 3/3/02 */
else sprintf( Dispfmt, "%%d:%s", &fmt[3] ); /* added 3/3/02 */
}
else if( strnicmp( fmt, "hh:mm:", 6 )==0 ) {
format = HHMMSS;
if( fmt[6] == 's' ) strcpy( Dispfmt, "%d:%02d:%02g" ); /* added 3/3/02 */
else sprintf( Dispfmt, "%%d:%%02d:%s", &fmt[6] ); /* added 3/3/02 */
}
else return( -1 );
strcpy( Curfmt, fmt );
return( 0 );
}
/* ============================= */
/* TOMIN - take a time in the "current format" and return # minutes since 00:00:00 */
/* Return 0 on valid input; return non-zero on invalid input */
int
DT_tomin( s, result )
char *s; /* time */
double *result; /* returned */
{
int i;
char t[128];
int nt;
int tlen;
if( stricmp( s, "now" )==0 ) {
GL_systime( &Hr, &Min, &i );
Sec = (double)i;
DT_maketime( Hr, Min, Sec, t );
}
else strcpy( t, s );
/* validate t */
tlen = strlen( t );
if( !isdigit( (int) t[0]) || !isdigit( (int) t[tlen-1]) /* || !isdigit( (int) t[tlen-2]) */ ) /* relaxed 7/17/01 */
{ *result = 0.0; return( 1 ); }
if( format == HHMM || format == HHMMSS ) {
if( tlen < 3 ) { *result = 0.0; return( 2 ); } /* sanity check */
Sec = 0.0;
nt = sscanf( t, "%d:%d:%lf", &Hr, &Min, &Sec );
if( nt == 2 ) *result = (Hr * 60.0) + Min;
else if( nt == 3 ) *result = (Hr * 60.0) + Min + (Sec/60.0);
else { *result = 0.0; return( 3 ); } /* error */
if( Hr < 0 || Min > 59 || Min < 0 || Sec >= 60.0 || Sec < 0.0 ) return( 5 ); /* scg 6/18/03 */
if( !Nodaylimit && ( Hr > 24 || ( Hr == 24 && Min != 0 ))) return( 5 ); /* scg 6/18/03 */
return( 0 );
}
else if( format == MMSS ) {
if( strlen( s ) < 4 ) { *result = 0.0; return( 4 ); } /* sanity check */
nt = sscanf( s, "%d:%lf", &Min, &Sec );
if( nt != 2 ) { *result = 0.0; return( 6 ); } /* error */
if( Min > 59 || Min < 0 || Sec >= 60.0 || Sec < 0.0 ) return( 7 );
*result = Min + (Sec/60.0);
}
return( 0 );
}
/* ============================ */
/* FROMMIN - take # minutes since 00:00:00 and return time string in current format */
int
DT_frommin( s, result )
double s; /* sec may be < 0 for "now" */
char *result;
{
int i;
if( s < 0.0 ) {
GL_systime( &Hr, &Min, &i );
Sec = (double)i;
}
else {
Hr = (int)(s/60.0);
Min = ((int)(s)-(Hr*60));
/* Sec = s - (double)((Hr*60) + (Min)); */ /* fixed scg 3/1/02 */
Sec = (s - (double)((Hr*60) + (Min))) * 60.0;
if( Sec < 0.0000001 ) Sec = 0.0; /* adjust for rounding error */
}
if( !Nodaylimit && Hr == 24 && Min == 0 && Sec == 0 ) Hr = 0; /* scg 9/29/03 */
DT_maketime( Hr, Min, Sec, result );
return( 0 );
}
/* ============================= */
/* GETHMS - get hour, min, sec components of most recent time
processed by tomin() for frommin() */
int
DT_gethms( hour, min, sec )
int *hour, *min;
double *sec;
{
*hour = Hr;
*min = Min;
*sec = Sec;
return( 0 );
}
/* ============================= */
/* MAKETIME - given h m s, build time string using current format. */
int
DT_maketime( hr, min, sec, result )
int hr, min;
double sec;
char *result;
{
if( format == HHMM ) sprintf( result, Dispfmt, hr, min );
else if( format == MMSS ) sprintf( result, Dispfmt, min, sec );
else if( format == HHMMSS ) sprintf( result, Dispfmt, hr, min, sec );
return( 0 );
}
/* ============================== */
/* take time in current format and convert to outformat */
int
DT_formattime( s, outformat, result )
char *s, *outformat, *result;
{
char oldformat[30];
double min;
char c;
char ampm[4];
char fmt[40];
int i;
strcpy( fmt, outformat );
DT_tomin( s, &min );
/* in case we do am/pm */
strcpy( ampm, "" );
c = fmt[ strlen( fmt ) - 1];
if( c == 'a' || c == 'A' ) {
if( Hr == 12 && Min == 0 ) strcpy( ampm, "N" ); /* scg 2/27/02 */
else if( Hr >= 12 && Hr < 24 ) strcpy( ampm, "PM" ); /* added < 24 scg 2/27/02 */
else strcpy( ampm, "AM" );
if( c == 'a' ) for( i = 0; ampm[i] != '\0'; i++ ) ampm[i] = tolower(ampm[i]);
fmt[ strlen( fmt ) - 1 ] = '\0';
if( Hr > 12 ) {
min -= 720.0;
Hr -= 12;
}
}
if( stricmp( fmt, "hh" )==0 ) sprintf( result, "%02d", Hr );
else if( stricmp( fmt, "h" )==0 ) sprintf( result, "%0d", Hr );
else if( stricmp( fmt, "mm" )==0 ) sprintf( result, "%02d", Min );
else if( stricmp( fmt, "m" )==0 ) sprintf( result, "%d", Min );
else if( stricmp( fmt, "ss" )==0 ) sprintf( result, "%g", Sec );
else if( fmt[0] == '%' ) sprintf( result, fmt, Sec );
else {
strcpy( oldformat, Curfmt ); /* scg 3/3/02 */
DT_settimefmt( fmt );
DT_frommin( min, result );
DT_settimefmt( oldformat ); /* scg 3/3/02 */
/* format = oldformat; */
}
if( ampm[0] != '\0' ) {
if( result[0] == '0' && result[1] != ':' ) sprintf( result, "%s%s", &result[1], ampm );
else strcat( result, ampm );
}
return( 0 );
}
/* =============================== */
/* TIMEDIFF - find difference between two times */
int
DT_timediff( s1, s2, diff )
char *s1, *s2;
double *diff; /* s1-s2 difference in minutes */
{
double min1, min2;
DT_tomin( s1, &min1 );
DT_tomin( s2, &min2 );
*diff = min1 - min2;
return( 0 );
}
#endif
/* =============================== */
/* TIMEFUNCTIONS - script entry point for time functions.
Return 0 if function found and executed normally.
Return 1 on error.
Return 2 if function not found here.
*/
int
DT_timefunctions( hash, name, arg, nargs, result, typ )
int hash;
char *name;
char *arg[];
int nargs;
char *result;
int *typ;
{
int stat;
#ifdef NO_DT
return( err( 198, "time functions not supported in this build", "" ));
}
#else
*typ = ALPHA;
if( hash == 400 ) { /* $tomin(t) take t (a value in the current time notation). Result is the equivalent,
expressed in # of minutes since 0:00:00. Result is float,
with any seconds expressed as the decimal portion of a minute. */
double f;
stat = DT_tomin( arg[0], &f );
sprintf( result, "%g", f );
*typ = NUMBER;
return( 0 );
}
if( hash == 1348 ) { /* $formattime() */
stat = DT_formattime( arg[0], arg[1], result );
if( stat != 0 ) { err( 1697, "$formattime failed", arg[1] ); return( 1 ); }
return( 0 );
}
if( hash == 1002 ) { /* $timevalid() */
double x;
stat = DT_tomin( arg[0], &x );
if( stat == 0 ) sprintf( result, "1" );
else sprintf( result, "0" );
*typ = NUMBER;
return( 0 );
}
if( hash == 706 ) { /* $frommin(m) inverse of $tomin(), where m is a float minutes value.
* Result is equivalent time in current notation. */
stat = DT_frommin( atof( arg[0] ), result );
return( 0 );
}
if( hash == 753 ) { /* $timediff(t1,t2) - find the difference between two times (both in
* current notation). Result is expressed in float minutes (any
* seconds expressed as fraction of a minute) */
double diff;
DT_timediff( arg[0], arg[1], &diff );
sprintf( result, "%g", diff );
*typ = NUMBER;
return( 0 );
}
if( hash == 1397 ) { /* $settimefmt(fmt) - set the "time format" currently being used */
stat = DT_settimefmt( arg[0] );
if( stat != 0 ) {
err( 1614, "$settimefmt - invalid format", arg[0] );
return( 1 );
}
strcpy( result, "0" );
*typ = NUMBER;
return( 0 );
}
if( hash == 262 ) { /* $time() - result is current time in hh:mm:ss format */
int hr, min, sec;
GL_systime( &hr, &min, &sec );
sprintf( result, "%02d:%02d:%02d", hr, min, sec );
return( 0 );
}
if( hash == 621 ) { /* $timesec() - return number of seconds since midnight for current time */
int hr, min, sec;
GL_systime( &hr, &min, &sec );
sprintf( result, "%ld", (((hr*(long)60) + min)*(long)60) + sec );
*typ = NUMBER;
return( 0 );
}
return( err( 198, "unrecognized function", name ) );
}
#endif
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/Makefile_orig 0000644 0001750 0001750 00000022721 11341534300 015542 0 ustar colin colin ######## PLOTICUS version 2.41 Copyright 1998-2009 Stephen C. Grubb http://ploticus.sourceforge.net
########
######## Use this Makefile to build pl executable or libploticus. Root permission is not required.
######## Configure the 3 settings below then do: make clean; make
######## Default settings should be ready to go for most linux platforms.
######## Problem reports and questions may be sent to ploticus@yahoogroups.com
# defaults..
CC = gcc
PLATFORM = UNIX
RMCOM = rm -f
NOX11 = -DNOX11
NOSWF = -DNOSWF
EXE = pl
####################################################################
########## Setting 1:
########## What do you wish to build? pl executable? libploticus?
########## Select ONE option below by activating the appropriate lines...
########## All other lines should be commented out.
####################################################################
############ Option 1: build the pl executable (unix), no X11 ....
# NOX11 = -DNOX11
############ Option 2: build the pl executable (unix), with X11 enabled ....
NOX11 =
XOBJ = x11.o interact.o
############ ...AND... activate the lines below for your platform... (X11 libs & header files)
#### linux
# XLIBS = -L/usr/X11R6/lib -lX11
# XINCLUDEDIR = -I/usr/X11R6/include
#### alt linux
# XLIBS = -lX11
# XINCLUDEDIR = -I/usr/include/X11
#### 64bit linux
# XLIBS = -L/usr/X11R6/lib64 -lX11
#### solaris
XLIBS = -L/usr/openwin/lib -lX11
XINCLUDEDIR = -I/usr/openwin/include
#### mac osx
# CC = cc -arch ppc -arch i386
# XLIBS = -L/usr/X11R6/lib -lX11
# XINCLUDEDIR = -I/usr/X11R6/include
#### cygwin
# XLIBS = -L/usr/X11R6/lib -lX11
# XINCLUDEDIR = -I/usr/X11R6/include
# PLATFORM = WIN32
############ Option 3: build pl executable (native win32 pl.exe)
# PLATFORM = WIN32
# RMCOM = del
############ Option 4: build static libploticus (unix) with PNG support (remember to also select PNG in Setting 2)
# LIBEXT = a
# ARCOM = ar r
# target: libploticus-static
#### and if you want X11 enabled uncomment the following line..
# XOBJ = x11.o interact.o
############ Option 5: build shared libploticus (unix)
############ Note: untested by me ... suggestions welcome -sg
# LIBEXT = a
# FPIC = -fPIC
# SONAME = libploticus.so.0
# SHAREFLAG = -shared -Wl,-soname,$(SONAME)
# target: libploticus-so
############################################################################
######### Setting 2:
######### Ploticus uses the GD library to create PNG, GIF, JPEG images.
######### This distribution includes GD13 (GIF), and GD16 (PNG) code.
######### You can choose to use one of these or you can choose to use your
######### own GD version, or you can choose to not use GD at all.
############################################################################
########### Option 1: use bundled GD16 (PNG only). Requires libpng and zlib.
# exetarget: plpng
## #GD16LIBS = -lpng -lz
## #GD16H =
# ZFLAG = -DWZ
# GD16LIBS = /home/scg/lib/libpng.a /home/scg/lib/libz.a
# GD16H = -I/home/scg/lib
########### Option 2: use bundled GD13 (GIF only). No additional lib dependencies.
exetarget: pl
########### Option 3: use your own GD resource. Requires GD 1.84+, libpng, zlib, libjpeg
# exetarget: plgd18
# GD18LIBS = -lgd -lpng -lz -ljpeg
# GD18H =
# GDFREETYPE =
# ZFLAG = -DWZ
########### Option 4: use your own GD resource with FreeType2 fonts enabled.
########### Requires GD 1.84+, libpng, zlib, libjpeg and libfreetype
# exetarget: plgd18
# GD18LIBS = -lgd -lpng -lz -ljpeg -lfreetype
# GD18H =
# GDFREETYPE = -DGDFREETYPE
# ZFLAG = -DWZ
########### Option 5: don't use GD at all.
# exetarget: plnogd
# NOGD = -DNOGD
################################################################
######## Third question.
######## Other various settings you may want to make.
################################################################
#### For SWF (flash) output capability activate the following. If necessary change -lming to location of ming.
#### Note, successful with ming 0.2a but not with later ming versions..
# MING = -lming
#optional for non-standard location: MINGH = -I/home/scg/lib
#### To set a hard-coded directory for prefabs files, edit the PREFABS_DIR define in pl.h before doing the build.
#### If the installer does this, users won't be required to have PLOTICUS_PREFABS environment variable defined.
#### If you do a "make install", where do you want the executable(s) to be moved to?
INSTALLBIN = /usr/local/bin
#### For LOCALE support (non-roman alphabets & collation), uncomment the following..
# LOCALEOBJ = localef.o
# LOCALE_FLAG = -DLOCALE
#### SVG output is always available by default.
#### If you want compressed SVG (.svgz), and you selected GD13 or no GD above,
#### uncomment the following. You need to have zlib. If necessary change -lz to location of zlib.
# ZLIB = -lz
# ZFLAG = -DWZ
#### To completely remove PostScript / EPS output capability, uncomment the following..
# NOPS = -DNOPS
#### To completely remove SVG output capability, uncomment the following..
# NOSVG = -DNOSVG
#### To see all possible compiler warnings, uncomment the following line..
WALL = -Wall
###############################################################################
######## Done. Now save this file and type: make clean; make ###########
######## ###########
###############################################################################
######## FYI... additional Makefile statement examples:
######## eg: GD16LIBS = /home/scg/lib/libpng.a /home/scg/lib/libz.a
######## eg: GD16H = -I/home/scg/lib
######## GD18LIBS = -L /home/scg/lib -lgd -lpng -lz -ljpeg -lfreetype
######## GD18H = -I/home/scg/lib/freetype-2.0.4/include -I/home/scg/lib/gd-1.8.4
######## eg: GD18H = -I/home/scg/lib/gd-1.8.4 -I/home/scg/lib/jpeg-6b -I/home/scg/lib -I/home/scg/lib/freetype-2.0.4/include
######## eg: MINGH = -I/home/scg/lib
######## eg: MING = /home/scg/lib/libming.a
###############################################################################
###############################################################################
###############################################################################
###############################################################################
GD13 = grgd13.o devstuff13.o gd13.o
GD16 = grgd16.o devstuff16.o gd16.o gd_io.o gd_io_dp.o gd_io_file.o gd_png.o
GD = gdfontg.o gdfontl.o gdfontmb.o gdfonts.o gdfontt.o
LIBS = $(XLIBS) -lm $(ADDLIBS)
CFLAGS = $(FPIC) $(WALL) -DPLOTICUS -D$(PLATFORM) -DTDH_NOREC $(ZFLAG) $(LOCALE_FLAG) \
$(NOGD) $(NOX11) $(NOPS) $(NOSVG) $(NOSWF) $(XINCLUDEDIR) $(MINGH)
OBJ = proc_annotate.o proc_areadef.o proc_axis.o proc_bars.o proc_rect.o proc_breakaxis.o \
proc_categories.o proc_curvefit.o proc_settings.o proc_drawcommands.o \
proc_getdata.o proc_image.o proc_legend.o proc_legendentry.o proc_line.o proc_lineplot.o \
proc_page.o proc_pie.o proc_print.o proc_boxplot.o proc_rangesweep.o proc_usedata.o proc_pvalue.o \
proc_scatterplot.o proc_vector.o proc_symbol.o proc_processdata.o proc_tabulate.o proc_venndisk.o clickmap.o proc_tree.o proc_catlines.o \
plhead.o execscriptfile.o execline.o lib.o details.o parse.o units.o preliminaries.o \
process_arg.o plvalue_subst.o cats.o fieldnames.o autorange.o nearest.o select.o datasets.o \
color.o plg.o init.o arrow.o mark.o block.o pcode.o ps.o svg.o swf.o stub.o winscale.o lineclip.o smoothfit.o ttest.o \
condex.o dates.o dbinterface.o err.o functions.o glroutines.o reslimits.o secondaryops.o \
shell.o sinterp.o tdhkit.o times.o value.o value_subst.o variable.o custom.o \
$(LOCALEOBJ)
# pl with gif support
pl: pl.o $(OBJ) $(XOBJ) gd00files gd13files
$(CC) pl.o $(OBJ) $(GD13) $(GD) $(XOBJ) $(LIBS) $(ZLIB) $(MING) -o $(EXE)
# pl with png support
plpng: pl.o $(OBJ) $(XOBJ) gd00files gd16files
$(CC) pl.o $(OBJ) $(GD16) $(GD) $(XOBJ) $(GD16LIBS) $(LIBS) $(MING) -o $(EXE)
# pl with jpeg support (user must supply gd 1.8+)
plgd18: pl.o $(OBJ) $(XOBJ) gd18files
$(CC) pl.o grgd.o devstuff.o $(OBJ) $(XOBJ) $(GD18LIBS) $(LIBS) $(MING) -o $(EXE)
# pl with no GD support
plnogd: pl.o $(OBJ) $(XOBJ) nogdfiles
$(CC) pl.o devstuff.o $(OBJ) $(XOBJ) $(LIBS) $(ZLIB) $(MING) -o $(EXE)
# libploticus.a with png
libploticus-static: $(OBJ) $(XOBJ) api.o gd00files gd16files
$(RMCOM) libploticus.$(LIBEXT)
$(ARCOM) libploticus.$(LIBEXT) $(OBJ) $(XOBJ) api.o $(GD16) $(GD)
# this one needs work... suggestions welcome
libploticus-so: $(OBJ) $(GDOBJ)
$(RMCOM) libploticus.$(LIBEXT)
$(CC) $(SHAREFLAG) -o libploticus.$(LIBEXT) $(OBJ) $(GDOBJ)
gd00files:
$(CC) $(FPIC) -I./gd13 -I./ -c gdfontg.c gdfontl.c gdfontmb.c gdfonts.c gdfontt.c
echo "done with gd00files" > gd00files
gd13files:
$(CC) -c $(WALL) grgd.c -DGD13 -DPLOTICUS -I./gd13 -o grgd13.o
$(CC) -c $(CFLAGS) devstuff.c -DGD13 -o devstuff13.o
$(CC) -c gd13.c -I./gd13
echo "done with gd13files" > gd13files
gd16files:
$(CC) -c $(WALL) $(FPIC) grgd.c -DGD16 -DPLOTICUS -I./ -I./gd16 -o grgd16.o
$(CC) -c $(CFLAGS) $(FPIC) devstuff.c -DGD16 -o devstuff16.o
$(CC) -c $(FPIC) -I./gd16 -I./ $(GD16H) gd16.c gd_io.c gd_io_dp.c gd_io_file.c gd_png.c
echo "done with gd16files" > gd16files
gd18files:
$(CC) -c grgd.c devstuff.c -DGD18 $(GDFREETYPE) $(GD18H) $(CFLAGS)
nogdfiles:
$(CC) -c devstuff.c $(CFLAGS)
devgrgd:
$(CC) -c $(WALL) grgd.c -DGD13 -DPLOTICUS -I./gd13 -o grgd13.o
touch pcode.c
make
install:
cp $(EXE) $(INSTALLBIN)
clean:
$(RMCOM) *.o gd??files
distclean: clean
$(RMCOM) $(EXE)
########
######## PLOTICUS Copyright 1998-2009 Stephen C. Grubb http://ploticus.sourceforge.net
########
ploticus-2.42/src/stub.c 0000644 0001750 0001750 00000024052 12144512006 014203 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* Low level elib drawing stub subroutines.. */
/* not to be confused with axis "stubs".. which are a completely different thing */
#include
#include "plg.h"
extern int GL_getseg(), GL_member();
static int doing_sup = 0; /* 1 if superscript/subscript enabled */
static double textslantparm = 0.3; /* how much to move vertically for every 1.0 horizontal */
/* ======================================== */
int
PLG_stub_initstatic()
{
doing_sup = 0;
textslantparm = 0.3;
return( 0 );
}
/* ======================================== */
/* CLR - clear the display */
int
PLG_clr()
{
double atof();
Epcode( 'z', 0.0, 0.0, Ecurbkcolor );
return(0);
}
/* ======================================== */
/* MOV - move to x, y absolute */
int
PLG_mov( x , y )
double x, y;
{
if( Eflip ) Epcode( 'M', (double)y , (double)x, "" );
else Epcode( 'M', (double)x , (double)y, "" );
return(0);
}
/* ======================================== */
/* LIN - line to x, y absolute */
int
PLG_lin( x , y )
double x, y;
{
if( Eflip ) Epcode( 'L', (double)y , (double)x, "" );
else Epcode( 'L', (double)x , (double)y, "" );
return(0);
}
/* ======================================== */
/* PATH - path to x, y absolute (form a polygon to be shaded later) */
int
PLG_path( x, y )
double x, y;
{
if( Eflip ) Epcode( 'P', (double)y , (double)x, "" );
else Epcode( 'P', (double)x , (double)y, "" );
return(0);
}
/* ======================================== */
/* DOTEXT - handle multi-line text. */
int
PLG_dotext( s, op )
char *s;
char op;
{
int i, slen;
char chunk[256], chunk2[256], supchunk[256], subchunk[256];
double x, y;
int j, k, insup, insub, supfound, subfound;
double ofs;
double a, b;
x = Ex1; y = Ey1;
/* convert op */
if( tolower(op) == 'l' ) op = 'T';
else if( tolower(op) == 'r' ) op = 'J';
else op = toupper(op);
if( !GL_member( op, "TCJDU" ) ) op = 'C';
slen = strlen( s );
for( i = 0; ; ) {
GL_getseg( chunk, s, &i, "\n" );
/* superscripts and subscripts - limited implementation - scg 8/23/04 */
supfound = 0; subfound = 0;
if( doing_sup ) for( j = 0; chunk[j] != '\0'; j++ ) {
if( chunk[j] == '^' ) supfound++;
else if( chunk[j] == '`' ) subfound++;
}
if( (supfound > 0 && supfound % 2 == 0) || (subfound > 0 && subfound % 2 == 0 )) {
for( j = 0, insup = 0, insub = 0, k = 0; chunk[j] != '\0'; j++ ) {
if( !insup && chunk[j] == '^' ) { insup = 1; continue; }
else if( insup && chunk[j] == '^' ) { insup = 0; continue; }
else if( insup ) { chunk2[k] = ' '; supchunk[k] = chunk[j]; subchunk[k] = ' '; k++; }
else if( !insub && chunk[j] == '`' ) { insub = 1; continue; }
else if( insub && chunk[j] == '`' ) { insub = 0; continue; }
else if( insub ) { chunk2[k] = ' '; subchunk[k] = chunk[j]; supchunk[k] = ' '; k++; }
else { chunk2[k] = chunk[j]; supchunk[k] = ' '; subchunk[k] = ' '; k++; }
}
chunk2[k] = '\0'; supchunk[k] = '\0'; subchunk[k] = '\0';
Epcode( op, 0.0, 0.0, chunk2 ); /* do regular portion of string */
if( supfound ) {
ofs = Ecurtextheight * 0.3;
/* if( Ecurtextdirection == 0 ) Emov( x, y+ofs );
* else if( Ecurtextdirection == 90 ) Emov( x-ofs, y );
* else if( Ecurtextdirection == 270 ) Emov( x+ofs, y );
***** changed - didn't work w/ Eflip scg 8/5/05 */
if( Ecurtextdirection == 0 ) { a = x; b = y+ofs; }
else if( Ecurtextdirection == 90 ) { a = x-ofs; b = y; }
else if( Ecurtextdirection == 270 ) { a = x+ofs; b = y; }
if( Eflip ) Emov( b, a );
else Emov( a, b );
Epcode( op, 0.0, 0.0, supchunk ); /* overlay the superscript - same pt size */
}
if( subfound ) {
ofs = Ecurtextheight * 0.3;
/* if( Ecurtextdirection == 0 ) Emov( x, y-ofs );
* else if( Ecurtextdirection == 90 ) Emov( x+ofs, y );
* else if( Ecurtextdirection == 270 ) Emov( x-ofs, y );
***** changed - didn't work w/ Eflip scg 8/5/05 */
if( Ecurtextdirection == 0 ) { a = x; b = y-ofs; }
else if( Ecurtextdirection == 90 ) { a = x+ofs; b = y; }
else if( Ecurtextdirection == 270 ) { a = x-ofs; b = y; }
if( Eflip ) Emov( b, a );
else Emov( a, b );
Epcode( op, 0.0, 0.0, subchunk ); /* overlay the subscript - same pt size */
}
}
else if( op == 'D' || op == 'U' ) { /* diagonal text (D=left-justified U=right justified)- added scg 8/8/07 */
double xx, yy, xofs, yofs;
int len;
char tc[5];
xofs = Ecurtextwidth;
yofs = Ecurtextheight * textslantparm;
if( op == 'D' ) xx = x + 0.03;
else if( op == 'U' ) xx = x;
yy = y + 0.09;
len = strlen( chunk );
for( j = 0; j < len; j++ ) {
if( op == 'U' ) k = (len-j)-1;
else k = j;
sprintf( tc, "%c", chunk[k] );
if( Eflip ) Emov( yy, xx );
else Emov( xx, yy );
Epcode( 'C', 0.0, 0.0, tc );
if( op == 'D' ) xx += xofs;
else xx -= xofs;
yy -= yofs;
}
}
else Epcode( op, 0.0, 0.0, chunk );
if( i >= slen ) break;
/* position for next line */
if( Ecurtextdirection == 0 ) y -= Ecurtextheight;
else if( Ecurtextdirection == 90 ) x += Ecurtextheight;
else if( Ecurtextdirection == 270 ) x -= Ecurtextheight;
if( Eflip ) Emov( y, x );
else Emov( x, y );
}
return(0);
}
/* ======================================== */
/* TEXTSUPMODE - set doing_sup .. */
int
PLG_textsupmode( mode )
int mode;
{
doing_sup = mode;
return( 0 );
}
/* ======================================== */
/* TEXTSLANT - set textslantparm .. */
int
PLG_textslant( val )
double val;
{
textslantparm = val;
return( 0 );
}
/* ======================================== */
/* FONT - Set font to s. If s is "" use standard font. */
int
PLG_font( s )
char *s;
{
if( strlen( s ) < 1 ) {
Epcode( 'F', 0.0, 0.0, Estandard_font );
strcpy( Ecurfont, Estandard_font );
}
else if( strcmp( s, Ecurfont )!= 0 ) {
Epcode( 'F', 0.0, 0.0, s );
strcpy( Ecurfont, s );
}
return(0);
}
/* ======================================== */
/* TEXTSIZE - Set textsize to x. If x is 0 use standard textsize.
In any case, the size is scaled by the standard text scaling factor. */
int
PLG_textsize( x )
int x;
{
double p;
/* scale text */
if( x == 0 ) p = Estandard_textsize;
else p = (double)x * (double)(Estandard_textsize/10.0);
Ecurtextheight = (p+2.0)/72.0; /* moved up here scg 8/10/05 so textdet() can reliably alter curtextheight */
if( (int)p != Ecurtextsize ) {
Epcode( 'I', p, 0.0, "" );
Ecurtextsize = (int)p;
/* Ecurtextheight = (p+2.0)/72.0; */
if( p >= 14 ) Ecurtextheight = p / 72.0;
if( Edev == 'g' && Ecurfont[0] == '\0' ) { /* "ascii" does not use preset sizes */
/* get exact dimensions of one of the 5 gif text sizes available .. */
if( p <= 6 ) { Ecurtextwidth = 0.05; Ecurtextheight = 9 / 72.0; } /* 7 */
else if( p >= 7 && p <= 9 )
{ Ecurtextwidth = 0.06; Ecurtextheight = 12 / 72.0; } /* 10 */
else if( p >= 10 && p <= 12 )
{ Ecurtextwidth = 0.07; Ecurtextheight = 14 / 72.0; } /* 12 */
else if( p >= 13 && p <= 15 )
{ Ecurtextwidth = 0.08; Ecurtextheight = 17 / 72.0; } /* 15 */
else if( p >= 15 ) { Ecurtextwidth = 0.09; Ecurtextheight = 20 / 72.0; }
}
else if( Edev != 'x' ) Ecurtextwidth = Ecurtextheight * 0.4;
}
return(0);
}
/* ======================================== */
int
PLG_textdir( x )
int x;
{
if( x != Ecurtextdirection ) {
Epcode( 'D', (double)x , 0.0, "" );
Ecurtextdirection = x ;
}
return(0);
}
/* ======================================== */
int
PLG_paper( x )
int x;
{
Epcode( 'O', (double)x , 0.0, "" );
Ecurpaper = x;
return(0);
}
/* ======================================== */
/* LINETYPE - Set line parameters. If linewidth is 0 use standard linescale.
If pattern density is 0 use standard linescale. */
int
PLG_linetype( pattern, linewidth, pat_dens )
int pattern;
double linewidth, pat_dens;
{
char buf[12];
/* scale linewidth */
if( linewidth == 0.0 ) linewidth = Estandard_lwscale;
else linewidth = linewidth * Estandard_lwscale;
if( pat_dens == 0.0 ) pat_dens = Estandard_lwscale;
if( linewidth != Ecurlinewidth ||
pattern != Ecurlinetype ||
pat_dens != Ecurpatternfactor ) {
sprintf( buf, "%d", pattern );
Epcode( 'Y', linewidth, pat_dens, buf );
Ecurlinewidth = linewidth / Estandard_lwscale; /* Estandard_lwscale added scg 4/20/07 */
Ecurlinetype = pattern;
Ecurpatternfactor = pat_dens;
}
return(0);
}
/* ======================================== */
int
PLG_normline()
{
Epcode( 'Y', Estandard_lwscale, 1.0, "0" );
Ecurlinewidth = Estandard_lwscale;
Ecurlinetype = 0;
Ecurpatternfactor = 1;
return(0);
}
/* ======================================== */
/* set current color for lines and text to s. If s is "", use
standard color. */
int
PLG_color( s )
char *s;
{
if( s[0] == '\0' ) strcpy( Ecurcolor, Estandard_color );
Epcode( 'r', 0.0, 0.0, s );
return(0);
}
/* ======================================== */
/* set background color.
If background color is "" use standard background color. */
int
PLG_backcolor( color )
char *color;
{
if( color[0] != '\0' )strcpy( Ecurbkcolor, color );
else strcpy( Ecurbkcolor, Estandard_bkcolor );
return(0);
}
/* ======================================== */
/* fill currently defined rectangle/polygon with color c */
int
PLG_colorfill( c )
char *c;
{
char oldcolor[30];
/* strcpy( oldcolor, Ecurcolor ); */
strcpy( oldcolor, Enextcolor ); /* changed scg 3/15/06 */
Ecolor( c );
Efill();
Ecolor( oldcolor ); /* go back to color as it existed before.. */
return(0);
}
#ifdef SUSPENDED
/* ======================================== */
/* (Old) do shading, within the previously defined polygon path.. the shade can be 0 to 1 */
PLG_shade( s )
double s;
{
char str[20];
sprintf( str, "%g", s );
Ecolorfill( str );
return( 0 )
}
#endif
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/gdfonts.h 0000644 0001750 0001750 00000000577 06736024172 014721 0 ustar colin colin
#ifndef _GDFONTS_H_
#define _GDFONTS_H_ 1
/*
This is a header file for gd font, generated using
bdftogd version 0.5 by Jan Pazdziora, adelton@fi.muni.cz
from bdf font
-misc-fixed-medium-r-semicondensed-sans-12-116-75-75-c-60-iso8859-2
at Thu Jan 8 14:13:20 1998.
No copyright info was found in the original bdf.
*/
#include "gd.h"
extern gdFontPtr gdFontSmall;
#endif
ploticus-2.42/src/libploticus.h 0000644 0001750 0001750 00000001010 10623041251 015550 0 ustar colin colin /* libploticus.h
* Copyright 1998-2007 Stephen C. Grubb (ploticus.sourceforge.net)
* and Colin Tuckley.
* This code is covered under the GNU General Public License (GPL);
* see the file ./Copyright for details. */
#ifndef LIBPLOTICUS
#define LIBPLOTICUS 1
/* function defines.. */
int ploticus_init( char *device, char *outfilename );
int ploticus_arg( char *name, char *value );
int ploticus_execline( char *line );
int ploticus_execscript( char *scriptfile, int prefabflag );
int ploticus_end();
#endif
ploticus-2.42/src/proc_curvefit.c- 0000644 0001750 0001750 00000034014 11202301677 016160 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC CURVEFIT - Fit a curve to the data.
Result becomes the new data that plotting procedures access. */
#include "pl.h"
#define MAXPTS 1000 /* default max # input points for movingavg curve */
#define MAXORDER 21 /* max bspline order value (no limit for movingavg order) */
#define MAXBSP_IN 100 /* max # input points for bspline curve */
#define MOVINGAVG 'm'
#define REGRESSION 'r'
#define BSPLINE 'b'
#define SIMPLEAVG 'a'
#define INTERPOLATED 'i'
/* the PLV vector is used for curve points */
static int bspline(), mavg(), plainavg(), lregress();
static int dblcompare(const void *a, const void *b);
int
PLP_curvefit()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
char *linedetails, *curvetype, *selectex;
char numstr[100];
char legendlabel[256];
int i, stat, order, xfield, yfield, npts, nresultpoints, irow, showresults, calcrangegiven;
int linerangegiven, statsonly, selectresult, xsort, maxinpoints, doclip;
double resolution, linestart, linestop, calcstart, calcstop, *inpoints, *inp, drawx, drawy, prevdrawx, prevdrawy, curveshift;
TDH_errprog( "pl proc curvefit" );
/* initialize */
order = 4;
xfield = -1;
yfield = -1;
nresultpoints = -1;
resolution = 5.0;
linedetails = "";
linestart = EDXlo;
linestop = EDXhi;
showresults = 0; calcrangegiven = 0; linerangegiven = 0; xsort = 0; doclip = 0; statsonly = 0;
curvetype = "movingavg";
selectex = "";
strcpy( legendlabel, "" );
maxinpoints = MAXPTS;
curveshift = 0.0;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "xfield" )==0 ) xfield = fref( lineval ) - 1;
else if( strcmp( attr, "yfield" )==0 ) yfield = fref( lineval ) - 1;
else if( strcmp( attr, "order" )==0 ) order = itokncpy( lineval );
else if( strcmp( attr, "resolution" )==0 ) resolution = ftokncpy( lineval );
else if( strcmp( attr, "xsort" )==0 ) xsort = getyn( lineval );
else if( strcmp( attr, "linedetails" )==0 ) linedetails = lineval;
else if( strcmp( attr, "legendlabel" )==0 ) tokncpy( legendlabel, lineval, 256 );
else if( strcmp( attr, "select" )==0 ) selectex = lineval;
else if( strcmp( attr, "linerange" )==0 ) {
if( lineval[0] != '\0' ) linerangegiven = 1;
getrange( lineval, &linestart, &linestop, 'x', EDXlo, EDXhi );
}
else if( strcmp( attr, "calcrange" )==0 ) {
if( lineval[0] != '\0' ) {
calcrangegiven = 1;
getrange( lineval, &calcstart, &calcstop, 'x', EDXlo, EDXhi );
}
else calcrangegiven = 0;
}
else if( strcmp( attr, "curvetype" )==0 ) curvetype = lineval;
else if( strcmp( attr, "curveshift" )==0 ) curveshift = ftokncpy( lineval ); /* added scg 6/2/06 */
else if( strcmp( attr, "maxinpoints" )==0 ) maxinpoints = itokncpy( lineval );
else if( strcmp( attr, "showresults" )==0 ) showresults = getyn( lineval );
else if( strcmp( attr, "clip" )==0 ) doclip = getyn( lineval );
else if( strcmp( attr, "statsonly" )==0 ) statsonly = getyn( lineval );
else Eerr( 1, "attribute not recognized", attr );
}
/* overrides and degenerate cases */
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) );
if( yfield < 0 || yfield >= Nfields ) return( Eerr( 601, "yfield not specified or out of range", "" ) );
/* if( xfield < 0 || xfield >= Nfields ) return( Eerr( 601, "xfield not specified or out of range", "" ) ); */
/* xfield can be unspecified - scg 6/2/06 (post 2.33 release) */
if( !scalebeenset() )
return( Eerr( 51, "No scaled plotting area has been defined yet w/ proc areadef", "" ) );
if( strncmp( legendlabel, "#usefname", 9 )==0 ) getfname( yfield+1, legendlabel ); /* legendlabel[256] */
/* now do the computation work.. */
/* -------------------------- */
/* allocate memory for the input points list.. */
inpoints = (double *) malloc( maxinpoints * sizeof( double ) * 2 );
inp = inpoints;
/* process input data.. */
npts = 0;
for( irow = 0; irow < Nrecords; irow++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, irow, &selectresult );
if( stat != 0 ) { Eerr( stat, "Select error", selectex ); continue; }
if( selectresult == 0 ) continue; /* reject */
}
/* in[npts][1] = fda( irow, yfield, Y ); */
inp += 1; /* because we're getting Y */
*inp = fda( irow, yfield, Y );
if( Econv_error() ) { conv_msg( irow, yfield, "yfield" ); inp -= 1; continue; } /* bug - inp-=1 added scg 2/3/05 */
inp -= 1; /* now back up one to get X */
if( xfield < 0 ) *inp = (double)irow + curveshift; /* in[npts][0] = (int)irow; */
else {
/* in[npts][0] = fda( irow, xfield, X ); */
*inp = fda( irow, xfield, X ) + curveshift;
if( Econv_error() ) { conv_msg( irow, xfield, "xfield" ); continue; }
}
/* compute curve only for points within calcrange */
if( calcrangegiven ) {
/* if( in[npts][0] < calcstart ) continue; */
/* else if( in[npts][0] > calcstop ) break; */
if( *inp < calcstart ) continue;
else if( *inp > calcstop ) break;
}
if( curvetype[0] == BSPLINE && npts >= MAXBSP_IN ) {
Eerr( 2599, "max of 100 input points allowed for bspline exceeded; curve truncated", "" );
break;
}
if( npts >= maxinpoints ) {
Eerr( 2599, "maxinpoints exceeded, curve truncated (see maxinpoints attribute)", "" );
break;
}
npts++;
inp+=2; /* to next point slot */
}
/* sort points on x - added scg 11/2000 */
if( curvetype[0] != INTERPOLATED || xsort )
qsort( inpoints, npts, sizeof(double)*2, dblcompare );
if( curvetype[0] == MOVINGAVG ) {
mavg( inpoints, npts, PLV, order );
nresultpoints = npts;
}
else if( curvetype[0] == REGRESSION ) {
double rlinestart, rlinestop;
if( linerangegiven ) {
rlinestart = linestart;
rlinestop = linestop;
}
else {
/* rlinestart = in[0][0]; rlinestop = in[npts-1][0]; */
inp = inpoints; rlinestart = *inp; inp += (npts-1)*2; rlinestop = *inp;
/* fprintf( stderr, "[rlinestart=%g rlinestop=%g ]\n", rlinestart, rlinestop ); */
}
lregress( inpoints, npts, PLV, rlinestart, rlinestop );
nresultpoints = 2;
/* vertical line (degenerate case) suppress.. */
if( dat2d( 0, 0 ) == dat2d( 1, 0 ) ) nresultpoints = 0;
/* clip to plotting area.. */
stat = Elineclip( &dat2d(0,0), &dat2d(0,1), &dat2d(1,0), &dat2d(1,1), EDXlo, EDYlo, EDXhi, EDYhi );
if( stat != 0 ) nresultpoints = 0;
}
else if( curvetype[0] == BSPLINE ) {
nresultpoints = npts * resolution;
if( nresultpoints >= PLVhalfsize ) nresultpoints = PLVhalfsize-1;
if( order >= MAXORDER ) {
Eerr( 2158, "Using max bspline order of 20", "" );
order = 20;
}
if( npts < order ) {
if( inpoints != NULL ) free( inpoints );
return( Eerr( 4892, "Must have at least 'order' data points", "" ) );
}
/* do the computation.. */
bspline( inpoints, npts, PLV, nresultpoints, order );
}
else if( curvetype[0] == INTERPOLATED ) {
stat = PL_smoothfit( inpoints, npts, PLV, &nresultpoints );
}
else { /* average curve (basic) */
plainavg( inpoints, npts, PLV, order );
nresultpoints = npts;
}
if( inpoints != NULL ) free( inpoints );
/* curve has been generated.. now draw the line.. */
/* ---------------------------------------------- */
linedet( "linedetails", linedetails, 1.0 );
Emovu( dat2d(0,0), dat2d(0,1) );
if( showresults ) fprintf( PLS.diagfp, "// generated curve points follow:\n%g %g\n", dat2d(0,0), dat2d(0,1) );
for( i = 1; i < nresultpoints; i++ ) {
drawx = dat2d(i,0);
drawy = dat2d(i,1);
/* draw only within linerange.. */
if( i > 0 && drawx > linestart && (dat2d(i-1,0)) < linestart ) Emovu( drawx, drawy );
else if( drawx < linestart ) continue;
else if( drawx > linestop ) break;
if( doclip && !statsonly && i > 0 ) {
prevdrawx = dat2d(i-1,0);
prevdrawy = dat2d(i-1,1);
stat = Elineclip( &prevdrawx, &prevdrawy, &drawx, &drawy, EDXlo, EDYlo, EDXhi, EDYhi );
if( stat ) goto BOTTOM;
Emovu( prevdrawx, prevdrawy );
}
if( !statsonly ) Elinu( drawx, drawy );
BOTTOM:
if( showresults ) fprintf( PLS.diagfp, "%g %g\n", drawx, drawy );
}
/* set YFINAL and Xfinal */
i--;
Euprint( numstr, Y, dat2d(i,1), "" ); /* numstr[100] */
setcharvar( "YFINAL", numstr );
Euprint( numstr, X, dat2d(i,0), "" ); /* numstr[100] */
setcharvar( "XFINAL", numstr );
if( legendlabel[0] != '\0' ) PL_add_legent( LEGEND_LINE, legendlabel, "", linedetails, "", "" );
return( 0 );
}
/* =========================== */
static int mavg( in, npts, out, order )
double in[][2]; /* input points */
int npts; /* number of input points */
double out[][2]; /* output points (same n as input points array) */
int order; /* # of points to average */
{
int i, j;
int avgstart;
double accum;
for( i = 0; i < npts; i++ ) {
avgstart = i - (order - 1);
if( avgstart < 0 ) avgstart = 0;
accum = 0.0;
for( j = avgstart; j <= i; j++ ) accum += in[j][1];
out[i][0] = in[i][0];
out[i][1] = accum / (double)(( i - avgstart ) + 1);
}
return( 0 );
}
/* =========================== */
/* same as movingavg but averages in points to right as well.. */
static int plainavg( in, npts, out, order )
double in[][2]; /* input points */
int npts; /* number of input points */
double out[][2]; /* output points (same n as input points array) */
int order; /* # of points to average */
{
int i, j;
int avgstart, avgstop;
double accum;
for( i = 0; i < npts; i++ ) {
avgstart = i - (order - 1);
avgstop = i + (order - 1);
if( avgstart < 0 ) avgstart = 0;
if( avgstop >= npts ) avgstop = npts-1;
accum = 0.0;
for( j = avgstart; j <= avgstop; j++ ) accum += in[j][1];
out[i][0] = in[i][0];
out[i][1] = accum / (double)(( avgstop - avgstart ) + 1 );
}
return( 0 );
}
/* ============================== */
/* LREGRESS - linear regression curve */
static int lregress( in, npts, out, start, stop )
double in[][2];
int npts; /* number of input points */
double out[][2]; /* output points (n=2 since it's a straight line) */
double start, stop; /* X values - result line start and stop */
{
int i;
double sumx, sumxx, sumy, sumyy, sumxy;
double b, m;
double numer, denom, denomleft, denomright;
char buf[128], tok[128];
double sqrt();
char *GL_autoroundf();
sumx = sumxx = sumy = sumyy = sumxy = 0.0;
for( i = 0; i < npts; i++ ) {
sumx += in[i][0];
sumxx += (in[i][0] * in[i][0]);
sumy += in[i][1];
sumyy += (in[i][1] * in[i][1]);
sumxy += (in[i][0] * in[i][1]);
}
/* compute x intercept (b) */
numer = (sumy * sumxx) - (sumx * sumxy);
denom = ( (double)npts * sumxx ) - (sumx * sumx);
b = numer / denom;
/* compute slope (m) */
numer = ((double)npts * sumxy) - (sumx * sumy);
denom = ((double)npts * sumxx) - (sumx * sumx);
if( denom == 0.0 ) m = 0.0; /* ? */
else m = numer / denom;
out[0][0] = start;
out[0][1] = (m * start) + b;
out[1][0] = stop;
out[1][1] = (m * stop) + b;
strcpy( tok, GL_autoroundf( m, 0 ) );
sprintf( buf, "Y = %s + %sX", GL_autoroundf(b,0), tok );
TDH_setvar( "REGRESSION_LINE", buf );
/* compute r (pearson correlation coeff) */
/* numer = ((double) nvalues * sumxy) - (sumx * sumy ); */
denomleft = ((double) npts * sumxx) - (sumx * sumx);
denomright = ((double) npts * sumyy) - (sumy * sumy);
denom = sqrt( denomleft * denomright );
if( denom == 0.0 ) strcpy( buf, "(none)" );
else sprintf( buf, "%s", GL_autoroundf( (numer/denom), 0 ) );
TDH_setvar( "CORRELATION", buf );
return( 0 );
}
/* ======================== */
/* BSPLINE curve */
static int
bspline( in, npts, out, ncv, order )
double in[][2]; /* input points */
int npts; /* number of input points */
double out[][2]; /* output points */
int ncv; /* number of output points to generate */
int order; /* order of the curve (2..n_in) */
{
int i, j, k, n;
int nknot; /* size of knot vector */
double t; /* parameter */
double N[MAXBSP_IN][MAXORDER]; /* weighting function */
double knot[MAXBSP_IN+MAXORDER]; /* knot vector */
double tmp1, tmp2, tmp3, tmp4, tmp5, tmp6;
int n_out;
/* generate the knot vector */
/* ------------------------ */
for( i = 0; i < MAXBSP_IN; i++ ) knot[i] = 0.0; /* init */
n = npts - 1;
nknot = n + 1 + order;
for( i = 0; i < order; i++ ) knot[i] = 0;
j = 1;
for( ; i < nknot-order; i++ ) knot[i] = j++;
for( ; i < nknot; i++ ) knot[i] = j;
/* printf( "Knot= [ " );
* for( i = 0; i < nknot; i++ ) printf( "%g ", knot[i] );
* printf( "]\n" );
*/
t = 0.0;
n_out = 0;
for( j = 0; j < ncv; j++ ) { /* for each point to be generated.. */
/* do the N(?,1) set.. */
for( i = 0; i <= n+1; i++ ) {
if( knot[i] <= t && t < knot[i+1] ) N[i][1] = 1.0;
else N[i][1] = 0.0;
}
/* do middle N.. */
for( k = 2; k <= order; k++ ) {
for( i = 0; i <= npts; i++ ) {
tmp1 = ((t - knot[i])*N[i][k-1]);
tmp2 = (knot[i+k-1] - knot[i]);
tmp3 = ((knot[i+k] - t)*N[i+1][k-1]);
tmp4 = (knot[i+k] - knot[i+1]);
if( tmp2 == 0.0 ) { tmp5 = 0.0; }
else { tmp5 = tmp1 / tmp2; }
if( tmp4 == 0.0 ) { tmp6 = 0.0; }
else { tmp6 = tmp3 / tmp4; }
N[i][k] = tmp5 + tmp6;
}
}
if( j == ncv-1 ) N[n][order] = 1.0; /* for last point */
tmp1 = tmp2 = tmp3 = 0;
for( i = 0; i < npts; i++ ) {
tmp1 += (in[i][0]*N[i][order]);
tmp2 += (in[i][1]*N[i][order]);
tmp3 += 0.0; /* (in[i][2]*N[i][order]); */
}
/* put curve into D2 */
out[n_out][0] = tmp1;
out[n_out][1] = tmp2;
/* out[n_out][2] = tmp3; */
n_out++;
t += ( knot[nknot-1] / (double)(ncv - 1) );
}
return( 1 );
}
/* ============================= */
static int
dblcompare( a, b )
const void *a, *b;
/* dblcompare( f, g )
* double *f, *g;
*/ /* changed to eliminate gcc warnings scg 5/18/06 */
{
double *f, *g;
f = (double *)a;
g = (double *)b;
if( *f > *g ) return( 1 );
if( *f < *g ) return( -1 );
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_legendentry.c 0000644 0001750 0001750 00000004041 10741227406 016575 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC LEGENDENTRY - proc to define one legend entry */
#include "pl.h"
int
PLP_legendentry( )
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
char *label, *sampletype, *spec1, *spec2, *spec3, *tag;
int samptyp;
TDH_errprog( "pl proc legendentry" );
/* initialize */
label = "";
sampletype = "none";
spec1 = "";
spec2 = "";
spec3 = "";
tag = "";
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "label" )==0 ) label = lineval;
else if( strcmp( attr, "tag" )==0 ) tag = lineval;
else if( strcmp( attr, "sampletype" )==0 ) sampletype = lineval;
else if( strcmp( attr, "details" )==0 ) spec1 = lineval;
else if( strcmp( attr, "details2" )==0 ) spec2 = lineval;
else if( strcmp( attr, "details3" )==0 ) spec3 = lineval;
else Eerr( 1, "attribute not recognized", attr );
}
samptyp = 0; /* for 'none' */
if( strcmp( sampletype, "line" )==0 ) samptyp = LEGEND_LINE;
else if( strcmp( sampletype, "color" )==0 ) samptyp = LEGEND_COLOR;
else if( strcmp( sampletype, "symbol" )==0 ) samptyp = LEGEND_SYMBOL;
else if( strcmp( sampletype, "text" )==0 ) samptyp = LEGEND_TEXT;
else if( strcmp( sampletype, "line+symbol" )==0 ) samptyp = LEGEND_LINE + LEGEND_SYMBOL;
else if( strcmp( sampletype, "text+symbol" )==0 ) samptyp = LEGEND_TEXT + LEGEND_SYMBOL;
PL_add_legent( samptyp, label, tag, spec1, spec2, spec3 );
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/condex.c 0000644 0001750 0001750 00000023277 12144510301 014512 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/*
Take a conditional expression as a single string argument.
If the expression is true, 1 is returned.
If the expression is false, 0 is returned.
If there was an error in the expression, -1 is returned.
*/
#include
#include
#include
#include
extern int GL_containswords();
extern int GL_smemberi( char *s, char *t );
extern int GL_wildcmp( char *s1, char *s2, int len, int casecare );
extern int GL_smember( char *s, char *t );
extern int GL_getseg( char *rtn, char *inbuf, int *i, char *sep );
extern int GL_goodnum( char *str, int *prec );
extern int GL_slmember( char *str, char *list );
extern int TDH_err(), TDH_function_call(), TDH_getvalue();
#define stricmp( s, t ) strcasecmp( s, t )
#define strnicmp( s, t, u ) strncasecmp( s, t, u )
#define err(a,b,c) TDH_err(a,b,c)
#define MAXPARMLEN 1024
#define NUMBER 0
#define ALPHA 1
#define NCLAUSE 30
#define NTOKS 30
#define MAXTOK 256
static int evalclause(), evalstmt(), yield();
static char listsep = ',';
extern char *GL_getok();
static int evalflag = 0;
static int nofunc = 0;
static int Matchscore, Matchscore_used;
/* the following is necessary only for var evaluation */
extern char *TDH_dat, *TDH_recid;
/* ================================== */
int
TDH_condex_initstatics()
{
listsep = ','; /* persist-from-quisp (matters?) */
evalflag = 0;
nofunc = 0;
return( 0 );
}
/* ================================== */
int
TDH_condex( cond, eval )
char cond[];
int eval; /* 1 = cond contains vars that need to be evaluated 0 = not */
{
int s[NCLAUSE], i, j, k, rtn, ix, negate;
char args[NTOKS][MAXTOK], tok[MAXTOK];
int argc;
double atof();
int condlen;
evalflag = eval;
condlen = strlen( cond );
Matchscore = 0; Matchscore_used = 0;
/* break cond into tokens */
ix = 0;
/* check for leading "not:" */
strcpy( tok, GL_getok( cond, &ix ) );
if( strcmp( tok, "not:" )==0 ) negate = 1;
else {
negate = 0;
ix = 0;
}
for( i = 1; ; i++ ) {
strcpy( args[ i ], GL_getok( cond, &ix ) );
/* function may be multiple args - concatenate..*/
if( !nofunc && args[i][0] == '$' && ( isalpha( (int) args[i][1] ) || args[i][1] == '$' ) ) {
while( args[i][ strlen( args[i]) - 1 ] != ')' ) {
if( ix >= condlen ) break;
strcat( args[i], GL_getok( cond, &ix ));
}
}
if( args[i][0] == '\0' ) break;
}
argc = i;
/* for( i = 1; i < argc; i++ ) printf( "[%s]", args[i] );
* printf( "\n" );
*/
/* do "clauses" */
for( i = 0; i < NCLAUSE; i++ ) s[i] = 0;
i = 0;
j = k = 1;
while( 1 ) {
if( j==argc && GL_smemberi( args[j], "or ||" )) {
err( 1001, "expression error", cond );
return( -1 );
}
if( j == argc || GL_smemberi( args[j], "or ||" )) {
s[ i ] = evalclause( args, k, j-1 );
if( s[ i ] == -1 ) {
err( 1002, "expression error", cond );
return( -1 );
}
k = j+1;
i++;
}
j++;
if( j > argc ) break;
}
rtn = ( s[0] || s[1] || s[2] || s[3] || s[4] || s[5] || s[6] || s[7] || s[8] || s[9] || s[10] || s[11] );
if( negate ) return( ! rtn );
else return( rtn );
}
/* ================ */
/* EVALCLAUSE - evaluate a clause */
static int
evalclause( args, start, stop )
char args[NTOKS][MAXTOK];
int start, stop;
{
int s[NCLAUSE], i, j, k, rtn;
for( i = 0; i < NCLAUSE; i++ ) s[i] = 1;
i = 0;
j = k = start;
while( 1 ) {
if( j==stop && GL_smemberi( args[j], "and &&" )) { return( -1 ); }
if( j==stop || GL_smemberi( args[j], "and &&" )) {
s[ i ] = evalstmt( args, k );
if( s[ i ] == -1 ) return( -1 );
k = j+1;
i++;
}
j++;
if( j > stop ) break;
}
rtn = ( s[0] && s[1] && s[2] && s[3] && s[4] && s[5] && s[6] && s[7] && s[8] && s[9] && s[10] && s[11] );
return( rtn );
}
/* ============ */
/* EVALSTMT - evaluate a statement */
static int
evalstmt( args, start )
char args[NTOKS][MAXTOK];
int start;
{
char r1[MAXTOK], r2[MAXTOK], op[MAXTOK];
int i, t1, t2, i1, i2;
double diff;
double atof(), a2f();
int slen;
if( strcmp( args[start], "@_matchscore" )==0 ) sprintf( r1, "%d", Matchscore ); /* allow capture from a leftward 'contains' */
else strcpy( r1, args[start] );
strcpy( op, args[start+1] );
strcpy( r2, args[start+2] );
if( GL_smemberi( r2, "and && or ||" ) || r2[0] == '\0' ) { return( -1 ); } /* got off track */
/* assign data type for value-- types are alpha, number, date */
i1 = yield( r1, &t1 );
i2 = yield( r2, &t2 );
if( i1 < 0 || i2 < 0 ) return( -1 );
/* handle these ops: = > >= < <= ... */
if( op[0] == '=' || op[0] == '>' || op[0] == '<' || stricmp( op, "is" )==0 ) {
if( t1 != t2 ) return( 0 ); /* type mismatch always false for these ops */
/* compute diff */
if( t1 == NUMBER && t2 == NUMBER ) diff = atof( r1 ) - atof( r2 );
else diff = (double) strcmp( r1, r2 );
/* determine return code 1 or 0 */
if( op[0] == '=' ) { if( diff == 0 ) return( 1 ); else return( 0 ); }
else if( op[0] == '>' ) {
if( diff > 0 ) return( 1 );
else if( op[1] == '=' && diff == 0 ) return( 1 );
else return( 0 );
}
else if( op[0] == '<' ) {
if( diff < 0 ) return( 1 );
else if( op[1] == '=' && diff == 0 ) return( 1 );
else return( 0 );
}
else if( stricmp( op, "is" )==0 ) { if( diff == 0 ) return( 1 ); else return( 0 ); }
}
/* 'like' ... */
else if( tolower( op[0] ) == 'l' ) return( ! GL_wildcmp( r1, r2, strlen( r2 ), 0 ) );
/* 'contains' */
#ifndef PLOTICUS
else if( strnicmp( op, "contains", 8 )==0 ) {
int stat;
stat = GL_containswords( r2, r1 ); /* delimit words on any space/punct */
if( stat < 0 ) stat = 20; /* to keep summation on track.. also so that initial check for 'contains' works */
if( !Matchscore_used ) Matchscore = stat;
else Matchscore += stat; /* if more than one term, accumulate scores */
Matchscore_used = 1;
return( (stat < 20 ) );
}
#endif
/* '!=' ... */
else if( GL_smember( op, "!= <> isnot" )) {
if( t1 != t2 ) return( 1 ); /* type mismatch always true for != */
if( t1 == NUMBER && t2 == NUMBER ) diff = atof( r1 ) - atof( r2 );
else diff = (double) strcmp( r1, r2 );
if( diff != 0 ) return( 1 );
else return( 0 );
}
/* 'inrange' and 'outrange' ... */
else if( strnicmp( op, "inra", 4 )==0 || strnicmp( op, "outr", 4 )==0 ) {
/* always false if any operands are non-numeric */
char valtok[80];
double ff, gg, hh;
int prec;
if( t1 != NUMBER ) return( 0 );
hh = atof( r1 );
i = 0;
GL_getseg( valtok, r2, &i, "," );
if( !GL_goodnum( valtok, &prec ) ) return( 0 );
ff = atof( valtok );
GL_getseg( valtok, r2, &i, "," );
if( !GL_goodnum( valtok, &prec ) ) return( 0 );
gg = atof( valtok );
if( tolower( op[0] ) == 'i' && hh >= ff && hh <= gg ) return( 1 );
else if( tolower( op[0] ) == 'o' && ( hh < ff || hh > gg )) return( 1 );
else return( 0 );
}
/* '!like' ... */
else if( GL_smemberi( op, "!like notlike" )) /* return( ! GL_slmember( r1, r2 ) ); */
return( abs( GL_wildcmp( r1, r2, strlen( r2 ), 0 )));
/* other list ops... */
for( i = 0, slen = strlen( r2 ); i < slen; i++ ) { if( r2[i] == listsep ) r2[i] = ' ' ; } /* change every comma to a space */
if( stricmp( op, "in" ) == 0 ) return( GL_smemberi( r1, r2 ) );
else if( GL_smemberi( op, "!in notin" )) return( ! GL_smemberi( r1, r2 ) );
else if( GL_smemberi( op, "inlike" )) return( GL_slmember( r1, r2 ) );
else if( GL_smember( op, "!inlike notinlike" )) return( ! GL_slmember( r1, r2 ) );
fprintf( stderr, "[%s?]", op );
return( -1 );
}
/* ========================= */
/* YIELD - determine data type, evaluate functions.
Yield is a recursive function.
Returns -1 for bad expression */
static int
yield( v, t )
char v[];
int *t;
{
double atof(), a2f();
int p, status;
char tok[256];
/* if evalflag, v likely contains one or more unevaluated vars */
*t = -1;
/* if v is a $function call, evaluate it .. */
if( !nofunc && v[0] == '$' && (isalpha( (int) v[1] ) || v[1] == '$' ) ) {
/* shsql always operates in nofunc mode. This #ifdef avoids function-related
references in shsql-only applications. QUISP, which uses condex for both
shsql and script processing, and needs the functions code, must be linked such
that tdhkit.a has precidence over libshsql.a
*/
#ifndef SHSQL
status = TDH_function_call( v, t, evalflag ); /* v will be modified here */
#else
status = 1;
#endif
if( status != 0 ) {
err( 1003, "function error in condex", v );
return( -1 );
}
}
/* variable.. evaluate it.. */
else if( evalflag && v[0] == '@' && v[1] != '@' ) {
status = TDH_getvalue( tok, &v[1], TDH_dat, TDH_recid );
if( status == 0 ) strcpy( v, tok );
/* else @var appears verbatim */
}
/* determine basic type of v */
if( *t >= 0 ) ; /* already known from function */
else if( GL_goodnum( v, &p ) ) *t = NUMBER;
else *t = ALPHA;
return( 1 );
}
/* ============================== */
/* ============================== */
/* CONDEX_LISTSEP - allow setting of list delimiter character in case comma is unacceptable */
int
TDH_condex_listsep( c )
char c;
{
listsep = c;
return( 0 );
}
/* ============================== */
/* CONDEX_NOFUNC - don't take special action on tokens beginning with dollar signs */
int
TDH_condex_nofunc( mode )
int mode;
{
nofunc = mode;
return( 0 );
}
/* =============================== */
/* CONDEX_MATCHSCORE - return most recent match score (-1 indicates not used) */
int
TDH_condex_matchscore()
{
if( !Matchscore_used ) return( -1 );
else return( Matchscore );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/gd_io_dp.c 0000644 0001750 0001750 00000016150 06745115664 015015 0 ustar colin colin /*
* io_dp.c
*
* Implements the dynamic pointer interface.
*
* Based on GD.pm code by Lincoln Stein for interfacing to libgd.
* Added support for reading as well as support for 'tell' and 'seek'.
*
* As will all I/O modules, most functions are for local use only (called
* via function pointers in the I/O context).
*
* gdDPExtractData is the exception to this: it will return the pointer to
* the internal data, and reset the internal storage.
*
* Written/Modified 1999, Philip Warner.
*
*/
#include
#include
#include
#include "gd.h"
#define TRUE 1
#define FALSE 0
/* this is used for creating images in main memory*/
typedef struct dpStruct {
void* data;
int logicalSize;
int realSize;
int dataGood;
int pos;
} dynamicPtr;
typedef struct dpIOCtx {
gdIOCtx ctx;
dynamicPtr *dp;
} dpIOCtx;
typedef struct dpIOCtx *dpIOCtxPtr;
/* these functions operate on in-memory dynamic pointers */
static int allocDynamic (dynamicPtr* dp,int initialSize, void *data);
static int appendDynamic (dynamicPtr* dp, const void* src, int size);
static int reallocDynamic (dynamicPtr* dp, int required);
static int trimDynamic (dynamicPtr* dp);
static void freeDynamicCtx(struct gdIOCtx* ctx);
static dynamicPtr* newDynamic(int initialSize, void *data);
static int dynamicPutbuf( struct gdIOCtx*, const void *, int );
static void dynamicPutchar( struct gdIOCtx*, int a );
static int dynamicGetbuf( gdIOCtxPtr ctx, void *buf, int len);
static int dynamicGetchar( gdIOCtxPtr ctx );
static int dynamicSeek(struct gdIOCtx*, const int);
static long dynamicTell(struct gdIOCtx*);
/* return data as a dynamic pointer */
gdIOCtx* gdNewDynamicCtx (int initialSize, void *data) {
dpIOCtx *ctx;
dynamicPtr* dp;
ctx = (dpIOCtx*) malloc(sizeof(dpIOCtx));
if (ctx == NULL) {
return NULL;
}
dp = newDynamic(initialSize, data);
if (!dp) {
free(ctx);
return NULL;
};
ctx->dp = dp;
ctx->ctx.getC = dynamicGetchar;
ctx->ctx.putC = dynamicPutchar;
ctx->ctx.getBuf = dynamicGetbuf;
ctx->ctx.putBuf = dynamicPutbuf;
ctx->ctx.seek = dynamicSeek;
ctx->ctx.tell = dynamicTell;
ctx->ctx.free = freeDynamicCtx;
return (gdIOCtx*)ctx;
};
void* gdDPExtractData(struct gdIOCtx* ctx, int *size)
{
dynamicPtr *dp;
dpIOCtx *dctx;
void *data;
dctx = (dpIOCtx*) ctx;
dp = dctx->dp;
/* clean up the data block and return it */
if (dp->dataGood) {
trimDynamic(dp);
*size = dp->logicalSize;
data = dp->data;
} else {
*size = 0;
data = NULL;
if (dp->data != NULL) {
free(dp->data);
}
}
dp->data = NULL;
dp->realSize=0;
dp->logicalSize=0;
return data;
}
static
void freeDynamicCtx(struct gdIOCtx* ctx)
{
dynamicPtr *dp;
dpIOCtx *dctx;
dctx = (dpIOCtx*) ctx;
dp = dctx->dp;
free(ctx);
/* clean up the data block and return it */
if (dp->data != NULL) {
free(dp->data);
dp->data = NULL;
}
dp->realSize=0;
dp->logicalSize=0;
free(dp);
}
static long dynamicTell(struct gdIOCtx* ctx)
{
dpIOCtx *dctx;
dctx = (dpIOCtx*) ctx;
return (dctx->dp->pos);
}
static int dynamicSeek(struct gdIOCtx* ctx, const int pos)
{
int bytesNeeded;
dynamicPtr *dp;
dpIOCtx *dctx;
dctx = (dpIOCtx*) ctx;
dp = dctx->dp;
if (!dp->dataGood) return FALSE;
bytesNeeded = pos;
if (bytesNeeded > dp->realSize) {
if (!reallocDynamic(dp,dp->realSize*2)) {
dp->dataGood = FALSE;
return FALSE;
}
}
/* if we get here, we can be sure that we have enough bytes
to copy safely */
/* Extend the logical size if we seek beyond EOF. */
if (pos > dp->logicalSize) {
dp->logicalSize = pos;
};
dp->pos = pos;
return TRUE;
}
/* return data as a dynamic pointer */
static dynamicPtr* newDynamic (int initialSize, void *data) {
dynamicPtr* dp;
dp = (dynamicPtr*) malloc(sizeof(dynamicPtr));
if (dp == NULL) {
return NULL;
}
if (!allocDynamic(dp,initialSize, data))
return NULL;
dp->pos = 0;
return dp;
};
static int
dynamicPutbuf( struct gdIOCtx* ctx, const void *buf, int size )
{
dpIOCtx *dctx;
dctx = (dpIOCtx*) ctx;
appendDynamic(dctx->dp,buf,size);
if (dctx->dp->dataGood) {
return size;
} else {
return -1;
};
}
static void
dynamicPutchar( struct gdIOCtx* ctx, int a )
{
unsigned char b;
dpIOCtxPtr dctx;
b = a;
dctx = (dpIOCtxPtr) ctx;
appendDynamic(dctx->dp,&b,1);
}
static int
dynamicGetbuf( gdIOCtxPtr ctx, void *buf, int len)
{
int rlen, remain;
dpIOCtxPtr dctx;
dynamicPtr* dp;
dctx = (dpIOCtxPtr) ctx;
dp = dctx->dp;
remain = dp->logicalSize - dp->pos;
if (remain >= len) {
rlen = len;
} else {
if (remain == 0) {
return EOF;
}
rlen = remain;
}
memcpy(buf, (void*)((char*)dp->data + dp->pos), rlen);
dp->pos += rlen;
return rlen;
}
static int
dynamicGetchar( gdIOCtxPtr ctx )
{
unsigned char b;
int rv;
rv = dynamicGetbuf(ctx, &b, 1);
if (rv != 1) {
return EOF;
} else {
return b ;/* (b & 0xff); */
}
}
/* *********************************************************************
*
* InitDynamic - Return a dynamically resizable void*
*
* *********************************************************************
*/
static int
allocDynamic (dynamicPtr* dp,int initialSize, void *data) {
if (data == NULL) {
dp->logicalSize = 0;
dp->dataGood = FALSE;
dp->data = malloc(initialSize);
} else {
dp->logicalSize = initialSize;
dp->dataGood = TRUE;
dp->data = data;
}
if (dp->data !=NULL) {
dp->realSize = initialSize;
dp->dataGood = TRUE;
dp->pos = 0;
return TRUE;
} else {
dp->realSize = 0;
return FALSE;
}
}
/* append bytes to the end of a dynamic pointer */
static int
appendDynamic (dynamicPtr* dp, const void* src, int size) {
int bytesNeeded;
char* tmp;
if (!dp->dataGood) return FALSE;
/* bytesNeeded = dp->logicalSize + size; */
bytesNeeded = dp->pos + size;
if (bytesNeeded > dp->realSize) {
if (!reallocDynamic(dp,bytesNeeded*2)) {
dp->dataGood = FALSE;
return FALSE;
}
}
/* if we get here, we can be sure that we have enough bytes
to copy safely */
/*printf("Mem OK Size: %d, Pos: %d\n", dp->realSize, dp->pos); */
tmp = (char*)dp->data;
memcpy((void*)(tmp+(dp->pos)),src,size);
dp->pos += size;
if (dp->pos > dp->logicalSize) {
dp->logicalSize = dp->pos;
};
return TRUE;
}
/* grow (or shrink) dynamic pointer */
static int
reallocDynamic (dynamicPtr* dp, int required) {
void* newPtr;
/* First try realloc(). If that doesn't work, make a new
memory block and copy. */
if ( (newPtr = realloc(dp->data,required)) ) {
dp->realSize = required;
dp->data = newPtr;
return TRUE;
}
/* create a new pointer */
newPtr = malloc(required);
if (!newPtr) {
dp->dataGood = FALSE;
return FALSE;
}
/* copy the old data into it */
memcpy(newPtr,dp->data,dp->logicalSize);
free(dp->data);
dp->data = newPtr;
dp->realSize = required;
return TRUE;
}
/* trim pointer so that its real and logical sizes match */
static int
trimDynamic (dynamicPtr* dp) {
return reallocDynamic(dp,dp->logicalSize);
}
ploticus-2.42/src/goqp 0000644 0001750 0001750 00000000046 10742706123 013757 0 ustar colin colin cd /home/scg/quisp/qsrc
make quisp_pl
ploticus-2.42/src/execline.c 0000644 0001750 0001750 00000045330 11155742156 015040 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
#include "pl.h"
#include "tdhkit.h"
#define NONDRAWINGPROCS "page print originaldata usedata tabulate getdata boxplot catslide processdata settings endproc"
#define MAXMALLOCATTRS 30 /* max # of multiline attributes per proc including clones */
#define GETTING 0
#define SCANNING 1
static int execline_init = 0;
static int lastbs; /* indicates that previous line ended with a backslash, indicating continuation.. */
static char procname[NAMEMAXLEN];
static char saveas_name[NAMEMAXLEN];
static char last_proctok[20]; /* either #proc or #procdef */
static char clone_name[NAMEMAXLEN];
static int nlhold;
static char clonelist[200];
static int holdmemflag = 0;
static int prevlineblank = 0; /* prevent -echo from spitting out lots of adjacent blank lines */
static char *mem;
static int nfl = 0;
static char *malloclist[MAXMALLOCATTRS]; /* list of malloced multiline items */
static int procstop; /* communicates end of proc w/ getmultiline */
static int proc_call(), initproc();
/* ================================================================= */
int
PL_execline_initstatic()
{
execline_init = 0;
holdmemflag = 0;
prevlineblank = 0;
/* don't reset nfl here.. let new job free the list */
return( 0 );
}
/* ================================================================= */
/* EXECLINE - execute one ploticus script line.
* Returns 0 if ok, or a non-zero error code
*/
int
PL_execline( line )
char *line; /* line of script file.. */ /* if const, no trailing newline and no #ifspec! (these modify line) */
{
int i, ix, stat;
char firsttok[50], buf2[50];
int buflen, endproc, procstat;
if( !execline_init ) {
PLS.npages = 0;
lastbs = 0;
strcpy( saveas_name, "" );
strcpy( last_proctok, "" );
strcpy( procname, "" );
strcpy( clonelist, "" );
/* proc line initializations.. */
PLL.nobj = 0;
PLL.nlines = nlhold = 0;
execline_init = 1;
}
if( PLS.skipout ) return( 1 ); /* a major error has occured; don't process any more lines.. just return */
buflen = strlen( line );
/* remove newlines cr/lf and trailing whitespace from every line... added scg 11/9/07 */
for( i = buflen-1; i >= 0; i-- ) if ( !isspace( (int) line[i] )) break;
line[i+1] = '\0';
buflen = i+1;
/* was... */
/* if( line[ buflen-1 ] == '\n' ) { line[ buflen-1 ] = '\0'; buflen--; } */ /* don't keep trailing newline.. */
/* if( line[ buflen-1 ] == 13 ) { line[ buflen-1] = '\0'; buflen--; } */ /* DOS LF */
ix = 0;
/* get first token in line.. changed to handle potentially long lines having no whitespace eg. long CSV data lines .. scg 10/25/07 */
strncpy( buf2, line, 40 ); buf2[40] = '\0';
strcpy( firsttok, GL_getok( buf2, &ix ) );
if( PLS.echolines && strcmp( firsttok, "#ifspec" )!= 0 ) {
if( prevlineblank && firsttok[0] == '\0' ); /* multiple blank lines.. don't output */
else if( PLS.echolines == 1 ) { printf( "%s\n", line ); fflush( stdout ); }
else if( PLS.echolines == 2 ) { fprintf( PLS.diagfp, "%s\n", line ); fflush( PLS.diagfp ); }
if( firsttok[0] == '\0' ) prevlineblank = 1;
else prevlineblank = 0;
}
/* intercept #endproc.. */
endproc = 0;
if( strcmp( firsttok, "#endproc" )==0 ) {
strcpy( firsttok, "#proc" );
endproc = 1;
/* and add an additional blank line to terminate any last multline item.. */
/* nlines>0 was added .. this caused seg fault on degenerate api case of 0 script lines 5/29/03 */
if( PLL.nlines > 0 && PLL.nlines < PLL.maxproclines-1 ) {
PLL.procline[ PLL.nlines ] = (char *) malloc( 5 );
strcpy( PLL.procline[ PLL.nlines ], "\n" );
(PLL.nlines)++;
}
}
/*** #proc(def): get ready to capture next proc, and execute the proc that has just been read... */
if( strncmp( firsttok, "#proc", 5 )==0 && !lastbs ) { /* #proc or #procdef break */
procstat = 0;
/* if #saveas was used, record the name.. */
if( saveas_name[0] != '\0' ) strcpy( PLL.objname[ PLL.nobj ], saveas_name );
/* get line count.. */
PLL.objlen[ PLL.nobj ] = PLL.nlines - nlhold;
/* if not first time around, and #proc was used (as opposed to #procdef), execute proc.. */
if( strcmp( last_proctok, "#proc" )==0 ) {
/* proc page can do the Einit, or we can do it here.. */
if( strcmp( procname, "page" )==0 ) PLS.eready = 1;
if( !PLS.eready && !GL_slmember( procname, NONDRAWINGPROCS )) {
stat = Einit( PLS.device );
if( stat ) { PLS.skipout = 1; return( stat ); }
Epaper( PLS.landscape );
PLS.eready = 1;
/* we are ready to draw.. safe to say page 1.. scg 11/28/00 */
if( strcmp( procname, "page" )!=0 ) PLS.npages = 1;
if( PLS.bkcolorgiven ) {
/* EPS color=transparent - best to do nothing.. scg 1/10/00*/
if( PLS.device == 'e' && strcmp( Ecurbkcolor, "transparent" )==0 ) ;
else Eclr();
}
}
/* execute the appropriate plotting procedure... */
procstat = proc_call( procname );
if( PLS.eready ) Eflush(); /* get output onto screen.. */
}
if( endproc ) strcpy( procname, "endproc" );
else if( sscanf( line, "%*s %s", procname ) < 1 ) {
Eerr( 24, "#proc must be followed by a procedure name", "" );
procstat = 24;
}
/* if we're not told to hold on to the memory (used by getdata), and if
there were no #saveas.., then free the proc lines now..*/
if( !holdmemflag && saveas_name[0] == '\0' ) {
for( i = nlhold; i < PLL.nlines; i++ ) free( PLL.procline[i] );
PLL.nlines = nlhold;
}
else {
if( PLL.nobj >= MAXOBJ-1 ) {
Eerr( 25, "too many active procs - see limitations page MAXOBJ", "" );
procstat = 25;
}
else (PLL.nobj)++;
}
holdmemflag = 0;
strcpy( last_proctok, firsttok );
if( procname[ strlen( procname ) - 1 ] == ':' ) procname[ strlen( procname ) - 1 ] = '\0';
/* initialize to capture next proc */
strcpy( saveas_name, "" );
strcpy( clonelist, "" );
strcpy( PLL.objname[ PLL.nobj ], "" );
PLL.objstart[ PLL.nobj ] = PLL.nlines;
nlhold = PLL.nlines;
return( procstat );
}
/****** for all other lines, get them, and add them to proc line list, looking for
****** special cases such as #clone and #saveas.. */
else {
if( firsttok[0] == '#' && firsttok[1] != '#' ) {
if( strncmp( firsttok, "#clone", 6 ) != 0 &&
strncmp( firsttok, "#saveas", 7 ) != 0 &&
strncmp( firsttok, "#ifspec", 7 ) != 0 ) Eerr( 57468, "unrecognized operator", firsttok );
}
if( procname[0] == '\0' ) return( 0 ); /* ? */
else {
/* add lines to proc line list.. */
/* also look for exceptions such as "#clone" */
if( !lastbs && strncmp( firsttok, "#clone", 6 )==0 ) {
strcpy( clone_name, "" );
sscanf( line, "%*s %s", clone_name );
if( clone_name[0] == '\0' ) {
Eerr( 27, "#clone object name is missing", procname );
return( 1 );
}
strcat( clonelist, clone_name );
strcat( clonelist, " " );
}
else if( !lastbs && strncmp( firsttok, "#saveas", 7 )==0 ) sscanf( line, "%*s %s", saveas_name );
else {
/* #ifspec scg 10/16/03 */
if( !lastbs && strncmp( firsttok, "#ifspec", 7 )==0 ) { /* #ifspec varname [attrname] */
int nt;
char varname[50], attrname[50], val[DATAMAXLEN+1];
nt = sscanf( line, "%*s %s %s", varname, attrname );
if( nt == 1 ) strcpy( attrname, varname );
stat = TDH_getvar( varname, val );
if( stat == 0 && val[0] != '\0' ) {
sprintf( line, " %s: %s", attrname, val );
if( PLS.echolines == 1 ) printf( "%s\n", line );
else if( PLS.echolines == 2 ) fprintf( PLS.diagfp, "%s\n", line );
}
else strcpy( line, "" );
buflen = strlen( line );
}
PLL.procline[ PLL.nlines ] = (char *) malloc( buflen+1 );
strncpy( PLL.procline[ PLL.nlines ], line, buflen );
PLL.procline[ PLL.nlines ][ buflen ] = '\0';
if( PLL.nlines >= PLL.maxproclines-1 ) {
PLS.skipout = 1; /* this is severe enough to abort mission.. */
return( err( 28, "Script file - too many lines in current proc plus saved procs; try raising -maxproclines", "" ));
}
(PLL.nlines)++;
if( line[ buflen - 2 ] == '\\' ) lastbs = 1;
else lastbs = 0;
}
}
return( 0 );
}
}
/* ========================= */
/* HOLDMEM - allow other modules to tell execline() to not free the lines
for the current proc.. Used by getdata.
*/
int
PL_holdmem( stat )
int stat;
{
holdmemflag = stat;
return( 0 );
}
/* ========================= */
/* PROC_CALL - call the appropriate proc routine */
static int proc_call( procname )
char *procname;
{
int stat;
int n;
stat = 0;
initproc(); /* initialize attribute malloc stuff for this proc (see below) */
if( PLS.debug ) {
if( strcmp( procname, "endproc" )==0 ) { fprintf( PLS.diagfp, "(endproc)\n" ); fflush( PLS.diagfp ); }
else fprintf( PLS.diagfp, "Executing %s\n", procname ); fflush( PLS.diagfp );
}
if( strcmp( procname, "areadef" )==0 ) {
stat = PLP_areadef();
if( stat != 0 ) {
PLS.skipout = 1;
return( Eerr( 10, "cannot set up plotting area .. likely culprits: bad xrange or yrange, or bad area rectangle", "" ));
}
}
else if( strcmp( procname, "page" )==0 ) {
stat = PLP_page();
if( stat ) { PLS.skipout = 1; return( stat ); }
}
else if( strcmp( procname, "xaxis" )==0 ) stat = PLP_axis( 'x', 0 );
else if( strcmp( procname, "yaxis" )==0 ) stat = PLP_axis( 'y', 0 );
else if( strcmp( procname, "getdata" )==0 ) stat = PLP_getdata();
else if( strcmp( procname, "categories" )==0 ) stat = PLP_categories( 0 );
else if( strcmp( procname, "legend" )==0 ) stat = PLP_legend();
else if( strcmp( procname, "bars" )==0 ) stat = PLP_bars();
else if( strcmp( procname, "scatterplot" )==0 ) stat = PLP_scatterplot();
else if( strcmp( procname, "pie" )==0 ) stat = PLP_pie();
else if( strcmp( procname, "lineplot" )==0 ) stat = PLP_lineplot();
else if( strcmp( procname, "rangesweep" )==0 ) stat = PLP_rangesweep();
else if( strcmp( procname, "boxplot" )==0 ) stat = PLP_boxplot();
else if( strcmp( procname, "annotate" )==0 ) stat = PLP_annotate();
else if( strcmp( procname, "processdata" )==0 ) stat = PLP_processdata();
else if( strcmp( procname, "catlines" )==0 ) stat = PLP_catlines();
else if( strcmp( procname, "curvefit" )==0 ) stat = PLP_curvefit();
else if( strcmp( procname, "vector" )==0 ) stat = PLP_vector();
else if( strcmp( procname, "usedata" )==0 ) stat = PLP_usedata();
else if( strcmp( procname, "legendentry" )==0 ) stat = PLP_legendentry();
else if( strcmp( procname, "line" )==0 ) stat = PLP_line();
else if( strcmp( procname, "rect" )==0 ) stat = PLP_rect();
else if( strcmp( procname, "tree" )==0 ) stat = PLP_tree();
else if( strcmp( procname, "venndisk" )==0 ) stat = PLP_venndisk();
else if( strcmp( procname, "pvalue" )==0 ) stat = PLP_pvalue();
else if( strcmp( procname, "settings" )==0 ) stat = PLP_settings();
else if( strcmp( procname, "breakaxis" )==0 ) stat = PLP_breakaxis();
else if( strcmp( procname, "image" )==0 ) stat = PLP_image();
else if( strcmp( procname, "drawcommands" )==0 ) stat = PLP_drawcommands();
else if( strcmp( procname, "tabulate" )==0 ) stat = PLP_tabulate();
else if( strcmp( procname, "symbol" )==0 ) stat = PLP_symbol();
else if( strcmp( procname, "print" )==0 ) stat = PLP_print();
else if( strcmp( procname, "trailer" )==0 ) ; /* do nothing */
else if( strcmp( procname, "endproc" )==0 ) ; /* do nothing */
else if( strcmp( procname, "catslide" )==0 ) stat = PLP_categories( 0 ); /* maps to: proc categories */
else if( strcmp( procname, "transform" )==0 ) stat = PLP_processdata(); /* maps to: proc processdata */
else if( strcmp( procname, "originaldata" )==0 ) stat = PLP_usedata(); /* maps to: proc usedata */
else if( strcmp( procname, "bevelrect" )==0 ) stat = PLP_rect(); /* maps to: proc rect */
else if( strcmp( procname, "import" )==0 ) stat = PLP_image(); /* maps to: proc image */
else if( strcmp( procname, "datesettings" )==0 ) stat = PLP_settings(); /* maps to: proc settings */
else if( strcmp( procname, "rangebar" )==0 ) return( Eerr( 27925, "proc rangebar has been replaced with proc boxplot", "" ) );
else if( strcmp( procname, "defineunits" )==0 ) return( Eerr( 27926, "proc defineunits discontinued; use proc areadef", "xnewunits and ynewunits" ));
else return( Eerr( 101, "procedure name unrecognized", procname ) );
TDH_errprog( "pl" );
if( PLS.eready ) Eflush();
n = report_convmsgcount();
if( PLS.debug && n > 0 ) {
fprintf( PLS.diagfp, "note: pl proc %s encountered %d unplottable data values\n", procname, n );
zero_convmsgcount();
}
return( stat );
}
/* ================================================================= */
/* GETNEXTATTR - serve up the next proc line, or NULL if no more */
/* This function returns a pointer to the proc line, and returns some values in the parameters. */
char *
PL_getnextattr( firsttime, attr, valpos )
int firsttime; /* 1 = first call for proc */
char *attr; /* returned: attribute name */
int *valpos; /* returned: char position in the string returned by this function, where value content begins */
{
static int cloneix, state;
static char *line;
int j, ix, alen;
char clone_name[NAMEMAXLEN];
/* states: 0 = init 1 = getting clone 2 = getting proc 3 = done */
if( firsttime ) { state = 0; cloneix = 0; }
if( state == 3 ) {
line = NULL;
return( line );
}
if( state == 0 ) {
RETRY:
strcpy( clone_name, GL_getok( clonelist, &cloneix ));
if( clone_name[0] != '\0' ) {
/* look up obj in list, starting with latest entry and working backward.. */
for( j = (PLL.nobj)-1; j >= 0; j-- ) if( strcmp( PLL.objname[j], clone_name )==0 ) break;
if( j < 0 ) {
Eerr( 2506, "#clone object not found", clone_name );
goto RETRY;
}
PLL.curline = PLL.objstart[j];
procstop = PLL.objstart[j] + PLL.objlen[j];
state = 1;
}
else {
PLL.curline = PLL.objstart[ PLL.nobj ];
procstop = PLL.nlines;
state = 2;
}
}
if( state == 1 || state == 2 ) {
RETRY2:
if( PLL.curline >= PLL.nlines ) return( NULL );
line = PLL.procline[ PLL.curline ];
ix = 0;
strncpy( attr, GL_getok( line, &ix ), 38 ); /* get 1st token (truncate at 38 chars) */
attr[38] = '\0';
if( attr[0] == '\0' ) { /* blank line.. skip */
(PLL.curline)++;
if( PLL.curline >= procstop && state == 1 ) { state = 0; goto RETRY; }
else if( PLL.curline >= procstop && state == 2 ) { state = 3; return( NULL ); }
else goto RETRY2;
}
alen = strlen( attr );
if( attr[ alen-1 ] == ':' ) attr[ alen-1 ] = '\0';
if( attr[0] != '\0' ) while( isspace( (int) line[ix] )) ix++; /* skip over ws */
*valpos = ix;
PLL.curline++;
if( PLL.curline >= procstop ) {
if( state == 1 ) state = 0;
else state = 3;
}
return( line );
}
return( NULL );
}
/* ================================================================= */
/* GETMULTILINE - get a multi-line text item from script file. Terminates when first empty line is encountered.
If mode == "get", sufficient memory is malloc'ed, the text is copied into it, and function returns pointer to text.
If mode == "skip", we simply advance to the end of the multiline text (see proc_getdata)
*/
char *
PL_getmultiline( firstline, mode )
char *firstline; /* first row of data, without attribute name */
char *mode; /* either "get" or "skip" */
{
char *line;
int i, iline;
int txtlen, txtstartline, txtstopline, memlen, emptyline;
txtstartline = PLL.curline;
/* first, scan thru all rows to get count of total # chars... */
txtlen = strlen( firstline );
/* go until we hit an empty line, or reach end of proc.. */
for( iline = txtstartline; iline <= procstop ; iline++ ) {
line = PLL.procline[ iline ];
for( i = 0, emptyline = 1; line[i] != '\0'; i++ ) if( !isspace( (int) line[i] )) { emptyline = 0; break; }
if( emptyline ) break;
if( mode[0] == 'g' ) txtlen += (strlen( &line[i] ) + 2); /* mode = "get", accumulate length sans leading ws */
}
/* remember where we stopped.. */
txtstopline = iline;
PLL.curline = iline; /* so scanner can resume at the right place.. */
if( mode[0] == 's' ) return( 0 ); /* mode = "skip" */
mem = malloc( txtlen+2 * sizeof( char *) );
if( mem == (char *)NULL ) { PLS.skipout = 1; Eerr( 27509, "multiline malloc failed", "" ); return( "" ); }
malloclist[nfl++] = mem;
memlen = 0;
/* copy first line content.. */
for( i = 0; firstline[i] != '\0'; i++ ) if( !isspace( (int) firstline[i] )) break; /* skip leading ws */
if( firstline[i] != '\0' ) {
sprintf( mem, "%s\n", &firstline[i] );
memlen = strlen( &firstline[i] ) + 1;
}
/* now fill mem.. */
for( iline = txtstartline; iline < txtstopline && iline <= procstop; iline++ ) {
line = PLL.procline[ iline ];
/* skip over leading whitespace as well as any leading backslash.. */
for( i = 0; line[i] != '\0'; i++ ) if( !isspace( (int) line[i] )) break;
if( line[i] == '\\' ) i++;
strcpy( &mem[memlen], &line[i] );
memlen += strlen( &line[i] );
mem[ memlen++ ] = '\n';
mem[ memlen ] = '\0';
}
return( mem );
}
/* ========================================= */
/* TOKNCPY - copy 1st token of lineval into val, up to maxlen (maxlen should be same as var declaration size) */
int
PL_tokncpy( val, lineval, maxlen )
char *val, *lineval;
int maxlen;
{
int i;
for( i = 0; i < maxlen-1; i++ ) {
if( (lineval[i]=='\0') || isspace( (int)lineval[i] )) break;
/* was: if isspace( (int)lineval[i] )) break; */
val[i] = lineval[i];
}
val[i] = '\0';
if( i == (maxlen-1) ) return( 1 );
else return( 0 );
}
/* ======================================== */
/* ITOKNCOPY - do tokncpy and convert to integer using atoi() */
int
PL_itokncpy( lineval )
char *lineval;
{
char val[80];
tokncpy( val, lineval, 80 );
return( atoi( val ) );
}
/* ======================================== */
/* FTOKNCOPY - do tokncpy and convert to float using atof() */
double
PL_ftokncpy( lineval )
char *lineval;
{
char val[80];
tokncpy( val, lineval, 80 );
return( atof( val ) );
}
#ifdef HOLD
/* ========================================= */
/* NEWATTR - malloc some memory for an attribute value, and copy the attribute value into it. */
char *
PL_newattr( lineval, len )
char *lineval;
int len;
{
if( nfl >= MAXMALLOCATTRS-1 ) { PLS.skipout = 1; Eerr( 29, "too many malloced attributes in this proc", "" ); return( "" ); }
if( len < 1 ) len = strlen( lineval );
mem = malloc( len+2 * sizeof( char *) );
if( mem == (char *)NULL ) { PLS.skipout = 1; Eerr( 27508, "newattr malloc failed", "" ); return( "" ); }
malloclist[nfl++] = mem;
strncpy( mem, lineval, len );
mem[len] = '\0';
return( mem );
}
#endif
/* =========================================== */
/* INITPROC - free all currently malloc'ed attr memory (if any) and initialize for next proc */
static int
initproc()
{
int i;
for( i = 0; i < nfl; i++ ) free( malloclist[i] );
nfl = 0;
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_drawcommands.c 0000644 0001750 0001750 00000013624 11153556147 016750 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC DRAWCOMMANDS - execute a list of draw commands */
#include "pl.h"
extern int unlink();
static int do_drawcommands();
int
PLP_drawcommands()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
char buf[1024], op[80];
char *dcfile, *dumpfile, *commands;
int ix, len;
double x, y;
FILE *fp;
TDH_errprog( "pl proc drawcommands" );
/* initialize */
dcfile = "";
dumpfile = "";
commands = "";
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "file" )==0 ) dcfile = lineval;
else if( strcmp( attr, "dumpfile" )==0 ) dumpfile = lineval;
else if( strcmp( attr, "commands" )==0 ) commands = getmultiline( lineval, "get" );
else Eerr( 1, "attribute not recognized", attr );
}
/* -------------------------- */
/* now do the plotting work.. */
/* -------------------------- */
if( commands[0] != '\0' ) {
sprintf( buf, "%s_Z", PLS.tmpname );
fp = fopen( buf, "w" ); /* temp file, unlinked below */
if( fp == NULL ) return( Eerr( 522, "Cannot open draw commands file", buf ));
fprintf( fp, "%s\n", commands );
fclose( fp );
do_drawcommands( buf );
unlink( buf );
}
else if( dcfile[0] != '\0' ) do_drawcommands( dcfile );
else if( dumpfile[0] != '\0' ) {
fp = fopen( dumpfile, "r" );
if( fp == NULL ) return( Eerr( 523, "Cannot open dump file", dumpfile ) );
while( fgets( buf, 1023, fp ) != NULL ) {
len = strlen( buf );
buf[ len-1 ] = '\0';
ix = 0;
strcpy( op, GL_getok( buf, &ix ));
if( op[0] == 'A' ) { PLG_setdefaults(); continue; } /* added scg 5/24/07 */
x = atof( GL_getok( buf, &ix ));
y = atof( GL_getok( buf, &ix ));
if( buf[ix] == ' ' ) ix++;
PLG_pcode( op[0], x, y, &buf[ix] );
}
fclose( fp );
}
return( 0 );
}
/* ===================================== */
/* DO_DRAWCOMMANDS - draw commands interpreter.
The commands follow the structure of the API,
except that movs lins and paths are used instead of movu, linu, and pathu
*/
static int
do_drawcommands( filename )
char *filename;
{
FILE *fp;
char buf[512];
int nt;
char op[80];
double x, y;
int oldtextsize;
char oldcolor[COLORLEN];
int oldlinetype;
double oldlinewidth, oldpatfact;
char sx[80], sy[80];
if( filename[0] == '\0' ) return( 0 );
if( strcmp( filename, "stdin" )==0 ) fp = stdin;
else fp = fopen( filename, "r" );
if( fp == NULL ) return( Eerr( 5737, "cannot open draw commands file", filename ) );
oldtextsize = Ecurtextsize;
strcpy( oldcolor, Ecurcolor );
oldlinetype = Ecurlinetype;
oldlinewidth = Ecurlinewidth;
oldpatfact = Ecurpatternfactor;
Etextsize( 12 );
Ecolor( "black" );
Elinetype( 0, 1.0, 1.0 );
while( fgets( buf, 511, fp ) != NULL ) {
buf[ strlen( buf ) - 1 ] = '\0';
nt = sscanf( buf, "%s %lf %lf", op, &x, &y );
if( PLS.usingcm ) { x /= 2.54; y /= 2.54; } /* added scg 8/8/05 */
if( nt < 1 ) continue; /* blank line */
if( op[0] == '/' && op[1] == '/' ) continue; /* comment */
if( GL_smember( op, "mov lin" ) && nt != 3 ) {
if( nt != 6 ) Eerr( 2582, "error in drawcommands", buf );
continue;
}
if( strcmp( op, "mov" )==0 ) Emov( x, y );
else if( strcmp( op, "lin" )==0 ) Elin( x, y );
else if( strcmp( op, "text" )==0 ) {
convertnl( &buf[5] );
Etext( &buf[5] );
}
else if( strcmp( op, "path" )==0 ) Epath( x, y );
else if( GL_smember( op, "movs lins paths" )) { /* scaled space operators */
sscanf( buf, "%*s %s %s", sx, sy );
if( op[0] == 'm' ) Emov( PL_u(X, sx ), PL_u(Y, sy ) );
else if( op[0] == 'l' ) Elin( PL_u(X, sx ), PL_u(Y, sy ) );
else if( op[0] == 'p' ) Epath( PL_u(X, sx ), PL_u(Y, sy ) );
}
else if( GL_smember( op, "movp linp pathp" )) { /* posex operators */
sscanf( buf, "%*s %s %s", sx, sy );
Eposex( sx, X, &x );
Eposex( sy, Y, &y );
/* posex() handles usingcm.. */
if( op[0] == 'm' ) Emov( x, y );
else if( op[0] == 'l' ) Elin( x, y );
else if( op[0] == 'p' ) Epath( x, y );
}
else if( strcmp( op, "fill" )==0 ) Efill();
else if( strcmp( op, "centext" )==0 ) {
convertnl( &buf[8] );
Ecentext( &buf[8] );
}
else if( strcmp( op, "rightjust" )==0 ) {
convertnl( &buf[10] );
Erightjust( &buf[10] );
}
else if( strcmp( op, "cblock" )==0 ) {
double x2, y2;
char color[COLORLEN], sx2[40], sy2[40];
int outline;
nt = sscanf( buf, "%*s %s %s %s %s %s %d", sx, sy, sx2, sy2, color, &outline );
Eposex( sx, X, &x ); /* changed to use posex - scg 8/8/05 */
Eposex( sy, Y, &y );
Eposex( sx2, X, &x2 );
Eposex( sy2, Y, &y2 );
if( nt != 6 ) Eerr( 2849, "drawfile error on this line", buf );
else Ecblock( x, y, x2, y2, color, outline );
}
else if( strcmp( op, "color" )==0 ) Ecolor( &buf[6] );
else if( strcmp( op, "textsize" )==0 ) Etextsize( atoi( &buf[9] ) );
else if( strcmp( op, "linetype" )==0 ) {
double z;
sscanf( buf, "%*s %*s %*s %lf", &z );
Elinetype( (int)x, y, z );
}
else if( strcmp( op, "mark" )==0 ) {
char sym[80];
double r;
sscanf( buf, "%*s %s %s %s %lf", sx, sy, sym, &r );
Eposex( sx, X, &x );
Eposex( sy, Y, &y );
Emark( x, y, sym, r );
}
else if( strcmp( op, "clr" )==0 ) Eclr(); /* allow? */
else if( strcmp( op, "bkcolor" )==0 ) Ebackcolor( &buf[8] ); /* persist? */
}
if( strcmp( filename, "stdin" )!= 0 ) fclose( fp );
Eflush();
/* restore previous settings.. */
Ecolor( oldcolor );
Etextsize( oldtextsize );
Elinetype( oldlinetype, oldlinewidth, oldpatfact );
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/Copyright 0000644 0001750 0001750 00000017403 11543142047 014765 0 ustar colin colin #set TITLE = "copyright and license"
#include top
.ig >>
== Begin ploticus 2.41 copyright notice ==
ploticus 2.41 data display software.
Copyright 1998-2009 Stephen C. Grubb
The home page for PLOTICUS is http://ploticus.sourceforge.net
The source code, binaries for some platforms, documentation, and examples
may be freely downloaded from that site.
About the author
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
A copy of the GNU General Public License should be present with the code, in
file GPL.txt. A copy of the GNU General Public License may also be obtained
from: Free Software Foundation, Inc., 51 Franklin St - Fifth Floor,
Boston, MA 02110-1301, USA.
Clarifications:
The following clarifications are based on my understanding of the GPL.
In case of contradiction, the GPL is the final authority on all of these
matters.
Q1. Can I make modifications to ploticus code?
Yes, but any derivatives must be made freely available as GPL code.
This is because your modifications might be good ones that would be useful to
the ploticus user community. This makes things fair for all the developers
who have contributed to ploticus code thus far.
You must keep the GPL.txt and Copyright files intact in the source code
directory (add your own "Modifications made by" language to the top of
the Copyright file). It must be stated in an end-user-accessible copyright or
acknowledgements area that the package is "a GPL derivative of Ploticus
data display engine (c) 1998-2009 Stephen Grubb, freely available from
http://ploticus.sourceforge.net". I request notification of the availability
of all such derivatives (stevegrubb@gmail.com) so that I can link to them from
the ploticus home page and consider possible inclusion in the main fork.
Q2. Can ploticus be used as part of a commercial (for-profit) product or service?
The GPL allows you to use ploticus to produce graphs for any lawful commercial or
noncommercial purpose, including providing services (automated or by hand) for a fee.
For example, there's no problem with executing a standard unmodified version of ploticus
on your server to produce graphs as part of a fee-based service.
Q3. Can ploticus be included/distributed as part of a non-GPL product?
Selling or distributing ploticus as a non-GPL product offering is prohibited.
Combining or intermingling of ploticus source code with non-GPL source code is
prohibited (thus the libploticus API cannot be used in this context).
However it is possible to distribute ploticus "along side of" non-GPL code if it is
partitioned ("kept at arm's length") from the non-GPL code. The GPL addresses this issue
here.
Partitioning is likely to be sufficient if all of these conditions are met:
1) ploticus (or GPL derivative) must be invoked as an executable, not via the libploticus API;
2) your product must be viable in its own right and essentially usable with or without ploticus;
3) ploticus-supported graphics capability may not be sold as an additional cost option;
4) if you've made modifications to the ploticus code you must abide by section Q1 above.
5) ploticus source code is kept in a separate directory, and the GPL.txt and Copyright files therein kept intact;
6) ploticus identity and authorship must be clearly stated and visible.
It must be stated in a end-user-accessible copyright or acknowledgements area that the product
utilizes "Ploticus data display engine (c) 1998-2009 Stephen Grubb, GPL, freely available
from http://ploticus.sourceforge.net".
I request notification of the availability of all such products (stevegrubb@gmail.com)so that
I can monitor compliance and link to them from the ploticus home page.
If you have questions or need clarification please contact me (stevegrubb@gmail.com) ....
I take an active interest in seeing that these rules are
adhered to, and request notification of any suspected violations.
Q4. How should ploticus be cited if it was used in the production of a published work?
Citation is always appreciated. Language like this is suggested:
Graphical data displays were produced using Ploticus software (ploticus.sf.net).
Q5. Can I deploy a mirror copy of the ploticus web site, or of a portion?
Yes, provided you include a prominent link back to the original site (ploticus.sourceforge.net)
Q6. Can I produce language translations of ploticus manual pages and put them on the web?
Yes, provided you include a prominent link back to the original page on ploticus.sourceforge.net.
Please also include the translator's name near the top of the page, and mention
that the translated page has not been reviewed in any way by the original author.
== end of clarifications ==
SVG driver copyright 2001 Bill Traill bill@traill.demon.co.uk
SWF driver copyright 2003 Bill Traill bill@traill.demon.co.uk
Ploticus generates PNG and run-length-encoded GIF-compatible
output using portions of Thomas Boutell's gd library versions
1.6.3 and 1.3. ploticus does not read GIF files.
GD 1.6.3 and 1.3 (www.boutell.com) carry the following statements:
|
| Portions copyright 1994, 1995, 1996, 1997, 1998, 1999 by
| Cold Spring Harbor Laboratory. Funded under Grant
| P41-RR02188 by the National Institutes of Health.
|
| Portions copyright 1996, 1997, 1998, 1999, by Boutell.Com, Inc.
|
| Portions relating to GD2 format copyright 1999 Philip Warner.
|
| Portions relating to PNG copyright 1999, Greg Roelofs.
|
| Portions relating to libttf copyright 1999, John Ellson
| (ellson@lucent.com).
|
| (Although his LZW compression code no longer appears
| in gd, the authors wish to thank David Rowley for the
| original LZW-based GIF compression code, which has been
| removed due to patent concerns.)
|
| Non-LZW-based GIF compression code copyright 1998, by
| Hutchison Avenue Software Corporation (http://www.hasc.com/,
| info@hasc.com).
|
| Permission has been granted to copy and distribute gd
| in any context, including a commercial application,
| provided that this notice is present in user-accessible
| supporting documentation.
|
| This does not affect your ownership of the derived work
| itself, and the intent is to assure proper credit for the
| authors of gd, not to interfere with your productive use
| of gd. If you have questions, ask. "Derived works" includes
| all programs that utilize the library. Credit must be
| given in user-accessible documentation.
|
| Permission to use, copy, modify, and distribute gd
| and its documentation for any purpose and without fee is
| hereby granted, provided that the above copyright notice
| appear in all copies and that both that copyright notice
| and this permission notice appear in supporting documentation.
| This software is provided "as is" without express or implied
| warranty.
|
== End of ploticus 2.41 Copyright Notice ==
.>>
#include bottom
ploticus-2.42/src/test.pl 0000644 0001750 0001750 00000000107 07573126504 014407 0 ustar colin colin
#proc areadef
rectangle: 3 4 6 7
xrange: 0 10
yrange: 0 10
frame: yes
ploticus-2.42/src/gd_png.c 0000644 0001750 0001750 00000052034 11343276215 014476 0 ustar colin colin #include
#include
#include
#include
#include "gd.h"
#include "png.h" /* includes zlib.h and setjmp.h */
#define TRUE 1
#define FALSE 0
/*---------------------------------------------------------------------------
gd_png.c Copyright 1999 Greg Roelofs and Thomas Boutell
The routines in this file, gdImagePng*() and gdImageCreateFromPng*(),
are drop-in replacements for gdImageGif*() and gdImageCreateFromGif*(),
except that these functions are noisier in the case of errors (comment
out all fprintf() statements to disable that).
Only GIF-like PNG features are currently supported; that is, images must
either be indexed-color to begin with or they will be converted to it,
and they can have, at most, a single, fully transparent palette entry or
color. (Alpha channels are ignored.) Since gd images are artificially
generated, gamma is also ignored, and there is currently no support for
embedded text annotations (a la GIF comments) in gd.
Last updated: 19 July 1999
---------------------------------------------------------------------------*/
typedef struct _jmpbuf_wrapper {
jmp_buf jmpbuf;
} jmpbuf_wrapper;
static jmpbuf_wrapper gdPngJmpbufStruct;
static void gdPngErrorHandler(png_structp png_ptr, png_const_charp msg)
{
jmpbuf_wrapper *jmpbuf_ptr;
/* This function, aside from the extra step of retrieving the "error
* pointer" (below) and the fact that it exists within the application
* rather than within libpng, is essentially identical to libpng's
* default error handler. The second point is critical: since both
* setjmp() and longjmp() are called from the same code, they are
* guaranteed to have compatible notions of how big a jmp_buf is,
* regardless of whether _BSD_SOURCE or anything else has (or has not)
* been defined. */
fprintf(stderr, "gd-png: fatal libpng error: %s\n", msg);
fflush(stderr);
jmpbuf_ptr = png_get_error_ptr(png_ptr);
if (jmpbuf_ptr == NULL) { /* we are completely hosed now */
fprintf(stderr,
"gd-png: EXTREMELY fatal error: jmpbuf unrecoverable; terminating.\n");
fflush(stderr);
exit(99);
}
longjmp(jmpbuf_ptr->jmpbuf, 1);
}
static void gdPngReadData(png_structp png_ptr,
png_bytep data, png_size_t length)
{
gdGetBuf(data, length, (gdIOCtx *)
png_get_io_ptr(png_ptr));
}
static void gdPngWriteData(png_structp png_ptr,
png_bytep data, png_size_t length)
{
gdPutBuf(data, length, (gdIOCtx *)
png_get_io_ptr(png_ptr));
}
static void gdPngFlushData(png_structp png_ptr)
{
}
gdImagePtr gdImageCreateFromPng(FILE *inFile)
{
gdImagePtr im;
gdIOCtx *in = gdNewFileCtx(inFile);
im = gdImageCreateFromPngCtx(in);
in->free(in);
return im;
}
/* This routine is based in part on the Chapter 13 demo code in "PNG: The
* Definitive Guide" (http://www.cdrom.com/pub/png/pngbook.html).
*/
gdImagePtr gdImageCreateFromPngCtx(gdIOCtx *infile)
{
png_byte sig[8];
png_structp png_ptr;
png_infop info_ptr;
png_uint_32 width, height, rowbytes;
int bit_depth, color_type, interlace_type;
int num_palette, num_trans;
png_colorp palette;
png_color_16p trans_gray_rgb;
png_bytep trans;
png_bytep image_data = NULL;
png_bytepp row_pointers = NULL;
gdImagePtr im = NULL;
int i, j, *open;
volatile int transparent = -1;
volatile int palette_allocated = FALSE;
/* Make sure the signature can't match by dumb luck -- TBB */
/* GRR: isn't sizeof(infile) equal to the size of the pointer? */
memset(infile, 0, sizeof(infile));
/* first do a quick check that the file really is a PNG image; could
* have used slightly more general png_sig_cmp() function instead */
gdGetBuf(sig, 8, infile);
#ifdef CUT
/* png_check_sig() has been removed from libpng... hopefully we don't need it ... scg */
if (!png_check_sig(sig, 8))
return NULL; /* bad signature */
#endif
png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, &gdPngJmpbufStruct,
gdPngErrorHandler, NULL);
if (png_ptr == NULL) {
fprintf(stderr, "gd-png error: cannot allocate libpng main struct\n");
return NULL;
}
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL) {
fprintf(stderr, "gd-png error: cannot allocate libpng info struct\n");
png_destroy_read_struct(&png_ptr, NULL, NULL);
return NULL;
}
/* we could create a second info struct here (end_info), but it's only
* useful if we want to keep pre- and post-IDAT chunk info separated
* (mainly for PNG-aware image editors and converters) */
/* setjmp() must be called in every non-callback function that calls a
* PNG-reading libpng function */
if (setjmp(gdPngJmpbufStruct.jmpbuf)) {
fprintf(stderr, "gd-png error: setjmp returns error condition\n");
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return NULL;
}
png_set_sig_bytes(png_ptr, 8); /* we already read the 8 signature bytes */
png_set_read_fn(png_ptr, (void *)infile, gdPngReadData);
png_read_info(png_ptr, info_ptr); /* read all PNG info up to image data */
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type,
&interlace_type, NULL, NULL);
if (bit_depth == 16)
png_set_strip_16(png_ptr);
else if (bit_depth < 8)
png_set_packing(png_ptr); /* expand to 1 byte per pixel */
if (color_type & PNG_COLOR_MASK_ALPHA) {
fprintf(stderr, "gd-png warning: alpha channel not supported\n");
png_set_strip_alpha(png_ptr);
}
switch (color_type) {
case PNG_COLOR_TYPE_PALETTE:
png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette);
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
int real_num_trans = 0, idx_first_trans = -1;
int min_trans = 256, idx_min_trans = -1;
png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL);
for (i = 0; i < num_trans; ++i) {
if (trans[i] < 255) {
++real_num_trans;
if (idx_first_trans < 0)
idx_first_trans = i;
if (trans[i] < min_trans) {
min_trans = trans[i];
idx_min_trans = i;
}
}
}
if (real_num_trans > 0) {
if (real_num_trans > 1 || trans[idx_first_trans] != 0) {
fprintf(stderr, "gd-png warning: only single-color, "
"100%% transparency supported\n");
transparent = idx_min_trans;
} else {
transparent = idx_first_trans;
}
}
}
break;
case PNG_COLOR_TYPE_GRAY:
case PNG_COLOR_TYPE_GRAY_ALPHA:
/* create a fake palette and check for single-shade transparency */
if ((palette = (png_colorp)malloc(256*sizeof(png_color))) == NULL) {
fprintf(stderr, "gd-png error: cannot allocate gray palette\n");
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return NULL;
}
palette_allocated = TRUE;
num_palette = 256;
for (i = 0; i < 256; ++i) {
palette[i].red = palette[i].green = palette[i].blue = i;
}
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
png_get_tRNS(png_ptr, info_ptr, NULL, NULL, &trans_gray_rgb);
if (bit_depth == 16) /* png_set_strip_16() not yet in effect */
transparent = trans_gray_rgb->gray >> 8;
else
transparent = trans_gray_rgb->gray;
/* Note slight error in 16-bit case: up to 256 16-bit shades
* may get mapped to a single 8-bit shade, and only one of them
* is supposed to be transparent. IOW, both opaque pixels and
* transparent pixels will be mapped into the transparent entry.
* There is no particularly good way around this in the case
* that all 256 8-bit shades are used, but one could write some
* custom 16-bit code to handle the case where there are free
* palette entries. This error will be extremely rare in
* general, though. (Quite possibly there is only one such
* image in existence.) */
}
break;
case PNG_COLOR_TYPE_RGB:
case PNG_COLOR_TYPE_RGB_ALPHA:
/* allocate a palette and check for single-shade transparency */
if ((palette = (png_colorp)malloc(256*sizeof(png_color))) == NULL) {
fprintf(stderr, "gd-png error: cannot allocate RGB palette\n");
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return NULL;
}
palette_allocated = TRUE;
num_palette = 256;
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) {
png_get_tRNS(png_ptr, info_ptr, NULL, NULL, &trans_gray_rgb);
if (bit_depth == 16) { /* png_set_strip_16() not yet active */
palette[0].red = trans_gray_rgb->red >> 8;
palette[0].green = trans_gray_rgb->green >> 8;
palette[0].blue = trans_gray_rgb->blue >> 8;
} else {
palette[0].red = trans_gray_rgb->red;
palette[0].green = trans_gray_rgb->green;
palette[0].blue = trans_gray_rgb->blue;
}
transparent = 0;
/* Note that the same error exists in the 16-bit RGB case as in
* the grayscale case, except that the degeneracy is now 16.8
* million to 1 (at a minimum--actually more than that due to
* quantization). Again, this is an extremely rare problem.
* Unfortunately, it also affects 8-bit-per-sample RGB images
* (quantization), unless libpng is doing something sneaky... */
} else {
palette[0].red = palette[0].green = palette[0].blue = 224;
}
#if 0 /* libpng.txt demo code looks broken--need to check both PLTE and hIST */
if (png_get_valid(png_ptr, info_ptr, PNG_INFO_PLTE)) {
png_color_16p histogram;
png_get_hIST(png_ptr, info_ptr, &histogram);
png_set_dither(png_ptr, palette, num_palette,
max_screen_colors, histogram, 1);
} else
#endif
{
int idx, red, green, blue;
#ifdef PALETTE_6x7x6
/* allocate a 6x7x6 color cube, starting at index 4 */
idx = 4;
for (red = 0; red < 256; red += 51) {
for (i = 0; i < 7; ++i) {
green = (i * 425) / 10; /* i.e., 42.5 */
for (blue = 0; blue < 256; blue += 51) {
palette[idx].red = red;
palette[idx].green = green;
palette[idx].blue = blue;
++idx;
}
}
}
/* fill in remaining entries (1-3) with common gray values */
palette[1].red = palette[1].green = palette[1].blue = 192;
palette[2].red = palette[2].green = palette[2].blue = 128;
palette[3].red = palette[3].green = palette[3].blue = 64;
/* final argument (full_dither) *must* be 1: */
png_set_dither(png_ptr, palette, 256, 256, NULL, 1);
#else
/* allocate a 6x6x6 color cube, starting at index 0 or 1 */
idx = (transparent < 0)? 0 : 1;
for (red = 0; red < 256; red += 51) {
for (green = 0; green < 256; green += 51) {
for (blue = 0; blue < 256; blue += 51) {
palette[idx].red = red;
palette[idx].green = green;
palette[idx].blue = blue;
++idx;
}
}
}
/* png_set_dither(png_ptr, palette, idx, idx, NULL, 1); .... n/a in my libpng.a build.. hopefully not needed.. scg */
#endif
}
break;
}
png_read_update_info(png_ptr, info_ptr);
/* allocate space for the PNG image data */
rowbytes = png_get_rowbytes(png_ptr, info_ptr);
if ((image_data = (png_bytep)malloc(rowbytes*height)) == NULL) {
fprintf(stderr, "gd-png error: cannot allocate image data\n");
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return NULL;
}
if ((row_pointers = (png_bytepp)malloc(height*sizeof(png_bytep))) == NULL) {
fprintf(stderr, "gd-png error: cannot allocate row pointers\n");
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
free(image_data);
return NULL;
}
/* set the individual row_pointers to point at the correct offsets */
for (j = 0; j < height; ++j) {
row_pointers[j] = image_data + j*rowbytes;
}
png_read_image(png_ptr, row_pointers); /* read whole image... */
png_read_end(png_ptr, NULL); /* ...done! */
if ((im = gdImageCreate((int)width, (int)height)) == NULL) {
fprintf(stderr, "gd-png error: cannot allocate gdImage struct\n");
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
free(image_data);
free(row_pointers);
return NULL;
}
im->colorsTotal = num_palette;
im->transparent = transparent;
im->interlace = (interlace_type == PNG_INTERLACE_ADAM7);
/* load the palette and mark all entries "open" (unused) for now */
open = im->open;
for (i = 0; i < num_palette; ++i) {
im->red[i] = palette[i].red;
im->green[i] = palette[i].green;
im->blue[i] = palette[i].blue;
open[i] = 1;
}
for (i = num_palette; i < gdMaxColors; ++i) {
open[i] = 1;
}
/* can't nuke structs until done with palette */
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
/* could copy data with memcpy(), but also want to check colormap entries */
for (j = 0; j < height; ++j) {
for (i = 0; i < width; ++i) {
register png_byte idx = row_pointers[j][i];
im->pixels[j][i] = idx;
open[idx] = 0;
}
}
#ifdef DEBUG
for (i = num_palette; i < gdMaxColors; ++i) {
if (!open[i]) {
fprintf(stderr, "gd-png warning: image data references out-of-range"
" color index (%d)\n", i);
}
}
#endif
if (palette_allocated)
free(palette);
free(image_data);
free(row_pointers);
return im;
}
void gdImagePng(gdImagePtr im, FILE *outFile)
{
gdIOCtx *out = gdNewFileCtx(outFile);
gdImagePngCtx(im, out);
out->free(out);
}
void* gdImagePngPtr(gdImagePtr im, int *size)
{
void *rv;
gdIOCtx *out = gdNewDynamicCtx(2048, NULL);
gdImagePngCtx(im, out);
rv = gdDPExtractData(out, size);
out->free(out);
return rv;
}
/* This routine is based in part on code from Dale Lutz (Safe Software Inc.)
* and in part on demo code from Chapter 15 of "PNG: The Definitive Guide"
* (http://www.cdrom.com/pub/png/pngbook.html).
*/
void gdImagePngCtx(gdImagePtr im, gdIOCtx *outfile)
{
int i, j, bit_depth, interlace_type;
int width = im->sx;
int height = im->sy;
int colors = im->colorsTotal;
int *open = im->open;
int mapping[gdMaxColors]; /* mapping[gif_index] == png_index */
png_byte trans_value = 0;
png_color palette[gdMaxColors];
png_structp png_ptr;
png_infop info_ptr;
volatile int transparent = im->transparent;
volatile int remap = FALSE;
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
&gdPngJmpbufStruct, gdPngErrorHandler, NULL);
if (png_ptr == NULL) {
fprintf(stderr, "gd-png error: cannot allocate libpng main struct\n");
return;
}
info_ptr = png_create_info_struct (png_ptr);
if (info_ptr == NULL) {
fprintf(stderr, "gd-png error: cannot allocate libpng info struct\n");
png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
return;
}
if (setjmp(gdPngJmpbufStruct.jmpbuf)) {
fprintf(stderr, "gd-png error: setjmp returns error condition\n");
png_destroy_write_struct(&png_ptr, &info_ptr);
return;
}
png_set_write_fn(png_ptr, (void *)outfile, gdPngWriteData, gdPngFlushData);
/* For now gd only supports palette images, for which filter type NONE is
* almost guaranteed to be the best. But that's what libpng defaults to
* for palette images anyway, so no need to set this explicitly. */
/* png_set_filter(png_ptr, 0, PNG_FILTER_NONE); */
/* may want to force maximum compression, but time penalty is large */
/* png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); */
/* can set this to a smaller value without compromising compression if all
* image data is 16K or less; will save some decoder memory [min == 8] */
/* png_set_compression_window_bits(png_ptr, 15); */
if (transparent >= im->colorsTotal ||
(transparent >= 0 && open[transparent]))
transparent = -1;
for (i = 0; i < gdMaxColors; ++i)
mapping[i] = -1;
/* count actual number of colors used (colorsTotal == high-water mark) */
colors = 0;
for (i = 0; i < im->colorsTotal; ++i) {
if (!open[i]) {
mapping[i] = colors;
++colors;
}
}
if (colors < im->colorsTotal) {
remap = TRUE;
if (transparent >= 0)
transparent = mapping[transparent];
}
if (colors <= 2)
bit_depth = 1;
else if (colors <= 4)
bit_depth = 2;
else if (colors <= 16)
bit_depth = 4;
else
bit_depth = 8;
interlace_type = im->interlace? PNG_INTERLACE_ADAM7 : PNG_INTERLACE_NONE;
png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth,
PNG_COLOR_TYPE_PALETTE, interlace_type,
PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
if (transparent >= 0) {
/* always write PNG files with the transparent palette entry first to
* minimize size of the tRNS chunk; swap if necessary */
if (transparent != 0) {
if (!remap) { /* so colors == im->colorsTotal */
remap = TRUE;
for (i = 0; i < colors; ++i)
mapping[i] = i;
}
mapping[transparent] = 0;
mapping[0] = transparent;
}
png_set_tRNS(png_ptr, info_ptr, &trans_value, 1, NULL);
}
/* convert GIF palette to libpng layout */
if (remap)
for (i = 0; i < im->colorsTotal; ++i) {
if (mapping[i] < 0)
continue;
palette[mapping[i]].red = im->red[i];
palette[mapping[i]].green = im->green[i];
palette[mapping[i]].blue = im->blue[i];
}
else
for (i = 0; i < colors; ++i) {
palette[i].red = im->red[i];
palette[i].green = im->green[i];
palette[i].blue = im->blue[i];
}
png_set_PLTE(png_ptr, info_ptr, palette, colors);
/* write out the PNG header info (everything up to first IDAT) */
png_write_info(png_ptr, info_ptr);
/* make sure < 8-bit images are packed into pixels as tightly as possible */
png_set_packing(png_ptr);
/* This code allocates a set of row buffers and copies the gd image data
* into them only in the case that remapping is necessary; in gd 1.3 and
* later, the im->pixels array is laid out identically to libpng's row
* pointers and can be passed to png_write_image() function directly.
* The remapping case could be accomplished with less memory for non-
* interlaced images, but interlacing causes some serious complications. */
if (remap) {
png_bytep *row_pointers;
row_pointers = malloc(sizeof(png_bytep) * height);
if (row_pointers == NULL) {
fprintf(stderr, "gd-png error: unable to allocate row_pointers\n");
}
for (j = 0; j < height; ++j) {
if ((row_pointers[j] = (png_bytep)malloc(width)) == NULL) {
fprintf(stderr, "gd-png error: unable to allocate rows\n");
for (i = 0; i < j; ++i)
free(row_pointers[i]);
return;
}
for (i = 0; i < width; ++i)
row_pointers[j][i] = mapping[im->pixels[j][i]];
}
png_write_image(png_ptr, row_pointers);
png_write_end(png_ptr, info_ptr);
for (j = 0; j < height; ++j)
free(row_pointers[j]);
free(row_pointers);
} else {
png_write_image(png_ptr, im->pixels);
png_write_end(png_ptr, info_ptr);
}
/* 1.6.3: maybe we should give that memory BACK! TBB */
png_destroy_write_struct(&png_ptr, &info_ptr);
}
ploticus-2.42/src/proc_processdata.c 0000644 0001750 0001750 00000072176 11154315113 016573 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC PROCESSDATA - perform various processing to the data set */
#include "pl.h"
#define MAXFLD 80
extern int unlink();
extern int DT_group();
#define MAXBREAKFLDS 5
static int rejfld[MAXFLD], nrejfld, kpfld[MAXFLD], nkpfld, breakcurrow = 0, eofcount = 0;
static char *outfile;
static FILE *outfp;
static int bor(), out(), eor(), dofld(), jadvance();
#ifdef NONANSI
static int dblcompare();
#else
static int dblcompare(const void *a, const void *b);
#endif
/* ================================= */
int
PLP_processdata_initstatic()
{
outfile = "";
breakcurrow = 0;
eofcount = 0;
return(0);
}
/* ================================= */
int
PLP_processdata( )
{
int i, j, k, lvp, first;
char attr[NAMEMAXLEN];
char *line, *lineval;
char *action, *selectex, *select1, *select2, *curcon, *startval, *binsize, *binmod, *fieldnames;
char buf[256], tok[256], outbuf[256];
char breakbuf[ MAXBREAKFLDS ][52];
char rformat[40], nacode[20];
int ix, stat, showdata, nfld, keepall, dispformatnum, resetbns, istart;
int select_result, select_error, nocloseoutfp, tagfld, breakfound, valfld, complen;
int fld[MAXFLD];
double accum[MAXFLD], count;
char newfstr[256];
TDH_errprog( "pl proc processdata" );
/* initialize */
selectex = ""; select1 = ""; select2 = "";
action = ""; outfile = "";
binsize = ""; binmod = "mid";
fieldnames = "";
strcpy( nacode, "=" );
nfld = 0;
strcpy( rformat, "%g" );
keepall = nrejfld = nkpfld = 0;
showdata = dispformatnum = select_error = nocloseoutfp = 0;
tagfld = -1;
valfld = -1;
complen = 50;
strcpy( newfstr, "" );
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "action" )==0 ) action = lineval;
else if( strcmp( attr, "fieldnames" )==0 ) fieldnames = lineval;
else if( strncmp( attr, "field", 5 )==0 ) {
ix = 0; i = 0;
while( 1 ) {
strcpy( tok, GL_getok( lineval, &ix ) );
if( tok[0] == '\0' ) break;
fld[i] = fref( tok ) -1;
i++;
if( i >= MAXFLD ) break;
}
nfld = i;
}
else if( strcmp( attr, "keepfields" )==0 ) {
ix = 0; i = 0;
while( 1 ) {
strcpy( tok, GL_getok( lineval, &ix ) );
if( tok[0] == '\0' ) break;
kpfld[i] = fref( tok ) -1;
i++;
if( i >= MAXFLD ) break;
}
nkpfld = i;
}
else if( strcmp( attr, "rejectfields" )==0 ) {
ix = 0; i = 0;
while( 1 ) {
strcpy( tok, GL_getok( lineval, &ix ) );
if( tok[0] == '\0' ) break;
rejfld[i] = fref( tok ) -1;
i++;
if( i >= MAXFLD ) break;
}
nrejfld = i;
}
else if( strcmp( attr, "tagfield" )==0 ) tagfld = fref( lineval )-1;
else if( strcmp( attr, "valfield" )==0 ) valfld = fref( lineval )-1;
else if( strcmp( attr, "complen" )==0 ) { complen = itokncpy( lineval ); if( complen > 50 || complen < 1 ) complen = 50; }
else if( strcmp( attr, "resultformat" )==0 ) tokncpy( rformat, lineval, 40 );
else if( strcmp( attr, "select" )==0 ) selectex = lineval; /* used by join */
else if( strcmp( attr, "leftselect" )==0 ) select1 = lineval; /* used by join */
else if( strcmp( attr, "rightselect" )==0 ) select2 = lineval; /* used by join */
else if( strcmp( attr, "missingdatacode" )==0 ) tokncpy( nacode, lineval, 20 ); /* used by join */
else if( strcmp( attr, "showresults" )==0 || strcmp( attr, "showdata" )==0 ) showdata = getyn( lineval );
else if( strcmp( attr, "keepall" )==0 ) keepall = getyn( lineval );
else if( strcmp( attr, "outfile" )==0 ) outfile = lineval;
else if( strcmp( attr, "binsize" )==0 ) binsize = lineval;
else if( strcmp( attr, "binmod" )==0 ) binmod = lineval;
else Eerr( 1, "attribute not recognized", attr );
}
if( strcmp( action, "" )==0) { Eerr( 7395, "warning, no action specified, defaulting to action: echo", "" ); action = "echo"; }
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) ); /* added scg 4/2/08 */
if( strcmp( action, "breakreset" )!= 0 ) {
if( Nrecords < 1 ) return( Eerr( 17, "Current data set is empty, nothing to process", "" ) );
}
if( GL_slmember( action, "per* tot* acc*") && nfld < 1 )
return( Eerr( 2870, "one or more 'fields' must be specified with percents, totals, or accumulate", "" ) );
if( strcmp( action, "count" )==0 && ( nfld < 1 || nfld > 2 ) )
return( Eerr( 2874, "'count' action requires one or two fields", "" ));
if( strcmp( action, "segment" )==0 && ( nfld < 1 || nfld > 2 ) )
return( Eerr( 2874, "'segment' action requires one or two fields", "" ));
if( strcmp( action, "select" )== 0 && selectex[0] == '\0' )
return( Eerr( 3879, "if action is 'select' a selection expression must be given", "" ));
/* now do the work.. */
/* -------------------------- */
if( rformat[0] == 'n' ) { /* if resultformat begins with 'n', user wants rewritenum to be applied.. */
dispformatnum = 1;
strcpy( rformat, &rformat[1] );
}
for( i = 0; i < MAXFLD; i++ ) accum[i] = 0.0;
if( outfile[0] == '\0' ) {
stat = PL_begindataset();
if( stat != 0 ) return( stat );
}
else {
outfp = fopen( outfile, "w" );
if( outfp == NULL ) { PLS.skipout = 1; return( Eerr( 75925, "cannot open outfile", outfile ) ); }
}
/* action: breaks ... break processing - calling script can detect when end is reached by looking at NRECORDS or BREAKFIELD1 */
if( strcmp( action, "breaks" )==0 ) {
char breakvarname[20];
/* start at current row */
if( breakcurrow >= Nrecords ) {
eofcount++;
if( eofcount > 10 ) {
PLS.skipout = 1;
return( Eerr( 4729, "unterminated loop (processdata action=breaks)", "" ) );
}
goto SKIPBREAK;
}
i = breakcurrow;
/* save initial contents of break fields.. */
/* also set vars BREAKFIELD1 .. N */
for( j = 0; j < nfld; j++ ) {
strncpy( breakbuf[j], da( i, fld[j] ), complen );
breakbuf[j][complen] = '\0';
sprintf( breakvarname, "BREAKFIELD%d", j+1 );
setcharvar( breakvarname, breakbuf[j] );
}
for( ; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
/* compare against contents of break fields.. when any differences found, break.. */
breakfound = 0;
for( j = 0; j < nfld; j++ ) {
if( strncmp( breakbuf[j], da( i, fld[j] ), complen ) != 0 ) {
breakfound = 1;
break;
}
}
if( breakfound ) break;
else {
bor();
for( j = 0; j < Nfields; j++ ) if( dofld( j )) out( da(i,j) );
eor();
}
}
breakcurrow = i;
SKIPBREAK: ;
}
/* action: breakreset */
else if( strcmp( action, "breakreset" )==0 ) {
breakcurrow = 0;
eofcount = 0;
return( 0 );
}
/* action: reverse */
else if( strcmp( action, "reverse" )==0 ) {
for( i = Nrecords-1; i >= 0; i-- ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
bor();
for( j = 0; j < Nfields; j++ ) if( dofld( j )) out( da(i,j) );
eor();
}
}
/* action: rotate */
else if( strcmp( action, "rotate" )==0 ) {
for( j = 0; j < Nfields; j++ ) {
if( dofld( j )) {
bor();
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
out( da( i,j) );
}
eor();
}
}
}
/* action: percents */
else if( strncmp( action, "percent", 7 )==0 ) {
/* find all totals.. */
for( i = 0; i < nfld; i++ ) {
for( j = 0; j < Nrecords; j++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
accum[i] += atof( da( j, fld[i] ) );
}
}
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
bor();
for( j = 0; j < Nfields; j++ ) {
if( dofld( j )) {
/* see if j is a 'hot' field */
for( k = 0; k < nfld; k++ ) if( j == fld[k] ) break;
if( k != nfld ) {
if( keepall ) out( da( i, j ) );
sprintf( outbuf, rformat, (atof(da( i, j )) / accum[k]) * 100.0 ); /* changed scg 5/18/06 - quoted
values not plottable */
out( outbuf );
}
else out( da( i, j ) );
}
}
eor();
}
}
/* action: accumulate */
else if( strncmp( action, "accum", 5 )==0 ) {
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
bor();
for( j = 0; j < Nfields; j++ ) {
/* see if j is a 'hot' field */
if( dofld( j )) {
for( k = 0; k < nfld; k++ ) if( j == fld[k] ) break;
if( k != nfld ) {
accum[k] += atof( da( i, j ) );
if( keepall ) out( da( i, j ) );
/* out( da( i, j ) ); */
sprintf( tok, rformat, accum[k] ); /* fixed scg 10/1/03 */
out( tok ); /* fixed scg 10/1/03 */
}
else out( da( i, j ) );
}
}
eor();
}
}
/* action: count - may be used with one or two fields.
* If one field, result has these fields: 1) field contents 2) count
* If two fields, result has these fields: 1) field1 contents 2) sum of field 2
* Output has a fixed number of fields; kpfld and nkpfld do not apply to this action..
* 'binsize' and 'binmod' attributes can be used in order to do numeric or date-based grouping.
* 'complen' attribute can be used to dictate number of significant chars in string comparisons.
*/
else if( strcmp( action, "count" )==0 ) {
double fval, fbin;
char *adjval, *curval, snum[80];
if( nfld == 1 ) strcpy( newfstr, "bin count" );
else if( nfld == 2 ) strcpy( newfstr, "bin sum" );
adjval = tok;
curval = buf;
count = 0.0;
strcpy( curval, "" );
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
if( binsize[0] != '\0' ) {
fbin = atof( binsize );
if( fbin != 0.0 ) {
fval = atof( da( i, fld[0] ));
sprintf( adjval, "%g", GL_numgroup( fval, fbin, binmod ) );
}
else {
stat = DT_group( binsize[0], binmod[0], da( i, fld[0] ), adjval );
if( stat != 0 ) { PLS.skipout = 1; return( Eerr( 27395, "invalid date/time data, or invalid binsize or binmod", "" )); }
}
}
else {
strncpy( adjval, da( i, fld[0] ), complen );
adjval[ complen ] = '\0';
}
if( strcmp( adjval, curval )!=0 ) {
if( i == 0 ) strcpy( curval, adjval );
else {
bor();
out( curval );
sprintf( snum, "%g", count ); out( snum );
eor();
}
strcpy( curval, adjval );
count = 0.0;
}
if( nfld == 1 ) count = count + 1.0;
else if( nfld == 2 && action[0] == 'c' ) count = count + atof( da( i, fld[1] ) );
}
/* last round.. */
bor();
out( curval );
sprintf( snum, "%g", count ); out( snum );
eor();
}
/* action: segment - may be used with one or two fields.
* If one field, result has these fields: 1) field contents 2) beginning record# 3) ending record#
* If two fields, result has these fields: 1) field1 contents 2) beginning record field2 value 3) ending record field2 value
*
* action: segmentb - same as segment, but segments butt up against each other (end point coincides with beginning point of next seg)
*
* output has a fixed number of fields; kpfld and nkpfld do not apply to this action..
*/
else if( strncmp( action, "segment", 7 ) ==0 ) {
if( nfld == 1 ) strcpy( newfstr, "bin startrow endrow" );
else if( nfld == 2 ) strcpy( newfstr, "bin startval endval" );
count = 0.0;
curcon = "";
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
if( strcmp( da( i, fld[0] ), curcon )!=0 ) {
if( i == 0 ) curcon = da( i, fld[0] );
else {
bor();
out( curcon );
if( nfld == 2 ) {
out( startval );
if( action[7] == 'b' ) out( da( i, fld[1] ));
else out( da( i-1, fld[1] ));
}
else {
sprintf( buf, "%d", istart );
out( buf );
if( action[7] == 'b' ) sprintf( buf, "%d", i+1 );
else sprintf( buf, "%d", i );
out( buf );
}
eor();
curcon = da( i, fld[0] );
count = 0.0;
}
if( action[0] == 's' ) {
if( nfld == 2 ) startval = da( i, fld[1] );
else istart = i+1;
}
}
}
/* last round.. */
bor();
out( curcon );
if( nfld == 2 ) { out( startval ); out( da( i-1, fld[1] )); }
else { sprintf( buf, "%d", istart ); out( buf ); sprintf( buf, "%d", i ); out( buf ); }
eor();
}
/* action: summary and action: summaryplus */
else if( strncmp( action, "summary", 7 )==0 ) {
int icount, prec, lastdone, nvect;
double fval, mean, sd, se, min, max, pctile;
char *val;
if( valfld < 0 ) return( Eerr( 5723, "action: summary requires valfield", "" ) );
/* note: output has a fixed number of fields; kpfld and nkpfld do not apply to this action.. */
/* initialize breakfields.. */
for( j = 0; j < nfld; j++ ) { strncpy( breakbuf[j], da( 0, fld[j] ), complen ); breakbuf[j][complen] = '\0'; }
/* set up usable field names for result: id1 .. idN mean sd se n_obs sum */
for( j = 0; j < nfld; j++ ) { sprintf( outbuf, "id%d ", j+1 ); strcat( newfstr, outbuf ); }
if( action[7] == 'p' ) strcat( newfstr, "mean sd se n_obs min max sum pctl5th pctl25th median pctl75th pctl95th" );
else strcat( newfstr , "mean sd se n_obs min max sum" );
/* go thru the data records.. */
lastdone = 0;
accum[0] = 0.0; accum[1] = 0.0; icount = 0; min = PLHUGE; max = NEGHUGE; nvect = 0;
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
/* compare against contents of break fields.. when any differences found, break.. */
breakfound = 0;
for( j = 0; j < nfld; j++ ) {
if( strncmp( breakbuf[j], da( i, fld[j] ), complen ) != 0 ) {
breakfound = 1;
break;
}
}
if( breakfound ) { /* write out mean, sd, etc. */
LASTCASE:
if( icount > 0 ) {
bor();
for( j = 0; j < nfld; j++ ) out( breakbuf[j] ); /* identifiers */
mean = accum[0] / (double)icount;
sprintf( outbuf, rformat, mean ); out( outbuf ); /* mean */
if( icount == 1 ) sd = 0.0;
else sd = sqrt( (accum[1] - (accum[0]*accum[0] / (double)icount ) ) / (double)(icount-1) );
sprintf( outbuf, rformat, sd ); out( outbuf ); /* sd */
se = sd / sqrt( (double) icount );
sprintf( outbuf, rformat, se ); out( outbuf ); /* se */
sprintf( outbuf, "%d", icount ); out( outbuf ); /* N */
sprintf( outbuf, rformat, min ); out( outbuf ); /* min */
sprintf( outbuf, rformat, max ); out( outbuf ); /* max */
sprintf( outbuf, rformat, accum[0] ); out( outbuf ); /* summation */
if( action[7] == 'p' ) { /* compute median and quartiles/percentiles */
int n;
n = nvect;
qsort( &PLV[1], nvect, sizeof(double), dblcompare);
/* these formulas depend on values being placed into array at cells PLV[1] thru PLV[n]
(probably because they were translated from fortran or similar */
pctile = (n % 20 ) ? PLV[(n/20) + 1] : (PLV[n/20] + PLV[(n/20) + 1] ) /2.0 ; /* 5th */
sprintf( outbuf, rformat, pctile ); out( outbuf );
pctile = ( n % 4 ) ? PLV[(n/4) + 1] : (PLV[n/4] + PLV[(n/4) + 1])/2.0 ; /* 25 */
sprintf( outbuf, rformat, pctile ); out( outbuf );
pctile = ( n % 2 ) ? PLV[(n+1) / 2] : (PLV[n/2] + PLV[(n/2)+1])/2.0 ; /* median/ 50th */
sprintf( outbuf, rformat, pctile ); out( outbuf );
pctile = ( n % 4 ) ? PLV[n - (n/4)] : (PLV[(n+1) - (n/4)] + PLV[n-(n/4)])/2.0 ; /* 75 */
sprintf( outbuf, rformat, pctile ); out( outbuf );
pctile = ( n % 20 ) ? PLV[n - (n/20)] : (PLV[(n+1) - (n/20)] + PLV[n - (n/20)]) / 2.0 ; /* 95 */
sprintf( outbuf, rformat, pctile ); out( outbuf );
}
eor();
if( lastdone ) break;
}
/* get ready to continue.. */
for( j = 0; j < nfld; j++ ) { strncpy( breakbuf[j], da( i, fld[j] ), complen ); breakbuf[j][complen] = '\0'; }
accum[0] = 0.0; accum[1] = 0.0; icount = 0; min = PLHUGE; max = NEGHUGE; nvect = 0;
}
/* add to accum.. (accum[0] holds sum, accum[1] holds sum squared) */
val = da( i, valfld );
if( GL_goodnum( val, &prec )) {
fval = atof( val );
accum[0] += fval;
accum[1] += fval*fval;
if( fval < min ) min = fval;
if( fval > max ) max = fval;
if( action[7] == 'p' ) {
if( nvect <= PLVsize-1 ) { nvect++; PLV[nvect] = fval; } /* save for median/quartiles computation */
else return( Eerr( 248, "cannot compute median, vector capacity exceeded (raise using -maxvector)\n", "" ) );
}
icount++;
}
}
if( !lastdone ) { lastdone = 1; goto LASTCASE; }
}
/* action: raccum */
else if( strncmp( action, "raccum", 6 )==0 ) {
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
for( j = 0; j < nfld; j++ ) accum[j] = 0.0; /* initialize */
for( j = 0; j < nfld; j++ ) { /* do the progressive summation operation */
if( j == 0 ) accum[j] = atof( da( i, fld[j] ));
else if( j > 0 ) accum[j] = atof( da( i, fld[j] )) + accum[j-1];
}
/* output the data row, including rewritten fields */
bor();
for( j = 0; j < Nfields; j++ ) {
for( k = 0; k < nfld; k++ ) if( fld[k] == j ) break;
if( k != nfld ) {
if( keepall ) out( da( i, j ) );
sprintf( outbuf, rformat, accum[k] ); out( outbuf );
}
else if( dofld( j )) out( da( i, j ));
}
eor();
}
}
/* action: total */
else if( strncmp( action, "total", 5 )==0 ) {
for( i = 0; i < nfld; i++ ) {
for( j = 0; j < Nrecords; j++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
accum[i] += atof( da( j, fld[i] ) );
}
}
}
/* action: join */
else if( strcmp( action, "join" )==0 || strcmp( action, "leftjoin" )==0 || strcmp( action, "rightjoin" )==0 ) {
int irec1, irec2, diff, prec, more1, more2;
char *f1, *f2;
more1 = more2 = 1;
irec1 = irec2 = -1;
jadvance( select1, &irec1, &more1 ); /* advance LHS to first eligible record (based on leftselect) */
jadvance( select2, &irec2, &more2 ); /* advance RHS to first eligible record (based on rightselect) */
while( 1 ) {
/* fprintf( stderr, "[%d][%d]\n", more1, more2 ); */
if( !more1 || !more2 ) break;
/* compare all join fields.. when first difference encountered break; save strcmp diff */
for( diff = 0, i = 0; i < nfld; i++ ) {
f1 = da( irec1, fld[i] );
f2 = da( irec2, fld[i] );
/* fprintf( stderr, "[%s vs. %s]..", f1, f2 ); */
/* if both are integers, do a numeric comparison.. */
if( GL_goodnum( f1, &prec ) && GL_goodnum( f2, &prec )) diff = atoi( f1 ) - atoi( f2 );
/* otherwise do a strcmp */
else diff = strcmp( da( irec1, fld[i]), da( irec2, fld[i] ));
if( diff != 0 ) break;
}
/* fprintf( stderr, "diff=%d..", diff ); */
if( diff == 0 ) {
/* if diff == 0 then join left record with right record and output */
bor();
for( i = 0; i < Nfields; i++ ) if( dofld( i )) out( da( irec1, i ));
for( i = 0; i < Nfields; i++ ) if( dofld( i )) out( da( irec2, i ));
eor();
/* fprintf( stderr, "LR..\n" ); */
jadvance( select1, &irec1, &more1 ); /* advance LHS to next eligible record */
jadvance( select2, &irec2, &more2 ); /* advance RHS to next eligible record */
}
else if( diff < 0 ) {
if( action[0] == 'l' ) { /* leftjoin... output LHS fields and missingcode for the RHS fields.. */
bor();
for( i = 0; i < Nfields; i++ ) if( dofld( i )) out( da( irec1, i ));
for( i = 0; i < Nfields; i++ ) if( dofld( i )) out( nacode );
eor();
/* fprintf( stderr, "L=..\n" ); */
}
jadvance( select1, &irec1, &more1 ); /* advance LHS to next eligible record */
}
else if( diff > 0 ) {
if( action[0] == 'r' ) { /* rightjoin... output missingcode for the LHS fields and output RHS fields.. */
bor();
for( i = 0; i < Nfields; i++ ) if( dofld( i )) out( nacode );
for( i = 0; i < Nfields; i++ ) if( dofld( i )) out( da( irec2, i ));
eor();
/* fprintf( stderr, "=R..\n" ); */
}
jadvance( select2, &irec2, &more2 ); /* advance RHS to next eligible record */
}
}
/* with leftjoin and rightjoin there may be orphan records at the end to take care of... */
if( action[0] == 'l' && more1 ) while( more1 ) { /* output the rest of LHS */
bor();
for( i = 0; i < Nfields; i++ ) if( dofld( i )) out( da( irec1, i ));
for( i = 0; i < Nfields; i++ ) if( dofld( i )) out( nacode );
eor();
jadvance( select1, &irec1, &more1 );
}
else if( action[0] == 'r' && more2 ) while( more2 ) { /* output the rest of RHS */
bor();
for( i = 0; i < Nfields; i++ ) if( dofld( i )) out( nacode );
for( i = 0; i < Nfields; i++ ) if( dofld( i )) out( da( irec2, i ));
eor();
jadvance( select2, &irec2, &more2 );
}
}
/* action: stats */
else if( strcmp( action, "stats" )==0 ) {
double val, min, max, sqrt();
int n, prec, nbad;
n = 0;
nbad = 0;
max = NEGHUGE;
min = PLHUGE;
/* accum[0] holds sum, accum[1] holds sumsq.. */
for( j = 0; j < Nrecords; j++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, j, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
for( k = 0; k < nfld; k++ ) {
strcpy( tok, da( j, fld[k] ) );
if( !GL_goodnum( tok, &prec )) { nbad++; continue; }
n++;
val = atof( tok );
accum[0] += val; /* sum */
accum[1] += (val * val); /* sum squared */
if( val > max ) {
max = val;
if( tagfld >= 0 ) strcpy( breakbuf[0], da( j, tagfld ));
}
if( val < min ) {
min = val;
if( tagfld >= 0) strcpy( breakbuf[1], da( j, tagfld ));
}
}
}
setintvar( "N", n );
setfloatvar( "TOTAL", accum[0], rformat );
setintvar( "NMISSING", nbad );
if( n == 0 ) { setcharvar( "MEAN", "n/a" ); }
else {
setfloatvar( "MEAN", accum[0]/(double)n, rformat );
if( n > 1 ) setfloatvar( "SD", sqrt( ( accum[1] - (accum[0]*accum[0]/(double)n )) / ((double)n-1.0) ), rformat );
else setcharvar( "SD", "n/a" );
setfloatvar( "MAX", max, rformat );
if( tagfld >= 0 ) setcharvar( "MAX_ID", breakbuf[0] ); /* fixed scg 3/8/05 */
setfloatvar( "MIN", min, rformat );
if( tagfld >= 0 ) setcharvar( "MIN_ID", breakbuf[1] ); /* fixed scg 3/8/05 */
}
return( 0 );
}
else if( strcmp( action, "echo" )==0 || strcmp( action, "numberrows" )==0 ) {
int do_numrows, foundrows;
char numstr[20];
do_numrows = 0;
if( action[0] == 'n' ) do_numrows = 1;
/* just write out fields */
for( i = 0, foundrows = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &select_result );
if( stat ) select_error += stat;
if( select_result == 0 || stat ) continue; /* reject */
}
foundrows++;
bor();
if( do_numrows ) { sprintf( numstr, "%d", foundrows ); out( numstr ); }
for( j = 0; j < Nfields; j++ ) if( dofld( j ) ) {
out( da( i, j ) );
}
eor();
}
}
else {
PLS.skipout = 1;
return( Eerr( 471, "unrecognized action specified.", action ) );
}
if( select_error ) Eerr( 472, "warning, an error occurred during 'select'", "" );
if( GL_slmember( action, "per* acc* tot*" )) {
/* make a comma-delimited list of totals for TOTALS */
strcpy( buf, "" );
for( i = 0; i < nfld; i++ ) {
char out[40];
sprintf( out, rformat, accum[i] );
if( dispformatnum ) { /* rewrite using numbernotation */
resetbns = 0;
if( PLS.bignumspacer == '\0' ) {
PLS.bignumspacer = ',';
resetbns = 1;
}
rewritenums( out ); /* rewrite w/spacing, decimal pt options*/
if( resetbns ) PLS.bignumspacer = '\0';
}
strcat( buf, out );
strcat( buf, "," );
}
buf[ strlen( buf ) -1 ] = '\0'; /* last comma */
setcharvar( "TOTALS", buf );
/* if doing totals, exit here */
if( strncmp( action, "tot", 3 )==0 ) return( 0 );
}
if( outfile[0] != '\0' ) fclose( outfp );
else PL_finishdataset( 0, 0 );
if( fieldnames[0] != '\0' ) definefieldnames( fieldnames );
else {
/* if field names not given in this proc, currently defined field names (if any) are guaranteed to be wrong
for certain actions or parameter combinations... for those clear the field name list now..
Was done earlier but this messed up execution of select conditions (based on old field names) */
if( nrejfld != 0 || nkpfld != 0 || keepall != 0 ) definefieldnames( "" );
if( GL_smember( action, "rotate join leftjoin rightjoin numberrows" )) definefieldnames( "" );
/* other situations... new field names are a given... */
if( newfstr[0] != '\0' ) definefieldnames( newfstr );
}
if( showdata ) {
getfname( 1, buf ); /* buf[256] */
fprintf( PLS.diagfp, "// proc processdata created the following data set (action = %s)\n", action );
if( buf[0] != '\0' ) {
fprintf( PLS.diagfp, "// field names are: " );
for( j = 0; j < Nfields; j++ ) { getfname( j+1, buf ); fprintf( PLS.diagfp, "%s|", buf ); } /* buf[256] */
fprintf( PLS.diagfp, "\n" );
}
else fprintf( PLS.diagfp, "// (no field names defined)\n" );
for( i = 0; i < Nrecords; i++ ) {
for( j = 0; j < Nfields; j++ ) fprintf( PLS.diagfp, "%s|", da( i, j ) );
fprintf( PLS.diagfp, "\n" );
}
fprintf( PLS.diagfp, "// end of data set\n" );
}
return( 0 );
}
/* ================ */
/* DOFLD - return 1 or 0 depending on whether field has been listed
in keepfields or rejectfields */
static int
dofld( fld )
int fld;
{
int i;
if( nrejfld > 0 ) {
for( i = 0; i < nrejfld; i++ ) if( fld == rejfld[i] ) break;
if( i != nrejfld ) return( 0 ); /* no */
}
if( nkpfld > 0 ) {
for( i = 0; i < nkpfld; i++ ) if( fld == kpfld[i] ) break;
if( i != nkpfld ) return( 1 ); /* yes */
else return( 0 ); /* no */
}
return( 1 );
}
/* ================= */
/* OUTPUT mgmt routines */
static int
bor( )
{
if( outfile[0] == '\0' ) return( PL_startdatarow() );
else return( 0 );
}
static int
out( s )
char *s;
{
if( outfile[0] != '\0' ) fprintf( outfp, "%s ", s );
else PL_catitem( s );
return( 0 );
}
static int
eor()
{
if( outfile[0] != '\0' ) fprintf( outfp, "\n" );
else PL_enddatarow();
return( 0 );
}
/* ============================= */
/* for action: join ... */
static int
jadvance( select, irow, moreflag )
char *select;
int *irow, *moreflag;
{
int sresult, newirow;
newirow = *irow;
newirow++;
for( ; newirow < Nrecords; newirow++ ) {
do_select( select, newirow, &sresult );
if( sresult ) break;
}
if( newirow >= Nrecords ) *moreflag = 0; /* and irow remains the same as passed in.. scg 11/15/07 */
else *irow = newirow;
return( 0 );
}
/* ============================= */
/* for qsort */
static int
dblcompare( a, b )
const void *a, *b;
{
double *f, *g;
f = (double *)a;
g = (double *)b;
if( *f > *g ) return( 1 );
if( *f < *g ) return( -1 );
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/secondaryops.c 0000644 0001750 0001750 00000013331 10746403634 015751 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* Secondary script ops such as "sql" and "shell". These ops can be multi-line and are
* subordinate to flow-of-control operators.
*/
#include "tdhkit.h"
#include
extern int TDH_sqlcommand(), TDH_sinterp(), TDH_shellcommand();
extern int atoi();
#define SHELL 0
#define SQL 1
static char bigbuf[ MAXRECORDLEN ];
static int bblen;
static int prohibit_shell = 0;
int
TDH_secondaryops( buf, ss, recordid, data )
char *buf;
struct sinterpstate *ss;
char *recordid;
char data[][DATAMAXLEN+1];
{
char tok[ DATAMAXLEN+1 ];
int ix;
int buflen;
int stat;
buflen = strlen( buf );
strcpy( tok, "" );
sscanf( buf, "%s", tok );
if( ( strncmp( tok, "#sql", 4 )==0 && (tok[4] == '\0' || isdigit( (int) tok[4] ))) || strcmp( tok, "#shell" )==0 ) {
/* #sql [ load | processrows | dump | dumptab | dumphtml | dumpsilent] sql command [#endsql] */
/* #shell [ #processrows | #dump | #dumptab | #dumphtml | #dumpsilent ] command [#endshell] */
int ixhold, capmode, opmode;
if( strncmp( tok, "#sql", 4 )==0 ) {
opmode = SQL;
capmode = 0; /* if no #sql mode given, default is processrows */
if( tok[4] == '\0' ) ss->dbc = 0;
else ss->dbc = tok[4] - '1';
}
else {
opmode = SHELL;
capmode = 'n'; /* if no #shell mode given, default is dump */
TDH_valuesubst_settings( "omit_shell_meta", 1 ); /* omit shell metachars in conversion */
}
ix = 0;
GL_getok( buf, &ix ); /* skip over 1st token..*/
SQL_DBC:
ixhold = ix;
strcpy( tok, GL_getok( buf, &ix ) );
if( tok[0] == '\0' ) ; /* no 2nd token - added scg 5/12/04 */
else if( opmode == SQL && atoi( tok ) > 1 ) { /* allow channel number to be a separate token - added scg 2/24/04 */
/* opmode == SQL added scg 5/12/04 */
ss->dbc = atoi( tok ) - 1;
goto SQL_DBC;
}
else if( tok[0] == '#' && atoi( &tok[1] ) > 1 ) {
ss->dbc = atoi( &tok[1] ) - 1;
goto SQL_DBC;
}
else if( strcmp( tok, "load" )==0 || strcmp( tok, "#load" )==0 ) {
capmode = 'l';
ixhold = ix;
strcpy( tok, GL_getok( buf, &ix ) );
}
else if( strncmp( tok, "dump", 4 )==0 || strncmp( tok, "#dump", 5 )==0 ) {
if( tok[0] == '#' ) capmode = tok[5];
else capmode = tok[4];
if( capmode == '\0' ) capmode = 'n'; /* default is nosep */
ixhold = ix;
strcpy( tok, GL_getok( buf, &ix ) );
}
else if( strcmp( tok, "processrows" )==0 || strcmp( tok, "#processrows" )==0 ) {
capmode = 0;
ixhold = ix;
strcpy( tok, GL_getok( buf, &ix ) );
}
if( tok[0] != '\0' ) {
strcpy( bigbuf, &buf[ixhold+1] ); /* 1 line command.. */
if( opmode == SHELL ) {
/* don't allow single-line construct - so we can treat vars during scan for cgi security */
/* return( err( 2488, "#shell: single line construct not allowed", "" )); */
err( 2488, "#shell: single line construct not allowed", "" );
return( SINTERP_END );
}
else if( opmode == SQL ) {
ss->doingsqlresult = capmode;
/* submit the sql.. */
stat = TDH_sqlcommand( ss->dbc, bigbuf );
if( stat != 0 ) {
ss->doingsqlresult = 0;
/* return( err( stat, "error on sql submit", "" )); */
err( stat, "error on sql submit", "" );
return( SINTERP_END );
}
}
return( SINTERP_END ); /* no more calls to sec needed this time.. */
}
/* Note: all error returns before this point should return SINTERP_END, to avoid race condition
* (after this point a new line is read by TDH_sinterp) scg 1/25/08
*/
bblen = 0;
while( 1 ) {
stat = TDH_sinterp( buf, ss, recordid, data );
if( stat != SINTERP_MORE ) return( stat );
buflen = strlen( buf );
strcpy( tok, "" );
sscanf( buf, "%s", tok );
if( strcmp( tok, "#endsql" )==0 ) {
ss->doingsqlresult = capmode; /* set ss->doingsqlresult to the capture mode (load, processrows, etc);
then this comes into play in sinterp.c */
/* submit the sql.. */
stat = TDH_sqlcommand( ss->dbc, bigbuf );
if( stat != 0 ) {
int jj;
ss->doingsqlresult = 0;
for( jj = 0; bigbuf[jj] != '\0'; jj++ ) if( bigbuf[jj] == '\n' ) { bigbuf[jj] = '\0'; break; }
sprintf( buf, "sql error %d, first line is: %s", stat, bigbuf );
return( stat );
}
return( SINTERP_END ); /* no more calls to sec needed this time */
}
else if( strcmp( tok, "#endshell" )==0 ) {
ss->doingshellresult = capmode;
/* submit the shell command.. */
if( prohibit_shell ) return( err( 1231, "attempt to #shell but shell commands prohibited", "" ));
else stat = TDH_shellcommand( bigbuf );
if( stat != 0 ) ss->doingshellresult = 0;
TDH_valuesubst_settings( "omit_shell_meta", 0 ); /* restore */
return( SINTERP_END );
}
else {
/* add more sql to bigbuf.. */
if( bblen + buflen > (MAXRECORDLEN-2) ) return( err( 1263, "missing #endsql or #endshell", "" ) );
strcpy( &bigbuf[bblen], buf );
bblen += buflen;
continue;
}
}
}
else {
/* other #ops will just be ignored.. control returns to the caller */
return( SINTERP_END_BUT_PRINT ); /* no more calls to sec needed this time */
}
}
/* ================================ */
/* If mode is passed as 1, #shell commands are disabled (safety). If mode is 0, #shell commands are re-enabled. */
int
TDH_prohibit_shell( mode )
int mode;
{
prohibit_shell = mode;
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/gdfontmb.h 0000644 0001750 0001750 00000000576 06736024172 015054 0 ustar colin colin
#ifndef _GDFONTMB_H_
#define _GDFONTMB_H_ 1
/*
This is a header file for gd font, generated using
bdftogd version 0.5 by Jan Pazdziora, adelton@fi.muni.cz
from bdf font
-misc-fixed-bold-r-normal-sans-13-94-100-100-c-70-iso8859-2
at Thu Jan 8 13:54:57 1998.
No copyright info was found in the original bdf.
*/
#include "gd.h"
extern gdFontPtr gdFontMediumBold;
#endif
ploticus-2.42/src/proc_annotate.c 0000644 0001750 0001750 00000020627 11153555766 016111 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC ANNOTATE - arbitrary placement of text, arrow, etc. */
#include "pl.h"
/* these statics are here to share values with calc_arrow() */
/* they need to persist only during the life of this proc. */
static double ahx, ahy, atx, aty, ahsize;
static double ah2x, ah2y, at2x, at2y;
static double boxw, boxh, ulx, uly;
static int arrowh, arrowt, arrow2h, arrow2t;
static int do_arrows(), calc_arrow();
static char *arrowdet = "";
int
PLP_annotate()
{
int lvp, first;
char attr[NAMEMAXLEN], *line, *lineval;
char *textcontent, *textdetails, *fromfile, *box, *mapurl, *maplabel;
char *backcolor, *lowbevelcolor, *hibevelcolor, *shadowcolor;
int align, fromfilemode, nlines, maxlen, verttext;
double adjx, adjy, x, y, bm, bevelsize, shadowsize;
int ioutline, do_ellipse, clip, backdim;
double bd1, bd2, bd3, bd4, cx, cy, px, py;
TDH_errprog( "pl proc annotate" );
/* initialize */
textcontent = ""; textdetails = ""; fromfile = ""; arrowdet = ""; box = ""; mapurl = ""; maplabel = "";
x = 3.0; y = 3.0;
fromfilemode = arrowh = arrowt = arrow2h = arrow2t = 0;
verttext = do_ellipse = backdim = clip = 0;
ahsize = 0.1;
bm = 0.0;
bevelsize = shadowsize = 0.0;
backcolor = "";
lowbevelcolor = "0.6";
hibevelcolor = "0.8";
shadowcolor = "black";
bd1 = bd2 = bd3 = bd4 = 0.0;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "location" )==0 ) getcoords( "location", lineval, &x, &y );
else if( strcmp( attr, "text" )==0 ) textcontent = getmultiline( lineval, "get" );
else if( strcmp( attr, "textdetails" )==0 ) textdetails = lineval;
else if( strcmp( attr, "fromfile" )==0 ) { fromfile = lineval; fromfilemode = 1; }
else if( strcmp( attr, "fromcommand" )==0 ) { fromfile = lineval; fromfilemode = 2; }
else if( strcmp( attr, "arrowhead" )==0 ) { getcoords( "arrowhead", lineval, &ahx, &ahy ); arrowh = 1; }
else if( strcmp( attr, "arrowtail" )==0 ) { getcoords( "arrowtail", lineval, &atx, &aty ); arrowt = 1; }
else if( strcmp( attr, "arrowhead2" )==0 ) { getcoords( "arrowhead2", lineval, &ah2x, &ah2y ); arrow2h = 1; }
else if( strcmp( attr, "arrowtail2" )==0 ) { getcoords( "arrowtail2", lineval, &at2x, &at2y ); arrow2t = 1; }
else if( strcmp( attr, "arrowdetails" )==0 ) arrowdet = lineval; /* ok - static but persists during this proc only */
else if( strcmp( attr, "arrowheadsize" )==0 ) ahsize = ftokncpy( lineval );
else if( strcmp( attr, "box" )==0 || strcmp( attr, "outline" )==0 ) box = lineval;
else if( strcmp( attr, "ellipse" )==0 ) do_ellipse = getyn( lineval );
else if( strcmp( attr, "clickmapurl" )==0 ) mapurl = lineval;
else if( strcmp( attr, "clickmaplabel" )==0 ) maplabel = lineval;
else if( strcmp( attr, "clickmaplabeltext" )==0 ) maplabel = getmultiline( lineval, "get" );
else if( strcmp( attr, "boxmargin" )==0 ) bm = ftokncpy( lineval );
else if( strcmp( attr, "verttext" )==0 ) verttext = getyn( lineval );
else if( strcmp( attr, "backcolor" )==0 ) backcolor = lineval;
else if( strcmp( attr, "bevelsize" )==0 ) bevelsize = ftokncpy( lineval );
else if( strcmp( attr, "shadowsize" )==0 ) shadowsize = ftokncpy( lineval );
else if( strcmp( attr, "lowbevelcolor" )==0 ) lowbevelcolor = lineval;
else if( strcmp( attr, "hibevelcolor" )==0 ) hibevelcolor = lineval;
else if( strcmp( attr, "shadowcolor" )==0 ) shadowcolor = lineval;
else if( strcmp( attr, "backdim" )==0 ) { PL_getbox( "backdim", lineval, &bd1, &bd2, &bd3, &bd4 ); backdim = 1; }
else if( strcmp( attr, "backadjust" )==0 ) { PL_getbox( "backadjust", lineval, &bd1, &bd2, &bd3, &bd4 ); backdim = 2; }
else if( strcmp( attr, "clip" )==0 ) clip = getyn( lineval );
else Eerr( 1, "attribute not recognized", attr );
}
if( ahsize <= 0.0 ) ahsize = 0.0; /* no arrow */
if( PLS.usingcm ) ahsize /= 2.54;
if( PLS.usingcm ) bm /= 2.54;
if( fromfilemode > 0 ) { file_to_buf( fromfile, fromfilemode, PL_bigbuf, MAXBIGBUF ); textcontent = PL_bigbuf; }
textdet( "textdetails", textdetails, &align, &adjx, &adjy, 0, "R", 1.0 );
if( align == '?' ) align = 'C';
px = x + adjx;
py = y + adjy;
/* figure backing box */
measuretext( textcontent, &nlines, &maxlen );
boxw = (maxlen+2) * Ecurtextwidth;
boxh = (nlines*1.2) * Ecurtextheight;
uly = py + Ecurtextheight;
if( align == 'L' ) ulx = px;
else if( align == 'R' ) ulx = px - boxw;
else ulx = px - (boxw/2.0); /* align=C */
if( bm != 0.0 ) {
ulx -= bm;
uly += bm;
boxw += (bm*2);
boxh += (bm*2);
}
if( clip ) PLG_pcodeboundingbox( 0 ); /* clip the annotation to the cropped size (by turning off bb) */
if( backcolor[0] != '\0' || ( box[0] != '\0' && strnicmp( box, "no", 2 )!= 0 ) ) {
if( box[0] != '\0' && strnicmp( box, "no", 2 )!= 0 ) {
ioutline = 1;
linedet( "box", box, 0.5 );
}
else ioutline = 0;
if( do_ellipse ) {
cx = ulx+(boxw/2.0);
cy = uly-(boxh/2.0);
if( backdim == 1 ) { cx = bd1; cy = bd2; boxw = bd3; boxh = bd4; }
do_arrows(); /* do this before ellipse to get abutting edge */
if( backdim == 2 ) PLG_ellipse( cx, cy, ((boxw/2.0)*1.3)+bd1, ((boxh/2.0)*1.3)+bd2, backcolor, ioutline );
else PLG_ellipse( cx, cy, ((boxw/2.0)*1.3), ((boxh/2.0)*1.3), backcolor, ioutline );
}
else {
if( backdim ==1 ) { ulx = bd1; uly = bd2; boxw = bd3; boxh = bd4; bd1 = bd2 = bd3 = bd4 = 0.0; }
do_arrows(); /* do this before fill to get abutting edge */
Ecblock( ulx+bd1, (uly-boxh)+bd2, ulx+boxw+bd3, uly+bd4, backcolor, ioutline );
if( bevelsize > 0.0 || shadowsize > 0.0 )
Ecblockdress( ulx+bd1, (uly-boxh)+bd2, ulx+boxw+bd3, uly+bd4, bevelsize, lowbevelcolor, hibevelcolor, shadowsize, shadowcolor);
}
}
else do_arrows();
if( PLS.clickmap && (mapurl[0] != '\0' || maplabel[0] != '\0' )) {
if( backdim && do_ellipse ) {
/* need to solve back to ulx,uly in this case.. */
ulx = (((boxw/2.0)-cx)*-1.0);
uly = (((boxw/2.0)-cy)*-1.0) + boxh;
}
clickmap_entry( 'r', mapurl, 0, ulx, (uly-boxh), ulx+boxw, uly, 1, 0, maplabel );
}
/* now render the text.. */
textdet( "textdetails", textdetails, &align, &adjx, &adjy, 0, "R", 1.0 ); /* need to do again */
if( align == '?' ) align = 'C';
Emov( x + adjx, y + adjy );
if( verttext ) Etextdir( 90 );
Edotext( textcontent, align );
if( verttext ) Etextdir( 0 );
if( clip ) PLG_pcodeboundingbox( 1 ); /* restore */
return( 0 );
}
/* ==================== */
/* do arrows */
static int do_arrows()
{
/* if tail location not given, try to be smart about arrow placement.. */
if( arrowh ) {
linedet( "arrowdetails", arrowdet, 0.7 );
if( !arrowt ) calc_arrow( ulx, uly, boxw, boxh, ahx, ahy, &atx, &aty );
Earrow( atx, aty, ahx, ahy, ahsize, 0.4, "" );
}
/* and render 2nd arrow.. */
if( arrow2h ) {
if( !arrow2t ) calc_arrow( ulx, uly, boxw, boxh, ah2x, ah2y, &at2x, &at2y );
Earrow( at2x, at2y, ah2x, ah2y, ahsize, 0.4, "" );
}
return( 0 );
}
/* ================== */
/* figure where tail of arrow should be */
static int
calc_arrow( ulx, uly, boxw, boxh, ahx, ahy, tailx, taily )
double ulx, uly, boxw, boxh, ahx, ahy, *tailx, *taily;
{
double atx, aty;
/* ah directly above or below textbox.. straight arrow.. */
if( ahx >= ulx && ahx <= ulx+boxw ) {
atx = ahx;
if( ahy > uly ) aty = uly;
else if( ahy < uly-boxh ) aty = uly-boxh;
}
/* ah directly beside textbox.. straight arrow.. */
else if( ahy >= uly-boxh && ahy <= uly ) {
aty = ahy;
if( ahx < ulx ) atx = ulx;
else if( ahx > ulx+boxw ) atx = ulx+boxw;
}
/* ah somewhere to left of textbox.. elbow arrow from mid-box.. */
else if( ahx < ulx ) {
atx = ahx + ((ulx - ahx)/2.0);
aty = uly - (boxh/2.0);
Emov( ulx, aty );
Elin( atx, aty );
}
/* ah somewhere to right of textbox.. elbow arrow from mid-box.. */
else if( ahx > ulx+boxw ) {
atx = ulx+boxw + ((ahx-(ulx+boxw))/2.0);
aty = uly - (boxh/2.0);
Emov( ulx+boxw, aty );
Elin( atx, aty );
}
else { atx = ahx; aty = ahy; } /* ? */
*tailx = atx;
*taily = aty;
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/plvalue_subst.c 0000644 0001750 0001750 00000007613 12144512247 016131 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
#include "tdhkit.h"
#include
extern int PL_fref(), PL_fref_error();
extern int GL_urlencode();
extern int atoi();
/* PL_VALUE_SUBST - take a text line and substitute values for variables.
* This is similar to TDH_value_subst, but is stripped down and accepts a data array that
* is an array of pointers rather than a 2d array. It also knows about ploticus field names (PL_fref() )
*/
/* scg 11/5/07 - now supporting data = NULL for situations where data array is n/a.
* Also, in the case of bad variable substitutions, the @varname is inserted into the output
* (no error handling had apparently been done before).
*/
int
PL_value_subst( out, in, data, mode )
char *out; /* result buffer */
const char *in; /* input buffer */
char *data[ MAXITEMS ]; /* can be passed as NULL if n/a .. scg 11/6/07 */
int mode; /* either FOR_CONDEX (1), indicating that the line will be passed to condex() (minor hooks);
URL_ENCODED (2), indicating that values substituted in should be urlencoded;
or NORMAL (0) */
{
int i, k;
char itemname[512];
char value[512];
int found;
int infunction;
int ifld;
int inlen;
int outlen;
int vallen;
int inamelen;
char tmpvalue[256];
int stat;
found = 0;
infunction = 0;
inlen = strlen( in );
outlen = 0;
strcpy( out, "" );
for( i = 0; i < inlen; i++ ) {
/* handle @@ (escape of @) */
if( in[i] == '@' && in[i+1] == '@' ) {
strcat( out, "@" );
i ++;
continue;
}
/* @item or @1 */
if( in[i] == '@' ) {
sscanf( &in[i+1], "%s", itemname );
found = 1;
/* truncate itemname at first char which is not alphanumeric or _ */
inamelen = strlen( itemname );
for( k = 0; k < inamelen; k++ ) {
if( !isalnum( (int) itemname[k] ) && itemname[k] != '_' ) {
itemname[k] = '\0';
break;
}
}
inamelen = strlen( itemname );
/* @1, @2, etc... */
ifld = atoi( itemname );
if( ifld > 0 && ifld < MAXITEMS ) {
if( data == NULL ) strcpy( value, itemname ); /* scg 11/5/07 */
else if( mode == URL_ENCODED ) GL_urlencode( data[ ifld-1 ], value );
else strcpy( value, data[ ifld-1 ] );
}
/* @fieldname .. */
else {
ifld = PL_fref( itemname );
if( ! PL_fref_error() && data != NULL ) {
if( mode == URL_ENCODED ) GL_urlencode( data[ ifld-1 ], value );
else strcpy( value, data[ ifld -1 ] );
}
else { /* try a tdh varname .. added scg 11/5/07 */
stat = TDH_getvar( itemname, tmpvalue );
if( stat ) strcpy( value, itemname ); /* scg 11/5/07 */
else if( mode == URL_ENCODED ) GL_urlencode( tmpvalue, value );
else strcpy( value, tmpvalue );
}
}
/* special case of 0 length data item when in a condex expression but
not within a function arg list.. to prevent condex syntax errors */
if( strcmp( value, "" )==0 && mode == FOR_CONDEX && !infunction )
strcpy( value, "_null_" );
vallen = strlen( value );
for( k = 0; k < vallen; k++ ) {
if( value[k] == ' ' && mode == FOR_CONDEX ) out[ outlen + k ] = '_';
else out[ outlen + k ] = value[k];
}
out[ outlen + k ] = '\0';
outlen += vallen;
i+= inamelen; /* advance past @itemname */
}
else {
if( in[i] == '$' && isalpha( (int) in[i+1] ) ) infunction = 1;
if( isspace( (int) in[i] ) ) infunction = 0;
/* len = strlen( out ); */
out[ outlen ] = in[i];
out[ outlen +1 ] = '\0';
outlen++;
}
}
return( found );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_rangesweep.c 0000644 0001750 0001750 00000012125 10721645732 016423 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC RANGESWEEP - render a sweep */
#include "pl.h"
#define MOVE 0
#define LINE 1
#define PATH 2
int
PLP_rangesweep()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
int i, j, stat, npoints, result, xfield, lofield, hifield;
double start, stop, xstart, f; double x, lo, hi, lastx, lastlo, lasthi;
char *color, *legendlabel, *selectex;
char oldcolor[COLORLEN];
TDH_errprog( "pl proc rangesweep" );
/* initialize */
xfield = -1; lofield = -1; hifield = -1;
start = EDXlo; stop = EDXhi; xstart = EDXlo;
color = "gray(0.9)";
legendlabel = "";
selectex = "";
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "xfield" )==0 ) xfield = fref( lineval ) - 1;
else if( strcmp( attr, "lofield" )==0 ) lofield = fref( lineval ) - 1;
else if( strcmp( attr, "hifield" )==0 ) hifield = fref( lineval ) - 1;
else if( strcmp( attr, "legendlabel" )==0 ) legendlabel = lineval;
else if( strcmp( attr, "sweeprange" )==0 ) getrange( lineval, &start, &stop, 'x', EDXlo, EDXhi );
else if( strcmp( attr, "xstart" )==0 ) { xstart = Econv( X, lineval ); if( Econv_error() ) xstart = EDXlo; }
else if( strcmp( attr, "select" )==0 ) selectex = lineval;
else if( strcmp( attr, "color" )==0 ) color = lineval;
else Eerr( 1, "attribute not recognized", attr );
}
/* -------------------------- */
/* overrides and degenerate cases */
/* -------------------------- */
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) );
if( !scalebeenset() )
return( Eerr( 51, "No scaled plotting area has been defined yet w/ proc areadef", "" ) );
if( (lofield < 0 || lofield >= Nfields )) return( Eerr( 601, "lofield out of range", "" ) );
if( (hifield < 0 || hifield >= Nfields )) return( Eerr( 601, "hifield out of range", "" ) );
if( xfield >= Nfields ) return( Eerr( 601, "xfield out of range", "" ) );
/* -------------------------- */
/* now do the plotting work.. */
/* -------------------------- */
/* put all values into PLV array.. */
j = 0;
f = xstart;
for( i = 0; i < Nrecords; i++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, i, &result );
if( stat != 0 ) { Eerr( stat, "Select error", selectex ); continue; }
if( result == 0 ) continue;
}
/* X */
if( xfield < 0 ) {
PLV[j] = f;
f += 1.0;
}
else {
PLV[j] = fda( i, xfield, X );
if( Econv_error() ) {
conv_msg( i, xfield, "xfield" );
PLV[j] = NEGHUGE;
}
}
j++;
/* LO */
PLV[j] = fda( i, lofield, Y );
if( Econv_error() ) {
conv_msg( i, lofield, "yfield" );
PLV[j] = NEGHUGE;
/* continue; */
}
j++;
/* HI */
PLV[j] = fda( i, hifield, Y );
if( Econv_error() ) {
conv_msg( i, hifield, "hifield" );
PLV[j] = NEGHUGE;
/* continue; */
}
j++;
if( j >= PLVsize-3 ) {
Eerr( 3579, "Too many points, sweep truncated (raise using -maxvector)", "" );
break;
}
}
npoints = j / 3;
/* draw the sweep.. */
/* ---------------- */
first = 1;
lastlo = 0.0;
lasthi = 0.0;
lastx = 0.0;
strcpy( oldcolor, Ecurcolor );
Ecolor( color );
for( i = 0; i < npoints; i++ ) {
if( !first && (hi > (NEGHUGE+1) && lo > (NEGHUGE+1) &&
x > (NEGHUGE+1) && x < (PLHUGE-1) ) ) {
lastlo = lo;
lasthi = hi;
lastx = x;
}
x = dat3d(i,0);
lo = dat3d(i,1);
hi = dat3d(i,2);
/* fprintf( stderr, "[last: x=%g lo=%g hi=%g current: x=%g lo=%g hi=%g]", lastx, lastlo, lasthi, x, lo, hi ); */
/* skip bad values and places */
if( x < (NEGHUGE+1) || lo < (NEGHUGE+1) || hi < (NEGHUGE+1) ) {
/* fprintf( stderr, "[skip]\n" ); */
continue;
}
/* if lo > hi reset so a new sweep can be started later.. */
if( lo > hi || x > (PLHUGE-1) ) {
first = 1;
/* fprintf( stderr, "[reset]\n" ); */
continue;
}
if( x < start ) {
/* fprintf( stderr, "[too lo]\n" ); */
continue; /* out of range - lo */
}
if( x > stop ) { /* out of range - hi */
/* fprintf( stderr, "[too hi]\n" ); */
break;
}
if( first ) {
/* fprintf( stderr, "[First]\n" ); */
first = 0;
continue;
}
if( !first ) {
/* fprintf( stderr, "[Draw]\n" ); */
Emovu( x, lo ); Epathu( lastx, lastlo );
Epathu( lastx, lasthi );
Epathu( x, hi );
/* Ecolorfill( color ); */ /* using Efill scg 6/18/04 */
Efill();
continue;
}
}
Ecolor( oldcolor );
if( legendlabel[0] != '\0' ) {
PL_add_legent( LEGEND_COLOR, legendlabel, "", color, "", "" );
}
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_settings.c 0000644 0001750 0001750 00000010012 11155237047 016112 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC SETTINGS - date, unit, notation settings */
#include "pl.h"
extern int PLGP_settings(), PLGS_setxmlparms(), PL_clickmap_urlenc1();
extern int setuid(), setgid();
int
PLP_settings()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first, stat;
TDH_errprog( "pl proc settings" );
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
/* settings that aren't shared with config file go here: */
/* do this here since "format" is an old attr name still supported.. */
if( strcmp( attr, "format" )==0 || strcmp( attr, "dateformat" )==0 ) DT_setdatefmt( lineval );
else if( GL_slmember( attr, "pivotyear months* weekdays omitweekends lazydates" )) {
stat = DT_setdateparms( attr, lineval );
}
/* the rest are shared settings.. */
else {
stat = PL_sharedsettings( attr, lineval );
if( stat ) Eerr( 1, "attribute not recognized", attr );
}
}
return( 0 );
}
/* ========================================= */
/* common code for setting attributes from proc settings or config file */
int
PL_sharedsettings( attr, lineval )
char *attr, *lineval;
{
char val[80];
tokncpy( val, lineval, 80 );
if( strcmp( attr, "units" )==0 ) {
if( val[0] == 'c' ) { PLS.usingcm = 1; setintvar( "CM_UNITS", 1 ); }
else { PLS.usingcm = 0; setintvar( "CM_UNITS", 0 ); }
}
#ifndef WIN32
else if( strcmp( attr, "uid" )==0 ) setuid( atoi( val ) );
else if( strcmp( attr, "gid" )==0 ) setgid( atoi( val ) );
else if( strcmp( attr, "cpulimit" )==0 ) TDH_reslimits( "cpu", atoi( val ) );
#endif
else if( strcmp( attr, "numbernotation" )==0 ) {
if( strcmp( val, "us" )==0 ) PLS.bignumspacer = ',';
else if( strcmp( val, "euro" )==0 ) PLS.bignumspacer = '.';
else PLS.bignumspacer = '\0';
}
else if( strcmp( attr, "numberspacerthreshold" )==0 ) PLS.bignumthres = atoi( val ); /* scg 2/28/02 */
else if( strcmp( attr, "font" )==0 ) strcpy( Estandard_font, lineval );
else if( strcmp( attr, "encodenames" )==0 ) { /* added scg 8/4/04 */
if( strncmp( val, "y", 1 )==0 ) PL_encode_fnames( 1 );
else PL_encode_fnames( 0 );
}
#ifndef NOPS
else if( strcmp( attr, "ps_latin1_encoding" )==0 ) {
if( strncmp( val, "y", 1 )==0 ) PLGP_settings( "ps_latin1_encoding", "1" ); /* added 7/28/04 */
else PLGP_settings( "ps_latin1_encoding", "0" ); /* added 7/28/04 */
}
#endif
#ifndef NOSVG
else if( strcmp( attr, "xml_encoding" )==0 ) PLGS_setxmlparms( "encoding", val );
else if( strcmp( attr, "xml_declaration" )==0 ) {
if( strncmp( val, "y", 1 )==0 ) PLGS_setxmlparms( "xmldecl", "1" );
else PLGS_setxmlparms( "xmldecl", "0" );
}
else if( strcmp( attr, "svg_tagparms" )==0 ) PLGS_setxmlparms( "svgparms", lineval );
else if( strcmp( attr, "svg_linkparms" )==0 ) PLGS_setxmlparms( "linkparms", lineval );
else if( strcmp( attr, "svg_mouseover_js" )==0 ) PLGS_setxmlparms( "mouseover_js", val );
#endif
else if( strcmp( attr, "dtsep" )==0 ) DT_setdtsep( val[0] );
else if( strcmp( attr, "errmsgpre" )==0 ) TDH_errprogsticky( lineval ); /* added 3/25/04 scg */
else if( strcmp( attr, "enable_suscripts" )==0 ) {
if( strncmp( val, "y", 1 )==0 ) PLG_textsupmode( 1 );
else PLG_textsupmode( 0 );
}
#ifdef HOLD
else if( strcmp( attr, "sanezone" )==0 ) {
double sanex, saney;
sscanf( lineval, "%lf %lf", &sanex, &saney );
PLG_sanezone( 0.0, 0.0, sanex, saney );
}
#endif
else return( 1 ); /* not found */
return( 0 ); /* ok */
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/plg.h 0000644 0001750 0001750 00000031567 12144511651 014033 0 ustar colin colin /*
* Graphics notes:
* - Origin is in lower left corner of "paper", regardless of orientation of paper.
* - Format of i-code will be: "a x y s\n", where a is an op code, x and y
* are coordinates in inches, and s is a variable length string (may be null).
*/
#ifndef PLGHEAD
#define PLGHEAD 1
#include
#include
#include
#include
#define YES 1
#define NO 0
#define MAXPATH 256
#define FONTLEN 60
#define COLORLEN 40
#define E_LINEAR 0
#define E_LOG 1
#define E_LOGPLUS1 2
#define E_RADIAL 3
#ifdef LOCALE
#define stricmp( s, t ) stricoll( s, t )
#define strnicmp( s, t, n ) strnicoll( s, t, n )
extern int stricoll(), strnicoll(); /* added scg 5/31/06 gcc4 */
#else
#define stricmp( s, t ) strcasecmp( s, t )
#define strnicmp( s, t, n ) strncasecmp( s, t, n )
#endif
/* output devices (Edev) */
#define X11 'x'
#define GD 'g'
#define SVG 's'
#define POSTSCRIPT 'p'
#define SWF 'f'
struct plgc {
/* overall settings */
char standard_font[FONTLEN] ;
int standard_textsize;
double standard_lwscale;
char standard_color[COLORLEN];
char standard_bkcolor[COLORLEN];
/* window size.. */
double winx, winy;
double winx_0, winy_0;
/* graphics parameters.. */
char dev;
int pixelsinch;
char standardfont[FONTLEN];
char curfont[FONTLEN];
int curtextsize;
int standardtextsize;
double curtextheight;
double curtextwidth;
int curtextdirection;
int curpaper;
double standardlinewidth;
double curlinewidth;
int curlinetype;
double curpatternfactor;
int curpen;
char curcolor[COLORLEN];
char curbkcolor[COLORLEN];
char nextcolor[COLORLEN];
char sparecolor[COLORLEN];
/* event information */
int event;
double eventx, eventy;
/* scaling.. */
double xlo, xhi, ylo, yhi; /* graphic area bounds, absolute coords */
double dxlo, dxhi, dylo, dyhi; /* graphic area bounds, data coords */
double scale_x, scale_y; /* linear scaling factors in x and y */
int scaletype_x; /* either LINEAR or LOG */
int scaletype_y; /* either LINEAR or LOG */
/* last moveto and lineto */
double x1, y1, x2, y2;
char progname[FONTLEN];
int flip;
int blacklines;
long flashdelay;
FILE *errfp;
};
/* ========== global vars ================= */
extern struct plgc PLG;
/* ========== function mappings - map E functions (used in most code) to PLG_ names ================ */
#define Emovu( x , y ) PLG_pcode( 'M', Eax((double) x ) , Eay((double) y ), "" )
#define Elinu( x , y ) PLG_pcode( 'L', Eax((double) x ) , Eay((double) y ), "" )
#define Epathu( x , y ) PLG_pcode( 'P', Eax((double) x ) , Eay((double) y ), "" )
/* #define Eclosepath() PLG_pcode( 'c', 0.0, 0.0, "" ) */
#define Efill( ) PLG_pcode( 's', 0.0, 0.0, "" )
#define Etext( s ) PLG_dotext( s, 'T' )
#define Ecentext( s ) PLG_dotext( s, 'C' )
#define Erightjust( s ) PLG_dotext( s, 'J' )
#define Esavewin( ) PLG_pcode( 'b', 0.0, 0.0, "" );
#define PLG_savewin( ) PLG_pcode( 'b', 0.0, 0.0, "" );
#define Erestorewin( ) PLG_pcode( 'B', 0.0, 0.0, "" );
#define PLG_restorewin( ) PLG_pcode( 'B', 0.0, 0.0, "" );
#define Escaletext( x ) PLG_pcode( 'e', x, 0.0, "" )
#define Eprint() PLG_getclick()
#define Eshow() PLG_pcode( 'Z', 0.0, 0.0, "" )
#define Esit() PLG_pcode( 'W', 0.0, 0.0, "" )
#define Easync() PLG_pcode( 'w', 0.0, 0.0, "" )
#define Eflush() PLG_pcode( 'U', 0.0, 0.0, "" )
#define PLG_flush() PLG_pcode( 'U', 0.0, 0.0, "" )
#define Ewinappear() PLG_pcode( 'a', 0.0, 0.0, "" )
#define PLG_winappear() PLG_pcode( 'a', 0.0, 0.0, "" )
#define Ewindisappear() PLG_pcode( 'd', 0.0, 0.0, "" )
#define Eendoffile() PLG_pcode( 'Q', 0.0, 0.0, "" )
#define Esquelch( s ) PLG_pcode( 'H', 0.0, 0.0, s )
#define PLG_squelch( s ) PLG_pcode( 'H', 0.0, 0.0, s )
#define PLG_forcecolorchg( ) PLG_pcode( 'v', 0.0, 0.0, "" )
#define Eerr( n, s, p ) TDH_err( n, s, p )
#define Epixpt( x, y, s ) PLG_pcode( '.', x, y, s ) /* direct pixel data point 5/25/06 */
#define Earrow( x1, y1, x2, y2, r, w, color ) PLG_arrow( x1, y1, x2, y2, r, w, color )
#define Ecblock( xlo, ylo, xhi, yhi, color, outline ) PLG_cblock( xlo, ylo, xhi, yhi, color, outline )
#define Ecblockdress( x1, y1, x2, y2, bs, lbc, hbc, ss, sc ) PLG_cblockdress( x1, y1, x2, y2, bs, lbc, hbc, ss, sc )
#define Esetlastbox( x1, y1, x2, y2 ) PLG_setlastbox( x1, y1, x2, y2 )
#define Egetlastbox( x1, y1, x2, y2 ) PLG_getlastbox( x1, y1, x2, y2 )
#define Escaletype( typ, axis ) PLG_scaletype( typ, axis )
#define Escale_x( xlo, xhi, datalow, datahi ) PLG_scale_x( xlo, xhi, datalow, datahi )
#define Escale_y( ylo, yhi, datalow, datahi ) PLG_scale_y( ylo, yhi, datalow, datahi )
#define Ea( xory, d ) PLG_a( xory, d )
#define Eax( d ) PLG_ax( d )
#define Eay( d ) PLG_ay( d )
#define Edx( a ) PLG_dx( a )
#define Edy( a ) PLG_dy( a )
#define Elimit( axis, end, units ) PLG_limit( axis, end, units )
#define Einit( dev ) PLG_init( dev )
#define Eset_early_defaults() PLG_set_early_defaults()
#define Esetsize( ux, uy, upleftx, uplefty ) PLG_setsize( ux, uy, upleftx, uplefty )
#define Esetdefaults() PLG_setdefaults()
#define Esetoutfilename( name ) PLG_setoutfilename( name )
#define Egetoutfilename( name ) PLG_getoutfilename( name )
#define Esetoutlabel( name ) PLG_setoutlabel( name )
#define Ehandle_events( x, y, e ) PLG_handle_events( x, y, e )
#define Egetkey( x, y, e ) PLG_getkey( x, y, e )
#define Egetclick() PLG_getclick()
#define Ehe( x, y, e ) PLG_he( x, y, e )
#define E_savekey( lx, ly, x ) PLG_savekey( lx, ly, c )
#define Eretreivekey( lx, ly, c ) PLG_retrievekey( lx, ly, c )
#define Esetsemfile( s ) PLG_setsemfile( s )
#define Esemfile() PLG_semfile()
#define Emark( x, y, code, r ) PLG_mark( x, y, code, r )
#define Epcode( op, x, y, s ) PLG_pcode( op, x, y, s )
#define Ebb( x, y ) PLG_bb( x, y )
#define Eresetbb() PLG_resetbb()
#define Egetbb( xlo, ylo, xhi, yhi ) PLG_getbb( xlo, ylo, xhi, yhi )
#define Egettextsize( w, h ) PLG_gettextsize( w, h )
#define Everttextsim( op, s ) PLG_verttextsim( op, s )
#define Etightbb( mode ) PLG_tightbb( mode )
#define Especifycrop( mode, x1, y1, x2, y2 ) PLG_specifycrop( mode, x1, y1, x2, y2 )
#define Egifrect( xlo, yhi, xhi, ylo, color ) PLG_gifrect( xlo, yhi, xhi, ylo, color )
#define Eimload( filename, scalex, scaley ) PLG_imload( filename, scalex, scaley )
#define Eimplace( x, y, filename, imalign, xscale, yscale ) PLG_implace( x, y, filename, imalign, xscale, yscale )
#define Esetglobalscale( sx, sy ) PLG_setglobalscale( sx, sy )
#define Egetglobalscale( sx, sy ) PLG_getglobalscale( sx, sy )
#define Esetposterofs( x, y ) PLG_setposterofs( x, y )
#define Epcodedebug( mode, fp ) PLG_pcodedebug( mode, fp )
#define Ecolorname_to_rgb( color, r, g, b ) PLG_colorname_to_rgb( color, r, g, b )
#define Ergb_to_gray( r, g, b ) PLG_rgb_to_gray( r, g, b )
#define Eicolor( i ) PLG_icolor( i )
#define Eclr() PLG_clr()
#define Emov( x, y ) PLG_mov( x , y )
#define Elin( x, y ) PLG_lin( x , y )
#define Epath( x, y ) PLG_path( x, y )
#define Edotext( s, op ) PLG_dotext( s, op )
#define Efont( s ) PLG_font( s )
#define Etextsize( x ) PLG_textsize( x )
#define Etextdir( x ) PLG_textdir( x )
#define Epaper( x ) PLG_paper( x )
#define Elinetype( pat, wid, dens ) PLG_linetype( pat, wid, dens )
#define Enormline() PLG_normline()
#define Ecolor( s ) PLG_color( s )
#define Ebackcolor( s ) PLG_backcolor( s )
#define Ecolorfill( c ) PLG_colorfill( c )
/* #define Eshade( s ) PLG_shade( s ) */
#define Esetwinscale( width, height, x_max, y_max ) PLG_setwinscale( width, height, x_max, y_max )
#define Exsca( f ) PLG_xsca( f )
#define Exsca_inv( i ) PLG_xsca_inv( i )
#define E_ysca( f ) PLG_ysca( f )
#define E_ysca_inv( i ) PLG_ysca_inv( i )
#define Elineclip( x1, y1, x2, y2, rx1, ry1, rx2, ry2) PLG_lineclip( x1, y1, x2, y2, rx1, ry1, rx2, ry2 )
/* =========== global vars mappings - map the 'E' name to the PLG member name ======= */
#define Estandard_font PLG.standard_font
#define Estandard_textsize PLG.standard_textsize
#define Estandard_lwscale PLG.standard_lwscale
#define Estandard_color PLG.standard_color
#define Estandard_bkcolor PLG.standard_bkcolor
#define EWinx PLG.winx
#define EWiny PLG.winy
#define EWinx_0 PLG.winx_0
#define EWiny_0 PLG.winy_0
#define Edev PLG.dev
#define Epixelsinch PLG.pixelsinch
#define Estandardfont PLG.standardfont
#define Ecurfont PLG.curfont
#define Ecurtextsize PLG.curtextsize
#define Estandardtextsize PLG.standardtextsize
#define Ecurtextheight PLG.curtextheight
#define Ecurtextwidth PLG.curtextwidth
#define Ecurtextdirection PLG.curtextdirection
#define Ecurpaper PLG.curpaper
#define Estandardlinewidth PLG.standardlinewidth
#define Ecurlinewidth PLG.curlinewidth
#define Ecurlinetype PLG.curlinetype
#define Ecurpatternfactor PLG.curpatternfactor
#define Ecurpen PLG.curpen
#define Ecurcolor PLG.curcolor
#define Ecurbkcolor PLG.curbkcolor
#define Enextcolor PLG.nextcolor
#define EEvent PLG.event
#define EEventx PLG.eventx
#define EEventy PLG.eventy
#define EXlo PLG.xlo
#define EXhi PLG.xhi
#define EYlo PLG.ylo
#define EYhi PLG.yhi
#define EDXlo PLG.dxlo
#define EDXhi PLG.dxhi
#define EDYlo PLG.dylo
#define EDYhi PLG.dyhi
#define EScale_x PLG.scale_x
#define EScale_y PLG.scale_y
#define Escaletype_x PLG.scaletype_x
#define Escaletype_y PLG.scaletype_y
#define Ex1 PLG.x1
#define Ey1 PLG.y1
#define Ex2 PLG.x2
#define Ey2 PLG.y2
#define Eprogname PLG.progname
#define Eflip PLG.flip
#define Eblacklines PLG.blacklines
#define Eflashdelay PLG.flashdelay
#define Errfp PLG.errfp
/* =========== more defines ================ */
/* mouse buttons */
#define E_MOUSE_LEFT 1001
#define E_MOUSE_MIDDLE 1002
#define E_MOUSE_RIGHT 1003
/* events */
#define E_EXPOSE 1010 /* window has been exposed, unable to restore contents */
#define E_RESIZE 1011 /* window has been resized */
#define E_MESSAGE 2000
#define E_COLORMAP_FULL 1100 /* no more colors, drop back to simple defaults */
#define E_MONODISPLAY 1101 /* monochrome display alert */
/* arrow keys */
#define E_LEFT 551
#define E_UP 552
#define E_RIGHT 553
#define E_DOWN 554
#define E_PAGEUP 555
#define E_PAGEDOWN 556
#define E_WAITFOR_WM 200000 /* in certain situations such as after remapping the window or after
resizing, a delay seems to be necessary before the window manager
responds to subsequent instructions.. This is in microseconds. */
/* ========== non-int function defines ================= */
double atof(), sqrt(), log();
extern double PLG_a(), PLG_ax(), PLG_ay(), PLG_dx(), PLG_dy(), PLG_limit(), PLG_conv(), PLG_u();
extern double PLG_xsca_inv(), PLG_ysca_inv();
extern char *PLG_icolor();
extern char *GL_getok(), *GL_autoround(), *GL_autoroundf();
/* ========== int function declares =================== */
extern int PLG_pcode();
extern int PLG_arrow();
extern int PLG_cblock();
extern int PLG_cblockdress();
extern int PLG_setlastbox();
extern int PLG_getlastbox();
extern int PLG_scaletype();
extern int PLG_scale_x();
extern int PLG_scale_y();
extern int PLG_init();
extern int PLG_set_early_defaults();
extern int PLG_setsize();
extern int PLG_setdefaults();
extern int PLG_setoutfilename();
extern int PLG_getoutfilename();
extern int PLG_setoutlabel();
extern int PLG_handle_events();
extern int PLG_getkey();
extern int PLG_getclick();
extern int PLG_he();
extern int PLG_savekey();
extern int PLG_retrievekey();
extern int PLG_setsemfile();
extern int PLG_semfile();
extern int PLG_mark();
extern int PLG_pcode();
extern int PLG_bb();
extern int PLG_resetbb();
extern int PLG_getbb();
extern int PLG_gettextsize();
extern int PLG_verttextsim();
extern int PLG_tightbb();
extern int PLG_specifycrop();
extern int PLG_gifrect();
extern int PLG_imload();
extern int PLG_implace();
extern int PLG_setglobalscale();
extern int PLG_getglobalscale();
extern int PLG_setposterofs();
extern int PLG_pcodedebug();
extern int PLG_colorname_to_rgb();
extern int PLG_rgb_to_gray();
extern int PLG_clr();
extern int PLG_mov();
extern int PLG_lin();
extern int PLG_path();
extern int PLG_dotext();
extern int PLG_font();
extern int PLG_textsize();
extern int PLG_textdir();
extern int PLG_paper();
extern int PLG_linetype();
extern int PLG_normline();
extern int PLG_color();
extern int PLG_backcolor();
extern int PLG_colorfill();
extern int PLG_setwinscale();
extern int PLG_xsca();
extern int PLG_ysca();
extern int PLG_lineclip();
extern int TDH_err();
extern int PLG_cblock_initstatic();
extern int PLG_colorname_to_rgb();
extern int PLG_ellipse();
extern int PLG_he();
extern int PLG_init_initstatic();
extern int PLG_mark_initstatic();
extern int PLG_pcode_initstatic();
extern int PLG_pcodeboundingbox();
extern int PLG_perptail();
extern int PLG_setdumpfile();
extern int PLG_setmaxdrivervect();
extern int PLG_stub_initstatic();
extern int PLG_textsupmode();
extern int PLG_xrgb_to_rgb();
extern int PLG_xsca();
extern int PLG_ysca();
#endif /* PLGHEAD */
ploticus-2.42/src/proc_vector.c 0000644 0001750 0001750 00000026001 11202300177 015545 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* windbarb features contributed by Andrew Phillips */
/* PROC VECTOR - render a display of vectors */
#include "pl.h"
#define TWOPI 6.2831854
#define HALFPI 1.5707963
int
PLP_vector()
{
char attr[NAMEMAXLEN], *line, *lineval;
int first, lvp;
int i, stat;
int xfield, yfield, dirfield, magfield, colorfield, exactcolorfield, clip;
double dirrange, lenscale, x, y, newx, newy, len, dir, ahlen, ahwid;
double sin(), cos(), basedir, constantlen, holdx, holdy;
char *acolor, *linedetails, *selex;
char legendlabel[256];
double barblimitbig, barblimitmedium, barblimitsmall, barblimittiny, barbdir, mag;
char dirunits, zeroat, clockdir, lenunits, type;
int x2field, y2field;
double taillen;
TDH_errprog( "pl proc vector" );
xfield = -1; yfield = -1; dirfield = -1; magfield = -1; colorfield = -1; exactcolorfield = -1; x2field = -1; y2field = -1;
dirrange = 360.0;
ahlen = 0.15;
ahwid = 0.4;
acolor = ""; selex = ""; linedetails = "";
strcpy( legendlabel, "" );
dirunits = 'd'; /* degrees */
zeroat = 't'; /* top */
clockdir = '+'; /* clockwise */
lenunits = 'a'; /* absolute */
type = 'a'; /* arrow */
lenscale = 1.0;
constantlen = 0.0;
taillen = 0.1;
barblimitbig = 50.0; /* Magnitude limits */
barblimitmedium = 10.0;
barblimitsmall = 5.0;
barblimittiny = 2.0;
barbdir = 120;
clip = 1;
mag = 0;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "xfield" )==0 ) xfield = fref( lineval ) -1;
else if( strcmp( attr, "yfield" )==0 ) yfield = fref( lineval ) -1;
else if( strcmp( attr, "dirfield" )==0 ) dirfield = fref( lineval ) -1;
else if( strcmp( attr, "x2field" )==0 ) x2field = fref( lineval ) -1;
else if( strcmp( attr, "y2field" )==0 ) y2field = fref( lineval ) -1;
else if( strcmp( attr, "dirrange" )==0 ) dirrange = atof( lineval );
else if( strcmp( attr, "dirunits" )==0 ) dirunits = lineval[0];
else if( strcmp( attr, "clockdir" )==0 ) clockdir = lineval[0];
else if( strcmp( attr, "zeroat" )==0 ) zeroat = lineval[0];
else if( strcmp( attr, "magfield" )==0 || strcmp( attr, "lenfield" )==0 ) magfield = fref( lineval ) -1;
else if( strcmp( attr, "lenunits" )==0 ) lenunits = lineval[0];
else if( strcmp( attr, "lenscale" )==0 ) lenscale = ftokncpy( lineval );
else if( strcmp( attr, "constantlen" )==0 ) constantlen = ftokncpy( lineval );
else if( strcmp( attr, "colorfield" )==0 ) colorfield = fref( lineval ) -1;
else if( strcmp( attr, "exactcolorfield" )==0 ) exactcolorfield = fref( lineval ) -1;
else if( strcmp( attr, "linedetails" )==0 ) linedetails = lineval;
else if( strcmp( attr, "arrowheadlength" )==0 ) ahlen = ftokncpy( lineval );
else if( strcmp( attr, "arrowheadwidth" )==0 ) ahwid = ftokncpy( lineval );
else if( strcmp( attr, "arrowheadcolor" )==0 ) acolor = lineval;
else if( strcmp( attr, "select" )==0 ) selex = lineval;
else if( strcmp( attr, "legendlabel" )==0 ) { strncpy( legendlabel, lineval, 255 ); legendlabel[255] = '\0'; }
else if( strcmp( attr, "taillen" )==0 ) taillen = ftokncpy( lineval );
else if( strcmp( attr, "clip" )==0 ) clip = getyn( lineval );
else if( strcmp( attr, "type" )==0 ) type = lineval[0];
else if( strcmp( attr, "barblimits" )==0 ) {
sscanf( lineval, "%lf %lf %lf %lf", &barblimitbig, &barblimitmedium, &barblimitsmall, &barblimittiny );
}
else if( strcmp( attr, "barbdir" )==0 ) barbdir = ftokncpy( lineval );
else Eerr( 1, "attribute not recognized", attr );
}
/* overrides and degenerate cases */
/* -------------------------- */
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) );
if( !scalebeenset() )
return( Eerr( 51, "No scaled plotting area has been defined yet w/ proc areadef", "" ) );
if( type == 'e' ) type = 'i';
if( xfield < 0 || yfield < 0 ) return( Eerr( 2205, "xfield and yfield are both required", "" ));
if( dirfield < 0 && ( x2field < 0 || y2field < 0 )) return( Eerr( 2205, "dirfield or x2field&y2field required", "" ));
if( magfield < 0 && constantlen == 0.0 && (x2field < 0 || y2field < 0 ))
return( Eerr( 2205, "magfield, constantlen, or x2field&y2field required", "" ));
if( magfield < 0 && type == 'b' && (x2field < 0 || y2field < 0 ))
return( Eerr( 2205, "magfield oe x2field/y2field required when type is barb", "" ));
if( barblimitbig <= 0 || barblimitmedium <= 0 || barblimitsmall <= 0 ) return( Eerr( 2205, "barblimits must be grater then 0", ""));
if( strncmp( legendlabel, "#usefname", 9 )==0 ) getfname( dirfield+1, legendlabel ); /* legendlabel[256] */
if( !GL_member( type, "abelit" )) type = 'a';
/* now do the plotting work.. */
/* -------------------------- */
if( dirunits == 'r' ) dirrange = TWOPI;
if( zeroat == 't' ) basedir = TWOPI * 0.25; /* top */
else if( zeroat == 'b' ) basedir = TWOPI * 0.75; /* bottom */
else if( zeroat == 'l' ) basedir = TWOPI * 0.5; /* left */
linedet( "linedetails", linedetails, 0.5 );
barbdir = (barbdir/dirrange) * TWOPI;
for( i = 0; i < Nrecords; i++ ) {
if( selex[0] != '\0' ) { /* process against selection condition if any.. */
int result;
stat = do_select( selex, i, &result );
if( stat != 0 ) { Eerr( stat, "Select error", selex ); continue; }
if( result == 0 ) continue; /* reject */
}
/* get x value.. */
x = fda( i, xfield, 'x' );
if( Econv_error() ) { conv_msg( i, xfield, "xfield" ); continue; }
/* get y value.. */
y = fda( i, yfield, 'y' );
if( Econv_error() ) { conv_msg( i, yfield, "yfield" ); continue; }
/* if colorfield used, get color.. */
if( colorfield >= 0 ) {
char *ldet; /* to get it to compile.. */
linedetails = "";
ldet = PL_get_legent( da( i, colorfield ) );
linedet( "colorfield", linedetails, 0.5 );
}
else if( exactcolorfield >= 0 ) {
linedetails = da( i, exactcolorfield );
linedet( "exactcolorfield", linedetails, 0.5 );
}
/* convert x,y to absolute units.. */
x = Eax( x );
y = Eay( y );
/* added scg 12/19/03 */
if( x2field >= 0 && y2field >=0 ) {
newx = Eax( fda( i, x2field, 'x' ) );
newy = Eay( fda( i, y2field, 'y' ) );
}
else {
/* dir and len.. */
dir = atof( da( i, dirfield ) );
if( magfield >= 0 ) mag = atof( da( i, magfield ) );
if( constantlen > 0.0 ) len = constantlen;
/* else len = atof( da( i, magfield ) ); */
else len = mag;
if( clockdir == '+' ) dir *= -1.0;
/* normalize dir and len.. */
dir = basedir + ((dir / dirrange) * TWOPI );
len *= lenscale;
if( lenunits == 'x' || lenunits == 'd' || lenunits == 'u' ) len = Eax( len ) - Eax( 0.0 );
else if( lenunits == 'y' ) len = Eay( len ) - Eay( 0.0 );
newx = x + (len * cos( dir ));
newy = y + (len * sin( dir ));
}
/* skip degenerate cases.. added scg 5/24/05 */
if( x == newx && y == newy ) continue;
if( clip ) {
holdx = newx; holdy = newy;
stat = Elineclip( &x, &y, &newx, &newy, EXlo, EYlo, EXhi, EYhi );
if( stat ) continue; /* entire vector is out of range */
else if( ! GL_close_to( newx, holdx, 0.000001 ) || !GL_close_to( newy, holdy, 0.000001 ) ) {
/* end is out of range, just draw line.. */
Emov( x, y );
Elin( newx, newy );
continue;
}
}
/* arrow */
if( type == 'a' ) {
Earrow( x, y, newx, newy, ahlen, ahwid, acolor );
}
/* line or error bar */
else if( type == 'l' || type == 'i' || type == 't' ) {
Emov( x, y );
Elin( newx, newy );
if( type == 'i' ) PLG_perptail( x, y, newx, newy, taillen );
if( type == 'i' || type == 't' ) PLG_perptail( newx, newy, x, y, taillen );
}
/* windbarb */
else if( type == 'b' ) {
/* contributed by Andrew Phillips */
int bigBarbCount, mediumBarbCount, smallBarbCount, curBarb, b;
double x1, x2, x3, y1, y2, y3, newMag, barbLen, barbSpace, barbAdjust;
bigBarbCount = 0;
mediumBarbCount = 0;
smallBarbCount = 0;
curBarb = 0;
newMag = mag;
/* length of barbs and the space betwen them */
barbLen = len/3;
barbSpace = len/6;
/* used to make small and medium barbs come from the
end of them stem */
barbAdjust = 0;
if( newMag >= barblimittiny) {
/* Draw the stem */
Emov( x, y );
Elin( newx, newy );
/* Count how many barbs to draw. Since barblimitbig
and friends arn't always going to be integers we
have to do this insted of some modulo fun. */
while(newMag > barblimitbig) {
bigBarbCount++;
newMag -= barblimitbig;
}
while(newMag > barblimitmedium) {
mediumBarbCount++;
newMag -= barblimitmedium;
}
while(newMag > barblimitsmall) {
smallBarbCount++;
newMag -= barblimitsmall;
}
/* Draw the big (triangle) barbs */
for (b = 0; b < bigBarbCount && curBarb < 8; b++) {
x1 = x + ((len - curBarb*barbSpace) * cos( dir ));
y1 = y + ((len - curBarb*barbSpace) * sin( dir ));
x2 = x + ((len - (curBarb+0.5)*barbSpace) * cos( dir )) - (barbLen * cos(dir+barbdir));
y2 = y + ((len - (curBarb+0.5)*barbSpace) * sin( dir )) - (barbLen * sin(dir+barbdir));
x3 = x + ((len - (curBarb+1)*barbSpace) * cos( dir ));
y3 = y + ((len - (curBarb+1)*barbSpace) * sin( dir ));
Emov(x1, y1);
Epath(x2, y2);
Epath(x3, y3);
Epath(x1, y1);
Ecolorfill( Ecurcolor );
curBarb++;
}
if (bigBarbCount > 0) barbAdjust = 0.5;
/* Draw the medium barbs */
for (b = 0; b < mediumBarbCount && curBarb < 8; b++) {
x1 = x + ((len - (curBarb+barbAdjust)*barbSpace) * cos( dir ));
y1 = y + ((len - (curBarb+barbAdjust)*barbSpace) * sin( dir ));
x2 = x1 - (barbLen * cos(dir+barbdir));
y2 = y1 - (barbLen * sin(dir+barbdir));
Emov(x1, y1);
Elin(x2, y2);
curBarb++;
}
/* Draw the small barbs */
for (b = 0; b < smallBarbCount && curBarb < 8; b++) {
x1 = x + ((len - (curBarb+barbAdjust)*barbSpace) * cos( dir ));
y1 = y + ((len - (curBarb+barbAdjust)*barbSpace) * sin( dir ));
x2 = x1 - (barbLen/2 * cos(dir+barbdir));
y2 = y1 - (barbLen/2 * sin(dir+barbdir));
Emov(x1, y1);
Elin(x2, y2);
curBarb++;
}
}
else {
/* Tiny barbs should just be half length stems */
newx = x + (len/2 * cos( dir ));
newy = y + (len/2 * sin( dir ));
/* Draw the mini stem */
Emov( x, y );
Elin( newx, newy );
}
} /* end of barbs */
} /* end data rows loop */
if( legendlabel[0] != '\0' ) PL_add_legent( LEGEND_LINE, legendlabel, "", linedetails, "", "" );
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_legend.c 0000644 0001750 0001750 00000037042 11540702117 015515 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC LEGEND - Render an automatic legend. Plotting procs supply legend entries */
#include "pl.h"
#define MAXLEGENT 100 /* max # of legend entries */
#define MAXLEGTEXT 5000 /* max amount of legend text, including labels
and details attributes */
#define DOWN 0
#define ACROSS 1
extern int PLG_init_bb2(), PLG_get_bb2();
static int NLE = 0;
static int LEavail = 0;
static int LEtype[MAXLEGENT];
static int LEparm1[MAXLEGENT];
static int LEparm2[MAXLEGENT];
static int LEparm3[MAXLEGENT];
static int LElabel[MAXLEGENT];
static int LEtag[MAXLEGENT];
static char Ltext[MAXLEGTEXT];
/* ================================ */
int
PLP_legend_initstatic()
{
NLE = 0;
LEavail = 0;
return(0);
}
/* ================================ */
int
PLP_legend()
{
int i;
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
char buf[256], symcode[80], holdstdcolor[COLORLEN], url[MAXURL], color[COLORLEN], format;
char *textdetails, *frame, *backcolor, *title, *titledetails, *s, *specifyorder;
int j, k, ix, ixx, nt, align, outline, nlines, maxlen, reverseorder, do_outline, colortext;
int buflen, noclear, nlinesym, maxtwidth, maxthi, wraplen, dobox, bstate;
double adjx, adjy, x, y, yy, seglen, hsep, msep, swatchsize, radius, extent;
double startx, starty, sampwidth, colchunksep, colbreak, rowchunksep, orig_x, orig_y, bx1, by1, bx2, by2, bmx1, bmy1, bmx2, bmy2, titx, tity;
TDH_errprog( "pl proc legend" );
/* initialize */
textdetails = "";
frame = "no";
title = "";
titledetails = "";
specifyorder = "";
backcolor = Ecurbkcolor;
x = -9999.0;
y = -9999.0;
format = DOWN;
seglen = 0.5;
msep = 0.0;
hsep = 0.3;
reverseorder = 0; do_outline = 0; colortext = 0; noclear = 0; wraplen = 0; dobox = 0;
swatchsize = 0.1;
extent = -1.0;
colchunksep = 0.35;
rowchunksep = 0.1;
nlinesym = 2;
bmx1 = bmy1 = bmx2 = bmy2 = 0.08;
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "location" )==0 ) getcoords( "location", lineval, &x, &y );
else if( strcmp( attr, "format" )==0 ) {
format = lineval[0];
if( format == 'd' || format == 'm' ) format = DOWN;
else if( format == 'a' || format == 's' ) format = ACROSS;
}
else if( strcmp( attr, "textdetails" )==0 ) textdetails = lineval;
else if( strcmp( attr, "seglen" )==0 ) seglen = ftokncpy( lineval );
else if( strcmp( attr, "sep" )==0 ) ; /* superseded by the 'separation' attribute */
else if( strcmp( attr, "separation" )==0 ) {
hsep = ftokncpy( lineval ); msep = ftokncpy( lineval );
if( PLS.usingcm ) { hsep /= 2.54; msep /= 2.54; }
}
else if( strcmp( attr, "colortext" )==0 ) colortext = getyn( lineval );
else if( strcmp( attr, "outlinecolors" )==0 ) do_outline = getyn( lineval );
else if( strcmp( attr, "noclear" )==0 ) noclear = getyn( lineval );
else if( strcmp( attr, "specifyorder" )==0 ) specifyorder = getmultiline( lineval, "get" );
else if( strcmp( attr, "specifyorder1" )==0 ) { specifyorder = lineval; convertnl( specifyorder ); }
else if( strcmp( attr, "swatchsize" )==0 ) { swatchsize = ftokncpy( lineval ); if( PLS.usingcm ) swatchsize /= 2.54; }
else if( strcmp( attr, "reverseorder" )==0 ) reverseorder = getyn( lineval );
else if( strcmp( attr, "reset" )==0 ) { NLE = 0; return( 0 ); }
/* the following attributes added for 2.32 - scg 8/12/05 ....... */
else if( strcmp( attr, "extent" )==0 ) { extent = ftokncpy( lineval ); if( PLS.usingcm ) extent /= 2.54; }
else if( strcmp( attr, "chunksep" )==0 ) { /* additional amount of separation between column chunks or row chunks */
colchunksep = ftokncpy( lineval );
rowchunksep = ftokncpy( lineval );
if( PLS.usingcm ) { colchunksep /= 2.54; rowchunksep /= 2.54; }
}
else if( strcmp( attr, "nlinesym" )== 0 ) { nlinesym = itokncpy( lineval ); if( nlinesym > 2 ) nlinesym = 2; }
else if( strcmp( attr, "wraplen" )==0 ) wraplen = itokncpy( lineval );
else if( strcmp( attr, "frame" )==0 ) { frame = lineval; dobox = 1; }
else if( strcmp( attr, "backcolor" )==0 ) { backcolor = lineval; dobox = 1; }
else if( strcmp( attr, "boxmargin" )==0 ) {
char foo1[40], foo2[40];
nt = sscanf( lineval, "%s %s", foo1, foo2 );
if( nt == 1 ) { if( PLS.usingcm ) bmx1 /= 2.54; bmy1 = bmx2 = bmy2 = bmx1; }
else {
PL_getbox( "boxmargin", lineval, &bmx1, &bmy1, &bmx2, &bmy2 );
if( PLS.usingcm ) { bmx1 /= 2.54; bmy1 /= 2.54; bmx2 /= 2.54; bmy2 /= 2.54; }
}
}
else if( strcmp( attr, "title" )==0 ) { title = lineval; dobox = 1; convertnl( title ); }
else if( strcmp( attr, "titledetails" )==0 ) titledetails = lineval;
else Eerr( 1, "attribute not recognized", attr );
}
if( NLE < 1 ) return( 0 ); /* silent is better here ... scg 5/5/04 */
/*********** now do the plotting work.. **********/
/* If we're doing a legend title and/or a bounding box around the legend... some tricks required....
What we'll do is go into squelch mode (suppressing all graphic device output calls), and
render the legend invisibly while keeping a bounding box. Then (see "goto RENDER"), we'll
get out of squelch mode, render the box (since we know it's coordinates now) then go back
and render the legend for real. [Note added scg 3/18/2011]
*/
/* box init stuff.. */
if( dobox ) { bstate = 0; PLG_init_bb2(); Esquelch( "on" ); }
/* default location */
if( x < -9000.0 ) {
if( scalebeenset() ) { x = EXhi - 1.5; y = EYhi - 0.1; }
else { x = 6.0; y = 2.0; }
}
orig_x = x; orig_y = y;
RENDER:
ix = 0;
buflen = strlen( specifyorder );
startx = x; starty = y;
if( format == DOWN ) {
if( extent < 0.0 ) colbreak = 0.0; /* always at y = 0 */
else colbreak = starty - extent; /* extent was specified.. do it */
}
maxtwidth = 0; /* keep track of the max text width in column */
maxthi = 0; /* keep track of the max text #lines in column (since individual entries can wrap with "\n" */
textdet( "textdetails", textdetails, &align, &adjx, &adjy, -2, "R", 1.0 );
y -= Ecurtextheight;
for( i = 0; i < NLE; i++ ) {
/* fprintf( stderr, "%d|%s|%s|%s\n", LEtype[i], &Ltext[LElabel[i]], &Ltext[LEparm1[i]], &Ltext[LEparm2[i]] ); */
if( specifyorder[0] != '\0' ) {
/* get next line in orderspec.. */
NEXTORDERLINE:
GL_getchunk( buf, specifyorder, &ix, "\n" );
if( ix >= buflen ) break;
/* now search for matching entry.. */
for( k = 0; k < NLE; k++ ) {
if( strncmp( buf, &Ltext[LElabel[k]], strlen(buf) )==0) {
j = k;
break;
}
}
if( k == NLE ) {
/* following changed, scg 2/27/02 */
/* Eerr( 2894, "No legend entry matched", buf ); */
goto NEXTORDERLINE;
/* continue; */
}
}
else if( reverseorder ) j = ((NLE-1)-i);
else j = i;
yy = y+(Ecurtextheight*0.4);
/* draw swatch(es), depending on type */
if( LEtype[j] == LEGEND_COLOR ) {
sampwidth = swatchsize+0.1;
if( format == ACROSS && x > startx ) x += sampwidth;
sscanf( &Ltext[LEparm1[j]], "%s", color );
if( strcmp( color, backcolor ) ==0 ) outline = 1;
else outline = do_outline;
if( outline ) { Elinetype( 0, 0.5, 1.0 ); Ecolor( Estandard_color ); PLG_forcecolorchg(); }
Ecblock( x-(swatchsize+0.1), y, x-0.1, y+swatchsize, color, outline );
}
else if( LEtype[j] == LEGEND_LINE ) {
sampwidth = seglen+0.1;
if( format == ACROSS && x > startx ) x += sampwidth;
linedet( &Ltext[LElabel[j]], &Ltext[LEparm1[j]], 1.0 );
Emov( x-(seglen+0.1), yy );
Elin( x-0.1, yy );
}
else if( LEtype[j] == LEGEND_LINEMARK ) { /* tiny line marks that can be used in scatterplots */
sampwidth = 0.2;
if( format == ACROSS && x > startx ) x += sampwidth;
linedet( &Ltext[LElabel[j]], &Ltext[LEparm1[j]], 1.0 );
if( strcmp( &Ltext[LEparm2[j]], "v" )==0 ) { Emov( x-0.15, yy+0.05 ); Elin( x-0.15, yy-0.05 ); } /* vertical */
else { Emov( x-0.2, yy ); Elin( x-0.1, yy ); } /* horizontal */
}
else if( LEtype[j] == LEGEND_SYMBOL ) {
symdet( "symbol", &Ltext[LEparm1[j]], symcode, &radius );
sampwidth = 0.17 + radius;
if( format == ACROSS && x > startx ) x += sampwidth;
Emark( x-0.17, yy, symcode, radius );
}
else if( LEtype[j] == LEGEND_TEXT ) {
sampwidth = 0.8; /* just a guess */
if( format == ACROSS && x > startx ) x += sampwidth;
/* parm1 is text, parm2 is textdetails */
textdet( &Ltext[LElabel[j]], &Ltext[LEparm2[j]], &align, &adjx, &adjy, -2, "R", 1.0 );
Emov( x-0.1, y );
Erightjust( &Ltext[LEparm1[j]] );
}
else if( LEtype[j] == (LEGEND_LINE + LEGEND_SYMBOL) ) {
sampwidth = seglen+0.1;
if( format == ACROSS && x > startx ) x += sampwidth;
/* parm1 is linedetails, parm2 is symboldetails */
linedet( &Ltext[LElabel[j]], &Ltext[LEparm1[j]], 1.0 );
Emov( x-(seglen+0.1), yy );
Elin( x-0.1, yy );
symdet( "symbol", &Ltext[LEparm2[j]], symcode, &radius );
if( nlinesym == 1 ) Emark( x-((seglen/2.0)+0.1), yy, symcode, radius );
else if ( nlinesym == 2 ) {
Emark( x-(seglen), yy, symcode, radius );
Emark( x-0.18, yy, symcode, radius );
}
}
else if( LEtype[j] == (LEGEND_TEXT + LEGEND_SYMBOL) ) {
sampwidth = 0.8; /* just a guess */
if( format == ACROSS && x > startx ) x += sampwidth;
/* parm1 is text, parm2 is textdetails, parm3 is symboldetails */
symdet( "symbol", &Ltext[LEparm3[j]], symcode, &radius );
Emark( x-0.17, yy, symcode, radius );
textdet( &Ltext[LElabel[j]], &Ltext[LEparm2[j]], &align, &adjx, &adjy, -2, "R", 1.0 );
Emov( x-0.17, y+(Ecurtextheight*0.2) );
Ecentext( &Ltext[LEparm1[j]] );
}
s = &Ltext[ LElabel[ j ]];
/* check for embedded url.. */
strcpy( url, "" );
if( strncmp( s, "url:", 4 )==0 ) {
ixx = 0;
strcpy( url, GL_getok( &s[4], &ixx ) );
s = &Ltext[ LElabel[j] + ixx + 4 + 1 ];
}
if( wraplen ) GL_wraptext( s, wraplen );
/* get #lines and maxlen of label */
measuretext( s, &nlines, &maxlen );
if( maxlen > maxtwidth ) maxtwidth = maxlen;
if( nlines > maxthi ) maxthi = nlines;
/* render label */
if( colortext ) {
if( LEtype[j] == LEGEND_COLOR ) Ecolor( color );
strcpy( holdstdcolor, Estandard_color );
strcpy( Estandard_color, "" ); /* this prevents textdet() from changing the color 7/12/01 */
}
textdet( "textdetails", textdetails, &align, &adjx, &adjy, -2, "R", 1.0 );
Emov( x + adjx, y + adjy );
Etext( s );
if( colortext ) strcpy( Estandard_color, holdstdcolor );
if( PLS.clickmap && url[0] ) {
clickmap_entry( 'r', url, 0, x+adjx, y+adjy,
x+adjx+(maxlen*Ecurtextwidth), y+adjy+(nlines*Ecurtextheight), 1, 0, "" );
}
/* determine position for next legend entry.. */
if( format == DOWN ) {
y -= ((Ecurtextheight * nlines) + 0.03 ) + msep;
if( y < colbreak ) { /* start a new column - added scg 8/12/05 */
/* x = x + ((double)maxtwidth*Ecurtextwidth) + sampwidth + colchunksep; */
x = x + ((double)maxtwidth*Ecurtextwidth) + sampwidth + colchunksep;
y = starty - Ecurtextheight;
maxtwidth = 0;
}
}
else if( format == ACROSS ) { /* single line */
/* if( hsep > 0.0 ) */ /* changed, scg 11/1/07 */
x += ((Ecurtextwidth * maxlen ) + hsep);
/* else x += ((Ecurtextwidth * maxlen ) + 1.2); */
if( x < startx ) x = startx; /* 11/1/07 */
if( extent > 0.0 && ((x-startx) > extent) ) { /* start a new row - added scg 8/12/05 */
y -= ((Ecurtextheight * maxthi) + rowchunksep);
x = startx;
maxthi = 0;
}
}
}
if( dobox ) {
PLG_get_bb2( &bx1, &by1, &bx2, &by2 ); /* get bb so we know where to place the title.. */
if( title[0] != '\0' ) { /* do invisible title 1st time thru to influence bb, then really draw it 2nd time thru.. */
textdet( "titledetails", titledetails, &align, &adjx, &adjy, 0, "R", 1.0 );
if( align == '?' ) align = 'C';
measuretext( title, &nlines, &maxlen );
if( bstate == 0 ) { titx = bx1+((bx2-bx1)/2.0)+adjx; tity = by2+(nlines*Ecurtextheight)+adjy; }
Emov( titx, tity );
Edotext( title, align );
}
Esquelch( "off" );
if( bstate == 0 ) {
/* now that we know the extent of the legend, do box now;
* then we'll go back and draw the legend on top of it */
PLG_get_bb2( &bx1, &by1, &bx2, &by2 ); /* may have changed if there was a title.. */
if( strcmp( frame, "bevel" )==0 ) {
Ecblock( bx1-bmx1, by1-bmy1, bx2+bmx2, by2+bmy2, backcolor, 0 );
Ecblockdress( bx1-bmx1, by1-bmy1, bx2+bmx2, by2+bmy2, 0.07, "0.6", "0.8", 0.0, "" );
}
else if( strcmp( frame, "no" ) == 0 ) Ecblock( bx1-bmx1, by1-bmy1, bx2+bmx2, by2+bmy2, backcolor, 0 );
else {
linedet( "frame", frame, 1.0 );
Ecblock( bx1-bmx1, by1-bmy1, bx2+bmx2, by2+bmy2, backcolor, 1 );
}
bstate = 1;
x = orig_x; y = orig_y;
goto RENDER;
}
}
/* now reset so a new legend can be accumulated.. */
if( !noclear ) { NLE = 0; LEavail = 0; } /* LEavail init added here, scg 10/3/06 */
return( 0 );
}
/* ===================================== */
/* ADD_LEGENT - used by procs to add a legend entry */
int
PL_add_legent( typ, label, tag, parm1, parm2, parm3 )
int typ;
char *label, *tag, *parm1, *parm2, *parm3;
{
char *errmsg;
errmsg = "Sorry, too much legend content";
LEtype[ NLE ] = typ;
if( typ == 0 ) label = "\n\n"; /* type=none is supposed to create extra space.. */
else if( label[0] != '\0' ) convertnl( label );
LElabel[ NLE ] = LEavail;
if( LEavail + strlen( label ) >= MAXLEGTEXT )
return( Eerr( 8478, errmsg, "" ) );
strcpy( &Ltext[ LEavail ], label );
LEavail += (strlen( label ) + 1);
LEtag[ NLE ] = LEavail;
if( LEavail + strlen( tag ) >= MAXLEGTEXT )
return( Eerr( 8478, errmsg, "" ) );
strcpy( &Ltext[ LEavail ], tag );
LEavail += (strlen( tag ) + 1);
if( LEavail + strlen( parm1 ) >= MAXLEGTEXT )
return( Eerr( 8478, errmsg, "" ) );
LEparm1[ NLE ] = LEavail;
strcpy( &Ltext[ LEavail ], parm1 );
LEavail += (strlen( parm1 ) + 1);
if( LEavail + strlen( parm2 ) >= MAXLEGTEXT )
return( Eerr( 8478, errmsg, "" ) );
LEparm2[ NLE ] = LEavail;
strcpy( &Ltext[ LEavail ], parm2 );
LEavail += (strlen( parm2 ) + 1);
if( LEavail + strlen( parm3 ) >= MAXLEGTEXT )
return( Eerr( 8478, errmsg, "" ) );
LEparm3[ NLE ] = LEavail;
strcpy( &Ltext[ LEavail ], parm3 );
LEavail += (strlen( parm3 ) + 1);
NLE++;
return( 0 );
}
/* ========================================= */
/* GET_LEGENT - get parm1 of a legend entry, based on tag ... used for "legend-driven" plot element selection */
char *
PL_get_legent( tag )
char *tag;
{
int i;
for( i = 0; i < NLE; i++ ) if( strcmp( tag, &Ltext[ LEtag[i] ] )==0 ) break;
if( i == NLE ) return( "" ); /* tag not found.. */
return( &Ltext[ LEparm1[i] ] );
/* if( parm1 != NULL ) strcpy( parm1, &Ltext[ LEparm1[i] ] ); */
/* if( parm2 != NULL ) strcpy( parm2, &Ltext[ LEparm2[i] ] ); */
/* if( parm3 != NULL ) strcpy( parm3, &Ltext[ LEparm3[i] ] ); */
/* return( 0 ); */
}
/* ========================================= */
/* GET_LEGENT_RG - get a legend entry based numeric comparison with tag ... used for "legend-driven" plot element selection */
char *
PL_get_legent_rg( val )
double val;
{
int i;
double atof();
for( i = 0; i < NLE; i++ ) if( val >= atof( &Ltext[ LEtag[i] ] ) ) break;
if( i == NLE ) return( "" ); /* tag not found.. */
return( &Ltext[ LEparm1[i] ] );
/* if( parm1 != NULL ) strcpy( parm1, &Ltext[ LEparm1[i] ] ); */
/* if( parm2 != NULL ) strcpy( parm2, &Ltext[ LEparm2[i] ] ); */
/* if( parm3 != NULL ) strcpy( parm3, &Ltext[ LEparm3[i] ] ); */
/* return( 0 ); */
}
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/glroutines.c 0000644 0001750 0001750 00000073164 11447116540 015441 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
#include
#include
#include
#include
#include
extern int GL_member(), GL_encode(), GL_wildcmp();
extern int getpid();
#define stricmp( s, t ) strcasecmp( s, t )
#define strnicmp( s, t, n ) strncasecmp( s, t, n )
#define DATAMAXLEN 256
static int getdecplaces(), wcmp();
static char Sep = ','; /* separator character for lists */
static char Gettok_buf[260];
static char Wildcard = '*';
static char Wildcard1 = '?';
static int Maxlen = 99999;
static char Member_nullstring[10] = "";
/* ================================= */
int
GL_initstatic()
{
Sep = ',';
Wildcard = '*';
Wildcard1 = '?';
Maxlen = 99999;
strcpy( Member_nullstring, "" );
return( 0 );
}
/* ================================= */
/* thanks to Markus Hoenicka for this more portable sysdate and systime code */
/* SYSDATE - get today's date */
int
GL_sysdate( mon, day, yr )
int *mon, *day, *yr ;
{
time_t clock;
struct tm *ltime;
time(&clock);
ltime = localtime(&clock);
*mon = ltime->tm_mon + 1;
*day = ltime->tm_mday;
*yr = ltime->tm_year;
if( (*yr) >= 100 ) (*yr) = (*yr) % 100; /* scg y2k 11/10/98 */
return( 0 );
}
/* ================================= */
/* SYSTIME - get current time */
int
GL_systime( hour, min, sec )
int *hour, *min, *sec ;
{
time_t clock;
struct tm *ltime;
time(&clock);
ltime = localtime(&clock);
*hour = ltime->tm_hour;
*min = ltime->tm_min;
*sec = ltime->tm_sec;
return( 0 );
}
/* ============================================= */
/* GETOK - get next whitespace-delimited token */
char
*GL_getok( string, index )
char *string;
int *index;
{
int n;
while( GL_member( string[(*index)], " \t\n" ) ) (*index)++;
for( n=0;
n <= 255 &&
string[*index] != ' ' &&
string[*index] != '\t' &&
string[*index] != '\n' &&
string[*index] != 13 && /* DOS LF added may 03 scg */
string[*index] != '\0' ;
Gettok_buf[n++] = string[(*index)++] ) ;
Gettok_buf[n] = '\0' ;
return( Gettok_buf );
}
/* ====================================================================== */
/* MEMBER - returns char position if character c is a member of string s,
0 otherwise. Char positions start with 1 for this purpose. */
int
GL_member( c, s )
char c, s[];
{
int i, len;
for( i = 0, len = strlen( s ); i < len; i++ ) if( s[i] == c ) return( i+1 );
return( 0 );
}
/* ===================================================================== */
/* SMEMBER - look for s in list t (white-space delimited). Case sensitive.
If found return 1 else 0. */
int
GL_smember( s, t )
char s[], t[];
{
char tok[DATAMAXLEN+1], *GL_getok();
int i;
i = 0;
while( 1 ) {
strcpy( tok, GL_getok( t, &i ) );
if( tok[0] == '\0' ) break;
if( Member_nullstring[0] != '\0' ) {
if( strcmp( s, Member_nullstring)== 0 && stricmp( tok, "null" )==0 )return( 1 );
}
if( strcmp( tok, s ) == 0 ) return( 1 );
}
return( 0 );
}
/* ===================================================================== */
/* SMEMBERI - look for s in list t (white-space delimited). Case insensitive.
If found return 1 else 0. */
int
GL_smemberi( s, t )
char s[], t[];
{
char tok[DATAMAXLEN+1], *GL_getok();
int i;
i = 0;
while( 1 ) {
strcpy( tok, GL_getok( t, &i ) );
if( tok[0] == '\0' ) break;
if( Member_nullstring[0] != '\0' ) {
if( strcmp( s, Member_nullstring)== 0 && stricmp( tok, "null" )==0 )return( 1 );
}
if( stricmp( tok, s ) == 0 ) return( 1 );
}
return( 0 );
}
/* ==================================================================== */
/* MEMBER_NULLMODE - set a special mode for the benefit of shsql, to consider
"null" or "NULL" equivalent to some code such as "=" */
int
GL_member_nullmode( s )
char *s;
{
strcpy( Member_nullstring, s );
return( 0 );
}
/* ===================================================================== */
/* GOODNUM - checks a token to see if it is a legal number. Returns 1 = yes 0 = no.
'prec' is returned.. and is the precision of the number (position of decimal point).
Number may contain unary + or -, and one decimal point.
Leading and trailing whitespace are tolerated by this routine, eg. " 28.5 " is considered OK
*/
int
GL_goodnum( str, prec )
char *str;
int *prec;
{
int i, start, len, p, bad;
bad = 0; *prec = -1;
len = strlen( str );
/* find limit of trailing whitespace.. */
for( i = len-1; i >= 0; i-- ) if( !isspace( (int) str[i] ) ) break;
len = i+1;
/* skip over leading whitespace.. */
for( i = 0; i < len; i++ ) if( !isspace( (int) str[i] ) ) break;
start = i;
/* screen out degenerate cases.. */
if( len < 1 ) return( 0 ); /* degenerate case "" */
if( len-start == 1 && ( str[start] == '.' || str[start] == '+' || str[start] == '-' ) )
return( 0 ); /* degenerate case; ".", "+", "-" */
/* check invididual characters.. */
for( p = start; p < len; p++ ) {
if( str[p] == '.' ) {
if( *prec == -1 ) *prec = p;
else bad=1;
}
else if( p == start && ( str[p] == '-' || str[p] == '+' ) );
else if( p > start && tolower( (int) str[p]) == 'e' ) { /* handle scientific notation ... scg 7/29/04 */
p++;
if( str[p] != '-' && str[p] != '+' ) bad=1;
if( p+1 >= len ) bad=1;
}
else if( ! isdigit( (int) str[p]) ) bad=1;
}
/* return.. */
if( bad ) return( 0 );
else return( 1 );
}
/* =========================================== */
/* GETSEG - Get fields, which are delimited by any member of sepstring.
Similar to GL_getchunk(); however
Whereas GL_getchunk() skips over adjacent separators,
this routine delimits on EACH separator character encountered,
Also, separator character is ignored if preceded in inbuf by a backslash(\).
Returns 1 when end-of-line is reached and no token is being returned.
SCG 12-2-96
*/
int
GL_getseg( rtn, inbuf, i, sep )
char rtn[];
char inbuf[];
int *i;
char *sep;
{
int n;
int escaping;
int eol;
n = 0;
rtn[0] = '\0';
escaping = 0;
eol = 0;
while( 1 ){
if( inbuf[*i] == '\0' ) {
if( n == 0 ) eol = 1;
break;
}
else if( GL_member( inbuf[*i], sep ) && !escaping ) { (*i)++; break; }
else if( inbuf[*i] == '\\' && GL_member( inbuf[(*i)+1], sep ) ) {
escaping = 1;
(*i)++;
continue;
}
else rtn[n++] = inbuf[(*i)++];
if( n >= 511 ) break; /* 512 max */
escaping = 0;
}
rtn[n] = '\0' ;
return( eol );
}
/* ==================================================================== */
/* GETCHUNK - Get tokens, which are separated by any member of sepstring */
int
GL_getchunk( rtn, line, i, sepstring )
char rtn[];
char line[];
int *i;
char sepstring[];
{
int n;
while( GL_member( line[(*i)], sepstring ) ) (*i)++;
n = 0;
rtn[0] = '\0';
while( 1 ){
if( GL_member( line[*i], sepstring ) || line[*i] == '\0' ) break;
else rtn[n++] = line[(*i)++];
if( n >= (Maxlen-1) ) break;
}
rtn[n] = '\0' ;
return( 0 );
}
/* ============================================= */
/* MAKE_UNIQUE_STRING - generate an identifier using date, time, and pid */
int
GL_make_unique_string( s, i )
char *s;
int i; /* may be sent as an integer.. if 0 getpid() will be used.. */
{
int mon, day, yr, hr, min, sec, pid;
GL_sysdate( &mon, &day, &yr );
GL_systime( &hr, &min, &sec );
s[0] = GL_encode( yr % 100 );
s[1] = GL_encode( mon );
s[2] = GL_encode( day );
s[3] = GL_encode( hr );
s[4] = GL_encode( min );
s[5] = GL_encode( sec );
if( i == 0 ) pid = getpid();
else pid = i;
s[6] = GL_encode( pid % 62 );
pid = pid / 62;
s[7] = GL_encode( pid % 62 );
s[8] = GL_encode( pid / 62 );
s[9] = '\0';
return( 0 );
}
/* encode - derive a character representation of a number (number must be in range 0 - 62) */
int
GL_encode( a )
int a;
{
if( a >= 0 && a <= 9 ) return( a + '0' );
else if( a > 35 ) return( (a-36) + 'A' ); /* A-Z 26 letters + 9 = 35 */
else if( a > 9 ) return( (a-10) + 'a' ); /* a-z */
else return( '0' );
}
/* decode - decode a character representation of a number */
int
GL_decode( a )
int a;
{
if( a >= '0' && a <= '9' ) return( a - '0' );
else if( a >= 'a' ) return( (a - 'a')+10 ); /* a-z */
else if( a >= 'A' ) return( (a - 'A')+36 ); /* A-Z 26 letters + 9 = 35 */
else return( '0' );
}
/* ============================================= */
/* EXPAND_TABS Takes a string parameter 'in' and expands tabs into spaces, placing the
result into parameter 'out'.
*/
int
GL_expand_tabs( out, in )
char in[], out[];
{
int i, j, k, l, len;
out[0] = '\0';
k = 0;
for( i = 0, len = strlen( in ); i < len; i++ ) {
if( in[i] == '\t' ) {
j = 8 - ( k % 8 ); /* 1 to 8 spaces needed */
for( l = 0; l < j; l++ ) out[k++] = ' ';
}
else out[k++] = in[i];
}
out[k] = '\0';
return( 0 );
}
/* ==================================================== */
/* WRAPTEXT - wrap txt so that no line exceeds maxchars. Wrap is done by changing certain whitespace chars to '\n' */
int GL_wraptext( txt, maxchars )
char *txt; /* the text */
int maxchars; /* max # of chars per line after wrap */
{
int i, lb, spaceat;
lb = 0;
spaceat = -1;
for( i = 0; txt[i] != '\0'; i++ ) {
if( i - lb > maxchars ) {
if( spaceat == -1 ) spaceat = i; /* for wierd situations - no space found, break right here */
txt[spaceat] = '\n';
lb = spaceat;
spaceat = -1;
}
else if( txt[i] == '\n' ) { lb = i; spaceat = -1; } /* newline already present in txt.. respect it.. */
else if( isspace( (int) txt[i] ) ) spaceat = i;
}
return( 0 );
}
/* test for wraptext */
/* main( argc, argv )
* int argc; char **argv;
* {
* char buf[256];
* if( argc < 2 ) exit(1);
* strcpy( buf, argv[1] );
* GL_wraptext( buf, atoi( argv[2] ) );
* printf( "%s\n", buf );
* }
*/
#ifndef BAREBONES /* getgui, lxlogo */
/* ===================================================== */
/* RAND returns a "random" number between 0.0 and 1.0 */
double
GL_rand()
{
double r;
static int first = 1;
if( first ) {
srand( getpid() % 1000 );
first = 0;
}
r = rand() / (double)(RAND_MAX);
if( r < 0.0 || r > 1.0 ) { printf( "%f: rand return out of range\n", r ); return( -1.0 ); }
return( r );
}
/* =========================================== */
/* SLMEMBER - Return 1 if str is matches any items in list.
List is a space-delimited list of tokens. The tokens in the
list may contain ? or * wildcard characters. The match is
Case insensitive.
scg 3-19-97
*/
int
GL_slmember( str, list )
char *str;
char *list;
{
char tok[256], *GL_getok();
int i;
i = 0;
while( 1 ) {
strcpy( tok, GL_getok( list, &i ) );
if( tok[0] == '\0' ) break;
if( Member_nullstring[0] != '\0' ) {
if( strcmp( str, Member_nullstring)== 0 && stricmp( tok, "null" )==0 )return( 1 );
}
if( GL_wildcmp( str, tok, strlen(tok), 0 ) == 0 ) return( 1 );
}
return( 0 );
}
/* ==================================================================== */
/* SETMAXLEN - set maximum token length for GETSEG (future: others) */
int
GL_setmaxlen( maxlen )
int maxlen;
{
if( maxlen == 0 ) Maxlen = 99999;
else Maxlen = maxlen;
return( 0 );
}
/* ===================================================================== */
/* WILDCMP - compare two strings s1 and s2. S2 may contain
wildcards (* and ?).
Function returns 0 on a match; < 0 if s1 < s2; > 0 if s1 > s2
Prints an error message and returns -999 on error.
* wildcard limited to the following uses: *ppp; ppp*; pp*pp; *ppp*
? can be used anywhere.
Double asterisks at beginning and end are also handled (means the
same as single asterisk).
scg 3-4-96 (written elsewhere)
*/
int
GL_wildcmp( char *s1, char *s2, int len, int casecare )
/* s1 = data value
s2 = query value which can contain wildcards - not null terminated.
len = length of s2
casecare = 0 for case-insensitive, 1 for case-sensitive
*/
{
int i, nwc, wcp, stat;
if( len == 0 ) return( strlen( s1 ) );
else if( s2[0] == Wildcard ) {
if( len == 1 ) return( 0 ); /* everything matches */
}
else if( s2[0] == Wildcard1 ) ; /* can't tell yet */
else if( tolower( s1[0] ) < tolower( s2[0] ) ) return( -1 ); /* way off */
else if( tolower( s1[0] ) > tolower( s2[0] ) ) return( 1 ); /* way off */
/* strip off extraneous * at beginning and end.. */
if( s2[0] == Wildcard && s2[1] == Wildcard ) { s2 = &s2[1]; len--; }
if( s2[len-1] == Wildcard && s2[len-2] == Wildcard ) len--;
/* see if any "*" wild cards were used.. */
nwc = 0;
for( i = 0; i < len; i++ ) if( s2[i] == Wildcard ) { nwc++; wcp = i; }
if( nwc < 1 ) { /* straight match */
if( strlen( s1 ) > len ) return( wcmp( s1, s2, strlen( s1 ), casecare));
else return( wcmp( s1, s2, len, casecare ) );
}
else if( nwc == 1 ) { /* wildcard match */
/* find beginning of what we need to compare */
i = strlen( s1 ) - (len - (wcp+1) );
/* case 1: wc at end.. */
if( wcp == len-1 ) {
return( wcmp( s1, s2, len-1, casecare ) );
}
/* case 2: wc at beginning.. */
if( wcp == 0 ) {
return( wcmp( &s1[i], &s2[ 1 ], len-1, casecare ) );
}
/* case 3: wc in middle.. */
else {
int frontlen, backlen;
frontlen = wcp;
/* do front compare.. */
stat = wcmp( s1, s2, frontlen, casecare );
if( stat != 0 ) return( stat );
backlen = strlen( s2 ) - (frontlen + 1);
if( strlen( s1 ) < frontlen + backlen ) return( 1 ); /* fail if s1 too short */
/* do back compare.. */
stat = wcmp( &s1[ strlen( s1 ) - backlen ], &s2[ strlen( s2 ) - backlen ], backlen, casecare );
return( stat );
}
}
else if( nwc == 2 ) {
int stop;
/* case 4: wc at beginning and end.. */
if( wcp != (len-1) ) goto ERR;
else if( s2[0] != Wildcard ) goto ERR;
stop = ( strlen( s1 ) - len ) + 2;
for( i = 0; i <= stop; i++ ) {
if( wcmp( &s1[i], &s2[1], len-2, casecare ) == 0 ) return( 0 );
}
return( -1 );
}
else {
ERR:
fprintf( stderr, "Wild card match error (%s vs %s).\n", s1, s2 );
return( -999 );
}
}
/* WCMP - compare two strings. S2 may contain ? wildcards which matches any
single character. Len is the # of characters to check.
*/
static int
wcmp( char *s1, char *s2, int len, int casecare )
{
int i;
for( i = 0; i < len; i++ ) {
if( s1[i] == '\0' ) { return( -1 ); } /* added scg 10/22/03 ... abc???? was matching abcde */
/* was returning 1.. changed scg 3/29/04 */
if( ! casecare ) {
if( tolower(s1[i]) < tolower(s2[i]) && s2[i] != Wildcard1 ) { return( -1 ); }
else if( tolower(s1[i]) > tolower(s2[i]) && s2[i] != Wildcard1 ) { return( 1 ); }
}
else {
if( s1[i] < s2[i] && s2[i] != Wildcard1 ) return( -1 );
else if( s1[i] > s2[i] && s2[i] != Wildcard1 ) return( 1 );
}
}
return( 0 );
}
/* WILDCHAR - set the wildcard symbol to be used instead of '*' */
int
GL_wildchar( c, d )
char c, d;
{
Wildcard = c;
Wildcard1 = d;
return( 0 );
}
/* ============================================= */
/* ADDMEMBER - append a new member to the end of a comma-delimited list */
int
GL_addmember( newmem, list )
char *newmem;
char *list;
{
/* hard code a destination length limit of 256 for now.. scg 3/22/07 */
if( strlen( newmem ) + strlen( list ) > 254 ) return( 0 ); /* silently don't do it.. */
if( list[0] == '\0' ) strcpy( list, newmem );
else {
strcat( list, "," );
strcat( list, newmem );
}
return( 0 );
}
/* ============================================= */
/* DELETEMEMBER - remove member(s) from a comma-delimited list.
Mem may contain wild cards. Returns number of members removed. */
int
GL_deletemember( mem, inlist, resultlist )
char *mem;
char *inlist;
char *resultlist;
{
int i, ix, len, outlen, found, memlen;
char tok[ 256 ];
resultlist[0] = '\0';
outlen = 0;
if( inlist[0] == '\0' ) return( 1 );
memlen = strlen( mem );
len = strlen( inlist );
for( i = 0, ix = 0, found = 0; ; ) {
if( ix >= len ) break;
GL_getseg( tok, inlist, &ix, "," );
if( GL_wildcmp( tok, mem, memlen, 0 )==0 ) { found++; continue; }
if( i > 0 ) strcpy( &resultlist[ outlen++ ], "," );
strcpy( &resultlist[ outlen ], tok );
outlen += strlen( tok );
i++;
}
resultlist[ outlen ] = '\0';
return( found );
}
/* ============================================= */
/* CONTAINS - if string s contains any of chars in clist, return position (1=first)
of first occurance in list. 0 if not found at all.
example: contains( "\"*'", "'hello'" ) -> 1
*/
int
GL_contains( clist, s )
char *clist, *s;
{
int i, len;
for( i = 0, len = strlen( s ); i < len; i++ ) {
if( GL_member( s[i], clist )) return( i+1 );
}
return( 0 );
}
/* ============================================= */
/* SUBST - change all occurances of s1 to s2, in t.
Returns 0 if successful, 1 if no occurance of s1 found.
scg 11/5/07 - now silently truncates the result to fit within buf[1024]
*/
int
GL_substitute( s1, s2, t )
char *s1, *s2, *t;
{
char buf[1024];
int i, j, len1, len2, buflen, found;
len1 = strlen( s1 );
if( len1 < 1 ) return( 1 );
strcpy( buf, t );
buflen = strlen( buf );
if( buflen < 1 ) return( 1 );
len2 = strlen( s2 );
found = 0;
j = 0;
for( i = 0; i < buflen; i++ ) {
if( strncmp( &buf[i], s1, len1 )==0 ) {
if( j + len2 > 1020 ) break; /* scg 11/3/07 */
strcpy( &t[j], s2 );
j += len2;
i += (len1 - 1);
found = 1;
}
else t[j++] = buf[i];
if( j > 1020 ) break; /* scg 11/3/07 */
}
t[j] = '\0';
if( found ) return( 0 );
else return( 1 );
}
/* ============================================= */
/* CHANGECHARS - go through string s and if any characters in clist found, change
the character to newchar */
int
GL_changechars( clist, s, newchar )
char *clist, *s, *newchar;
{
int i, special;
special = 0;
if( strcmp( clist, "not_alnum" )==0 ) special = 1;
if( newchar[0] == '\0' ) return( 1 );
for( i = 0; s[i] != '\0'; i++ ) {
if( special && !isalnum( (int)s[i] )) s[i] = newchar[0];
else if( !special && GL_member( s[i], clist )) s[i] = newchar[0];
}
return( 0 );
}
/* ============================================= */
/* DELETECHARS - go through string s and if any characters in clist found, delete
the character. */
int
GL_deletechars( clist, s )
char *clist, *s;
{
int i, j, special;
special = 0;
if( strcmp( clist, "not_alnum" )==0 ) special = 1;
for( i = 0, j = 0; s[i] != '\0'; ) {
if( special && !isalnum( (int)s[i] )) i++;
else if( !special && GL_member( s[i], clist )) i++;
else s[j++] = s[i++];
}
s[j] = '\0';
return( 0 );
}
/* ======================================================================== */
/* SUBSTRING -
GL_substring( result, str, fromchar, nchar )
char *result; // substring is copied into this variable
char *str; // the original string
int fromchar; // starting point from which to take the substring
int nchar; // length of the substring
In all cases the first char is 1, not 0.
Two ways it can operate:
If is greater than 0, the result will be the portion of
beginning at position , for a length of , or until
the end is reached.
If is less than 0, and is greater than 0:
we will begin counting from the end of ,
leftward. for (abs) characters. Then, we will take the
substring beginning from that character
for a length of , or until the end is reached.
Examples: substring( result, "02001.fv02", 7, 4 ) -- result would be "fv02"
substring( result, "02001.fv02", -4, 99 ) -- result would be "fv02"
*/
int
GL_substring( result, str, fromchar, nchar )
char *result;
char *str;
int fromchar;
int nchar;
{
int i, j;
int len;
len = strlen( str );
if( fromchar > 0 ) fromchar -= 1;
else if( fromchar < 0 ) fromchar += len;
for( i = fromchar, j = 0; i < fromchar + nchar; i++ ) {
if( i > len-1 ) break;
result[j++] = str[i];
}
result[j] = '\0';
return( 0 );
}
/* ===================================================================== */
/* VARSUB - given string s, find every occurance
of symbol (case-sensitive) and change it to value.
Copies result back into s... s must be able to accomodate.
Returns number of times a substitution was made, 0 if none.
This routine is not sophisticated about delimiting the symbol;
e.g. if s contains $NUMBER and varsub() is looking for $NUM it will find it.
-scg 11/5/07 - now silently truncates result to fit within rtnbuf[1024]
*/
int
GL_varsub( s, symbol, value )
char *s, *symbol, *value;
{
int i, j, len, vlen, found;
int slen;
char rtnbuf[1024];
len = strlen( symbol );
slen = strlen( s );
vlen = strlen( value );
found = 0;
for( i = 0, j = 0; i < slen; i++, j++ ) {
if( strncmp( &s[i], symbol, len )==0 ) { /* note- strncmp man page says that it won't go beyond null terminator */
if( j + vlen > 1020 ) break;
strcpy( &rtnbuf[j], value );
j = strlen( rtnbuf ) - 1;
i+= (len-1);
found++;
}
else rtnbuf[j] = s[i];
if( j >= 1020 ) break; /* scg 11/3/07 */
}
rtnbuf[j] = '\0';
strcpy( s, rtnbuf );
return( found );
}
/* ============================================= */
/* AUTOROUND - round the decimal portion a number reasonably based on its magnitude.
val is the value, represented as a string.
decoffset controls the precision of the rounded result as follows:
If decoffset = 0 then nothing happens.
If decoffset = 1 then rounding will go to 1 additional decimal place.
decoffset = -1 then rounding will go to one less decimal place than normal.
The rounded result is copied back into val.
If val is non-numeric or a whole number then it is left unchanged.
*/
int
GL_autoround( val, decoffset )
char *val;
int decoffset;
{
int precision, decplaces, stat;
char roundingfmt[50];
double g, atof();
stat = GL_goodnum( val, &precision );
if( stat && precision > 0 ) {
g = atof( val );
decplaces = getdecplaces( g );
if( decplaces > -99 ) {
if( decplaces < 0 ) decplaces = 0;
sprintf( roundingfmt, "%%.%df", decplaces + decoffset );
sprintf( val, roundingfmt, g );
}
}
return( 0 );
}
/* ============================================= */
/* AUTOROUNDF - variant of autoround(), takes val as a double, return value is character rep..*/
char *
GL_autoroundf( val, decoffset )
double val;
int decoffset;
{
int decplaces;
char roundingfmt[50];
static char result[50];
sprintf( result, "%g", val ); /* fallback */
decplaces = getdecplaces( val );
if( decplaces > -99 ) {
if( decplaces < 0 ) decplaces = 0;
sprintf( roundingfmt, "%%.%df", decplaces + decoffset );
sprintf( result, roundingfmt, val );
}
return( result );
}
static int getdecplaces( val )
double val;
{
int decplaces;
double g, fabs();
g = fabs( val );
decplaces = -99;
if( g >= 1000 ) decplaces = 0;
else if( g >= 100 ) decplaces = 0;
else if( g >= 10 ) decplaces = 1;
else if( g >= 1.0 ) decplaces = 2;
else if( g >= 0.1 ) decplaces = 3;
else if( g >= 0.01 ) decplaces = 4;
else if( g >= 0.001 ) decplaces = 5;
else if( g >= 0.0001 ) decplaces = 6;
return( decplaces );
}
#ifdef HOLD
/* ======================== */
/* FMOD */
double fmod( a, b )
double a, b;
{
double x, y;
x = a / b;
y = (int) (x) * b;
return( a - y );
}
#endif
/* ========================= */
/* NUMGROUP - convert val to a nearby multiple of h, taking mode (low, mid, high) into account */
double
GL_numgroup( val, h, mode )
double val, h;
char *mode;
{
double fmod(), ofs, modf;
ofs = 0.0;
if( mode[0] == 'm' ) ofs = h / 2.0;
else if( mode[0] == 'h' ) ofs = h;
/* the following bug fix contributed by Phil Carmody */
modf = h*(int)(val/h+0.5);
return(modf+ofs);
/* was:
* modf = fmod( val, h );
* return( (val - modf) + ofs );
*/
}
/* ======================================================================== */
/* RANGER - take a range specification of integers and return an enumeration of all members.
* Examples: "3-8" would return in list array: 3,4,5,6,7,8
* "4,5,7-9,12-last" would return (for a 15 member list): 4,5,7,8,9,12,13,14,15
* "4,5 7-9 12-last" would be equivalent to the above example.
* "1-last" would return (for an 8 member list): 1,2,3,4,5,6,7,8
*
* There may be no embedded spaces within the dash construct.
*/
int
GL_ranger( spec, list, n )
char *spec;
int *list; /* array */
int *n; /* in: size of list (max number of members)
out: number of members in list that have been filled */
{
int i, ix, p, j, lo, hi;
char tok[256], histr[80];
/* parse spec.. */
ix = 0;
i = 0;
while( 1 ) {
/* split up on commas or spaces */
GL_getchunk( tok, spec, &ix, ", " );
if( tok[0] == '\0' ) break;
if( GL_goodnum( tok, &p ) ) {
list[i] = atoi( tok );
i++;
}
else {
sscanf( tok, "%d-%s", &lo, histr );
if( stricmp( histr, "last" )==0 ) hi = *n;
else hi = atoi( histr );
if( hi < lo ) {
fprintf( stderr, "bad range specification: %s\n", tok );
return( 1 );
}
for( j = lo; j <= hi; j++ ) {
list[i] = j;
i++;
if( i >= (*n) -1 ) break; /* truncate */
}
}
}
*n = i;
return( 0 );
}
/* ============================== */
/* CLOSE_TO - test two floating point numbers to see if
they are within a small tolerance. */
int
GL_close_to( a, b, tol )
double a, b;
double tol;
{
if( a == b ) return( 1 );
else if( a > b && a - b < tol ) return( 1 );
else if( b > a && b - a < tol ) return( 1 );
else return( 0 );
}
/* ============================= */
/* COMMONMEMBERS - compare two commalists and return number of members
that are in common.. */
int
GL_commonmembers( list1, list2, mode )
char *list1;
char *list2;
int mode; /* 0 = return a count; 1 = quit when one found */
{
int i, j, ii, ij, count;
int len1, len2;
char tok1[DATAMAXLEN+1], tok2[DATAMAXLEN+1];
count = 0;
len1 = strlen( list1 );
len2 = strlen( list2 );
for( i = 0, ii = 0; ; i++ ) {
if( ii >= len1 ) break;
GL_getseg( tok1, list1, &ii, "," );
for( j = 0, ij = 0; ; j++ ) {
if( ij >= len2 ) break;
GL_getseg( tok2, list2, &ij, "," );
if( stricmp( tok1, tok2 )==0 ) {
if( mode == 1 ) return( 1 );
count++;
}
}
}
return( count );
}
/* ==================================== */
/* LISTMEMBER - see if s is in list (comma-delimited);
if so return 1 and list position (first=1) and string position (first=0) */
int
GL_listmember( s, list, memnum, pos )
char *s;
char *list;
int *memnum;
int *pos;
{
int ix, i, lastix, len;
char tok[256];
*memnum = 0;
ix = 0;
len = strlen( list );
lastix = 0;
for( i = 1, ix = 0; ; i++ ) {
if( ix >= len ) break;
lastix = ix;
GL_getseg( tok, list, &ix, "," );
if( strcmp( tok, s )==0 ) {
*memnum = i;
*pos = lastix;
return( 1 );
}
}
return( 0 );
}
/* ===================================== */
/* GETCGIARG - get next arg from CGI QUERY_STRING (encoded constructs are converted) */
int
GL_getcgiarg( arg, uri, pos, maxlen )
char *arg, *uri;
int *pos; /* current position */
int maxlen; /* max size of string, including terminator */
{
int i, j;
char hex[10];
unsigned int val;
for( i = *pos, j = 0; j < maxlen; i++ ) {
if( uri[i] == '&' || uri[i] == '\0' || j >= maxlen ) {
arg[j] = '\0';
if( uri[i] == '\0' ) *pos = i;
else *pos = i+1;
return( 0 );
}
else if( uri[i] == '%' && isxdigit( (int) uri[i+1] ) && isxdigit( (int) uri[i+2] ) ) { /* urldecode */
sprintf( hex, "%c%c", uri[i+1], uri[i+2] );
sscanf( hex, "%x", &val );
arg[j++] = (char) val;
i += 2;
}
else if( uri[i] == '+' ) arg[j++] = ' '; /* added scg 10/9/07 */
else arg[j++] = uri[i];
}
return( 0 );
}
/* ================================================= */
/* URLENCODE - perform url encoding (any questionable characters changed to %XX hex equivalent */
/* added scg 5/29/06 */
int
GL_urlencode( in, out )
char *in, *out;
{
int i, j, c;
for( i = 0, j = 0; in[i] != '\0'; i++ ) {
c = in[i];
/* per the wikipedia entry for "Query string"... changed scg 6/4/07 */
if( c >= 48 && c <= 57 ) out[j++] = c; /* 0-9 */
else if( c >= 65 && c <= 90 ) out[j++] = c; /* A-Z */
else if( c >= 97 && c <= 122 ) out[j++] = c; /* a-z */
else if( GL_member( c, ".-~_" )) out[j++] = c;
/* else if( c == ' ' ) out[j++] = '+'; */ /* encode spaces as %20 ... scg 3/9/09 */
else { sprintf( &out[j], "%%%X", c ); j += 3; } /* encode as %FF */
}
out[j] = '\0'; /* terminate */
return( 0 );
}
/* ================================================= */
/* URLDECODE - perform url decoding (any %XX constructs changed to char equivalent */
/* added scg 5/29/06 */
int GL_urldecode( in, out )
char *in, *out;
{
int i, j, c;
char tok[10];
for( i = 0, j = 0; in[i] != '\0'; i++ ) {
if( in[i] == '%' && in[i+1] != '\0' && in[i+2] != '\0' ) {
tok[0] = in[i+1]; tok[1] = in[i+2]; tok[2] = '\0';
sscanf( tok, "%x", &c );
out[j++] = c;
i += 2;
}
else out[j++] = in[i];
}
out[j] = '\0'; /* terminate */
return( 0 );
}
/* ================================================= */
/* GETCWORD - get next word, as delimited by any sequence of spaces and punct chars - related to 'contains' */
int
GL_getcword( rtn, line, i )
char rtn[];
char line[];
int *i;
{
int n, j;
j = *i;
while( isspace( (int) line[j] ) || ispunct( (int) line[j] ) ) j++;
n = 0;
rtn[0] = '\0';
while( 1 ){
if( line[j] != '*' && ( isspace( (int) line[j] ) || ispunct( (int) line[j] ) || line[j] == '\0' )) break;
else rtn[n++] = line[j];
j++;
}
*i = j;
rtn[n] = '\0' ;
return( 0 );
}
/* =================================== */
/* STRIP_WS strip white-space off of front and end of string s */
int
GL_strip_ws( s )
char *s;
{
int i, j, len;
/* don't do anything if first and last characters are non-space.. */
if( !isspace( (int) s[0] ) && !isspace( (int) s[ strlen( s ) - 1 ] ) ) return( 0 );
/* find last significant char and put a null after it */
for( j = strlen( s ) -1; j >= 0; j-- )
if( !GL_member( s[j], " \t\n" )) break;
s[j+1] = '\0';
/* find 1st significant char at position i */
for( i = 0, len = strlen( s ); i < len; i++ )
if( !GL_member( s[i], " \t\n" )) break;
strcpy( s, &s[i] );
return( 0 );
}
#endif
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/ttest.c 0000644 0001750 0001750 00000007033 10775152775 014416 0 ustar colin colin /* ttest - take two measurements (mean, n, sd)
and return the p value associated with the T-test.
Used code from gnu scientific library and wctb.
*/
#define PI 3.141592653589
double sqrt(), atan(), fabs();
double GL_ttest( mean1, sd1, n1, mean2, sd2, n2 )
double mean1, sd1, mean2, sd2;
int n1, n2;
{
int i;
double tvalue, pooled_variance, var1, var2, df;
double t1, t2, t3, cdf;
var1 = sd1 * sd1;
var2 = sd2 * sd2;
pooled_variance = (((n1 - 1 ) * var1 ) + ((n2 - 1) * var2)) / (n1 + n2 - 2);
tvalue = (mean1 - mean2) / (sqrt (pooled_variance * ((1.0 / n1) + (1.0 / n2))));
df = (n1 + n2) - 2;
/* printf( "var1=%g var2=%g pooledvar=%g tvalue=%g df=%g\n", var1, var2, pooled_variance, tvalue, df ); */
/* now compute the pvalue on the tvalue... (from wctb/statlibx/ttest_p.c) */
t1 = df / ( df + (tvalue * tvalue) );
if( df/2 != (double)(int)( df/2 ) ) { /* odd df */
t3 = 0;
if( df != 1.0 ) {
t2 = t3 = 2 * sqrt( t1 * ( 1 - t1 )) / PI;
for( i = 1; i <= (int) (df/2) -1; i++ )
{
t2 = t2 * (double)(i) / ( (double)(i) + 0.5 ) * t1 ;
t3 = t3 + t2;
}
}
t3 = 1 - 2 / PI * atan( sqrt ( t1 / (1-t1) )) + t3;
}
else { /* even df */
t2 = t3 = sqrt( 1 - t1 );
for( i = 1; i <= df/2 -1; i++ )
{
t2 = t2 * ( (double)i - 0.5 ) / (double)i * t1;
t3 = t3 + t2;
}
}
if( tvalue > 0 ) cdf = ( 1 + t3 / 2 );
else cdf = ( 1 - t3 / 2 );
if( tvalue >= 0 ) return( 1- fabs( ( 1-cdf ) * 2 ) );
else return( fabs( 1- ( 2 * cdf ) ));
}
/* main()
* {
* double ttest(), p;
*
* p = ttest( 35.0, 5.0, 5, 38.0, 7.0, 6 );
* printf( "p=%g\n", p );
* }
*/
/* ================================= */
/* ================================= */
#ifdef CUT
/* source code from GSL */
double
FUNCTION(gsl_stats,ttest) (const BASE data1[],
const size_t stride1, const size_t n1,
const BASE data2[],
const size_t stride2, const size_t n2)
{
/* runs a t-test between two datasets representing independent
samples. Tests to see if the difference between means of the
samples is different from zero */
/* find means for the two samples */
const double mean1 = FUNCTION(gsl_stats,mean) (data1, stride1, n1);
const double mean2 = FUNCTION(gsl_stats,mean) (data2, stride2, n2);
/* find pooled variance for the two samples */
const double pv = FUNCTION(gsl_stats,pvariance) (data1, stride1, n1, data2, stride2, n2);
/* calculate the t statistic */
const double t = (mean1 - mean2) / (sqrt (pv * ((1.0 / n1) + (1.0 / n2))));
return t;
}
double
FUNCTION(gsl_stats,pvariance) (const BASE data1[],
const size_t stride1, const size_t n1,
const BASE data2[],
const size_t stride2, const size_t n2)
{
/* Find the pooled variance of two datasets */
const double var1 = FUNCTION(gsl_stats,variance) (data1, stride1, n1);
const double var2 = FUNCTION(gsl_stats,variance) (data2, stride2, n2);
/* calculate the pooled variance */
const double pooled_variance =
(((n1 - 1) * var1) + ((n2 - 1) * var2)) / (n1 + n2 - 2);
return pooled_variance;
}
static double
FUNCTION(compute,variance) (const BASE data[], const size_t stride, const size_t n, const double mean)
{
/* takes a dataset and finds the variance */
long double variance = 0 ;
size_t i;
/* find the sum of the squares */
for (i = 0; i < n; i++)
{
const long double delta = (data[i * stride] - mean);
variance += (delta * delta - variance) / (i + 1);
}
return variance ;
}
#endif
ploticus-2.42/src/plhead.c 0000644 0001750 0001750 00000001557 10277134043 014476 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
#include "plg.h"
#include "pl.h"
struct plstate PLS;
struct pldata PLD;
struct proclines PLL;
double *PLV;
int PLVsize, PLVhalfsize, PLVthirdsize;
char PL_bigbuf[ MAXBIGBUF ]; /* general purpose large buffer - don't rely
on content integrity across procs */
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/sinterp.c 0000644 0001750 0001750 00000056471 12144516113 014727 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/*
* Call sinterp_open() or sinterp_openmem() first. Then repeatedly call sinterp().
* Continue while getting a return value of SINTERP_MORE; for any other return value, stop.
*
* Returns SINTERP_MORE = normal, more results to come
* SINTERP_END = no more results - eof
* 0-19 = user
* 20 & up = error (revised 1/30/03)
*
* Notes:
* Any programs that use sinterp need a stub for customtextvect()
*
* data may be passed as NULL (recordid must be "")
*/
#include "tdhkit.h"
extern int TDH_shellresultrow(), TDH_shellclose(), TDH_sqlnames(), TDH_sqlrow(), TDH_dequote(), TDH_function_call();
extern int TDH_function_listsep(), TDH_condex_listsep(), TDH_errmode(), TDH_setshellfdelim();
extern int atoi(); /* sure thing */
#ifndef TDH_NOREC
extern int sqlbuild0(), sqlbuild1(), TDH_sqltabdef();
#endif
#ifndef PLOTICUS
extern int customforvect();
#endif
#ifndef TDH_DB
#define TDH_DB 0
#endif
#if TDH_DB != 0
extern int TDH_sqlrow_nullrep();
#endif
static FILE *skiptoendloop();
static char *specialincludedir = "";
/* -------------------------------------- */
int
TDH_sinterp( line, ss, recordid, data )
char *line; /* should be length of at least SCRIPTLINELEN */
struct sinterpstate *ss;
char *recordid;
char data[][DATAMAXLEN+1];
{
int i, j;
int stat;
int ix;
char buf[ SCRIPTLINELEN ], tok[ DATAMAXLEN+1];
long linebegin;
char str[ DATAMAXLEN+1 ];
char varname[40];
char list[ SCRIPTLINELEN ];
int len;
char conj[40];
char delimstr[5];
int typ;
TDH_dat = (char *)data;
TDH_recid = recordid;
while( 1 ) {
if( ss->nmemrows > 0 ) goto MEMOPS;
/* if an #shell dump is currently in progress, handle results.. */
if( ss->doingshellresult != 0 ) {
int nshfields;
char *shfields[MAXITEMS];
int delim;
/* get a row.. */
stat = TDH_shellresultrow( buf, shfields, &nshfields, SCRIPTLINELEN );
if( stat != 0 ) {
TDH_shellclose();
ss->doingshellresult = 0;
TDH_setshellfdelim( 0 ); /* reset shell delimiter.. added scg 8/3/06 */
continue;
}
delim = ss->doingshellresult;
if( delim == 's' ) continue; /* silent */
/* stream output.. do delimitation processing */
for( i = 0, j = 0; i < nshfields; i++ ) {
if( delim == 'h' ) { strcpy( &line[j], "" ); j+=4; }
strcpy( &line[j], shfields[i] );
j+= strlen( shfields[i] );
if( delim == 'h' ) { strcpy( &line[j], " " ); j+=5; }
else if( delim == 't' ) { strcpy( &line[j], "\t" ); j+=1; }
}
if( delim == 'h' ) { strcpy( &line[j], "" ); j+=5; }
strcpy( &line[j], "\n" );
return( SINTERP_MORE );
}
/* if an #sql dump is currently in progress, handle results.. */
if( ss->doingsqlresult != 0 ) {
int nsqlfields, nsqlnames;
char *sqlfields[MAXITEMS], *sqlnames[MAXITEMS];
int delim;
if( ss->doingsqlresult == 'l' ) { /* load from 1st retrieved row.. */
TDH_sqlnames( ss->dbc, sqlnames, &nsqlnames );
stat = TDH_sqlrow( ss->dbc, sqlfields, &nsqlfields );
if( stat == 0 ) for( i = 0; i < nsqlfields; i++ ) {
if( stricmp( sqlfields[i], TDH_dbnull )==0 && ss->nullrep ) {
if( ss->nullrep == 1 ) TDH_setvar( sqlnames[i], "" );
else if( ss->nullrep == 2 ) TDH_setvar( sqlnames[i], DBNULL );
else if( ss->nullrep == 3 ) TDH_setvar( sqlnames[i], " " );
}
else TDH_setvar( sqlnames[i], sqlfields[i] );
}
else {
for( i = 0; i < nsqlfields; i++ ) TDH_setvar( sqlnames[i], "" );
if( stat > 20 ) {
ss->doingsqlresult = 0;
return( err( stat, "error on sql load", "" ) );
}
}
ss->doingsqlresult = 0;
continue;
}
/* get a row.. */
stat = TDH_sqlrow( ss->dbc, sqlfields, &nsqlfields );
if( stat != 0 ) {
ss->doingsqlresult = 0;
if( stat > 20 ) return( err( stat, "error on sql row", "" ));
continue;
}
delim = ss->doingsqlresult;
if( delim == 's' ) continue; /* silent */
/* stream output.. do delimitation processing */
for( i = 0, j = 0; i < nsqlfields; i++ ) {
if( delim == 'h' ) { strcpy( &line[j], "" ); j+=4; }
if( stricmp( sqlfields[i], TDH_dbnull )==0 && ss->nullrep ) {
if( ss->nullrep == 2 ) { strcpy( &line[j], DBNULL ); j+=4; }
else if( ss->nullrep == 3 ) { strcpy( &line[j], " " ); j+= 6; }
}
else { strcpy( &line[j], sqlfields[i] ); j+= strlen( sqlfields[i] ); }
if( delim == 'h' ) { strcpy( &line[j], " " ); j+=5; }
else if( delim == 't' ) { strcpy( &line[j], "\t" ); j+=1; }
}
if( delim == 'h' ) { strcpy( &line[j], "" ); j+=5; }
strcpy( &line[j], "\n" );
return( SINTERP_MORE );
}
#ifndef TDH_NOREC
/* if a #sqlbuild is currently in progress, handle results.. */
if( ss->sqlbuildi > 0 ) {
stat = sqlbuild1( line, ss );
if( stat != 0 ) {
ss->sqlbuildi = 0;
return( err( stat, "error in sqlbuild", "" ));
}
return( SINTERP_MORE );
}
#endif
/* --------------------------------------------- */
/* otherwise, read next line of script.. */
linebegin = ftell( ss->sfp[ ss->incnest ] ); /* remember loc before the read.. */
if( fgets( line, SCRIPTLINELEN-1, ss->sfp[ ss->incnest ] ) == NULL ) {
fclose( ss->sfp[ ss->incnest ] );
ss->sfp[ ss->incnest ] = NULL;
if( ss->incnest > 0 ) {
(ss->incnest)--;
continue;
}
else return( SINTERP_END );
}
/* or.. get next in-memory script row.. */
MEMOPS:
if( ss->nmemrows > 0 ) {
if( ss->mrow >= ss->nmemrows ) return( SINTERP_END );
sprintf( line, "%s\n", *(ss->memrows) );
(ss->mrow)++;
(ss->memrows)++;
/* fprintf( stderr, "%s", line ); */
}
/* get first token.. */
ix = 0;
strcpy( tok, GL_getok( line, &ix ) );
if( strncmp( tok, "//", 2 )==0 ) continue; /* comment */
/* remove trailing newline.. */
/* line[ strlen( line ) -1 ] = '\0'; */
len = strlen( line );
line[ len-1 ] = '\0'; len--;
if( line[ len-1 ] == 13 ) { line[ len-1 ] = '\0'; len--; } /* DOS LF */
/* for conditional expressions and assignments, convert quoted strings.
for all other lines, evaluate items. */
if( ss->evalvars ) {
if( GL_smember( tok, "#if #elseif #set #call #setifnotgiven" )) /* did include #sqlbuild */
TDH_dequote( buf, line, "SL" );
else TDH_value_subst( buf, line, data, recordid, NORMAL, 0 );
strcpy( line, buf );
}
/* quick return for non-op lines .. */
if( tok[0] != '#' ) {
PUT:
/* check if-logic display flags .. if any are 0 then don't display */
for( i = 1; i <= ss->ifnest; i++ ) if( ! ss->disp[i] ) break;
if( i != (ss->ifnest)+1 ) continue;
/* add trailing newline unless \c */
len = strlen( line );
if( len >= 2 && line[ len-2 ] == '\\' && line[ len-1 ] == 'c' ) {
line[ len-2 ] = '\0';
return( SINTERP_MORE );
}
line[ len ] = '\n'; line[ len+1 ] = '\0';
return( SINTERP_MORE );
}
/* ----------------------------------------------------- */
/* if-logic operators begin here. Each chunk must end with a 'continue' */
if( strcmp( tok, "#if" )==0 ) {
if( (ss->ifnest)+1 >= IFNESTMAX ) return( err( 1220, "#if nest level exceeded", "" ) );
(ss->ifnest)++;
/* if parent disp flag is 0 don't evaluate condex.. */
if( ss->ifnest > 1 && ss->disp[ (ss->ifnest)-1 ] == 0 ) stat = 0;
else stat = TDH_condex( &line[ix], 1 );
ss->condmet[ ss->ifnest ] = ss->disp[ ss->ifnest ] = stat;
continue;
}
else if( strcmp( tok, "#endif" )==0 ) {
ss->condmet[ ss->ifnest ] = 0;
ss->disp[ ss->ifnest ] = 1;
if( ss->ifnest > 0 ) (ss->ifnest)--;
else return( err( 1264, "extra #endif", "" ) );
continue;
}
else if( strcmp( tok, "#elseif" )== 0 ) {
/* if parent disp flag is 0 don't evaluate condex.. */
if( ss->ifnest > 1 && ss->disp[ (ss->ifnest)-1 ] == 0 ) ss->disp[ ss->ifnest ] = 0;
else if( !ss->condmet[ ss->ifnest ] ) {
stat = TDH_condex( &line[ix], 1 );
ss->condmet[ ss->ifnest ] = ss->disp[ ss->ifnest ] = stat;
}
else ss->disp[ ss->ifnest ] = 0;
continue;
}
else if( strcmp( tok, "#else" )==0 ) {
/* if parent disp flag is 0 don't evaluate condex.. */
sscanf( &line[ix], "%s", tok );
if( strcmp( tok, "if" )==0 ) err( 1219, "#else if: invalid syntax. Use #elseif", "" );
if( ss->ifnest > 1 && ss->disp[ (ss->ifnest)-1 ] == 0 ) ss->disp[ ss->ifnest ] = 0;
else if( !ss->condmet[ ss->ifnest ] ) ss->disp[ ss->ifnest ] = 1;
else ss->disp[ ss->ifnest ] = 0;
continue;
}
/* ----------------------------------------------------- */
/* check if-logic display flags .. if any are 0 then continue.. */
for( i = 1; i <= ss->ifnest; i++ ) if( ! ss->disp[i] ) break;
if( i != (ss->ifnest)+1 ) continue;
/* ----------------------------------------------------- */
/* standard operators other than if-logic ones begin here.
* Each chunk must end with a 'continue' */
if( strcmp( tok, "#+" )==0 || strcmp( tok, "#print" )==0 ) { /* #print is used by ploticus getdata filters (only?) */
strcpy( line, &line[ix+1] );
goto PUT;
}
if( strcmp( tok, "#set" )==0 || strcmp( tok, "#setifnotgiven" )==0 ) {
strcpy( varname, GL_getok( line, &ix ) );
if( strlen( tok ) > 4 ) { /* setifnotgiven */
stat = TDH_getvar( varname, str );
if( stat != 0 || str[0] == '\0' ) ;
else continue;
/* if( stat == 0 ) continue; */
}
GL_getok( line, &ix ); /* skip '=' */
while( line[ix] == ' ' ) ix++; /* skip over white space.. */
if( line[ix] == '@' ) { /* variable(s) (as supplied or from "string").. take everything to eol */
TDH_valuesubst_settings( "omitws", 1 );
TDH_value_subst( buf, &line[ix], data, recordid, NORMAL, 0 );
TDH_valuesubst_settings( "omitws", 0 );
stat = TDH_setvalue( varname, buf, data, recordid );
if( stat != 0 ) return( stat );
}
else if( line[ix] == '$' ) { /* a standalone function.. */
strcpy( buf, &line[ix] );
stat = TDH_function_call( buf, &typ, 1 );
if( stat != 0 ) err( 1201, "function error", buf );
if( buf[ strlen(buf)-1 ] == ' ' ) buf[ strlen(buf)-1 ] = '\0'; /* forced alpha */
stat = TDH_setvalue( varname, buf, data, recordid );
if( stat != 0 ) return( stat );
}
else { /* value, e.g. numeric (single token) */
strcpy( tok, "" );
sscanf( line, "%*s %*s %*s %s", tok );
stat = TDH_setvalue( varname, tok, data, recordid );
if( stat != 0 ) return( stat );
}
continue;
}
if( strcmp( tok, "#call" )==0 ) {
while( line[ix] == ' ' ) ix++; /* skip over white space.. */
strcpy( buf, &line[ix] );
stat = TDH_function_call( buf, &typ, 1 );
if( stat != 0 ) err( 1201, "function error", buf );
if( buf[ strlen(buf)-1 ] == ' ' ) buf[ strlen(buf)-1 ] = '\0'; /* forced alpha */
continue;
}
if( strcmp( tok, "#exit" )==0 ) {
strcpy( tok, "" );
sscanf( line, "%*s %s", tok );
stat = atoi( tok );
/* close all open script files.. */
for( i = 0; i < ss->incnest; i++ ) {
fclose( ss->sfp[ i ] );
ss->sfp[ i ] = NULL;
}
ss->ifnest = 0;
ss->loopnest = 0;
if( stat >= 0 && stat <= 255 ) return( atoi( tok ) ); /* should be 0 - 255 */
else return( 0 );
}
if( strcmp( tok, "#declare" )==0 ) continue; /* do nothing */
/* in-memory scripts don't support any other ops.. */
if( ss->nmemrows > 0 ) {
err( 1270, "directive not supported in mem mode", tok );
continue;
}
if( strcmp( tok, "#include" )==0 ) {
char incfile[ MAXPATH ];
sscanf( line, "%*s %s", incfile );
if( incfile[0] == '$' ) {
strcpy( tok, incfile );
sprintf( incfile, "%s%c%s", specialincludedir, PATH_SLASH, &tok[1] );
}
if( (ss->incnest)-1 < INCNESTMAX ) {
(ss->incnest)++;
/* first try scriptdir.. */
sprintf( buf, "%s%c%s", TDH_scriptdir, PATH_SLASH, incfile );
ss->incifnest[ ss->incnest ] = ss->ifnest;
ss->incloopnest[ ss->incnest ] = ss->loopnest;
ss->sfp[ ss->incnest ] = fopen( buf, "r" );
if( ss->sfp[ ss->incnest ] == NULL ) {
/* then try name as is.. */
ss->sfp[ ss->incnest ] = fopen( incfile, "r" );
if( ss->sfp[ ss->incnest ] == NULL ) {
(ss->incnest)--;
return( err( 1221, "cannot open #include file", incfile ) );
}
}
continue;
}
return( err( 1222, "#include nest level exceeded", "" ) );
}
if( strcmp( tok, "#for" )==0 ) { /* for var in list */
strcpy( list, "" );
sscanf( line, "%*s %s %s %s", varname, conj, list );
if( (ss->loopnest)+1 >= LOOPNESTMAX ) {
return( err( 1223, "loop nest level exceeded", "" ) ); /* loop nest level exceeded */
}
if( conj[0] == 'a' ) { /* "across" */
#ifndef PLOTICUS
stat = customforvect( str, list, 1 ); /* up to the application */
if( stat == 1 ) strcpy( list, "" ); /* no results */
else if( stat > 1 ) return( stat );
#else
return( err( 12230, "for .. across not supported", "" ));
#endif
}
if( list[0] == '\0' ) { /* empty list.. skip directly to matching #endloop.. */
ss->sfp[ ss->incnest ] = skiptoendloop( line, ss->sfp[ ss->incnest ] );
continue;
}
(ss->loopnest)++;
/* prepare to execute the loop body.. */
ss->forloc[ ss->loopnest ] = linebegin;
ss->forcount[ ss->loopnest ] = 1;
ss->loopifnest[ ss->loopnest ] = ss->ifnest;
if( conj[0] != 'a' ) {
ss->forlistpos[ ss->loopnest ] = 0;
sprintf( delimstr, "%c", ss->listdelim );
GL_getseg( str, list, &(ss->forlistpos[ss->loopnest]), delimstr );
}
stat = TDH_setvar( varname, str );
if( stat != 0 ) return( stat );
continue;
}
if( strcmp( tok, "#while" )==0 ) {
if( (ss->loopnest)+1 >= LOOPNESTMAX ) return( err( 1224, "loop nest level exceeded", "" ) );
stat = TDH_condex( &line[ix], 1 );
if( stat == 0 ) { /* condition is false on first try.. skip to #endloop.. */
ss->sfp[ ss->incnest ] = skiptoendloop( line, ss->sfp[ ss->incnest ] );
continue;
}
(ss->loopnest)++;
ss->forloc[ ss->loopnest ] = linebegin;
ss->forcount[ ss->loopnest ] = -1;
ss->loopifnest[ ss->loopnest ] = ss->ifnest;
continue;
}
if( strcmp( tok, "#loop" )==0 ) { /* basic loop */
if( (ss->loopnest)+1 >= LOOPNESTMAX ) return( err( 1224, "loop nest level exceeded", "" ) );
(ss->loopnest)++;
ss->forloc[ ss->loopnest ] = linebegin;
ss->forcount[ ss->loopnest ] = 0;
ss->loopifnest[ ss->loopnest ] = ss->ifnest;
continue;
}
if( strcmp( tok, "#endloop" )== 0 ) {
if( ss->forloc[ ss->loopnest ] < 0 ) return( err( 1262, "#endloop: no loop begin", "" ) );
/* resume = ftell( ss->sfp[ ss->incnest ] ); */
PROCESS_ENDLOOP:
/* seek to #loop (or whatever) statement and read line.. */
fseek( ss->sfp[ ss->incnest ], ss->forloc[ ss->loopnest ], SEEK_SET );
fgets( line, SCRIPTLINELEN-1, ss->sfp[ ss->incnest ] );
if( ss->forcount[ ss->loopnest ] == 0 ) continue; /* #loop */
else if( ss->forcount[ ss->loopnest ] == -1 ) { /* #while */ /* added 4/26/01 */
TDH_value_subst( buf, line, data, recordid, FOR_CONDEX, 0 );
ix = 0;
GL_getok( buf, &ix ); /* skip #while.. */
stat = TDH_condex( &buf[ix], 1 );
if( stat == 0 ) {
ss->sfp[ ss->incnest ] = skiptoendloop( line, ss->sfp[ ss->incnest ] );
ss->forloc[ ss->loopnest ] = -1;
(ss->loopnest)--;
}
continue;
}
/* #for */
TDH_value_subst( buf, line, data, recordid, NORMAL, 0 ); /* added 4/20/01 */
sscanf( buf, "%*s %s %s %s", varname, conj, list );
ss->forcount[ ss->loopnest ] ++;
if( conj[0] == 'a' ) {
#ifndef PLOTICUS
stat = customforvect( str, list, ss->forcount[ ss->loopnest ] );
#endif
}
else {
sprintf( delimstr, "%c", ss->listdelim );
stat = GL_getseg( str, list, &(ss->forlistpos[ss->loopnest]), delimstr );
}
if( stat != 0 ) {
/* #for loop is finished */
ss->sfp[ ss->incnest ] = skiptoendloop( line, ss->sfp[ ss->incnest ] );
ss->forloc[ ss->loopnest ] = -1;
(ss->loopnest)--;
}
else {
stat = TDH_setvar( varname, str );
if( stat != 0 ) return( stat );
}
continue;
}
if( strcmp( tok, "#break" )==0 ) {
if( ss->forloc[ ss->loopnest ] < 0 ) return( err( 1260, "#break not within loop", "" ) );
/* seek to top of latest loop.. */
fseek( ss->sfp[ ss->incnest ], ss->forloc[ ss->loopnest ], SEEK_SET );
/* read the loop top line.. */
fgets( line, SCRIPTLINELEN-1, ss->sfp[ ss->incnest ] );
/* skip to matching #endloop.. */
ss->sfp[ ss->incnest ] = skiptoendloop( line, ss->sfp[ ss->incnest ] );
ss->ifnest = ss->loopifnest[ ss->loopnest ]; /* restore */
ss->forloc[ ss->loopnest ] = -1;
(ss->loopnest)--;
continue;
}
if( strcmp( tok, "#continue" )==0 ) {
if( ss->forloc[ ss->loopnest ] < 0 ) return( err( 1261, "#continue not within loop", "" ) );
ss->ifnest = ss->loopifnest[ ss->loopnest ]; /* restore */
goto PROCESS_ENDLOOP;
}
if( strcmp( tok, "#return" )==0 ) {
fclose( ss->sfp[ ss->incnest ] );
ss->sfp[ ss->incnest ] = NULL;
ss->ifnest = ss->incifnest[ ss->incnest ]; /* restore */
ss->loopnest = ss->incloopnest[ ss->incnest ]; /* restore */
if( ss->incnest > 0 ) {
(ss->incnest)--;
continue;
}
else return( 0 ); /* if at top level, same as #exit 0 */
}
if( strcmp( tok, "#musthave" )==0 ) {
stat = 0;
for( i = 0, len = strlen( line ); i < len; i++ ) if( line[i] == ',' ) line[i] = ' ';
while( 1 ) {
strcpy( varname, GL_getok( line, &ix ) );
if( varname[0] == '\0' ) break;
stat += TDH_getvar( varname, buf );
}
if( stat != 0 ) return( 1226 ); /* required variable not set - caller can check 'line' var */
continue;
}
#ifndef TDH_NOREC
if( strcmp( tok, "#sqlbuild" )==0 ) { /* #sqlbuild insert|update table quote|noquote exceptionfield1 .. N */
sqlbuild0( buf, ss );
continue;
}
if( strcmp( tok, "#sqlblankrow" )==0 ) {
char table[MAXPATH], *fnames[MAXITEMS];
/* FILE *dbfp; */
int nitems;
strcpy( table, GL_getok( buf, &ix ) ); /* 1st arg is tablename */
TDH_altfmap( 1 );
stat = TDH_sqltabdef( table, fnames, &nitems ); /* caution - fnames points to info with limited lifespan */
TDH_altfmap( 0 );
if( stat != 0 ) return( err( stat, "sqlblankrow: no such table", table ));
for( i = 0; i < nitems; i++ ) {
stat = TDH_getvar( fnames[i], tok );
if( stat == 0 ) continue;
stat = TDH_setvar( fnames[i], "" );
}
continue;
}
#endif
if( strcmp( tok, "#write" )==0 ) { /* #write outfile [outmode] ... #endwrite */
/* note: calling app must actually fprintf to writefp */
char outfile[ MAXPATH ], outmode[20];
int nt;
strcpy( outmode, "w" );
nt = sscanf( buf, "%*s %s %s", outfile, outmode );
if( nt < 1 ) return( err( 1290, "#write: no file specified", "" ) ); /* no file specified */
if( stricmp( outfile, "stdout" )==0 ) ss->writefp = stdout;
else if( stricmp( outfile, "stderr" )==0 ) ss->writefp = stderr;
else ss->writefp = fopen( outfile, outmode );
if( ss->writefp == NULL ) return( err( 1205, "#write: cannot open file", outfile ) );
continue;
}
if( strcmp( tok, "#endwrite" )==0 ) {
strcpy( tok, "" );
sscanf( buf, "%*s %s", tok );
if( ss->writefp != NULL ) {
if( stricmp( tok, "noclose" )!= 0 && ss->writefp != stdout && ss->writefp != stderr )
{ fclose( ss->writefp ); }
ss->writefp = NULL;
}
continue;
}
if( strcmp( tok, "#cat" )==0 ) {
FILE *cfp;
int c;
while( 1 ) {
strcpy( tok, GL_getok( buf, &ix ));
if( tok[0] == '\0' ) break;
cfp = fopen( tok, "r" );
if( cfp == NULL ) continue;
while( ( c = getc( cfp ) ) != EOF ) printf( "%c", c );
fclose( cfp );
}
continue;
}
if( strcmp( tok, "#mode" )==0 || strcmp( tok, "#control" )== 0 ) {
char what[40];
sscanf( line, "%*s %s %s", what, tok );
if( strcmp( tok, "comma" )==0 ) strcpy( tok, "," );
else if( strcmp( tok, "tab" )==0 ) strcpy( tok, "\t" );
else if( strcmp( tok, "space" )==0 ) strcpy( tok, " " );
if( strncmp( what, "listsep", 7 )==0 ) {
TDH_function_listsep( tok[0] ); /* for function args that are lists */
TDH_condex_listsep( tok[0] ); /* for condex list ops e.g. in, inlike, etc. */
ss->listdelim = tok[0]; /* for lists herein */
}
else if( strcmp( what, "evalvars" ) == 0 ) {
if( tok[0] == 'n' ) ss->evalvars = 0;
else ss->evalvars = 1;
}
#if TDH_DB != 0
else if( strcmp( what, "nullrep" ) == 0 ) {
if( strcmp( tok, "noconvert" )==0 ) ss->nullrep = 0;
else if( strcmp( tok, "blank" )==0 ) ss->nullrep = 1;
else if( strcmp( tok, "null" )==0 ) ss->nullrep = 2;
else if( strcmp( tok, "nbsp" )==0 ) ss->nullrep = 3;
TDH_sqlrow_nullrep( ss->nullrep ); /* make it available to $functions */
}
#endif
else if( strcmp( what, "errormode" )==0 ) TDH_errmode( tok );
else if( strcmp( what, "shellmetachars" )==0 ) strcpy( TDH_shellmetachars, tok );
else if( GL_smember( what, "allowinlinecodes suppressdll shieldquotedvars dot_in_varnames" )) {
if( tok[0] == 'y' ) TDH_valuesubst_settings( what, 1 );
else TDH_valuesubst_settings( what, 0 );
}
continue;
}
/* other operators - add trailing newline and return - caller must implement */
len = strlen( line );
line[ len ] = '\n'; line[ len+1 ] = '\0';
return( SINTERP_MORE );
}
}
/* ---------------------------------- */
/* SINTERP_OPEN - open a script file and prepare to interpret it.
* filename may be "-" indicating stdin.
* Example: sinterp_open( "myscript", &ss );
*
* script may be taken from memory. To do this, pass filename as "",
* and, before calling TDH_sinterp_open(), set ss.nmemrows and ss.memrows.
*/
int
TDH_sinterp_open( filename, ss )
char *filename;
struct sinterpstate *ss;
{
int i;
char buf[512]; /* was 256 .. scg 3/16/06 */
ss->incnest = 0;
if( filename[0] != '\0' ) {
/* first try scriptdir.. */
sprintf( buf, "%s%c%s", TDH_scriptdir, PATH_SLASH, filename );
ss->sfp[ 0 ] = fopen( buf, "r" );
if( ss->sfp[ 0 ] == NULL ) {
/* then try the file name as is.. */
ss->sfp[ 0 ] = fopen( filename, "r" );
if( ss->sfp[ 0 ] == NULL ) {
return( 1 );
}
}
ss->nmemrows = 0;
}
else ss->mrow = 0;
/* initialize.. */
for( i = 0; i < IFNESTMAX; i++ ) ss->condmet[ i ] = 0;
for( i = 0; i < IFNESTMAX; i++ ) ss->disp[ i ] = 1;
ss->ifnest = 0;
ss->loopnest = 0;
TDH_valuesubst_settings( "hideund", 0 );
ss->listdelim = ',';
ss->nitems = 0;
ss->evalvars = 1;
ss->doingshellresult = 0;
ss->doingsqlresult = 0;
ss->sqlbuildi = 0;
ss->writefp = NULL;
ss->forloc[0] = -1;
ss->nullrep = 1;
return( 0 );
}
/* ============================== */
int
TDH_sinterp_openmem( memrows, nmemrows, ss )
char **memrows;
int nmemrows;
struct sinterpstate *ss;
{
int stat;
ss->memrows = memrows;
ss->nmemrows = nmemrows;
stat = TDH_sinterp_open( "", ss );
return( stat );
}
/* ============================== */
/* SKIPTOENDLOOP */
static FILE *
skiptoendloop( buf, fp )
char *buf;
FILE *fp;
{
int nestcount;
char tok[ DATAMAXLEN+1];
nestcount = 1;
while( fgets( buf, SCRIPTLINELEN-1, fp ) != NULL ) {
tok[0] = '\0'; /* scg 5/1/03 */
sscanf( buf, "%s", tok );
if( GL_smember( tok, "#for #while #loop" )) nestcount++;
if( GL_smember( tok, "#endloop" )) nestcount--;
if( nestcount == 0 ) break;
}
return( fp );
}
/* =============================== */
/* SETSPECIALINCDIR - set special include directory */
int
TDH_setspecialincdir( dir )
char *dir;
{
specialincludedir = dir;
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/dbinterface.c 0000644 0001750 0001750 00000012347 10451263221 015501 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* TDH abstract database interface.
Interfaces to other databases should be implemented here.
If compile flag TDH_DB is undefined or set to 0, no sql connectivity is available.
If TDH_DB is set to 2, shsql calls will be made. SHSQL has no concept of "connect".
*/
#include "tdhkit.h"
extern int TDH_dbnewquery(), TDH_dberrorcode();
#define SHSQL 2
#define MYSQL 10
#define ORACLE 20
#define SYBASE 30
#ifndef TDH_DB
#define TDH_DB 0
#endif
#if TDH_DB == SHSQL
extern int SHSQL_sql(), SHSQL_getrow(), SHSQL_pushrow(), SHSQL_getnames(), SHSQL_tabdef(), SHSQL_getnrows(), SHSQL_writable();
#endif
/* =============================================================================
SQLCOMMAND - submit an sql command and return its execution status (0 = normal).
*/
int
TDH_sqlcommand( dbc, sql )
int dbc; /* connection identifier (0 - 3) */
char *sql; /* sql command */
{
int stat;
#if TDH_DB == 0
return( err( 7949, "sql support not included in this build", "" ) );
#else
TDH_dbnewquery( dbc ); /* notify $sqlrow() function of new query */
#endif
#if TDH_DB == SHSQL
stat = SHSQL_sql( dbc, sql );
#endif
#if TDH_DB != 0
TDH_dberrorcode( dbc, stat ); /* save return code so $sqlerror() can provide it later.. */
#endif
return( stat );
}
/* ==========================================================================
SQLROW - get one row of results from most recent SQL SELECT.
Return 0 if row fetched, 1 if not (no more rows), or an error code.
All result fields should be character strings, including "null".
FIELDS is an array of char pointers; each will be made to point to a result field in shsql space.
(app should immediately copy into app space or risk obliteration on subsequent shsql retrieval)
N will be set to the number of fields.
*/
int
TDH_sqlrow( dbc, fields, n )
int dbc;
char *fields[];
int *n;
{
int stat;
#if TDH_DB == SHSQL
stat = SHSQL_getrow( dbc, fields, n );
#endif
#if TDH_DB > 1
/* this must be done here to report on locked records when a SELECT .. FOR UPDATE is done. Added scg 3/8/06 */
TDH_dberrorcode( dbc, stat ); /* save return code so $sqlerror() can provide it later.. */
#endif
return( stat );
}
/* ==========================================================================
SQLPUSHROW - allow next call to sqlrow() to get same row again.
*/
int
TDH_sqlpushrow( dbc )
int dbc;
{
#if TDH_DB == SHSQL
return( SHSQL_pushrow( dbc ) );
#endif
return( 0 );
}
/* =========================================================================
SQLNAMES - fetch names of result fields from most recent SQL SELECT.
Return 0 or an error code.
FIELDS is an array of char pointers; each will point to a name.
N will be set to the number of names (same as number of fields).
*/
int
TDH_sqlnames( dbc, fields, n )
int dbc;
char *fields[];
int *n;
{
#if TDH_DB == SHSQL
return( SHSQL_getnames( dbc, fields, n ) );
#endif
return( 0 );
}
/* ===========================================================================
SQLTABDEF - fetch the names of a table's fields
*/
int
TDH_sqltabdef( table, fields, n )
char *table;
char *fields[];
int *n;
{
#if TDH_DB == SHSQL
return( SHSQL_tabdef( table, fields, n ) );
#endif
return( 0 );
}
/* ==========================================================================
SQLROWCOUNT - return # of rows presented or affected by last sql command
*/
int
TDH_sqlrowcount( dbc )
int dbc;
{
#if TDH_DB == SHSQL
return( SHSQL_getnrows( dbc ) );
#endif
return( 0 );
}
/* ==========================================================================
SQLWRITABLE - return 0 if current process is allowed to write to the database, non-zero otherwise.
*/
int
TDH_sqlwritable()
{
#if TDH_DB == SHSQL
return( SHSQL_writable() );
#endif
return( 0 );
}
/* ======== The following are convenience routines that call the above TDH routines. ====== */
/* ============================= */
/* SQLGET - convenience routine to retrieve one field using default db connection.
Return 0 or an error code. */
int
TDH_sqlget( sql, result )
char *sql;
char *result;
{
int stat, n;
char *f[10];
strcpy( result, "" );
stat = TDH_sqlcommand( 0, sql );
if( stat != 0 ) return( stat );
stat = TDH_sqlrow( 0, f, &n );
if( stat != 0 ) return( stat );
if( n != 1 ) return( 5 );
strcpy( result, f[0] );
return( 0 );
}
/* =============================== */
/* SQLGETS - convenience routine to retrieve multiple fields. Return 0 or an error code. */
int
TDH_sqlgets( sql, fields )
char *sql;
char *fields[];
{
int stat, n;
stat = TDH_sqlcommand( 0, sql );
if( stat != 0 ) return( stat );
stat = TDH_sqlrow( 0, fields, &n );
if( stat != 0 ) return( stat );
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/init.c 0000644 0001750 0001750 00000015176 12144512213 014200 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* routines related to low level graphic initialization */
#include "plg.h"
extern int PLGP_setup(), PLGS_setup(), PLGX_setup(), PLGG_setup(), PLGF_setup();
extern int GL_sysdate(), GL_systime();
#define DEFAULT_WIN_WIDTH 8
#define DEFAULT_WIN_HEIGHT 9
#define MM_PER_INCH 25.3807
static int uplefttx = 0, upleftty = 0;
static double pagewidth = DEFAULT_WIN_WIDTH, pageheight = DEFAULT_WIN_HEIGHT;
static int initialized = 0;
static char outfilename[ MAXPATH ] = "";
static char outlabel[80] = "ploticus-graphic";
static int maxdrivervect = 500;
/* ========================================== */
int
PLG_init_initstatic()
{
uplefttx = 0;
upleftty = 0;
pagewidth = DEFAULT_WIN_WIDTH;
pageheight = DEFAULT_WIN_HEIGHT;
initialized = 0;
strcpy( outfilename, "" );
strcpy( outlabel, "ploticus-graphic" );
maxdrivervect = 500;
return( 0 );
}
/* ========================================== */
/* INIT - initialize device */
int
PLG_init( dev )
char dev; /* device code */
{
int yr, mon, day, hr, min, sec;
char sdev[8];
int stat;
GL_sysdate( &mon, &day, &yr ); GL_systime( &hr, &min, &sec );
/* initialize graphics parameters.. */
Edev = dev;
if( dev == 'p' || dev == 'c' || dev == 'e' ) {
#ifdef NOPS
return( Eerr( 12016, "PostScript capability was not included in this build.", "" ) );
#else
stat = PLGP_setup( outlabel, dev, outfilename );
if( stat ) return( stat );
Edev = 'p'; /* driver now knows eps/color/bw, from now on call it 'p' */
#endif
}
/* added support for svg - BT 05/11/01 */
else if( dev == 's' ) {
#ifdef NOSVG
return( Eerr( 12016, "SVG capability was not included in this build.", "" ) );
#else
Epixelsinch = 72;
Esetwinscale( (int)(pagewidth*Epixelsinch), (int)(pageheight*Epixelsinch), pagewidth, pageheight );
stat = PLGS_setup( outlabel, dev, outfilename, Epixelsinch, pagewidth, pageheight, uplefttx, upleftty );
if( stat ) return( stat );
#endif
}
else if( dev == 'x' ) {
#ifdef NOX11
return( Eerr( 12016, "X11 capability was not included in this build.", "" ) );
#else
double sx, sy;
Epixelsinch = 75;
Esetwinscale( (int)(pagewidth*Epixelsinch), (int)(pageheight*Epixelsinch), pagewidth, pageheight );
Egetglobalscale( &sx, &sy );
stat = PLGX_setup( outlabel, Epixelsinch, pagewidth, pageheight, uplefttx, upleftty, maxdrivervect );
if( stat ) return( stat );
#endif
}
else if( dev == 'g' ) {
#ifdef NOGD
return( Eerr( 12016, "GD image capability was not included in this build.", "" ) );
#else
Epixelsinch = 100;
Esetwinscale( (int)(pagewidth*Epixelsinch), (int)(pageheight*Epixelsinch), pagewidth, pageheight );
stat = PLGG_setup( outlabel, Epixelsinch, pagewidth, pageheight, uplefttx, upleftty, maxdrivervect );
if( stat ) return( stat );
Edev = 'g';
#endif
}
else if( dev == 'f' ) {
#ifdef NOSWF
return( Eerr( 12016, "SWF capability was not included in this build.", "" ) );
#else
Epixelsinch = 72;
Esetwinscale( (int)(pagewidth*Epixelsinch), (int)(pageheight*Epixelsinch), pagewidth, pageheight );
stat = PLGF_setup( outlabel, dev, outfilename, Epixelsinch, pagewidth, pageheight, uplefttx, upleftty, maxdrivervect );
if( stat ) return( stat );
#endif
}
else if( dev == 'n' ) ; /* null device */
else {
sprintf( sdev, "%c", dev );
return( Eerr( 12016, "Unsupported display device code", sdev ) );
}
if( dev != 'n' ) initialized = 1;
EWinx = pagewidth; EWiny = pageheight;
PLG_setdefaults();
return( 0 );
}
/* ================================== */
/* SETSIZE - set the size and position of the display. Should be called before init()
*/
int
PLG_setsize( ux, uy, upleftx, uplefty )
double ux, uy; /* size of window in inches.. */
int upleftx, uplefty; /* point (in native window system coords ) of upper-left corner of window */
{
extern int PLGX_resizewin();
if( ! initialized ) { /* getting ready to initialize-- set size parameters */
pagewidth = ux; pageheight = uy; uplefttx = upleftx; upleftty = uplefty;
return( 0 );
}
if( initialized ) { /* window already exists, resize it.. */
/* update parameters: window size and original size */
/* do this regardless of device since any code may use EWin variables.. */
if( ux >= 0 ) { EWinx = ux; EWinx_0 = ux; }
if( uy >= 0 ) { EWiny = uy; EWiny_0 = uy; }
#ifndef NOX11
if( Edev == 'x' ) {
/* update scaling */
Esetwinscale( (int)(ux*Epixelsinch), (int)(uy*Epixelsinch), ux, uy );
/* resize window */
PLGX_resizewin( Epixelsinch, upleftx, uplefty, ux, uy );
}
#endif
#ifndef NOGD
else if( Edev == 'g' ) {
/* terminate existing image and start a new one with new size.. */
Esetwinscale( (int)(pagewidth*Epixelsinch), (int)(pageheight*Epixelsinch), pagewidth, pageheight );
PLGG_setup( "", Epixelsinch, pagewidth, pageheight, uplefttx, upleftty );
}
#endif
}
return( 0 );
}
/* ====================================== */
int
PLG_setdefaults()
{
Efont( Estandard_font );
Etextsize( 10 );
Etextdir( 0 );
Elinetype( 0, 0.6, 1.0 );
Ecolor( Estandard_color ); PLG_forcecolorchg();
/* strcpy( Ecurcolor, Estandard_color ); */ /* added scg 7/28/04 ... related to pcode color change optimization */
Ebackcolor( Estandard_bkcolor );
Escaletype( "linear", 'x' );
Escaletype( "linear", 'y' );
Epaper( 0 );
Eblacklines = 1; /* set to 0 only when half-tone lines desired when displaying on b/w device */
EEvent = 0;
return( 0 );
}
/* =================== */
int
PLG_setoutfilename( name )
char *name;
{
strncpy( outfilename, name, MAXPATH-1 );
outfilename[ MAXPATH-1 ] = '\0';
return( 0 );
}
/* =================== */
int
PLG_getoutfilename( name )
char *name;
{
strcpy( name, outfilename );
return( 0 );
}
/* ==================== */
int
PLG_setoutlabel( name )
char *name;
{
strncpy( outlabel, name, 78 );
outlabel[78] = '\0';
return( 0 );
}
/* ===================== */
/* added scg 5/4/04 */
int
PLG_setmaxdrivervect( j )
int j;
{
maxdrivervect = j;
return( 0 );
}
/* ========================= */
int
PLG_handle_events( x, y, e )
double x, y;
int e;
{
/* fprintf( stderr, "[event %d]\n", e ); */
if( e == E_EXPOSE || e == E_RESIZE ) Erestorewin();
#ifdef GETGUI
getgui_late_refresh();
#endif
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/proc_tabulate.c 0000644 0001750 0001750 00000040461 11155272001 016053 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC TABULATE - do frequency distributions, 1-D or 2-D */
/* Uses data read by most recent getdata; result becomes "current data set"
scg 1/11/00 - added support for special units even when categories not in use
scg 1/21/00 - changed tab[][], total[], and grantotal from int to double.
added accumfield option.
scg 1/21/00 - for 2-way dist, column tags are used to set getdata field names
scg 4/2/04 - added numfmt - %g doesn't give correct results for sets of very small values
*/
#include "pl.h"
#define WORDLEN 40
#define MAXBINS 200
#define MAXROWS 200
#define MAXCOLS 60
static int fsort(), freqsort();
int
PLP_tabulate()
{
char attr[NAMEMAXLEN], *line, *lineval;
int lvp, first;
char buf[256], val[256];
double tab[MAXROWS][MAXCOLS];
double total[2][MAXROWS];
double grantotal;
char list[2][MAXROWS][WORDLEN];
int stat, j, nlist[3], select[3], ndim;
int order[2][MAXROWS], valuesgiven[2], dopercents;
int forcevertical, forcehorizontal;
char ordering[2];
char tmp[WORDLEN];
char *GL_getok();
double atof();
/* --- */
char *valuelist[2], *rangespec[2], *selectex, *rangesepchar, *showrange, *fieldnamelist, *numfmt;
char axis[2], numbuf[80], hival[80], lowval[80], tag[80];
int field[2], accumfield;
int axisset[2]; /* added 1/11/00 scg */
int i, ix, showresults, irow, result, doranges[2], ixx;
double gran[2], hiv[MAXBINS], lowv[MAXBINS], fval, inc;
TDH_errprog( "pl proc tabulate" );
/* initialize */
field[0] = -1; field[1] = -1;
ndim = -1;
valuesgiven[0] = valuesgiven[1] = 0;
dopercents = 0;
forcevertical = 1; forcehorizontal = 0;
ordering[0] = '?'; ordering[1] = '?';
gran[0] = gran[1] = 0.0;
doranges[0] = doranges[1] = 0;
axis[0] = 'x';
axis[1] = 'y';
rangespec[0] = rangespec[1] = "";
axisset[0] = axisset[1] = 0;
accumfield = -1;
showresults = 0;
selectex = "";
rangesepchar = "-";
showrange = "";
numfmt = "%g";
valuelist[0] = valuelist[1] = "";
fieldnamelist = "";
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "datafield1" )==0 ) { field[0] = fref( lineval ) - 1; ndim = 1; }
else if( strcmp( attr, "datafield2" )==0 ) { field[1] = fref( lineval ) - 1; ndim = 2; }
else if( strcmp( attr, "accumfield" )==0 ) accumfield = fref( lineval ) -1;
else if( strcmp( attr, "valuelist1" )==0 ) valuelist[0] = lineval;
else if( strcmp( attr, "valuelist2" )==0 ) valuelist[1] = lineval;
else if( strcmp( attr, "doranges1" )==0 ) doranges[0] = getyn( lineval );
else if( strcmp( attr, "doranges2" )==0 ) doranges[1] = getyn( lineval );
else if( strcmp( attr, "showrangelowonly" )==0 ) { if( getyn( lineval ) ) showrange = "low"; }
else if( strcmp( attr, "showrange" )==0 ) showrange = lineval;
else if( strcmp( attr, "rangesepchar" )==0 ) rangesepchar = lineval;
else if( strcmp( attr, "resultfieldnames" )==0 ) fieldnamelist = lineval;
else if( strcmp( attr, "order1" )==0 ) { /* mag, rev, nat, none */
if( lineval[0] == 'm' || lineval[0] == 'r' || lineval[1] == 'a' ) ordering[0] = lineval[0];
else ordering[0] = 0;
}
else if( strcmp( attr, "order2" )==0 ) {
if( lineval[0] == 'm' || lineval[0] == 'r' || lineval[1] == 'a' ) ordering[1] = lineval[0];
else ordering[1] = 0;
}
else if( strcmp( attr, "percents" )==0 ) dopercents = getyn( lineval );
else if( strcmp( attr, "showresults" )==0 || strcmp( attr, "savetable" )==0 ) showresults = getyn( lineval );
else if( strcmp( attr, "select" )==0 ) selectex = lineval;
else if( strcmp( attr, "axis1" )==0 ) { axis[0] = lineval[0]; axisset[0] = 1; }
else if( strcmp( attr, "axis2" )==0 ) { axis[1] = val[0]; axisset[1] = 1; }
else if( strcmp( attr, "rangespec1" )==0 ) rangespec[0] = lineval;
else if( strcmp( attr, "rangespec2" )==0 ) rangespec[1] = lineval;
else if( strcmp( attr, "numfmt" )==0 ) numfmt = lineval;
else Eerr( 1, "attribute not recognized", attr );
}
/* overrides and degenerate cases */
/* -------------------------- */
if( field[0] < 0 ) return( Eerr( 4984, "datafield1 must be specified", "" ) );
if( ordering[0] == '?' ) {
if( valuelist[0][0] != '\0' ) ordering[0] = '0';
else ordering[0] = 'n';
}
if( ordering[1] == '?' ) {
if( valuelist[1][0] != '\0' ) ordering[1] = '0';
else ordering[1] = 'n';
}
/* now do the computation work.. */
/* -------------------------- */
/* initialize tables */
grantotal = 0.0;
for( i = 0; i < MAXROWS; i++ ) {
if( i < 2 )nlist[i] = 0;
for( j = 0; j < MAXCOLS; j++ ) { tab[i][j] = 0.0; if( i < 2 ) { total[i][j] = 0.0; } }
order[0][i] = order[1][i] = i;
}
/* get value list (a comma or space delimited list of values; output distribution will
be for only these values (in the order given?) */
for( j = 0; j < ndim; j++ ) { /* for all dimensions (1 or 2).. */
if( valuelist[j][0] != '\0' ) {
int ix;
for( i = 0, ix = 0; ; i++ ) {
if( GL_getseg( tmp, valuelist[j], &ix, " ," ) ) break;
strcpy( list[j][i], tmp );
nlist[j]++;
if( doranges[j] ) { /* find lowv and hiv */
if( i >= MAXBINS ) return( Eerr( 9285, "Sorry, max number of bins exceeded","" ) );
ixx = 0;
GL_getseg( lowval, tmp, &ixx, rangesepchar );
strcpy( hival, &tmp[ixx] );
if( strcmp( lowval, "c" )==0 && i > 0 ) lowv[i] = hiv[i-1]; /* contiguous*/
else lowv[i] = Econv( axis[j], lowval );
if( Econv_error( ) ) { /* a non-conformant value.. */
lowv[i] = PLHUGE; /* so that we know to compare
to value for non-numerics */
hiv[i] = NEGHUGE;
}
else {
hiv[i] = Econv( axis[j], hival );
Euprint( lowval, axis[j], lowv[i], numfmt ); /* lowval[80] */
if( showrange[0] == 'l' ) strcpy( list[j][i], lowval );
else if( showrange[0] == 'a' ) Euprint( list[j][i], axis[j], (lowv[i]+hiv[i])/2.0, numfmt ); /* [40] */
else sprintf( list[j][i], "%s%s%s", lowval, rangesepchar, hival );
}
}
}
valuesgiven[j] = 1;
}
/* automatic bins */
if( rangespec[j][0] != '\0' ) {
double binsiz, hilimit, rw;
int nt;
doranges[j] = 1; /* implied */
nt = sscanf( rangespec[j], "%s %lf %s", lowval, &binsiz, hival );
if( nt < 2 || nt > 3 ) return( Eerr( 2740, "2 or 3 values expected in rangespec",
rangespec[j] ) );
rw = Econv( axis[j], lowval );
if( Econv_error() ) return( Eerr( 2750, "warning: error on rangespec lowlimit", rangespec[j] ) );
if( nt == 3 ) {
hilimit = Econv(axis[j], hival );
if( Econv_error() ) return( Eerr( 2750, "warning: error on rangespec hilimit", rangespec[j] ) );
}
else if( nt == 2 ) {
if( !scalebeenset() ) return( Eerr( 2479, "rangespec must have 3 values since scaleing has not yet been set", "" ));
hilimit = Elimit( axis[j], 'h', 's' );
}
for( i = 0; i < MAXBINS ; i++ ) {
lowv[i] = rw;
rw += binsiz;
hiv[i] = rw;
Euprint( lowval, axis[j], lowv[i], "" ); /* lowval[80] */
Euprint( hival, axis[j], hiv[i], "" ); /* hival[80] */
if( showrange[0] == 'l' ) strcpy( list[j][i], lowval );
else if( showrange[0] == 'a' ) Euprint( list[j][i], axis[j], (lowv[i]+hiv[i])/2.0, numfmt ); /* [40] */
else sprintf( list[j][i], "%s%s%s", lowval, rangesepchar, hival );
nlist[j]++;
if( rw > hilimit ) break;
}
valuesgiven[j] = 1;
}
if( doranges[j] && !valuesgiven[j] )
return( Eerr( 2052, "A values list must be given when doing ranges.", "" ));
}
/* process from data already read in earlier.. */
if( Nrecords < 1 ) return( Eerr( 32, "No data has been read yet.", "" ) );
/* process input data.. */
ix = 0;
for( irow = 0; irow < Nrecords; irow++ ) {
if( selectex[0] != '\0' ) { /* process against selection condition if any.. */
stat = do_select( selectex, irow, &result );
if( stat != 0 ) { Eerr( stat, "Select error", selectex ); continue; }
if( result == 0 ) continue; /* reject */
}
/* for each item requested (1 or 2) */
for( i = 0; i < ndim; i++ ) {
/* strcpy( val, data[ field[i] ] ); */
strcpy( val, da( irow, field[i] ));
val[WORDLEN-1] = '\0';
/**** if ranges have not been pre defined... */
if( !doranges[i] ) { /* classify by value */
/**** a. if axis has been set, use special units, Econv, etc. */
if( axisset[i] ) { /* code copied from below; uses fval instead of val */
fval = Econv( axis[i], val );
/* see if already encountered (compare fval) */
for( j = 0; j < nlist[i]; j++ )
if( GL_close_to( fval, atof(list[i][j]), 0.001 ))
{ select[i] = j; break; }
if( j == nlist[i] && valuesgiven[i] ) goto NEXT;
/* otherwise, add the internal representation to list */
if( j == nlist[i] ) {
if( (i == 0 && nlist[i] >= MAXROWS) || (i == 1 && nlist[i] >= MAXCOLS) )
fprintf( PLS.errfp, "tabulate warning, sorry, table capacity exceeded, skipping %s\n", val );
else {
if( !Econv_error())
sprintf( list[i][j], "%f", fval );
else strcpy( list[i][j], val );
select[i] = j;
nlist[i] ++;
}
}
}
/**** b. axis has not been set, dont use Econv */
else {
/* see if we've already encountered current val */
for( j = 0; j < nlist[i]; j++ ) if( strcmp( val, list[i][j] )== 0 )
{ select[i] = j; break; }
if( j == nlist[i] && valuesgiven[i] ) goto NEXT; /* not in value list-
discard */
/* add it to list */
if( j == nlist[i] ) {
if( (i == 0 && nlist[i] >= MAXROWS) || (i == 1 && nlist[i] >= MAXCOLS) )
fprintf( PLS.errfp, "tabulate warning, sorry, table capacity exceeded, skipping %s\n", val );
else {
strcpy( list[i][j], val );
select[i] = j;
nlist[i] ++;
}
}
}
}
/**** if ranges have been defined.. */
else if( doranges[i] ) {
fval = Econv( axis[i], val );
/* go through list backwards so that boundary values are
put into higher category.. */
for( j = nlist[i] - 1; j >= 0; j-- ) {
if( lowv[j] >= PLHUGE && hiv[j] <= NEGHUGE ) {
if( strcmp( list[i][j], val )==0 ) {
select[i] = j;
break;
}
}
if( Econv_error() ) continue;
if( fval >= lowv[j] && fval <= hiv[j] ) {
select[i] = j;
break;
}
}
/* if( j == nlist[i] ) goto NEXT; */ /* not in value list- discard */
if( j < 0 ) goto NEXT; /* not in value list- discard */
}
}
if( accumfield >= 0 ) inc = atof( da( irow, accumfield ) );
else inc = 1.0;
if( ndim == 1 ) {
tab[ 0 ][ select[ 0 ] ] += inc;
total[0][0] += inc;
}
else if( ndim == 2 ) {
( tab[ select[0] ][ select[1] ] ) += inc;
total[0][select[0]] += inc;
total[1][select[1]] += inc;
grantotal += inc;
}
NEXT: continue;
}
/* put rows/cols in some kind of order */
if( ndim == 1 ) {
if( ordering[0] == 'n' ) fsort( list[0], nlist[0], order[0] );
else if( ordering[0] == 'm' ) freqsort(tab[0], nlist[0], order[0], 0 );
else if( ordering[0] == 'r' ) freqsort(tab[0], nlist[0], order[0], 1 );
}
else if( ndim == 2 ) {
if( ordering[0] == 'n' ) fsort( list[0], nlist[0], order[0] );
else if( ordering[0] == 'm' ) freqsort(tab[0], nlist[0], order[0], 0 );
else if( ordering[0] == 'r' ) freqsort(tab[0], nlist[0], order[0], 1 );
if( ordering[1] == 'n' ) fsort( list[1], nlist[1], order[1] );
else if( ordering[1] == 'm' ) freqsort(total[1], nlist[1], order[1], 0 );
else if( ordering[1] == 'r' ) freqsort(total[1], nlist[1], order[1], 1 );
}
/* --------------------- */
/* generate the results */
/* --------------------- */
/* make a description string */
if( showresults ) {
if( ndim == 1 ) fprintf( PLS.diagfp, "// proc tabulate has computed this distribution on field %d %s\n", field[0]+1, selectex );
else if( ndim == 2 ) fprintf( PLS.diagfp, "// proc tabulate has computed this 2-way distribution\n// on field %d (down) by field %d (across) %s\n",
field[0]+1, field[1]+1, selectex );
}
/* PL_newdataset(); */
PL_begindataset();
/* ------------------ */
/* for 1-way tables.. */
/* ------------------ */
if( ndim == 1 ) {
/* do output lines.. */
for( i = 0; i < nlist[0]; i++ ) {
if( !doranges[0] && axisset[0] ) Euprint( tag, axis[0], atof(list[0][order[0][i]]), "" ); /* tag[80] */
else strcpy( tag, list[0][order[0][i]] );
PL_startdatarow();
PL_catitem( tag ); /* label */
/* n */
sprintf( buf, numfmt, tab[0][order[0][i]] );
PL_catitem( buf );
if( dopercents ) {
sprintf( buf, numfmt, (double)(tab[0][order[0][i]])/(total[0][0]+0.0001)*100 );
PL_catitem( buf );
}
PL_enddatarow();
}
}
/* ------------------ */
/* for 2-way tables.. */
/* ------------------ */
else if( ndim == 2 ) {
if( fieldnamelist[0] != '\0' ) {
definefieldnames( fieldnamelist );
fprintf( PLS.diagfp, "proc tabulate: field names are now: %s\n", fieldnamelist );
}
/* do output lines.. */
for( j = 0; j < nlist[0]; j++ ) {
if( !doranges[0] && axisset[0] ) Euprint( tag, axis[0], atof(list[0][order[0][j]]), "" ); /* tag[80] */
else strcpy( tag, list[0][order[0][j]] );
PL_startdatarow();
PL_catitem( tag ); /* label */
for( i = 0; i < nlist[1]; i++ ) {
/* n */
sprintf( numbuf, numfmt, tab[order[0][j]] [order[1][i]] );
PL_catitem( numbuf );
if( dopercents ) {
sprintf( numbuf, numfmt,
(double)(tab[order[0][j]][order[1][i]])/ (total[1][order[1][i]]+0.00001) * 100 );
PL_catitem( numbuf );
}
}
/* row total */
sprintf( numbuf, numfmt, total[0][order[0][j]] );
PL_catitem( numbuf );
if( dopercents ) {
sprintf( numbuf, numfmt, (double)(total[0][order[0][j]]) / (grantotal+0.00001) * 100 );
PL_catitem( numbuf );
}
PL_enddatarow();
}
}
PL_finishdataset( 0, 0 );
if( showresults ) for( i = 0; i < Nrecords; i++ ) {
for( j = 0; j < Nfields; j++ ) fprintf( PLS.diagfp, "[%s]", da( i, j ) );
fprintf( PLS.diagfp, "\n" );
}
return( 0 );
}
/* ================ */
/* sort bin names numerically if all numeric, alphabetically otherwise */
static int
fsort( data, nd, order )
char data[][WORDLEN];
int nd, order[];
{
int i, j, used[MAXROWS], mincell, first, allnum, foo, idiff;
double atof(), diff;
allnum = YES;
for( i = 0; i < nd; i++ ) {
used[i] = 0;
if( atof( data[i] ) < -31999) strcpy( data[i], "-31000" );
if( !GL_goodnum( data[i], &foo )) { allnum = NO; }
}
for( i = 0; i < nd; i++ ) {
first = YES;
for( j = 0; j < nd; j++ ) {
if( used[j] ) continue;
if( first ) { mincell = j; first = NO; }
if( allnum ) {
diff = atof( data[j] ) - atof( data[mincell] );
if( diff <= 0.0 ) mincell = j;
}
else {
idiff = (strcmp( data[j], data[mincell] ));
if( idiff <= 0 ) mincell = j;
}
}
order[i] = mincell;
used[mincell] = 1;
}
return( 0 );
}
/* ================ */
static int
freqsort( counts, nd, order, reverse )
double counts[];
int nd, order[], reverse;
{
int i, j, used[MAXROWS], firstcell, first, diff;
for( i = 0; i < nd; i++ )
used[i] = NO;
for( i = 0; i < nd; i++ ) {
first = YES;
for( j = 0; j < nd; j++ ) {
if( used[j] ) continue;
if( first ) { firstcell = j; first = NO; }
diff = counts[j] - counts[firstcell];
switch (reverse)
{
case YES: if (diff >= 0) firstcell = j; break;
case NO: if (diff <= 0) firstcell = j; break;
}
}
order[i] = firstcell;
used[firstcell] = 1;
}
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/value.c 0000644 0001750 0001750 00000006577 10713647125 014371 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* VALUE.C - assign / get value of data array field or variable */
#include "tdhkit.h"
extern int atoi();
#ifdef PLOTICUS
extern int PL_fref_showerr(), PL_fref(), PL_fref_error();
#endif
/* ======================== */
/* SETVALUE - set the named variable to the given value.
Returns 0 if ok, 1 if itemname not recognized. */
int
TDH_setvalue( itemname, value, data, recordid )
char *itemname, *value;
char data[ MAXITEMS ][ DATAMAXLEN+1 ]; /* data array */
char *recordid; /* see top of this file */
{
int j;
int stat;
int p;
/* see if itemname is an integer field number;
if so set it and return.. scg 2-18-98 */
stat = GL_goodnum( itemname, &p );
if( stat && p <= 0 ) {
if( data == NULL ) return( 1301 );
strcpy( data[ atoi( itemname ) -1 ], value );
return( 0 );
}
if( strcmp( recordid, "" )==0 ) j = -1;
#ifndef TDH_NOREC
else if( recordid[0] == '@' ) {
int ival;
ival = atoi( &recordid[1] );
if( ival > 0 && ival < MAXITEMS ) {
if( data == NULL ) return( 1302 );
j = TDH_fieldmap( data[ival-1], itemname );
}
else return( 1303 ); /* invalid @N */
}
else j = TDH_fieldmap( recordid, itemname );
#endif
if( j < 0 ) {
stat = TDH_setvar( itemname, value );
return( stat );
}
else {
if( strlen( value ) > DATAMAXLEN ) return( 1304 ); /* value too long */
if( data == NULL ) return( 1305 );
strcpy( data[ j ] , value );
}
return( 0 );
}
/* ========================= */
/* GETVALUE - get the value of the named variable.
Returns 0 if ok, 1 if itemname not recognized.
4/30/01 - now handles field#s, e.g. itemname = 2
*/
int
TDH_getvalue( value, itemname, data, recordid )
char *value;
char *itemname;
char data[ MAXITEMS ][ DATAMAXLEN+1 ]; /* data array */
char *recordid; /* see top of this file */
{
int j;
int stat;
int ival;
if( GL_goodnum( itemname, &stat ) ) { /* @3, etc. */
ival = atoi( itemname );
if( ival < 1 || ival > MAXITEMS ) return( 1309 ); /* field# out of range */
if( data == NULL ) return( 1308 ); /* attempt to access data item but data array not supplied */
strcpy( value, data[ ival-1 ] );
return( 0 );
}
if( strcmp( recordid, "" )==0 ) j = -1;
#ifndef TDH_NOREC
else j = TDH_fieldmap( recordid, itemname );
#endif
if( j < 0 ) {
stat = TDH_getvar( itemname, value );
#ifdef PLOTICUS
if( stat != 0 && data != NULL ) { /* try data field name.. */
PL_fref_showerr( 0 );
j = PL_fref( itemname ) - 1;
PL_fref_showerr( 1 );
if( PL_fref_error() ) return( 1308 );
/* return( err( 1308, "unrecognized variable or data field name", itemname )); */
/* if( data == NULL ) return( 1308 ); */ /* moved above.. scg 11/5/07 */
strcpy( value, data[ j ] );
return( 0 );
}
#endif
return( stat );
}
else {
if( data == NULL ) return( 1308 ); /* attempt to access data item but data array not supplied */
strcpy( value, data[ j ] );
}
return( 0 );
}
/* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
ploticus-2.42/src/gdfontl.c 0000644 0001750 0001750 00000220635 06736024171 014703 0 ustar colin colin
/*
This is a header file for gd font, generated using
bdftogd version 0.5 by Jan Pazdziora, adelton@fi.muni.cz
from bdf font
-misc-fixed-medium-r-normal--16-140-75-75-c-80-iso8859-2
at Tue Jan 6 19:39:27 1998.
The original bdf was holding following copyright:
"Libor Skarvada, libor@informatics.muni.cz"
*/
#include "gdfontl.h"
char gdFontLargeData[] = {
/* Char 0 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 1 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,1,1,0,0,0,
0,1,1,1,1,1,0,0,
1,1,1,1,1,1,1,0,
1,1,1,1,1,1,1,0,
0,1,1,1,1,1,0,0,
0,0,1,1,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 2 */
1,0,1,0,1,0,1,0,
0,1,0,1,0,1,0,1,
1,0,1,0,1,0,1,0,
0,1,0,1,0,1,0,1,
1,0,1,0,1,0,1,0,
0,1,0,1,0,1,0,1,
1,0,1,0,1,0,1,0,
0,1,0,1,0,1,0,1,
1,0,1,0,1,0,1,0,
0,1,0,1,0,1,0,1,
1,0,1,0,1,0,1,0,
0,1,0,1,0,1,0,1,
1,0,1,0,1,0,1,0,
0,1,0,1,0,1,0,1,
1,0,1,0,1,0,1,0,
0,1,0,1,0,1,0,1,
/* Char 3 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,1,0,0,0,
1,0,0,0,1,0,0,0,
1,1,1,1,1,0,0,0,
1,0,0,0,1,0,0,0,
1,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,1,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 4 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,0,0,0,0,
1,0,0,0,0,0,0,0,
1,1,1,0,0,0,0,0,
1,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,0,
0,0,0,1,0,0,0,0,
0,0,0,1,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 5 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,0,0,0,0,
1,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
0,1,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,1,0,0,
0,0,0,1,0,0,1,0,
0,0,0,1,1,1,0,0,
0,0,0,1,0,1,0,0,
0,0,0,1,0,0,1,0,
0,0,0,0,0,0,0,0,
/* Char 6 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
1,1,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,0,
0,0,0,1,0,0,0,0,
0,0,0,1,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 7 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 8 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 9 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,1,0,0,0,
1,1,0,0,1,0,0,0,
1,0,1,0,1,0,0,0,
1,0,0,1,1,0,0,0,
1,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,1,1,1,0,
0,0,0,0,0,0,0,0,
/* Char 10 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,1,0,0,0,
1,0,0,0,1,0,0,0,
0,1,0,1,0,0,0,0,
0,1,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,1,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 11 */
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
1,1,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 12 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 13 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,1,1,1,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 14 */
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 15 */
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 16 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 17 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 18 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 19 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 20 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 21 */
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,1,1,1,1,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 22 */
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
1,1,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 23 */
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 24 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,1,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 25 */
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 26 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,1,1,0,0,
0,0,1,1,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,1,1,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 27 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,1,1,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,1,1,0,0,
0,0,1,1,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 28 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
1,0,1,0,1,0,0,0,
0,0,1,0,1,0,0,0,
0,0,1,0,1,0,0,0,
0,0,1,0,1,0,0,0,
0,0,1,0,1,0,0,0,
1,1,0,0,0,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 29 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
1,1,1,1,1,1,1,0,
0,0,0,1,1,0,0,0,
0,0,1,1,0,0,0,0,
1,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 30 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
1,1,1,1,1,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,1,0,0,0,1,0,
1,0,1,1,1,1,0,0,
1,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 31 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 32 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 33 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 34 */
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 35 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,1,0,
0,0,0,1,0,0,1,0,
0,0,0,1,0,0,1,0,
0,1,1,1,1,1,1,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,1,1,1,1,1,1,0,
0,1,0,0,1,0,0,0,
0,1,0,0,1,0,0,0,
0,1,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 36 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,0,0,
0,1,1,1,0,0,0,0,
0,0,0,1,1,1,0,0,
0,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
0,1,1,1,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 37 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,0,0,0,1,0,
1,0,0,1,0,1,0,0,
1,0,0,1,0,1,0,0,
0,1,1,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,1,1,0,0,
0,1,0,1,0,0,1,0,
0,1,0,1,0,0,1,0,
1,0,0,0,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 38 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
0,1,1,1,0,0,1,0,
1,0,0,0,1,0,1,0,
1,0,0,0,0,1,0,0,
1,0,0,0,1,1,0,0,
0,1,1,1,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 39 */
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 40 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 41 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 42 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
1,0,0,1,0,0,1,0,
0,1,0,1,0,1,0,0,
0,0,1,1,1,0,0,0,
0,1,0,1,0,1,0,0,
1,0,0,1,0,0,1,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 43 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
1,1,1,1,1,1,1,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 44 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 45 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 46 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 47 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 48 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 49 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 50 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 51 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,1,1,1,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 52 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,1,0,0,
0,0,0,1,0,1,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 53 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 54 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,1,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 55 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 56 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 57 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 58 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 59 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 60 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 61 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 62 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 63 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 64 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,1,0,0,
0,0,1,0,0,0,1,0,
0,1,0,0,1,0,1,0,
0,1,0,1,0,1,1,0,
0,1,0,1,0,0,1,0,
0,1,0,1,0,0,1,0,
0,1,0,1,0,0,1,0,
0,1,0,0,1,1,1,0,
0,0,1,0,0,0,0,0,
0,0,0,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 65 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 66 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 67 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 68 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,0,0,
0,1,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 69 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 70 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 71 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,1,1,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 72 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 73 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 74 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,1,1,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 75 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,0,0,
0,1,0,0,1,0,0,0,
0,1,0,1,0,0,0,0,
0,1,1,0,0,0,0,0,
0,1,1,0,0,0,0,0,
0,1,0,1,0,0,0,0,
0,1,0,0,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 76 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 77 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,0,0,1,0,
1,1,0,0,0,1,1,0,
1,1,0,0,0,1,1,0,
1,0,1,0,1,0,1,0,
1,0,1,0,1,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,0,0,0,1,0,
1,0,0,0,0,0,1,0,
1,0,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 78 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,1,0,0,0,1,0,
0,1,1,0,0,0,1,0,
0,1,0,1,0,0,1,0,
0,1,0,1,0,0,1,0,
0,1,0,0,1,0,1,0,
0,1,0,0,1,0,1,0,
0,1,0,0,0,1,1,0,
0,1,0,0,0,1,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 79 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 80 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 81 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,1,1,0,1,0,
0,1,1,0,0,1,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,1,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 82 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,0,0,
0,1,0,0,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 83 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,1,1,0,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 84 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 85 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 86 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,0,0,1,0,
1,0,0,0,0,0,1,0,
1,0,0,0,0,0,1,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,0,1,0,1,0,0,0,
0,0,1,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 87 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,0,0,1,0,
1,0,0,0,0,0,1,0,
1,0,0,0,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,1,0,1,0,1,0,
1,0,1,0,1,0,1,0,
0,1,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 88 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 89 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,0,0,1,0,
1,0,0,0,0,0,1,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,0,1,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 90 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 91 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 92 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 93 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 94 */
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 95 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
/* Char 96 */
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 97 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,1,1,1,0,
0,0,1,1,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 98 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,1,1,1,0,0,
0,1,1,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,0,0,0,1,0,
0,1,0,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 99 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 100 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,1,1,1,0,1,0,
0,1,0,0,0,1,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 101 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 102 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,1,0,0,
0,0,1,0,0,0,1,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 103 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,0,
0,0,1,1,1,0,1,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
/* Char 104 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,1,1,1,0,0,
0,1,1,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 105 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 106 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,1,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,0,1,0,0,
0,1,0,0,1,0,0,0,
0,0,1,1,0,0,0,0,
/* Char 107 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,1,0,0,0,
0,1,0,1,0,0,0,0,
0,1,1,1,0,0,0,0,
0,1,0,0,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 108 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 109 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,0,1,1,0,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 110 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,1,1,1,0,0,
0,1,1,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 111 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 112 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,1,1,1,0,0,
0,1,1,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,0,0,0,1,0,
0,1,0,1,1,1,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
/* Char 113 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,0,1,0,
0,1,0,0,0,1,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
/* Char 114 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,1,1,1,0,0,
0,1,1,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 115 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 116 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,1,0,
0,0,0,0,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 117 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 118 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 119 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,1,0,1,0,1,0,
0,1,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 120 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 121 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,0,0,1,1,0,
0,0,0,1,1,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
/* Char 122 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 123 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 124 */
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 125 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 126 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,0,0,0,1,0,
1,0,0,1,0,0,1,0,
1,0,0,0,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 127 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 128 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 129 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 130 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 131 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 132 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 133 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 134 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 135 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 136 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 137 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 138 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 139 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 140 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 141 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 142 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 143 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 144 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 145 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 146 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 147 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 148 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 149 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 150 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 151 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 152 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 153 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 154 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 155 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 156 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 157 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 158 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 159 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 160 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 161 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,1,0,
/* Char 162 */
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 163 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,1,0,0,0,0,
0,1,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
1,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 164 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,0,0,1,0,
0,1,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
0,1,0,0,0,1,0,0,
1,0,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 165 */
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,1,0,0,0,
0,1,0,0,1,0,0,0,
0,1,0,1,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 166 */
0,0,0,0,0,1,1,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,1,1,0,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 167 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 168 */
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 169 */
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,1,1,0,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 170 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,1,1,0,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 171 */
0,0,1,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 172 */
0,0,0,0,0,1,1,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 173 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 174 */
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 175 */
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 176 */
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 177 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,1,1,1,0,
0,0,1,1,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,1,0,
/* Char 178 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,1,1,0,
/* Char 179 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,1,0,0,0,0,
0,1,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 180 */
0,0,0,0,0,0,0,0,
0,0,0,0,1,1,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 181 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,1,0,
0,0,1,1,0,0,1,0,
0,0,0,1,0,0,1,0,
0,0,0,1,0,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 182 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 183 */
0,0,0,0,0,0,0,0,
0,1,0,0,0,1,0,0,
0,0,1,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 184 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
/* Char 185 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 186 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 187 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,1,0,
0,0,1,0,0,0,1,0,
0,0,1,0,0,0,1,0,
1,1,1,1,0,1,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 188 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 189 */
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,1,0,
0,0,1,0,0,1,0,0,
0,1,0,0,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 190 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 191 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 192 */
0,0,0,0,0,1,1,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,0,0,
0,1,0,0,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 193 */
0,0,0,0,0,1,1,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 194 */
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 195 */
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 196 */
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 197 */
0,0,0,0,1,1,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 198 */
0,0,0,0,0,1,1,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 199 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
/* Char 200 */
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 201 */
0,0,0,0,0,1,1,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 202 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,1,0,
/* Char 203 */
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 204 */
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 205 */
0,0,0,0,1,1,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 206 */
0,0,1,1,1,0,0,0,
0,1,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 207 */
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,0,0,
0,1,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 208 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
1,1,1,1,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,0,0,
0,1,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 209 */
0,0,0,0,0,1,1,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,1,0,0,0,1,0,
0,1,1,0,0,0,1,0,
0,1,0,1,0,0,1,0,
0,1,0,1,0,0,1,0,
0,1,0,0,1,0,1,0,
0,1,0,0,1,0,1,0,
0,1,0,0,0,1,1,0,
0,1,0,0,0,1,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 210 */
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,1,0,0,0,1,0,
0,1,1,0,0,0,1,0,
0,1,0,1,0,0,1,0,
0,1,0,1,0,0,1,0,
0,1,0,0,1,0,1,0,
0,1,0,0,1,0,1,0,
0,1,0,0,0,1,1,0,
0,1,0,0,0,1,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 211 */
0,0,0,0,0,1,1,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 212 */
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 213 */
0,0,0,1,0,0,1,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 214 */
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 215 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 216 */
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,0,0,
0,1,0,0,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 217 */
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 218 */
0,0,0,0,0,1,1,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 219 */
0,0,0,1,0,0,1,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 220 */
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 221 */
0,0,0,0,0,1,1,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
1,0,0,0,0,0,1,0,
1,0,0,0,0,0,1,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,0,1,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 222 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
1,1,1,1,1,1,1,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 223 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,1,0,0,
1,1,0,0,1,0,0,0,
0,1,0,0,0,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,0,0,0,1,0,
0,1,0,1,1,1,0,0,
1,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 224 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,1,1,1,0,0,
0,1,1,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 225 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,1,1,1,0,
0,0,1,1,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 226 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,1,0,0,
0,0,1,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,1,1,1,0,
0,0,1,1,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 227 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,1,1,1,0,
0,0,1,1,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 228 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,0,0,0,1,1,1,0,
0,0,1,1,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 229 */
0,0,0,0,1,1,0,0,
0,0,1,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 230 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 231 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
/* Char 232 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 233 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 234 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,1,0,0,
/* Char 235 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 236 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,1,1,1,1,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 237 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 238 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,1,0,1,0,0,0,
0,1,0,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 239 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,1,1,
0,0,0,0,0,0,0,1,
0,0,0,0,0,1,0,1,
0,0,0,0,0,1,1,0,
0,0,0,0,0,1,0,0,
0,1,1,1,0,1,0,0,
1,0,0,0,1,1,0,0,
1,0,0,0,0,1,0,0,
1,0,0,0,0,1,0,0,
1,0,0,0,0,1,0,0,
1,0,0,0,1,1,0,0,
0,1,1,1,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 240 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,1,1,1,1,0,
0,0,0,0,0,1,0,0,
0,1,1,1,0,1,0,0,
1,0,0,0,1,1,0,0,
1,0,0,0,0,1,0,0,
1,0,0,0,0,1,0,0,
1,0,0,0,0,1,0,0,
1,0,0,0,1,1,0,0,
0,1,1,1,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 241 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,1,1,1,0,0,
0,1,1,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 242 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,1,1,1,0,0,
0,1,1,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 243 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 244 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 245 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,1,
0,0,0,1,0,0,1,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 246 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,1,1,1,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,1,1,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 247 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,1,1,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 248 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,1,1,1,0,0,
0,1,1,0,0,0,1,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 249 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,1,0,0,1,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 250 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 251 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,1,
0,0,0,1,0,0,1,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 252 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,1,0,0,1,0,0,
0,0,1,0,0,1,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,1,1,0,
0,0,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/* Char 253 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,1,0,0,0,0,1,0,
0,0,1,0,0,1,1,0,
0,0,0,1,1,0,1,0,
0,0,0,0,0,0,1,0,
0,0,0,0,0,1,0,0,
0,0,1,1,1,0,0,0,
/* Char 254 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,1,1,1,1,1,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,1,0,0,1,0,
0,0,0,0,1,1,0,0,
0,0,0,0,1,0,0,0,
0,0,0,0,1,0,0,0,
0,0,0,1,0,0,0,0,
/* Char 255 */
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,1,1,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
};
gdFont gdFontLargeRep = {
256,
0,
8,
16,
gdFontLargeData
};
gdFontPtr gdFontLarge = &gdFontLargeRep;
/* This file has not been truncated. */
ploticus-2.42/src/proc_pvalue.c 0000644 0001750 0001750 00000010055 12144512305 015545 0 ustar colin colin
/* ======================================================= *
* Copyright 1998-2008 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* PROC PVALUE - compute and display P values */
/* for now, this assumes X is the base axis */
#include "pl.h"
extern double GL_ttest( );
int
PLP_pvalue( )
{
int lvp, first, irow;
char attr[NAMEMAXLEN];
char *line, *lineval;
char *textdetails, *selectex, *printfmt, *signifcolor;
char fname[3][NAMEMAXLEN], str[80], printfmt2[80];
int statf[2][3]; /* field numbers for mean, sd, n, for 2 cases */
int i, j, xfield, nt, stat, select_result, align;
double lowp, signif, adjx, adjy, pval, x, y;
TDH_errprog( "pl proc pvalue" );
/* initialize */
xfield = -1;
textdetails = ""; selectex = ""; signifcolor = "yellow";
lowp = 0.01;
signif = 0.05;
printfmt = "p=%2.2f";
/* get attributes.. */
first = 1;
while( 1 ) {
line = getnextattr( first, attr, &lvp );
if( line == NULL ) break;
first = 0;
lineval = &line[lvp];
if( strcmp( attr, "xfield" )==0 ) xfield = fref( lineval )-1;
else if( strcmp( attr, "statfields1" )==0 ) {
nt = sscanf( lineval, "%s %s %s", fname[0], fname[1], fname[2] );
if( nt != 3 ) return( Eerr( 7295, "3 values (mean sd n) expected for statfields1", "" ) );
statf[0][0] = fref( fname[0] )-1;
statf[0][1] = fref( fname[1] )-1;
statf[0][2] = fref( fname[2] )-1;
}
else if( strcmp( attr, "statfields2" )==0 ) {
nt = sscanf( lineval, "%s %s %s", fname[0], fname[1], fname[2] );
if( nt != 3 ) return( Eerr( 7295, "3 values (mean sd n) expected for statfields2", "" ) );
statf[1][0] = fref( fname[0] )-1;
statf[1][1] = fref( fname[1] )-1;
statf[1][2] = fref( fname[2] )-1;
}
else if( strcmp( attr, "textdetails" )==0 ) textdetails = lineval;
else if( strcmp( attr, "lowp" )==0 ) lowp = ftokncpy( lineval );
else if( strcmp( attr, "signif" )==0 ) signif = ftokncpy( lineval );
else if( strcmp( attr, "signifcolor" )==0 ) signifcolor = lineval;
else if( strcmp( attr, "select" )==0 ) selectex = lineval;
else if( strcmp( attr, "printformat" )==0 ) printfmt = lineval;
else Eerr( 1, "attribute not recognized", attr );
}
if( Nrecords < 1 ) return( Eerr( 17, "No data has been read yet w/ proc getdata", "" ) );
if( !scalebeenset() ) return( Eerr( 51, "No scaled plotting area has been defined yet w/ proc areadef", "" ) );
if( xfield > Nfields || xfield < 0 ) return( Eerr( 52, "xfield invalid", "" ) );
for( i = 0; i < 2; i++ ) {
for( j = 0; j < 3; j++ ) {
if( statf[i][j] > Nfields || statf[i][j] < 0 ) return( Eerr( 52, "statfields spec invalid", "" ) );
}
}
if( strcmp( signifcolor, "none" )==0 ) signifcolor = "";
/* build printfmt2 (to handle cases where p < 0.05 or whatever */
for( i = 0; printfmt[i] != '\0'; i++ ) {
if( printfmt[i] == '=' ) printfmt2[i] = '<';
else printfmt2[i] = printfmt[i];
}
printfmt2[i] = '\0';
textdet( "textdetails", textdetails, &align, &adjx, &adjy, -3,"C", 1.0 );
PLG_forcecolorchg( );
for( irow = 0; irow < Nrecords; irow++ ) {
if( selectex ) {
stat = do_select( selectex, irow, &select_result );
if( select_result == 0 || stat ) continue; /* reject */
}
pval = GL_ttest( atof( da( irow, statf[0][0] ) ), atof( da( irow, statf[0][1] ) ), atoi( da( irow, statf[0][2] ) ),
atof( da( irow, statf[1][0] ) ), atof( da( irow, statf[1][1] ) ), atoi( da( irow, statf[1][2] ) ) );
sprintf( str, "%g", pval );
if( strcmp( str, "NaN" )==0 ) pval = 1.0; /* ??? */
if( pval < lowp ) sprintf( str, printfmt2, lowp );
else sprintf( str, printfmt, pval );
x = Eax( fda( irow, xfield, 'x' ) ) + adjx;
y = Eay( EDYlo ) + adjy;
/* do highlighting of statistically significant p values... */
if( pval <= signif && signifcolor ) {
double hbw, bh;
hbw = (strlen( str ) * Ecurtextwidth ) * 0.5;
bh = Ecurtextheight*0.8;
Ecblock( x-hbw, y, x+hbw, y+bh, signifcolor, 0 );
}
Emov( x, y );
Edotext( str, 'C' );
}
return( 0 );
}
ploticus-2.42/src/svg.c 0000644 0001750 0001750 00000067605 12144512051 014040 0 ustar colin colin /* ======================================================= *
* Copyright 1998-2005 Stephen C. Grubb *
* http://ploticus.sourceforge.net *
* Covered by GPL; see the file ./Copyright for details. *
* ======================================================= */
/* SVG Driver for Ploticus - Copyright 2001 Bill Traill (bill@traill.demon.co.uk).
* Portions Copyright 2001, 2002 Stephen C. Grubb
* Covered by GPL; see the file ./Copyright for details. */
/*
Checking for redundant calls is not done here; should be done by caller.
special characters not delt with
04Nov01 bt Created svg driver based on existing postscript driver ps.c
12Nov01 bt Changed to relative addressing within a path.
Added grouping of styles and a default style in elements
Added some shorthand in the entity header
Accuracy of some of the coords improved
Added stoke to SVGfill to get rid of occasional ghost lines
16Nov01 scg Implemented for improved alignment; implemented .svgz;
other integration issues
June02 scg clickmap support added
*/
#ifndef NOSVG
#include
#include
#include
#ifdef WZ
# include "zlib.h"
#endif
extern int TDH_err(), PLG_xrgb_to_rgb(), PLG_colorname_to_rgb(), PL_clickmap_out();
extern int atoi(), chmod(), unlink(); /* sure thing or return value not used */
extern int GL_member(), GL_goodnum();
#define Eerr(a,b,c) TDH_err(a,b,c)
#define stricmp(a,b) strcasecmp(a,b)
#define MARG_X 0
#define MARG_Y 0
static int svg_stdout; /* 1 if svg_fp is stdout */
static FILE *svg_fp;
static double svg_x_size; /* width of the drawing area */
static double svg_y_size; /* height of the drawing area */
static int svg_path_in_prog =0; /* flag to indicate if an svg path is in progress */
static char svg_cur_color[80] = "#000000";
static char svg_dash_style[128];
static double svg_line_width=1;
static char svg_font_name[100] = ""; /* current font name */
static int svg_chdir; /* char direction in degrees */
static int svg_currpointsz; /* current char size in points */
static char svg_font_weight[100];
static char svg_font_style[100];
static char svg_align[100];
static long svg_bbofs; /* byte offset of viewbox statement as returned by ftell() - scg */
static int svg_pixs_inch; /* number of pixels per inch - scg */
static int svg_dotag = 0; /* if 1, write a suitable html