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 colincolorgrid2
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 colindistrib
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 colinpie1
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 colinannot2
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 colinsar-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 colincatlines1
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 colinbars3
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 colinkmslide
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 colinvector1
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 colincolorgrid
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 colintd
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 colinhitcount3
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 colinscatterplot10
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 colindrawcom
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 colinlineplot5
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-A1.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 colintimeline2
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 colintimely
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 colinscatterplot4
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 colinpropbars1
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 colinvenn
// 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 colinerrbar1
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 colinlineplot4
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 colinerrbar5
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 colinheatmap3
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 colinlineplot20
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 colindevol
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 colinstock2
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 colinsupstubs
// 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 colinquarters
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 colintree1
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 TuckleyMon, 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 inelements 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