jgraph/0000777005471000040510000000000013207321556011157 5ustar planklocijgraph/.gdb_history0000777005471000040510000000023111447702136013475 0ustar planklocirun -P < shit.alb > shit.jps where up up up up up up up up print prec print t1 print s->s print *s->s print *s print *s/*s print *s->*s print *s->s quit jgraph/acc.jgr0000777005471000040510000000132111447702134012410 0ustar plankloci(* Graph #6: Kbytes processed each second *) newgraph yaxis size 2.5 min 0 max 100 label fontsize 8 : Percentage of bus utilization xaxis size 1.8 min 0 max 5 no_draw_hash_marks no_draw_axis_label no_draw_hash_labels (* 100% of utilization == 6510.4166 Kb/sec *) newcurve label : DB marktype xbar fill .9 marksize .4 pts 1 3.3573 (* 218.5792 Kb/sec *) newcurve label : QS marktype xbar fill .6 marksize .4 pts 2 8.0665 (* 525.1688 Kb/sec *) newcurve label : GE marktype xbar fill .3 pattern stripe 40 marksize .4 pts 3 27.9602 (* 518.2473 Kb/sec *) newcurve label : RNG marktype xbar fill 0 pattern stripe marksize .4 pts 4 8.2876 (* 539.5619 Kb/sec *) jgraph/acc.tex0000777005471000040510000000025011447702134012426 0ustar plankloci \documentstyle[12pt]{report} \input{psfig} \begin{document} A sample bar graph \begin{figure}[h] \centerline{\psfig{figure=acc.eps}} \end{figure} \end{document} jgraph/ad.jgr0000777005471000040510000000073211447702134012253 0ustar planklocinewgraph xaxis min 0 max 5.5 size 5.5 nodraw yaxis min 0 max 2.8 size 2.8 nodraw (* newcurve eps cube.eps marksize 1.25 2.8 pts .6 1.4 newcurve eps disk.eps marksize .8 .8 pts *) newcurve eps cube.eps marksize 0 0 pts .6 1.4 newcurve eps disk.eps marksize 0 0 pts 4.7 1.6 4.5 1.3 4.3 1 4.1 0.7 newline asize .2 .1 linethickness 3 rarrow pts 1.4 1.5 4.0 1.6 copycurve pts 1.4 1.4 3.8 1.3 copycurve pts 1.4 1.3 3.6 1.0 copycurve pts 1.4 1.2 3.4 0.7 jgraph/alb.jgr0000777005471000040510000004022511447702134012426 0ustar planklocinewgraph xaxis min 1 max 25 size 6.000 nodraw yaxis min .25 max 5 size 1.14 nodraw newstring x 12.5 y .25 vjc hjc : (a) newcurve linetype solid marktype circle marksize 0.200 0.200 pts 1 5 1 4 1 3 1 2 1 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 2 5 3 4 3 3 3 2 3 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 2 4 3 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 2 3 3 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 2 2 3 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 2 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 3 5 3 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 4 5 3 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 4 4 3 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 4 3 3 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 4 2 3 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 4 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 5 5 7 4 7 3 7 2 7 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 5 4 7 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 5 3 7 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 5 2 7 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 5 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 6 5 7 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 6 4 7 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 6 3 7 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 6 2 7 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 6 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 7 5 7 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 8 5 7 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 8 4 7 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 8 3 7 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 8 2 7 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 8 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 9 5 7 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 9 4 7 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 9 3 7 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 9 2 7 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 9 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 10 5 13 4 13 3 13 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 10 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 10 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 10 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 10 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 11 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 11 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 11 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 11 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 11 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 12 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 12 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 12 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 12 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 12 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 13 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 14 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 14 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 14 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 14 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 14 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 15 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 15 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 15 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 15 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 15 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 16 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 16 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 16 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 16 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 16 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 17 5 21 4 21 3 21 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 17 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 17 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 17 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 17 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 18 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 18 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 18 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 18 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 18 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 19 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 19 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 19 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 19 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 19 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 20 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 20 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 20 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 20 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 20 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 21 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 22 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 22 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 22 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 22 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 22 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 23 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 23 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 23 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 23 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 23 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 24 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 24 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 24 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 24 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 24 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 25 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 25 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 25 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 25 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 25 1 newgraph xaxis min 1 max 25 size 6.000 nodraw yaxis min .25 max 5 size 1.14 nodraw y_translate -1.5 newstring x 12.5 y .25 vjc hjc : (b) newcurve linetype solid marktype circle marksize 0.200 0.200 pts 1 5 21 4 21 3 21 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 1 4 3 3 7 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 1 3 3 2 7 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 1 2 3 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 1 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 2 5 3 4 7 3 13 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 2 4 3 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 2 3 3 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 2 2 3 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 2 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 3 5 3 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 4 5 3 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 4 4 3 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 4 3 3 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 4 2 3 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 4 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 5 5 7 4 13 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 5 4 7 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 5 3 7 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 5 2 7 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 5 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 6 5 7 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 6 4 7 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 6 3 7 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 6 2 7 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 6 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 7 5 7 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 8 5 7 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 8 4 7 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 8 3 7 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 8 2 7 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 8 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 9 5 7 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 9 4 7 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 9 3 7 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 9 2 7 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 9 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 10 5 13 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 10 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 10 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 10 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 10 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 11 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 11 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 11 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 11 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 11 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 12 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 12 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 12 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 12 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 12 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 13 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 14 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 14 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 14 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 14 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 14 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 15 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 15 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 15 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 15 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 15 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 16 5 13 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 16 4 13 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 16 3 13 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 16 2 13 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 16 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 17 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 17 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 17 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 17 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 17 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 18 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 18 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 18 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 18 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 18 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 19 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 19 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 19 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 19 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 19 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 20 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 20 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 20 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 20 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 20 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 21 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 22 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 22 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 22 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 22 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 22 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 23 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 23 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 23 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 23 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 23 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 24 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 24 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 24 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 24 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 24 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 25 5 21 4 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 25 4 21 3 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 25 3 21 2 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 25 2 21 1 newcurve linetype solid marktype circle marksize 0.200 0.200 pts 25 1 jgraph/bailey.jgr0000777005471000040510000000076411447702134013141 0ustar plankloci (* Example of Unix spline(1) to smooth a curve. This is a file to draw sin(i) for i going from -pi to pi *) newgraph yaxis min -1 max 1 label : sin(i) xaxis label : i grid_lines border title : Example Unix spline(1) to interpolate points (* Plot the sin curve *) newline label : data pts include bailey.pts copycurve label : splined linetype dotted pts shell : spline < bailey.pts (* bailey.pts file: -3.1416 0.0 -1.81 -0.9715 -0.55 -0.5226 0.71 0.6518 1.97 0.9213 3.1416 0.0 *) jgraph/bailey.pts0000777005471000040510000000012011447702134013147 0ustar plankloci-3.1416 0.0 -1.81 -0.9715 -0.55 -0.5226 0.71 0.6518 1.97 0.9213 3.1416 0.0 jgraph/cube.jgr0000777005471000040510000000203211447702134012600 0ustar plankloci(* Drawing of the hypercube: Dimensions = 1.25 * 2.55 *) newgraph xaxis min 0 max 1.25 size 1.25 nodraw yaxis min -0.30 max 2.25 size 2.55 nodraw (* Legs *) newline poly pfill 0 pts 0.50 0.00 0.75 0.00 0.75 -0.20 0.50 -0.20 copycurve pts 0.75 -0.20 1.20 -0.30 1.23 -0.28 0.75 -0.10 copycurve pts 0.50 -0.20 0.05 -0.30 0.02 -0.28 0.50 -0.10 copycurve pts 0.75 -0.05 1.20 0.03 1.23 0.02 0.75 -0.13 copycurve pts 0.50 -0.05 0.05 0.03 0.02 0.02 0.50 -0.13 (* Box *) newline poly pfill 1 pts 0.00 0.00 1.00 0.00 1.00 2.00 0.00 2.00 copycurve pfill .80 pts 0.00 2.00 0.25 2.20 1.25 2.20 1.00 2.00 copycurve pfill .9 pts 1.00 2.00 1.25 2.20 1.25 0.25 1.00 0.00 newline poly pfill 0 pts 0.60 0.70 0.60 1.80 0.90 1.80 0.90 0.70 newcurve marktype box marksize .03 .08 fill 1 pts shell : awk ' BEGIN { for (i = 0.65; i < 0.90; i += 0.05) {\ for (j = 0.80; j < 1.70; j += 0.15) {\ printf("%f %f\n", i, j); } } }' jgraph/data.txt0000777005471000040510000000423111447702134012633 0ustar planklociNumber of records = 0 Time = 0 Number of records = 5000 Time = 2 Number of records = 10000 Time = 3 Number of records = 15000 Time = 4 Number of records = 20000 Time = 6 Number of records = 25000 Time = 9 Number of records = 30000 Time = 10 Number of records = 35000 Time = 11 Number of records = 40000 Time = 13 Number of records = 45000 Time = 15 Number of records = 50000 Time = 16 Number of records = 55000 Time = 18 Number of records = 60000 Time = 21 Number of records = 65000 Time = 21 Number of records = 70000 Time = 23 Number of records = 75000 Time = 26 Number of records = 80000 Time = 27 Number of records = 85000 Time = 28 Number of records = 90000 Time = 31 Number of records = 95000 Time = 32 Number of records = 100000 Time = 33 Number of records = 105000 Time = 36 Number of records = 110000 Time = 38 Number of records = 115000 Time = 38 Number of records = 120000 Time = 41 Number of records = 125000 Time = 45 Number of records = 130000 Time = 44 Number of records = 135000 Time = 46 Number of records = 140000 Time = 48 Number of records = 145000 Time = 49 Number of records = 150000 Time = 51 Number of records = 155000 Time = 52 Number of records = 160000 Time = 54 Number of records = 165000 Time = 56 Number of records = 170000 Time = 58 Number of records = 175000 Time = 61 Number of records = 180000 Time = 61 Number of records = 185000 Time = 63 Number of records = 190000 Time = 69 Number of records = 195000 Time = 66 Number of records = 200000 Time = 69 Number of records = 210000 Time = 73 Number of records = 220000 Time = 77 Number of records = 230000 Time = 78 Number of records = 240000 Time = 88 Number of records = 250000 Time = 86 Number of records = 260000 Time = 89 Number of records = 270000 Time = 94 Number of records = 280000 Time = 96 Number of records = 290000 Time = 102 Number of records = 300000 Time = 104 Number of records = 310000 Time = 106 Number of records = 320000 Time = 111 Number of records = 330000 Time = 113 Number of records = 340000 Time = 120 Number of records = 350000 Time = 122 Number of records = 360000 Time = 124 Number of records = 370000 Time = 133 Number of records = 380000 Time = 131 Number of records = 390000 Time = 134 jgraph/descrip.mms0000777005471000040510000000233111447702134013327 0ustar plankloci# VMS MMS makefile # # In the link you will get a warning because of the multiple definition # of exit(). This may be ignored; in order to get MMS completing without # trouble you will have to call MMS as follows: # $ MMS/IGNORE # .ifdef DEBUG CFLAGS=/INCLUDE=(SYS$DISK:[],SYS$SHARE:)/noopt/debug LFLAGS=/debug .else CFLAGS=/INCLUDE=(SYS$DISK:[],SYS$SHARE:) LFLAGS= .endif OBJS = draw.obj, \ edit.obj, \ jgraph.obj, \ list.obj, \ printline.obj, \ prio_list.obj, \ process.obj, \ show.obj, \ token.obj, \ exit.obj all : jgraph.exe ! done # Do not link against the shareable image VAXCRTL.EXE, or you will # miss the reference to the local exit() routine. # EXIT will be reported as being multiply defined - ignore that. jgraph.exe : $(OBJS) link $(LFLAGS) /exe=jgraph $(OBJS),sys$library:vaxcrtl/libr ### draw.obj : draw.c jgraph.h list.h prio_list.h edit.obj : edit.c jgraph.h list.h prio_list.h jgraph.obj : jgraph.c jgraph.h list.h prio_list.h list.obj : list.c list.h printline.obj : printline.c jgraph.h list.h prio_list.h prio_list.obj : prio_list.c list.h prio_list.h process.obj : process.c jgraph.h list.h prio_list.h show.obj : show.c jgraph.h list.h prio_list.h token.obj : token.c list.h exit.obj : exit.c jgraph/disk.jgr0000777005471000040510000000055111447702134012620 0ustar planklocinewgraph xaxis min 0 max 0.4 nodraw yaxis min 0 max 0.4 nodraw (* Picture of a disk: 0 0 to 0.4 0.4 *) newcurve marktype ellipse fill .5 marksize 0.4 0.2 pts 0.2 0.1 newcurve marktype box fill .5 gray .5 marksize 0.4 0.2 pts 0.2 0.2 newline pts 0.0 0.1 0.0 0.3 newline pts 0.4 0.1 0.4 0.3 newcurve marktype ellipse fill 1 marksize 0.4 0.2 pts 0.2 0.3 jgraph/draw.c0000755005471000040510000005654113207316747012300 0ustar plankloci/* draw.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/draw.c,v $ * $Revision: 8.5 $ * $Date: 2017/11/28 17:33:27 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "jgraph.h" #include #include #include #include void draw_label(); void draw_axis(); void draw_label(); void draw_curves(); void draw_curve(); void draw_mark(); void draw_arrow(); void draw_legend(); void draw_strings(); void draw_graph(); void draw_graphs(); void draw_header(); void draw_footer(); static char real_eof = EOF; float ctop(val, axis) float val; Axis axis; { if (axis->is_lg) { if (val <= 0.0) { error_header(); fprintf(stderr, "Value of %f is at negative infinity with logrhythmic %c axis\n", val, (axis->is_x) ? 'x' : 'y'); exit(1); } return (log(val) / axis->logfactor - axis->logmin) * axis->factor; } else { return (val - axis->min) * axis->factor; } } float disttop(val, axis) float val; Axis axis; { if (axis->is_lg) { return FCPI * val; } else { return (val) * axis->factor; } } float intop(val) float val; { return FCPI * val; } #define MAXIMUM(a,b) ((a > b) ? a : b) void draw_axis(a, other) Axis a, other; { char orientation; Hash h; String s; orientation = (a->is_x) ? 'x' : 'y'; setlinewidth(1.0); comment("Drawing Axis"); if (a->grid_lines) { comment("Drawing Grid lines"); gsave(); setgray(a->gr_graytype, a->gr_gray); for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) { if (h->major) { printline(h->loc, 0.0, h->loc, other->psize, orientation); } } grestore(); } if (a->mgrid_lines) { comment("Drawing Minor Grid lines"); gsave(); setgray(a->mgr_graytype, a->mgr_gray); for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) { if (!h->major) { printline(h->loc, 0.0, h->loc, other->psize, orientation); } } grestore(); } gsave(); setgray(a->graytype, a->gray); if (a->draw_axis_line) { printline(0.0, a->draw_at, a->psize, a->draw_at, orientation); } if (a->draw_hash_marks) { comment("Drawing Hash Marks"); for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) { printline(h->loc, a->draw_hash_marks_at, h->loc, a->draw_hash_marks_at + (h->size * a->hash_scale), orientation); } } if (a->draw_hash_labels) { comment("Drawing Hash Labels"); for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) { a->hl->label = s->s->label; if (a->is_x) { a->hl->x = s->s->x; } else { a->hl->y = s->s->y; } draw_label(a->hl); } } if (a->draw_axis_label) { comment("Drawing Axis Label"); draw_label(a->label); } grestore(); printf("\n"); } void draw_label(l) Label l; { if (l->label == CNULL) return; comment(l->label); print_label(l); } void set_clip(g) Graph g; { comment("Setting Clip"); printf("newpath\n"); printf(" 0 0 moveto 0 %f lineto %f %f lineto %f 0 lineto\n", g->y_axis->psize, g->x_axis->psize, g->y_axis->psize, g->x_axis->psize); printf(" closepath clip newpath\n"); } void draw_curves(g) Graph g; { Curve c; gsave(); printf("\n"); if (g->clip) set_clip(g); for(c = first(g->curves); c != nil(g->curves); c = next(c)) { draw_curve(c, g); } grestore(); printf("\n"); } void draw_curve(c, g) Curve c; Graph g; { Point p, px, py; int i, j; float this_x, this_y, last_x, last_y, x, y; gsave(); setgray(c->graytype, c->gray); if (c->clip) set_clip(g); if (first(c->xepts) != nil(c->xepts) || first(c->yepts) != nil(c->yepts)) { comment("Drawing Epts"); px = first(c->xepts); py = first(c->yepts); setlinewidth(c->linethick); setlinestyle('s', (Flist)0); for (p = first(c->pts); p != nil(c->pts); p = next(p)) { if (p->e == 'x') { x = ctop(p->x, g->x_axis); y = ctop(p->y, g->y_axis); print_ebar(x, y, ctop(px->x, g->x_axis), c->marksize[1]/2.0, 'x'); px = next(px); print_ebar(x, y, ctop(px->x, g->x_axis), c->marksize[1]/2.0, 'x'); px = next(px); } else if (p->e == 'y') { x = ctop(p->x, g->x_axis); y = ctop(p->y, g->y_axis); print_ebar(y, x, ctop(py->y, g->y_axis), c->marksize[0]/2.0, 'y'); py = next(py); print_ebar(y, x, ctop(py->y, g->y_axis), c->marksize[0]/2.0, 'y'); py = next(py); } } } comment("Drawing Curve"); if (c->linetype != '0' || c->poly) { if (c->bezier) { i = 0; j = 0; if (c->poly) printf("newpath "); for (p = first(c->pts); p != nil(c->pts); p = next(p)) { if (j == 0 && i == 0) { start_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis), c); j++; } else if (i != 0) { bezier_control(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis)); } else { bezier_end(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis)); j++; } if (!c->poly && j == 30 && i == 0) { end_line(); p = prev(p); j = 0; i = 0; } else i = (i + 1) % 3; } if (j != 0) { if (c->poly) { printf("closepath "); setfill(0.0, 0.0, c->pfilltype, c->pfill, c->ppattern, c->pparg); } end_line(); } } else { i = 0; if (c->poly) printf("newpath "); for (p = first(c->pts); p != nil(c->pts); p = next(p)) { if (i == 0) { start_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis), c); } else { cont_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis)); } if (!c->poly && i == 100 && next(p)) { end_line(); p = prev(p); i = 0; } else i++; } if (i != 0) { if (c->poly) { printf("closepath "); setfill(0.0, 0.0, c->pfilltype, c->pfill, c->ppattern, c->pparg); } end_line(); } } } comment("Drawing Curve points"); i = 0; for (p = first(c->pts); p != nil(c->pts); p = next(p)) { this_x = ctop(p->x, g->x_axis); this_y = ctop(p->y, g->y_axis); if (!c->bezier || i == 0) draw_mark(this_x, this_y, c, g); if (p != first(c->pts)) { if (c->rarrows || (c->rarrow && p == last(c->pts))) { if (!c->bezier || i == 0) draw_arrow(this_x, this_y, last_x, last_y, c); } if (c->larrows || (c->larrow && prev(p) == first(c->pts))) { if (!c->bezier || i == 1) draw_arrow(last_x, last_y, this_x, this_y, c); } } last_x = this_x; last_y = this_y; i = (i + 1) % 3; } grestore(); printf("\n"); } void draw_mark(x, y, c, g) float x, y; Curve c; Graph g; { Point p; float ms0, ms1, scx, scy, trx, try; int i, j; FILE *f; char ch; int done; char inp[1000]; int bb[4]; if (c->marktype == 'n') return; ms0 = c->marksize[0] / 2.0; ms1 = c->marksize[1] / 2.0; gsave(); printf(" %f %f translate %f rotate\n", x, y, c->mrotate); switch (c->marktype) { case 'n': break; case 'E': if (c->eps == CNULL) break; f = fopen(c->eps, "r"); if (f == NULL) { fprintf(stderr, "Error: eps file %s couldn't be opened\n", c->eps); exit(1); } /* Get bbox */ done = 0; while (!done && fgets(inp, 1000, f) != NULL) { if (strncmp("%%BoundingBox:", inp, 14) == 0) done = 1; } if (!done) { fprintf(stderr, "Error: Eps file '%s' has %s\n", c->eps, "no bounding box"); exit(1); } if (sscanf(inp+14, "%d %d %d %d", bb, bb+1, bb+2, bb+3) != 4) { fprintf(stderr, "Error: Eps file '%s': bad bounding box.\n", c->eps); exit(1); } if (bb[2] - bb[0] == 0) { scx = ms0; trx = 0.0; } else { scx = ms0 * 2.0/(float)(bb[2] - bb[0]); trx = -(float)(bb[2] - bb[0])/2.0 - bb[0]; } if (bb[3] - bb[1] == 0) { scy = ms1; try = 0.0; } else { scy = ms1 * 2.0/(float)(bb[3] - bb[1]); try = -(float)(bb[3] - bb[1])/2.0 - bb[1]; } /* Don't scale if ms == 0 0 */ if (ms0 == 0.0 && ms1 == 0.0) { scx = 1.0; scy = 1.0; } sprintf(inp, "Including eps file %s", c->eps); comment(inp); /* Use bbox to scale and translate */ printf("%f %f scale %f %f translate\n", scx, scy, trx, try); /* Include the rest of the file */ for (ch = getc(f); ch != real_eof; ch = getc(f)) putchar(ch); putchar('\n'); fclose(f); break; case 'p': if (c->postscript == CNULL) break; if (ms0 != 0.0 || ms1 != 0.0) { printf("%f %f scale\n", ms0, ms1); } if (!c->postfile) { printf("%s\n", c->postscript); } else { f = fopen(c->postscript, "r"); if (f == NULL) { fprintf(stderr, "Error: postscript file %s couldn't be opened\n", c->postscript); exit(1); } for (ch = getc(f); ch != real_eof; ch = getc(f)) putchar(ch); putchar('\n'); fclose(f); } break; case 'c': printline(-ms0, 0.0, ms0, 0.0, 'x'); printline(-ms1, 0.0, ms1, 0.0, 'y'); break; case 'b': start_poly(-ms0, -ms1); cont_poly(ms0, -ms1); cont_poly(ms0, ms1); cont_poly(-ms0, ms1); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'd': start_poly(-ms0, 0.0); cont_poly(0.0, -ms1); cont_poly(ms0, 0.0); cont_poly(0.0, ms1); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'g': p = first(c->general_marks); if (p == nil(c->general_marks)) break; if (next(p) == nil(c->general_marks)) break; start_poly(p->x*ms0, p->y*ms1); for(p = next(p); p != nil(c->general_marks); p = next(p)) cont_poly(p->x*ms0, p->y*ms1); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'G': i = 0; for (p = first(c->general_marks); p != nil(c->general_marks); p = next(p)) { if (i == 0) { printf("%f %f moveto ", p->x*ms0, p->y*ms1); } else { printf("%f %f lineto\n", p->x*ms0, p->y*ms1); } if (i == 100) { printf("stroke\n"); p = prev(p); i = 0; } else i++; } if (i != 0) printf("stroke\n"); break; case 'B': i = 0; j = 0; for (p = first(c->general_marks); p != nil(c->general_marks); p = next(p)) { if (j == 0 && i == 0) { printf("%f %f moveto ", p->x*ms0, p->y*ms1); j++; } else if (i != 0) { printf("%f %f ", p->x*ms0, p->y*ms1); } else { printf("%f %f curveto\n", p->x*ms0, p->y*ms1); j++; } if (j == 30 && i == 0) { printf(" stroke\n"); p = prev(p); j = 0; i = 0; } else i = (i + 1) % 3; } if (j != 0) printf(" stroke\n"); if (! ((i == 1) || (i == 0 && j == 0))) { fprintf(stderr, "Error: curve %d, %s\n", c->num, "wrong number of points for bezier marktype\n"); exit(1); } break; case 'Z': i = 0; j = 0; for (p = first(c->general_marks); p != nil(c->general_marks); p = next(p)) { if (i == 0 && j == 0) { printf("newpath %f %f moveto ", p->x*ms0, p->y*ms1); j++; } else if (i != 0) { printf("%f %f ", p->x*ms0, p->y*ms1); } else { printf("%f %f curveto\n", p->x*ms0, p->y*ms1); } i = (i + 1) % 3; } printf("closepath "); setfill(x, y, c->filltype, c->fill, c->pattern, c->parg); printf("stroke\n"); if (i != 1) { fprintf(stderr, "Error: curve %d, %s\n", c->num, "wrong number of points for bezier marktype\n"); exit(1); } break; case 'x': printline(-ms0, -ms1, ms0, ms1, 'x'); printline(-ms0, ms1, ms0, -ms1, 'x'); break; case 'o': printellipse(x, y, ms0, ms0, c->filltype, c->fill, c->pattern, c->parg); break; case 'e': printellipse(x, y, ms0, ms1, c->filltype, c->fill, c->pattern, c->parg); break; case 't': start_poly(ms0, -ms1); cont_poly(0.0, ms1); cont_poly(-ms0, -ms1); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'X': start_poly(ms0, 0.0); cont_poly(-ms0, 0.0); cont_poly(-ms0, g->x_axis->draw_at - y); cont_poly(ms0, g->x_axis->draw_at - y); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'Y': start_poly(0.0, ms1); cont_poly(0.0, -ms1); cont_poly(g->y_axis->draw_at - x, -ms1); cont_poly(g->y_axis->draw_at - x, ms1); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'l': draw_label(c->lmark); break; default: error_header(); fprintf(stderr, "Unknown mark: %c\n", c->marktype); break; } grestore(); } void draw_arrow(x1, y1, x2, y2, c) float x1, y1, x2, y2; Curve c; { float dx, dy; float ms0; float theta, ct, st; if (c->marktype == 'o') { dx = x1 - x2; dy = y1 - y2; if (dx == 0.0 && dy == 0.0) return; ms0 = c->marksize[0] / 2.0; if (dx == 0.0) theta = asin(1.0); else theta = atan(dy/dx); if (theta < 0.0) theta = -theta; ct = cos(theta)*ms0; st = sin(theta)*ms0; x1 = x1 + ct*(dx > 0.0 ? -1.0 : 1.0); y1 = y1 + st*(dy > 0.0 ? -1.0 : 1.0); if ( ((x1 - x2 > 0) != (dx > 0)) || ((y1 - y2 > 0) != (dy > 0)) ) return; } dx = x1 - x2; dy = y1 - y2; if (dx == 0.0 && dy == 0.0) return; gsave(); printf("%f %f translate %f %f atan rotate\n", x1, y1, dy, dx); start_poly(0.0, 0.0); cont_poly(-(c->asize[0]), (c->asize[1])); cont_poly(-(c->asize[0]), -(c->asize[1])); end_poly(0.0, 0.0, c->afilltype, c->afill, c->apattern, c->aparg); grestore(); printf("\n"); } void draw_legend(g) Graph g; { Curve c; Legend l; float x, y; char tmpmktype; l = g->legend; comment("Drawing legend"); if (l->type == 'n' || l->anylines < 0) return; gsave(); if (l->type == 'u') { printf("%f %f translate %f rotate\n", l->l->x, l->l->y, l->l->rotate); } for (c = first(g->curves); c != nil(g->curves); c = next(c)) { if (c->l->label != CNULL) { gsave(); setgray(c->graytype, c->gray); y = (c->l->ymax + c->l->ymin) / 2.0; if (l->anylines) { if (c->linetype != '0' && l->linelength != 0) { if (l->type == 'c' && c->l->hj == 'r') { x = c->l->x + l->midspace; } else { x = c->l->x - l->midspace - l->linelength; } start_line(x, y, c); cont_line(x+l->linelength, y); end_line(); } tmpmktype = c->marktype; c->marktype = 'n'; if (c->larrows || c->larrow) draw_arrow(x, y, x+l->linelength, y, c); if (c->rarrows || c->rarrow) draw_arrow(x+l->linelength, y, x, y, c); c->marktype = tmpmktype; if (l->type == 'c' && c->l->hj == 'r') { x = c->l->x + l->midspace + l->linelength / 2.0; } else { x = c->l->x - l->midspace - l->linelength / 2.0; } } else if (l->type == 'c' && c->l->hj == 'r') { x = c->l->x + l->midspace; } else { x = c->l->x - l->midspace; } if (c->marktype == 'X' || c->marktype == 'Y') { char old; old = c->marktype; c->marktype = 'b'; draw_mark(x, y, c, g); c->marktype = old; } else { draw_mark(x, y, c, g); } grestore(); printf("\n"); draw_label(c->l); } } grestore(); printf("\n"); } void draw_strings(g) Graph g; { String s; comment("Drawing strings"); for (s = first(g->strings); s != nil(g->strings); s = next(s)) draw_label(s->s); } void draw_graph(g) Graph g; { comment("Drawing New Graph"); printf("%f %f translate\n", g->x_translate, g->y_translate); if (g->border) { printline(0.0, 0.0, 0.0, g->y_axis->psize, 'x'); printline(0.0, 0.0, 0.0, g->x_axis->psize, 'y'); printline(g->x_axis->psize, 0.0, g->x_axis->psize, g->y_axis->psize, 'x'); printline(g->y_axis->psize, 0.0, g->y_axis->psize, g->x_axis->psize, 'y'); } draw_axis(g->x_axis, g->y_axis); draw_axis(g->y_axis, g->x_axis); draw_label(g->title); draw_curves(g); draw_legend(g); draw_strings(g); printf("%f %f translate\n", - g->x_translate, - g->y_translate); } void draw_graphs(gs, pp, landscape) Graphs gs; int pp; int landscape; { Graphs gs_p; Graph g; for (gs_p = first(gs); gs_p != nil(gs); gs_p = next(gs_p)) { draw_header(gs_p, pp, landscape); for (g = first(gs_p->g); g != nil(gs_p->g); g = next(g)) { draw_graph(g); } draw_footer(gs_p, pp); } } void draw_header(gs, pp, landscape) Graphs gs; int pp; int landscape; { FILE *f; char c; if (gs->page == 1) printf("%%!PS-Adobe-2.0 EPSF-1.2\n"); printf("%%%%Page: %d %d\n", gs->page, gs->page); if (landscape) { printf("%%%%BoundingBox: %d %d %d %d\n", gs->bb[1], gs->bb[0], gs->bb[3], gs->bb[2]); } else { printf("%%%%BoundingBox: %d %d %d %d\n", gs->bb[0], gs->bb[1], gs->bb[2], gs->bb[3]); } printf("%%%%EndComments\n"); if (landscape) { printf("-90 rotate\n"); } if (pp) { if (landscape) { printf("%f 0 translate\n", -(11.0 * FCPI)); printf("%f %f translate\n", (((11.0 * FCPI) - (gs->bb[2] - gs->bb[0])) / 2.0) - gs->bb[0], (((8.5 * FCPI) - (gs->bb[3] - gs->bb[1])) / 2.0) - gs->bb[1]); } else { printf("%f %f translate\n", (((8.5 * FCPI) - (gs->bb[2] - gs->bb[0])) / 2.0) - gs->bb[0], (((11.0 * FCPI) - (gs->bb[3] - gs->bb[1])) / 2.0) - gs->bb[1]); } } else if (landscape) { printf("%f 0 translate\n", (double) (-gs->bb[2] - gs->bb[0])); } printf("1 setlinecap 1 setlinejoin\n"); printf("0.700 setlinewidth\n"); printf("0.00 setgray\n"); printf("\n"); printf("/Jrnd { exch cvi exch cvi dup 3 1 roll idiv mul } def\n"); printf("/JDEdict 8 dict def\n"); printf("JDEdict /mtrx matrix put\n"); printf("/JDE {\n"); printf(" JDEdict begin\n"); printf(" /yrad exch def\n"); printf(" /xrad exch def\n"); printf(" /savematrix mtrx currentmatrix def\n"); printf(" xrad yrad scale\n"); printf(" 0 0 1 0 360 arc\n"); printf(" savematrix setmatrix\n"); printf(" end\n"); printf("} def\n"); printf("/JSTR {\n"); printf(" gsave 1 eq { gsave 1 setgray fill grestore } if\n"); printf(" exch neg exch neg translate \n"); printf(" clip \n"); printf(" rotate \n"); printf(" 4 dict begin\n"); printf(" pathbbox /&top exch def\n"); printf(" /&right exch def\n"); printf(" /&bottom exch def\n"); printf(" &right sub /&width exch def\n"); printf(" newpath\n"); printf(" currentlinewidth mul round dup \n"); printf(" &bottom exch Jrnd exch &top \n"); printf(" 4 -1 roll currentlinewidth mul setlinewidth \n"); printf(" { &right exch moveto &width 0 rlineto stroke } for \n"); printf(" end\n"); printf(" grestore\n"); printf(" newpath\n"); printf("} bind def\n"); gsave(); setfont("Times-Roman", 9.00); if (gs->preamble != CNULL) { if (gs->prefile) { f = fopen(gs->preamble, "r"); if (f == NULL) { fprintf(stderr, "Error: preamble file %s couldn't be opened\n", gs->preamble); exit(1); } for (c = getc(f); c != real_eof; c = getc(f)) putchar(c); putchar('\n'); fclose(f); } else { printf("%s\n", gs->preamble); } } } void draw_footer(gs, pp) Graphs gs; int pp; { FILE *f; char c; if (gs->epilogue != CNULL) { if (gs->epifile) { f = fopen(gs->epilogue, "r"); if (f == NULL) { fprintf(stderr, "Error: epilogue file %s couldn't be opened\n", gs->epilogue); exit(1); } for (c = getc(f); c != real_eof; c = getc(f)) putchar(c); putchar('\n'); fclose(f); } else { printf("%s\n", gs->epilogue); } } grestore(); if (pp) printf("showpage\n"); else printf("\n"); } jgraph/ebars.jgr0000777005471000040510000000113511447702134012761 0ustar plankloci(* This graph shows the use of y_epts to get error bars onto the graph. It plots the curve y = 2x plus or minus x/2 for integer x values from from 1 to 10 *) newgraph xaxis min 0 max 10 label : x yaxis min 0 max 25 label : y = 2x +- x/2 newcurve marktype circle linetype dotted (* These points could equally be generated by: y_epts shell : echo "" |\ awk '{ for (i = 1; i < 11; i++) print i, 2*i, 2*i-i/2.0, 2*i+i/2.0}' *) y_epts 1 2 1.5 2.5 2 4 3 5 3 6 4.5 7.5 4 8 6 10 5 10 7.5 12.5 6 12 9 15 7 14 10.5 17.5 8 16 12 20 9 18 13.5 22.5 10 20 15 25 jgraph/edit.c0000755005471000040510000010744113207316747012264 0ustar plankloci/* edit.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/edit.c,v $ * $Revision: 8.5 $ * $Date: 2017/11/28 17:33:27 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "jgraph.h" #define MAX(a,b) ((a > b) ? a : b) #define MIN(a,b) ((a < b) ? a : b) void edit_label(); void copy_curve(); void copy_label(); void copy_axis(); void copy_legend(); void inherit_axes(); void getpattern(); void edit_curve(); void edit_hash_label(); void edit_axis(); void edit_legend(); void edit_graph(); void edit_graphs(); void edit_label(l) Label l; { char *txt, inp_str[80]; float f; int i; while ( getstring(inp_str) ) { if (strcmp(inp_str, ":") == 0) { if ((txt = getlabel()) == CNULL) return; l->label = txt; } else if (strcmp(inp_str, "x") == 0) { if (!getfloat(&f)) rejecttoken(); else l->x = f; } else if (strcmp(inp_str, "y") == 0) { if (!getfloat(&f)) rejecttoken(); else l->y = f; } else if (strcmp(inp_str, "fontsize") == 0) { if (!getfloat(&f)) rejecttoken(); else l->fontsize = f; } else if (strcmp(inp_str, "linesep") == 0) { if (!getfloat(&f)) rejecttoken(); else l->linesep = f; } else if (strcmp(inp_str, "hjl") == 0) { l->hj = 'l'; } else if (strcmp(inp_str, "hjc") == 0) { l->hj = 'c'; } else if (strcmp(inp_str, "hjr") == 0) { l->hj = 'r'; } else if (strcmp(inp_str, "vjc") == 0) { l->vj = 'c'; } else if (strcmp(inp_str, "vjt") == 0) { l->vj = 't'; } else if (strcmp(inp_str, "vjb") == 0) { l->vj = 'b'; } else if (strcmp(inp_str, "font") == 0) { if (!getstring(inp_str)) return; txt = (char *) malloc (sizeof(char)*strlen(inp_str)+2); strcpy(txt, inp_str); l->font = txt; } else if (strcmp(inp_str, "rotate") == 0) { if (!getfloat(&f)) rejecttoken(); else l->rotate = f; } else if (strcmp(inp_str, "lgray") == 0) { if (!getfloat(&f)) rejecttoken(); else { l->graytype = 'g'; l->gray[0] = f; } } else if (strcmp(inp_str, "lcolor") == 0) { l->graytype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); l->graytype = 'n'; break ; } else l->gray[i] = f ; } } else { rejecttoken(); return; } } } void copy_curve(c1, c2) /* Copies curve c2 to c1 */ Curve c1, c2; { Flist f, newf; Point p, newp; copy_label(c1->l, c2->l); copy_label(c1->lmark, c2->lmark); c1->l->label = CNULL; c1->clip = c2->clip; for (f = first(c2->gen_linetype); f != nil(c2->gen_linetype); f = next(f)) { newf = (Flist) get_node((List) c1->gen_linetype); newf->f = f->f; insert((List) newf, (List) c1->gen_linetype); } c1->pattern = c2->pattern; c1->apattern = c2->apattern; c1->ppattern = c2->ppattern; c1->parg = c2->parg; c1->aparg = c2->aparg; c1->pparg = c2->pparg; c1->marktype = c2->marktype; c1->linetype = c2->linetype; c1->linethick = c2->linethick; c1->marksize[0] = c2->marksize[0]; c1->marksize[1] = c2->marksize[1]; c1->mrotate = c2->mrotate; for (p = first(c2->general_marks); p != nil(c2->general_marks); p = next(p)) { newp = (Point) get_node((List) c1->general_marks); newp->x = p->x; newp->y = p->y; insert((List) newp, (List) c1->general_marks); } c1->graytype = c2->graytype; c1->gray[0] = c2->gray[0]; c1->gray[1] = c2->gray[1]; c1->gray[2] = c2->gray[2]; c1->filltype = c2->filltype; c1->fill[0] = c2->fill[0]; c1->fill[1] = c2->fill[1]; c1->fill[2] = c2->fill[2]; c1->poly = c2->poly; c1->pfilltype = c2->pfilltype; c1->pfill[0] = c2->pfill[0]; c1->pfill[1] = c2->pfill[1]; c1->pfill[2] = c2->pfill[2]; c1->afilltype = c2->afilltype; c1->afill[0] = c2->afill[0]; c1->afill[1] = c2->afill[1]; c1->afill[2] = c2->afill[2]; c1->postscript = c2->postscript; c1->postfile = c2->postfile; c1->eps = c2->eps; c1->rarrow = c2->rarrow; c1->larrow = c2->larrow; c1->rarrows = c2->rarrows; c1->larrows = c2->larrows; c1->asize[0] = c2->asize[0]; c1->asize[1] = c2->asize[1]; c1->bezier = c2->bezier; } void copy_label(l1, l2) /* Copies label l2 to l1 */ Label l1, l2; { l1->label = l2->label; l1->x = l2->x; l1->y = l2->y; l1->rotate = l2->rotate; l1->font = l2->font; l1->fontsize = l2->fontsize; l1->hj = l2->hj; l1->vj = l2->vj; l1->graytype = l2->graytype; l1->gray[0] = l2->gray[0]; l1->gray[1] = l2->gray[1]; l1->gray[2] = l2->gray[2]; l1->linesep = l2->linesep; } void copy_axis(a1, a2) /* Copies axis a2 to a1 */ Axis a1, a2; { copy_label(a1->label, a2->label); copy_label(a1->hl, a2->hl); a1->max = a2->max; a1->min = a2->min; a1->pmax = a2->pmax; a1->pmin = a2->pmin; a1->size = a2->size; a1->hash_interval = a2->hash_interval; a1->hash_start = a2->hash_start; a1->log_base = a2->log_base; a1->draw_hash_marks_at = a2->draw_hash_marks_at; a1->draw_hash_labels_at = a2->draw_hash_labels_at; a1->draw_at = a2->draw_at; a1->draw_hash_labels = a2->draw_hash_labels; a1->draw_axis_line = a2->draw_axis_line; a1->draw_hash_marks = a2->draw_hash_marks; a1->draw_axis_label = a2->draw_axis_label; a1->auto_hash_labels = a2->auto_hash_labels; a1->auto_hash_marks = a2->auto_hash_marks; a1->minor_hashes = a2->minor_hashes; a1->hash_scale = a2->hash_scale; a1->hash_format = a2->hash_format; a1->graytype = a2->graytype; a1->gray[0] = a2->gray[0]; a1->gray[1] = a2->gray[1]; a1->gray[2] = a2->gray[2]; a1->mgr_graytype = a2->mgr_graytype; a1->mgr_gray[0] = a2->mgr_gray[0]; a1->mgr_gray[1] = a2->mgr_gray[1]; a1->mgr_gray[2] = a2->mgr_gray[2]; a1->gr_graytype = a2->gr_graytype; a1->gr_gray[0] = a2->gr_gray[0]; a1->gr_gray[1] = a2->gr_gray[1]; a1->gr_gray[2] = a2->gr_gray[2]; a1->grid_lines = a2->grid_lines; a1->mgrid_lines = a2->mgrid_lines; a1->precision = a2->precision; a1->start_given = a2->start_given; a1->is_lg = a2->is_lg; a1->is_x = a2->is_x; } Curve do_copy_curve(g, gs, all_gs) Graph g; Graphs gs; Graphs all_gs; { Curve lastc, newc; Graph oldg; Graphs oldgs; int num; if (!getint(&num)) { rejecttoken(); oldg = g; oldgs = gs; while(gs != nil(all_gs)) { if (gs != oldgs) g = last(gs->g); while(g != nil(gs->g)) { if (first(g->curves) == nil(g->curves)) g = prev(g); else { lastc = last(g->curves); if (first(oldg->curves) == nil(oldg->curves)) newc = new_curve(oldg->curves, 0); else newc = new_curve(oldg->curves, last(oldg->curves)->num + 1); copy_curve(newc, lastc); return newc; } } gs = prev(gs); } error_header(); fprintf(stderr, "Cannot perform copycurve on first curve\n"); exit(1); } else { if (first(g->curves) == nil(g->curves)) newc = new_curve(g->curves, 0); else newc = new_curve(g->curves, last(g->curves)->num + 1); lastc = g->curves; while(1) { lastc = prev(lastc); if (lastc == nil(g->curves) || lastc->num < num) { error_header(); fprintf(stderr, "copycurve: curve #%d not found\n", num); exit(1); } if (lastc->num == num) { copy_curve(newc, lastc); return newc; } } } return newc; /* To shut lint up */ } Label do_copy_string(g, gs, all_gs) Graph g; Graphs gs; Graphs all_gs; { String lastl, newl; Graph oldg; Graphs oldgs; int num; if (!getint(&num)) { rejecttoken(); oldgs = gs; oldg = g; while(gs != nil(all_gs)) { if (gs != oldgs) g = last(gs->g); while(g != nil(gs->g)) { if (first(g->strings) == nil(g->strings)) g = prev(g); else { lastl = last(g->strings); if (first(oldg->strings) == nil(oldg->strings)) newl = new_string(oldg->strings, 0); else newl = new_string(oldg->strings, last(oldg->strings)->num + 1); copy_label(newl->s, lastl->s); return newl->s; } } gs = prev(gs); } error_header(); fprintf(stderr, "Cannot perform copystring on first string\n"); exit(1); return newl->s; /* To shut lint up */ } else { if (first(g->strings) == nil(g->strings)) newl = new_string(g->strings, 0); else newl = new_string(g->strings, last(g->strings)->num + 1); lastl = g->strings; while(1) { lastl = prev(lastl); if (lastl == nil(g->strings) || lastl->num < num) { error_header(); fprintf(stderr, "copystring: string #%d not found\n", num); exit(1); } if (lastl->num == num) { copy_label(newl->s, lastl->s); return newl->s; } } } } Graph last_graph(g, gs, all_gs) Graph g; Graphs gs; Graphs all_gs; { Graph lastg; lastg = prev(g); while(lastg == nil(gs->g)) { if (prev(gs) == nil(all_gs)) { error_header(); fprintf(stderr, "First graph cannot inherit axes\n"); exit(1); } else { gs = prev(gs); lastg = last(gs->g); } } return lastg; } void copy_legend(l1, l2) Legend l1, l2; { l1->linelength = l2->linelength; l1->linebreak = l2->linebreak; l1->midspace = l2->midspace; l1->type = l2->type; copy_label(l1->l, l2->l); } void inherit_axes(g, lastg) Graph g; Graph lastg; { char *s; copy_axis(g->x_axis, lastg->x_axis); copy_axis(g->y_axis, lastg->y_axis); g->x_translate = lastg->x_translate; g->y_translate = lastg->y_translate; g->clip = lastg->clip; g->border = lastg->border; copy_legend(g->legend, lastg->legend); s = g->title->label; copy_label(g->title, lastg->title); g->title->label = s; } void getpattern(inp_str, key, p, a) char *inp_str, *key, *p; float *a; { int i; float f; if (!getstring(inp_str)) return; for (i = 0; i < NPATTERNS; i++) { if (strcmp(inp_str, PATTERNS[i]) == 0) { *p = PTYPES[i]; if (getfloat(&f)) { *a = f; } else { rejecttoken(); } i = NPATTERNS + 1; } } if (i == NPATTERNS) { error_header(); fprintf(stderr, "Bad %s: %s\n", key, inp_str); error_header(); fprintf(stderr, " Valid %ss are:", key); for (i = 0; i < NPATTERNS; i++) fprintf(stderr, " %s", PATTERNS[i]); fprintf(stderr, "\n"); exit(1); } return; } void edit_curve(c, g) Curve c; Graph g; { char inp_str[256], *txt; float x, y, f, e1, e2; float xh, yh, xl, yl; Point p, p1, p2; Flist fl; FILE *fi; int i; char e; while ( getstring(inp_str) ) { if (strcmp(inp_str, "y_epts") == 0 || strcmp(inp_str, "pts") == 0 || strcmp(inp_str, "x_epts") == 0) { e = inp_str[0]; while (getfloat(&x)) { if (e == 'p') { if (!getfloat(&y)) { error_header(); fprintf(stderr, "Reading Points, no y value for x=%f\n", x); exit(1); } } else { if (!getfloat(&y) || !getfloat(&e1) || !getfloat(&e2)) { error_header(); fprintf(stderr, "Reading %s, need 4 values per data point\n", inp_str); exit(1); } } p = (Point) get_node((List) c->pts); p->x = x; p->y = y; p->e = e; insert((List) p, (List) c->pts); c->npts++; if (e == 'x') { p1 = (Point) get_node((List) c->xepts); p1->x = e1; p1->y = y; p2 = (Point) get_node((List) c->xepts); p2->x = e2; p2->y = y; insert((List) p1, (List) c->xepts); insert((List) p2, (List) c->xepts); xh = MAX(e1, e2); xh = MAX(xh, x); xl = MIN(e1, e2); xl = MIN(xl, x); yh = y; yl = y; } else if (e == 'y') { p1 = (Point) get_node((List) c->yepts); p1->y = e1; p1->x = x; p2 = (Point) get_node((List) c->yepts); p2->y = e2; p2->x = x; insert((List) p1, (List) c->yepts); insert((List) p2, (List) c->yepts); yh = MAX(e1, e2); yh = MAX(yh, y); yl = MIN(e1, e2); yl = MIN(yl, y); xh = x; xl = x; } else { xh = x; xl = x; yh = y; yl = y; } if (g->x_axis->pmax == FSIG) { g->x_axis->pmax = xh; g->x_axis->pmin = xl; g->y_axis->pmax = yh; g->y_axis->pmin = yl; } else { g->x_axis->pmax = MAX(g->x_axis->pmax, xh); g->x_axis->pmin = MIN(g->x_axis->pmin, xl); g->y_axis->pmax = MAX(g->y_axis->pmax, yh); g->y_axis->pmin = MIN(g->y_axis->pmin, yl); } } rejecttoken(); } else if (strcmp(inp_str, "label") == 0) { edit_label(c->l); } else if (strcmp(inp_str, "marksize") == 0) { if (!getfloat(&f)) rejecttoken(); else { c->marksize[0] = f; if (!getfloat(&f)) rejecttoken(); else c->marksize[1] = f; } } else if (strcmp(inp_str, "gmarks") == 0) { while (getfloat(&x)) { if (!getfloat(&y)) { error_header(); fprintf(stderr, "Reading GMarks, no y value for x=%f\n", x); exit(1); } p = (Point) get_node((List) c->general_marks); p->x = x; p->y = y; insert((List) p, (List) c->general_marks); } rejecttoken(); } else if (strcmp(inp_str, "pfill") == 0) { if (!getfloat(&f)) rejecttoken(); else { /* grey fill */ c->pfilltype = 'g'; c->pfill[0] = f; } } else if (strcmp(inp_str, "pcfill") == 0) { /* color fill */ c->pfilltype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); c->pfilltype = 'n'; break ; } else c->pfill[i] = f ; } } else if (strcmp(inp_str, "fill") == 0) { if (!getfloat(&f)) rejecttoken(); else { /* grey fill */ c->filltype = 'g'; c->fill[0] = f; } } else if (strcmp(inp_str, "cfill") == 0) { /* color fill */ c->filltype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); c->filltype = 'n'; break ; } else c->fill[i] = f ; } } else if (strcmp(inp_str, "afill") == 0) { if (!getfloat(&f)) rejecttoken(); else { c->afilltype = 'g'; c->afill[0] = f; } } else if (strcmp(inp_str, "acfill") == 0) { c->afilltype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); c->afilltype = 'n'; break ; } else c->afill[i] = f ; } } else if (strcmp(inp_str, "marktype") == 0) { if (!getstring(inp_str)) return; for (i = 0; i < NMARKTYPES && strcmp(inp_str, MARKTYPESTRS[i]) != 0; i++) ; if (i == NMARKTYPES) { error_header(); fprintf(stderr, "Bad mark: %s\n", inp_str); fprintf(stderr, " Valid marks are:"); for (i = 0; i < NMARKTYPES; i++) { fprintf(stderr, " %s", MARKTYPESTRS[i]); } fprintf(stderr, "\n"); exit(1); } else { c->marktype = MARKTYPES[i]; if (c->marktype == 'l') edit_label(c->lmark); } } else if (strcmp(inp_str, "glines") == 0) { while (getfloat(&f)) { fl = (Flist) get_node((List) c->gen_linetype); fl->f = f; insert((List) fl, (List) c->gen_linetype); } rejecttoken(); } else if (strcmp(inp_str, "pattern") == 0) { getpattern(inp_str, "pattern", &(c->pattern), &(c->parg)); } else if (strcmp(inp_str, "apattern") == 0) { getpattern(inp_str, "apattern", &(c->apattern), &(c->aparg)); } else if (strcmp(inp_str, "ppattern") == 0) { getpattern(inp_str, "ppattern", &(c->ppattern), &(c->pparg)); } else if (strcmp(inp_str, "linetype") == 0) { if (!getstring(inp_str)) return; if (strcmp(inp_str, "none") == 0) c->linetype = '0'; else if (strcmp(inp_str, "solid") == 0) c->linetype = 's'; else if (strcmp(inp_str, "dotted") == 0) c->linetype = '.'; else if (strcmp(inp_str, "dashed") == 0) c->linetype = '-'; else if (strcmp(inp_str, "longdash") == 0) c->linetype = 'l'; else if (strcmp(inp_str, "dotdash") == 0) c->linetype = 'd'; else if (strcmp(inp_str, "dotdotdash") == 0) c->linetype = 'D'; else if (strcmp(inp_str, "dotdotdashdash") == 0) c->linetype = '2'; else if (strcmp(inp_str, "general") == 0) c->linetype = 'g'; else { error_header(); fprintf(stderr, "Bad line type: %s\n", inp_str); error_header(); fprintf(stderr, " Valid marks are %s\n", "solid, dotted, dashed, longdash, dotdash,"); error_header(); fprintf(stderr, " %s.\n", "dotdotdash, dotdotdashdash, none"); exit(1); } } else if (strcmp(inp_str, "linethickness") == 0) { if (!getfloat(&f)) rejecttoken(); else c->linethick = f; } else if (strcmp(inp_str, "gray") == 0) { if (!getfloat(&f)) rejecttoken(); else { c->graytype = 'g'; c->gray[0] = f; } } else if (strcmp(inp_str, "color") == 0) { c->graytype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); c->graytype = 'n'; break ; } else c->gray[i] = f ; } } else if (strcmp(inp_str, "mrotate") == 0) { if (!getfloat(&f)) rejecttoken(); else { c->mrotate = f; } } else if (strcmp(inp_str, "eps") == 0) { if (!getstring(inp_str)) { error_header(); fprintf(stderr, "eps token must be followed by an %s\n", "encapsulated postscript file\n"); exit(1); } c->marktype = 'E'; c->eps = (char *) malloc ((strlen(inp_str)+1)*sizeof(char)); strcpy(c->eps, inp_str); fi = fopen(c->eps, "r"); if (fi == NULL) { error_header(); fprintf(stderr, "couldn't open eps file '%s'\n", c->eps); exit(1); } fclose(fi); } else if (strcmp(inp_str, "postscript") == 0) { if (!getstring(inp_str)) return; c->marktype = 'p'; if (strcmp(inp_str, ":") == 0) { c->postfile = 0; if ((txt = getmultiline()) == CNULL) return; c->postscript = txt; } else { c->postfile = 1; c->postscript = (char *) malloc ((strlen(inp_str)+1)*sizeof(char)); strcpy(c->postscript, inp_str); fi = fopen(c->postscript, "r"); if (fi == NULL) { error_header(); fprintf(stderr, "couldn't open postscript file '%s'\n", c->postscript); exit(1); } fclose(fi); } } else if (strcmp(inp_str, "poly") == 0) { c->poly = 1; } else if (strcmp(inp_str, "nopoly") == 0) { c->poly = 0; } else if (strcmp(inp_str, "larrow") == 0) { c->larrow = 1; } else if (strcmp(inp_str, "nolarrow") == 0) { c->larrow = 0; } else if (strcmp(inp_str, "rarrow") == 0) { c->rarrow = 1; } else if (strcmp(inp_str, "norarrow") == 0) { c->rarrow = 0; } else if (strcmp(inp_str, "larrows") == 0) { c->larrows = 1; } else if (strcmp(inp_str, "nolarrows") == 0) { c->larrows = 0; } else if (strcmp(inp_str, "rarrows") == 0) { c->rarrows = 1; } else if (strcmp(inp_str, "norarrows") == 0) { c->rarrows = 0; } else if (strcmp(inp_str, "bezier") == 0) { c->bezier = 1; } else if (strcmp(inp_str, "nobezier") == 0) { c->bezier = 0; } else if (strcmp(inp_str, "asize") == 0) { if (!getfloat(&f)) rejecttoken(); else { c->asize[0] = f; if (!getfloat(&f)) rejecttoken(); else c->asize[1] = f; } } else if (strcmp(inp_str, "clip") == 0) { c->clip = 1; } else if (strcmp(inp_str, "noclip") == 0) { c->clip = 0; } else { rejecttoken(); return; } } } void edit_hash_label(a) Axis a; { float at, f; char *s; char inp_str[256]; String st; int done; s = CNULL; at = (first(a->hash_lines) == nil(a->hash_lines)) ? FSIG : first(a->hash_lines)->loc; while(1) { done = 0; if (getstring(inp_str)) { if (strcmp(inp_str, ":") == 0) { if ((s = getlabel()) == CNULL) return; } else if (strcmp(inp_str, "at") == 0) { if (getfloat(&f)) { at = f; } else { rejecttoken(); done = 1; } } else { rejecttoken(); done = 1; } } else { done = 1; } if (done) { if (s == CNULL) return; if (at == FSIG) { error_header(); fprintf(stderr, "hash_label either needs \"at\" or an associated \"hash_at\"\n"); exit(1); } st = (String) get_node((List) a->hash_labels); st->s = new_label(); st->s->label = s; st->s->x = at; st->s->y = at; insert((List) st, (List) a->hash_labels); return; } } } void edit_axis(a) Axis a; { char inp_str[256]; float f; int i; Hash h; while ( getstring(inp_str) ) { if (strcmp(inp_str, "size") == 0) { if ( getfloat(&f)) a->size = f; else rejecttoken(); } else if (strcmp(inp_str, "max") == 0) { if ( getfloat(&f)) a->max = f; else rejecttoken(); } else if (strcmp(inp_str, "min") == 0) { if ( getfloat(&f)) a->min = f; else rejecttoken(); } else if (strcmp(inp_str, "hash") == 0) { if ( getfloat(&f)) a->hash_interval = f; else rejecttoken(); } else if (strcmp(inp_str, "shash") == 0) { if ( getfloat(&f)) { a->hash_start = f; a->start_given = 1; } else rejecttoken(); } else if (strcmp(inp_str, "mhash") == 0) { if (getint(&i)) a->minor_hashes = i; else rejecttoken(); } else if (strcmp(inp_str, "precision") == 0) { if (getint(&i)) a->precision = i; else rejecttoken(); } else if (strcmp(inp_str, "label") == 0) { edit_label(a->label); } else if (strcmp(inp_str, "hash_format") == 0) { if (!getstring(inp_str)) return; if (strcmp(inp_str, "g") == 0) { a->hash_format = 'g'; } else if (strcmp(inp_str, "G") == 0) { a->hash_format = 'G'; } else if (strcmp(inp_str, "E") == 0) { a->hash_format = 'E'; } else if (strcmp(inp_str, "e") == 0) { a->hash_format = 'e'; } else if (strcmp(inp_str, "f") == 0) { a->hash_format = 'f'; } else { error_header(); fprintf(stderr, "Invalid hash_style %s. Must be f, g, G, e or E\n", inp_str); exit(1); } } else if (strcmp(inp_str, "hash_labels") == 0) { edit_label(a->hl); } else if (strcmp(inp_str, "log_base") == 0) { if (getfloat(&f)) { if (f <= 1.0) { error_header(); fprintf(stderr, "\"log_base %f\": log_base must be > 1.0\n", f); exit(1); } else a->log_base = f; } else rejecttoken(); } else if (strcmp(inp_str, "draw_at") == 0) { if ( getfloat(&f)) a->draw_at = f; else rejecttoken(); } else if (strcmp(inp_str, "log") == 0) { a->is_lg = 1; } else if (strcmp(inp_str, "linear") == 0) { a->is_lg = 0; } else if (strcmp(inp_str, "nodraw") == 0) { a->draw_hash_labels = 0; a->draw_axis_line = 0; a->draw_hash_marks = 0; a->draw_axis_label = 0; } else if (strcmp(inp_str, "draw") == 0) { a->draw_hash_labels = 1; a->draw_axis_line = 1; a->draw_hash_marks = 1; a->draw_axis_label = 1; } else if (strcmp(inp_str, "hash_at") == 0 || strcmp(inp_str, "mhash_at") == 0) { if (getfloat(&f)) { h = (Hash) get_node((List) a->hash_lines); h->loc = f; h->major = (inp_str[0] == 'h'); h->size = h->major ? HASH_SIZE : MHASH_SIZE; insert((List) h, (List) a->hash_lines); } else rejecttoken(); } else if (strcmp(inp_str, "hash_label") == 0) { edit_hash_label(a); } else if (strcmp(inp_str, "hash_scale") == 0) { if ( getfloat(&f)) a->hash_scale = f; else rejecttoken(); } else if (strcmp(inp_str, "auto_hash_marks") == 0) { a->auto_hash_marks = 1; } else if (strcmp(inp_str, "no_auto_hash_marks") == 0) { a->auto_hash_marks = 0; } else if (strcmp(inp_str, "auto_hash_labels") == 0) { a->auto_hash_labels = 1; } else if (strcmp(inp_str, "no_auto_hash_labels") == 0) { a->auto_hash_labels = 0; } else if (strcmp(inp_str, "draw_hash_labels_at") == 0) { if (getfloat(&f)) a->draw_hash_labels_at = f; else rejecttoken(); } else if (strcmp(inp_str, "draw_hash_marks_at") == 0) { if (getfloat(&f)) a->draw_hash_marks_at = f; else rejecttoken(); } else if (strcmp(inp_str, "no_draw_hash_labels") == 0) { a->draw_hash_labels = 0; } else if (strcmp(inp_str, "draw_hash_labels") == 0) { a->draw_hash_labels = 1; } else if (strcmp(inp_str, "no_draw_axis_line") == 0) { a->draw_axis_line = 0; } else if (strcmp(inp_str, "draw_axis_line") == 0) { a->draw_axis_line = 1; } else if (strcmp(inp_str, "no_draw_axis") == 0) { a->draw_axis_line = 0; } else if (strcmp(inp_str, "draw_axis") == 0) { a->draw_axis_line = 1; } else if (strcmp(inp_str, "no_draw_hash_marks") == 0) { a->draw_hash_marks = 0; } else if (strcmp(inp_str, "draw_hash_marks") == 0) { a->draw_hash_marks = 1; } else if (strcmp(inp_str, "no_draw_axis_label") == 0) { a->draw_axis_label = 0; } else if (strcmp(inp_str, "draw_axis_label") == 0) { a->draw_axis_label = 1; } else if (strcmp(inp_str, "no_grid_lines") == 0) { a->grid_lines = 0; } else if (strcmp(inp_str, "grid_lines") == 0) { a->grid_lines = 1; } else if (strcmp(inp_str, "no_mgrid_lines") == 0) { a->mgrid_lines = 0; } else if (strcmp(inp_str, "mgrid_lines") == 0) { a->mgrid_lines = 1; } else if (strcmp(inp_str, "gray") == 0) { if (!getfloat(&f)) rejecttoken(); else { a->graytype = 'g'; a->gray[0] = f; } } else if (strcmp(inp_str, "color") == 0) { a->graytype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); a->graytype = 'n'; break ; } else a->gray[i] = f ; } } else if (strcmp(inp_str, "grid_gray") == 0) { if (!getfloat(&f)) rejecttoken(); else { a->gr_graytype = 'g'; a->gr_gray[0] = f; } } else if (strcmp(inp_str, "grid_color") == 0) { a->gr_graytype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); a->gr_graytype = 'n'; break ; } else a->gr_gray[i] = f ; } } else if (strcmp(inp_str, "mgrid_gray") == 0) { if (!getfloat(&f)) rejecttoken(); else { a->mgr_graytype = 'g'; a->mgr_gray[0] = f; } } else if (strcmp(inp_str, "mgrid_color") == 0) { a->mgr_graytype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); a->mgr_graytype = 'n'; break ; } else a->mgr_gray[i] = f ; } } else { rejecttoken(); return; } } } void edit_legend(l) Legend l; { char inp_str[256]; float f; while ( getstring(inp_str) ) { if (strcmp(inp_str, "x") == 0) { if (!getfloat(&f)) rejecttoken(); else { l->l->x = f; l->l->hj = 'l'; l->l->vj = 't'; l->type = 'u'; } } else if (strcmp(inp_str, "y") == 0) { if (!getfloat(&f)) rejecttoken(); else { l->l->y = f; l->l->hj = 'l'; l->l->vj = 't'; l->type = 'u'; } } else if (strcmp(inp_str, "right") == 0 || strcmp(inp_str, "on") == 0) { l->type = 'u'; l->l->y = FSIG; l->l->x = FSIG; l->l->hj = 'l'; l->l->vj = 'c'; } else if (strcmp(inp_str, "left") == 0) { l->type = 'u'; l->l->y = FSIG; l->l->x = FSIG; l->l->hj = 'r'; l->l->vj = 'c'; } else if (strcmp(inp_str, "off") == 0) { l->type = 'n'; } else if (strcmp(inp_str, "top") == 0) { l->type = 'u'; l->l->y = FSIG; l->l->x = FSIG; l->l->hj = 'l'; l->l->vj = 'b'; } else if (strcmp(inp_str, "bottom") == 0) { l->type = 'u'; l->l->y = FSIG; l->l->x = FSIG; l->l->hj = 'l'; l->l->vj = 't'; } else if (strcmp(inp_str, "custom") == 0) { l->type = 'c'; } else if (strcmp(inp_str, "linelength") == 0) { if (!getfloat(&f)) rejecttoken(); else l->linelength = f; } else if (strcmp(inp_str, "linebreak") == 0) { if (!getfloat(&f)) rejecttoken(); else l->linebreak = f; } else if (strcmp(inp_str, "midspace") == 0) { if (!getfloat(&f)) rejecttoken(); else l->midspace = f; } else if (strcmp(inp_str, "defaults") == 0) { edit_label(l->l); } else { rejecttoken(); return; } } } void edit_graph(g, gs, all_gs) Graph g; Graphs gs; Graphs all_gs; { char inp_str[80]; int num; String s; float f; while ( getstring(inp_str) ) { if (strcmp(inp_str, "xaxis") == 0) edit_axis(g->x_axis); else if (strcmp(inp_str, "yaxis") == 0) edit_axis(g->y_axis); else if (strcmp(inp_str, "curve") == 0) { if (!getint(&num)) { error_header(); fprintf(stderr, "\"curve\" not followed by number\n"); exit(1); } edit_curve(get_curve(g->curves, num), g); } else if (strcmp(inp_str, "newcurve") == 0) { if (first(g->curves) == nil(g->curves)) edit_curve(new_curve(g->curves, 0), g); else edit_curve(new_curve(g->curves, last(g->curves)->num + 1), g); } else if (strcmp(inp_str, "copycurve") == 0) { edit_curve(do_copy_curve(g, gs, all_gs), g); } else if (strcmp(inp_str, "newline") == 0) { if (first(g->curves) == nil(g->curves)) edit_curve(new_line(g->curves, 0), g); else edit_curve(new_line(g->curves, last(g->curves)->num + 1), g); } else if (strcmp(inp_str, "title") == 0) { edit_label(g->title); } else if (strcmp(inp_str, "legend") == 0) { edit_legend(g->legend); } else if (strcmp(inp_str, "x_translate") == 0) { if (!getfloat(&f)) rejecttoken(); else g->x_translate = f; } else if (strcmp(inp_str, "y_translate") == 0) { if (!getfloat(&f)) rejecttoken(); else g->y_translate = f; } else if (strcmp(inp_str, "string") == 0) { if (!getint(&num)) { error_header(); fprintf(stderr, "\"string\" not followed by number\n"); exit(1); } s = get_string(g->strings, num); edit_label(s->s); } else if (strcmp(inp_str, "newstring") == 0) { if (first(g->strings) == nil(g->strings)) s = new_string(g->strings, 0); else s = new_string(g->strings, last(g->strings)->num + 1); edit_label(s->s); } else if (strcmp(inp_str, "copystring") == 0 || strcmp(inp_str, "copyline") == 0) { edit_label(do_copy_string(g, gs, all_gs)); } else if (strcmp(inp_str, "inherit_axes") == 0) { inherit_axes(g, last_graph(g, gs, all_gs)); } else if (strcmp(inp_str, "Y") == 0) { if (!getfloat(&f)) rejecttoken(); else gs->height = f; } else if (strcmp(inp_str, "X") == 0) { if (!getfloat(&f)) rejecttoken(); else gs->width = f; } else if (strcmp(inp_str, "border") == 0) { g->border = 1; } else if (strcmp(inp_str, "noborder") == 0) { g->border = 0; } else if (strcmp(inp_str, "clip") == 0) { g->clip = 1; } else if (strcmp(inp_str, "noclip") == 0) { g->clip = 0; } else { rejecttoken(); return; } } } void edit_graphs(gs) Graphs gs; { Graphs the_g; Graph g, tmp_g; char inp_str[80]; float f; int num, i, ok, j; the_g = first(gs); while ( getstring(inp_str) ) { if (strcmp(inp_str, "graph") == 0) { if (!getint(&num)) { error_header(); fprintf(stderr, "\"graph\" not followed by number\n"); exit(1); } edit_graph(get_graph(the_g->g, num), the_g, gs); } else if (strcmp(inp_str, "newgraph") == 0) { if (first(the_g->g) == nil(the_g->g)) edit_graph(new_graph(the_g->g, 0), the_g, gs); else edit_graph(new_graph(the_g->g, last(the_g->g)->num + 1), the_g, gs); } else if (strcmp(inp_str, "copygraph") == 0) { if (first(the_g->g) == nil(the_g->g)) g = new_graph(the_g->g, 0); else g = new_graph(the_g->g, last(the_g->g)->num + 1); if (!getint(&num)) { rejecttoken(); inherit_axes(g, last_graph(g, the_g, gs)); } else { ok = 0; tmp_g = the_g->g; while(!ok) { tmp_g = prev(tmp_g); if (tmp_g == nil(the_g->g) || tmp_g->num < num) { error_header(); fprintf(stderr, "copygraph: no graph #%d\n", num); exit(1); } ok = (tmp_g->num == num); } inherit_axes(g, tmp_g); } edit_graph(g, the_g, gs); } else if (strcmp(inp_str, "Y") == 0) { if (!getfloat(&f)) rejecttoken(); else the_g->height = f; } else if (strcmp(inp_str, "X") == 0) { if (!getfloat(&f)) rejecttoken(); else the_g->width = f; } else if (strcmp(inp_str, "newpage") == 0) { new_graphs(gs); the_g = last(gs); } else if (strcmp(inp_str, "bbox") == 0) { for (i = 0; i < 4; i++) { if (!getint(&j)) { error_header(); fprintf(stderr, "Bbox definition must have four integers\n"); exit(1); } else { the_g->bb[i] = j; } } } else if (strcmp(inp_str, "preamble") == 0) { if (!getstring(inp_str)) return; if (strcmp(inp_str, ":") != 0) { the_g->prefile = 1; the_g->preamble = (char *) malloc (sizeof(char)*(strlen(inp_str)+1)); strcpy(the_g->preamble, inp_str); } else { the_g->prefile = 0; the_g->preamble = getmultiline(); if (the_g->preamble == CNULL) return; } } else if (strcmp(inp_str, "epilogue") == 0) { if (!getstring(inp_str)) return; if (strcmp(inp_str, ":") != 0) { the_g->epifile = 1; the_g->epilogue = (char *) malloc (sizeof(char)*(strlen(inp_str)+1)); strcpy(the_g->epilogue, inp_str); } else { the_g->epifile = 0; the_g->epilogue = getmultiline(); if (the_g->epilogue == CNULL) return; } } else { error_header(); fprintf(stderr, "Bad token: %s\n", inp_str); exit(1); } } } jgraph/ex1.jgr0000777005471000040510000000167211447702134012370 0ustar plankloci(* This is a graph for Figure 1 of the USENIX jgraph abstract. It shows three simple curves plotted with jgraph. There are two graphs plotted -- the first is the actual jgraph. The second is a text string showing the input for the graph. Print it out -- you'll see what I mean. *) newgraph xaxis size 2 yaxis size 1.5 newcurve pts 0 6 1 9 2 11 3 14 4 18 5 20 newcurve marktype triangle linetype solid pts 0 3 1 4 2 7 3 9 4 10 5 13 newcurve marktype none linetype dashed pts 0 0 1 2 2 3 3 5 4 6 5 9 copygraph x_translate -3.5 border xaxis nodraw min 0 max 1 size 2.8 yaxis nodraw min 0 max 1 newstring hjl vjc x .05 y .5 font Courier fontsize 7 : newgraph\ newcurve \ pts 0 6 1 9 2 11 3 14 4 18 5 20\ newcurve \ marktype triangle \ linetype solid\ pts 0 3 1 4 2 7 3 9 4 10 5 13\ newcurve \ marktype none \ linetype dashed\ pts 0 0 1 2 2 3 3 5 4 6 5 9 jgraph/ex2.jgr0000777005471000040510000000270211447702134012364 0ustar plankloci(* This is a graph for Figure 2 of the USENIX jgraph abstract. It shows how to extract points from a data file with awk, and how to use awk to plot a function to match the data (the function that is plot here is (n/k)log(n), where k is expermentally chosen to be 35000. There are two graphs plotted -- the first is the actual jgraph. The second is a text string showing the input for the graph. Print it out -- you'll see what I mean. *) newgraph xaxis size 2.5 hash_labels font Helvetica label : Number of indexed Records (N) yaxis size 2.1 label : Running time (seconds) hash_labels font Helvetica newcurve marktype cross label : Data pts shell : awk '{print $5, $8}' data.txt newcurve marktype none linetype solid label : N log N / 35000 pts shell : nawk \ ' $5 != 0 { \ print $5, $5 * log($5) / 35000}' \ data.txt copygraph x_translate -3.1 border xaxis nodraw min 0 max 1 size 2.3 yaxis nodraw min 0 max 1 newstring hjl vjc x .03 y .5 font Courier fontsize 6 : xaxis size 2.5 \ hash_labels font Helvetica\ label : Number of indexed Records (N)\ yaxis size 2.1 \ label : Running time (seconds)\ hash_labels font Helvetica\ \ newcurve \ marktype cross\ label : Data\ pts shell : awk '{print $5, $8}' data.txt\ \ newcurve\ marktype none linetype solid\ label : N log N / 35000\ pts shell : nawk \\ ' $5 != 0 { \\ print $5, $5 * log($5) / 35000}' \\ data.txt\ jgraph/exit.c0000755005471000040510000000210711447702134012272 0ustar plankloci/* **++ ** FUNCTIONAL DESCRIPTION: ** ** Exit is a VMS replacement for the standard Unix exit function ** ** FORMAL PARAMETERS: ** ** error_code integer passed by value (optional) ** ** SIDE EFFECTS: ** ** Exit will never return to calling program ** VMS exit status ($STATUS) will be set **-- **/ #include exit(va_alist) va_dcl { int nargs; va_list va; int exit_code = 0; /* * Pick up the argument, if present */ va_count(nargs); va_start(va); if (nargs > 0) exit_code = va_arg(va,int); /* * Set the VMS $STATUS to the appropriate value: * if exit_code == 0 then $STATUS := success * if exit_code > 0 then $STATUS := error * if exit_code < 0 then $STATUS := severe_error * and perform exit. * * Note: * the %X10000000 added to the actual success/error indicator * will prevent DCL from printing a message. * A 'on error' will be obeyed however. */ if (exit_code == 0) /* success */ sys$exit(0x10000001); else if (exit_code > 0) /* error */ sys$exit(0x10000002); else /* severe error */ sys$exit(0x10000004); } jgraph/g8.jgr0000777005471000040510000000174411447702134012211 0ustar plankloci(* $Log: g8.jgr,v $ * Revision 1.1 90/10/12 17:33:33 jsp * Initial revision * *) Y 3 (* Graph #8: Frequency of Traps. This graph shows examples of plotting * character strings. *) newgraph yaxis size 1.9 min 0 max 10 hash 1 mhash 0 hash_labels fontsize 7 label fontsize 8 : Traps per 0.1 second Interval xaxis size 2.14 min 0 max 2.6001 hash .5 mhash 4 precision 1 hash_labels fontsize 7 label fontsize 8 : Starting Time of 0.1 second interval (sec) title fontsize 10 : Graph 8: Frequency of Traps. newcurve marktype circle fill 0 linetype none pts 0.0 9 0.1 3 0.2 5 0.3 6 0.4 6 0.5 5 0.6 6 0.7 6 0.8 6 0.9 6 1.0 6 1.1 4 1.2 5 1.3 3 1.4 4 1.5 5 1.6 3 1.7 5 1.8 5 1.9 4 2.0 3 2.1 4 2.2 5 2.3 5 2.4 4 2.5 0 2.6 0 newstring : Average Trap Time = 0.015 seconds x 2.6 y 10 hjr vjc fontsize 7 newstring : ... x 2.7 y 0 hjl vjb fontsize 7 jgraph/g8col.jgr0000777005471000040510000000205611447702134012704 0ustar plankloci(* $Log: g8.jgr,v $ * Revision 1.1 90/10/12 17:33:33 jsp * Initial revision * *) Y 3 (* Graph #8: Frequency of Traps. This graph shows examples of plotting * character strings. *) newgraph yaxis size 1.9 min 0 max 10 hash 1 mhash 0 hash_labels fontsize 7 label fontsize 8 : Traps per 0.1 second Interval xaxis size 2.14 min 0 max 2.6001 hash .5 mhash 4 precision 1 hash_labels fontsize 7 label fontsize 8 : Starting Time of 0.1 second interval (sec) newcurve marktype box cfill 1 1 0 marksize 11 60 pts 1.3 5 copygraph title fontsize 10 : Graph 8: Frequency of Traps. newcurve marktype circle fill 0 linetype none pts 0.0 9 0.1 3 0.2 5 0.3 6 0.4 6 0.5 5 0.6 6 0.7 6 0.8 6 0.9 6 1.0 6 1.1 4 1.2 5 1.3 3 1.4 4 1.5 5 1.6 3 1.7 5 1.8 5 1.9 4 2.0 3 2.1 4 2.2 5 2.3 5 2.4 4 2.5 0 2.6 0 newstring : Average Trap Time = 0.015 seconds x 2.6 y 10 hjr vjc fontsize 7 newstring : ... x 2.7 y 0 hjl vjb fontsize 7 jgraph/g9n10.jgr0000777005471000040510000000743211447702136012533 0ustar plankloci(* This file plots two graphs side by side with a tricky legend format: * There are 5 legend entries, one of which is of a curve containing a * line. The desire is to make the legend have two columns, the first * with the first three legend entries, and the second with the last * two. * * The way that this is done is to actually plot four graphs -- two sets * of two graphs superimposed on each other. The first of the two * graphs has the first three curves, and the second has the last two. * Thus, the first can set its legend to be the first column, and the * second can set its legend to be the second column. * * To get the two columns is pretty simple. In each graph, the * x and y coordinates of the legends are explicitly set. For the * first column, the x coordinate is 0, and for the second column, * the x coordinate is 5.5. * * A potential problem with this graph is that in the first set of * legends, there is a line (the "Merge Sort" curve), while in the * second set there is not. Thus, if nothing is done with the midspace * and linelength paramters, the second columns marks will appear closer * to the text than in the first column. The solution to this was to * explicitly set the linelength and midspace in the first legend to * be .80 and .25 respectively. This means that in the first legend, the * marks are 0.65 units away from the text (in the presence of a line, * the marks are (midspace + linelength/2) away from the text. In * the absence of a line, the marks are simply (midspace) away from the * text. Thus, midspace is set to be 0.65 in the second legend column. *) (* Set up the axes of the first graph. Translate it to the left of the * page *) newgraph x_translate -1.37 yaxis size 1.9 min 0 max 40 precision 0 hash 10 mhash 1 label : Time (sec) fontsize 8 xaxis size 2.14 min 0 max 10 hash 2 mhash 1 label : Heap Size (MBytes) fontsize 8 title : Graph 9: Checkpoint Time of Other Benchmarks. fontsize 10 (* Draw the first three curves *) newcurve label : Merge Sort marktype circle fill 0.0 linetype solid pts .789 5.5414 2.985 13.9958 3.962 17.2362 4.938 21.0804 7.868 32.4082 9.821 39.8312 newcurve label : Travelling Salesman marktype triangle fill 0 linetype none pts .064 2.359 newcurve label : Pattern Match marktype diamond fill 1.0 linetype none pts 1.233 6.374 (* set the legend *) legend linelength .8 midspace .25 x 0 y 47.5 defaults fontsize 7 (* Now make a second graph for the second curve with the same axes *) copygraph xaxis nodraw yaxis nodraw (* Draw the last two curves *) newcurve label : Bubble Sort marktype cross fill 1.0 linetype none pts .513 3.91 newcurve label : Matrix Multiplication marktype box fill 1 linetype none pts 3 14.71 (* set the second legend to be a second column from the first *) legend x 5.5 midspace .65 (* The second of these graphs is just like the first only it is translated to the right *) copygraph x_translate 1.7 xaxis draw yaxis draw yaxis min 0 max 5 hash 1 mhash 1 title : Graph 10: Checkpoint Overhead of Other Benchmarks. fontsize 10 newcurve label : Merge Sort marktype circle fill 0.0 linetype solid pts .789 0.5954 2.985 3.8368 3.962 3.3598 4.938 3.6288 7.868 4.3096 9.821 4.377 newcurve label : Travelling Salesman marktype triangle fill 0 linetype none pts .064 0.17 newcurve label : Pattern Match marktype diamond fill 1.0 linetype none pts 1.233 0.07 legend linelength .8 midspace .25 x 0 y 5.9 defaults fontsize 7 copygraph xaxis nodraw yaxis nodraw newcurve label : Bubble Sort marktype cross fill 1.0 linetype none pts .513 0.07 newcurve label : Matrix Multiplication marktype box fill 1 linetype none pts 3 0.75 legend x 5.5 midspace .65 jgraph/gpaper.jgr0000777005471000040510000000032611447702136013146 0ustar planklocinewgraph xaxis size 7 min 0 max 7 hash 1 mhash 9 yaxis size 9 min 0 max 9 hash 1 mhash 9 copygraph xaxis hash_scale 1 grid_lines mgrid_lines mgrid_gray .5 yaxis hash_scale 1 grid_lines mgrid_lines mgrid_gray .5 jgraph/hypercube.jgr0000777005471000040510000000272011447702136013656 0ustar plankloci(* * $Source: /n/fs/vd/jsp/papers/dckp/RCS/hypercube.jgr,v $ * $Revision: 4.4 $ * $Date: 91/10/03 13:56:21 $ * $Author: jsp $ * * Jgraph file containing a picture of a 3-D hypercube. *) Y 2.3 newgraph xaxis size 2.5 min 0 max 2.5 nodraw yaxis size 2 min 0 max 2 nodraw legend x 2.8 y 1.25 linelength 0.5 (* The links are drawn first, so that the nodes will be drawn over them. *) newline linethickness 2 pts 0 0 1.5 0 copycurve pts 0 1.5 1.5 1.5 copycurve pts .5 .5 2.0 .5 copycurve pts 2 2 .5 2 label fontsize 12 : Dimension 0 links newline linethickness 2 linetype dotted pts 0 0 0 1.5 copycurve pts 1.5 0 1.5 1.5 copycurve pts .5 .5 .5 2.0 copycurve pts 2 2 2 .5 label fontsize 12 : Dimension 1 links newline linethickness 2 linetype dashed pts 0 0 .5 .5 copycurve pts 0 1.5 .5 2 copycurve pts 1.5 0 2.0 .5 copycurve pts 1.5 1.5 2 2 label fontsize 12 : Dimension 2 links (* Now draw the nodes with fill 0 so that they will draw white over the * link overlap *) newcurve pts 0 0 0 1.5 1.5 0 1.5 1.5 marksize .35 marktype circle fill 1 newcurve pts .5 .5 .5 2 2 .5 2 2 marksize .27 marktype circle fill 1 (* Now draw the node labels inside the nodes *) newstring x 0 y 0 fontsize 12 hjc vjc : 000 copystring x 1.5 y 0 : 001 copystring x 0 y 1.5 : 010 copystring x 1.5 y 1.5 : 011 copystring x 0.5 y 0.5 fontsize 10 : 100 copystring x 2.0 y 0.5 : 101 copystring x 0.5 y 2.0 : 110 copystring x 2.0 y 2.0 : 111 jgraph/jgraph.10000777005471000040510000013501011447702136012520 0ustar plankloci.\" SCCSID: @(#)jgraph.1 1.1 10/23/89 .\" SCCSID: @(#)jgraph.1 1.1 10/23/89 .TH jgraph 1 .SH NAME jgraph \- filter for graph plotting to postscript .SH SYNTAX .B jgraph [\-\fIp\fR\|] [\-\fIP\fR\|] [\-\fIL\fR\|] [\-\fIcomments\fR\|] [\fIfilename\fR ...\|] .SH DESCRIPTION \fBJgraph\fR takes the description of a graph or graphs and produces a postscript file on the standard output. \fBJgraph\fR is ideal for plotting any mixture of scatter point graphs, line graphs, and/or bar graphs, and embedding the output into LaTeX, or any other text processing system which can read postscript. .sp \fBJgraph\fR reads its input from the specified files. If no files are specified, then it reads from standard input. .sp The graph description language is simple enough to get nice looking graphs with a minimum of effort, yet powerful enough to give the user the flexibility to tailor the appearance of the graph to his or her individual preferences. This includes plotting multiple graphs and laying them out separately on the page (or pages). .sp As an example, if the user wanted to simply plot the points (2,3), (4,5), (1,6), the following would be enough of a specification file: .PP .nf newgraph newcurve pts 2 3 4 5 1 6 .fi .PP Now, if the user wanted to spruce the graph up by adding labels to the axes, connecting the points, and titling the graph, then the input could change to: .PP .nf newgraph newcurve pts 2 3 4 5 1 6 linetype solid xaxis label : X axis yaxis label : Y axis title : This is an example graph .fi .PP If the user instead wanted this to be a bar graph with different endpoints on the axes, he/she could simply change the input to: .PP .nf newgraph xaxis min 0 max 5 label : X axis yaxis min 0 max 6 label : Y axis newcurve pts 2 3 4 5 1 6 marktype xbar title : This is an example bar graph .fi .PP There are many more features of the description language, which are described below in the next section. Features which are not embedded within the description language are: line and function interpolation, function plotting, and pie graphs. The latter is impossible to do with the aid of \fBjgraph, \fR however, the others can be effected with \fBjgraph \fR mixed with awk or c. See FUNCTION PLOTTING AND OTHER NON-INHERENT FEATURES below. .sp Also below is a section HINTS AND EXAMPLE GRAPHS, which may give good ideas on how to use \fBjgraph \fR more effectively. .SH OPTIONS .TP .B \-P The \fB\-P\fR option produces postscript which can be piped directly to \fBlpr,\fR which can be displayed in an Xwindows environment with \fBgs\fR (ghostscript). Without this option, the output should be embedded within \fBLaTeX\fR or a similar text processing system. .TP .B \-L The \fB\-L\fR option produces a landscape plot. .TP .B \-p The \fB\-p\fR option re-prints the input on the standard output, only with all the defaults made explicit. This is useful for letting the user do his/her own special formatting, as it shows the explicit values that the defaults assume, so that they can be manipulated. .TP .B \-comments This option makes jgraph put comments into the output postscript. These make it easier for the user to wade through the final postscript if necessary. .SH THE DESCRIPTION LANGUAGE The description language is essentially keywords followed by attributes. All keywords and attributes except for string attributes are tokens -- non-white-space characters surrounded by white-space. Special tokens are ``(*'', ``*)'', ``include'', ``:'', and ``shell'', which denote comments, include-file statements, string identifiers, and shell-include statements: .TP .B Comments Comments are surrounded by the tokens ``(*'' ``*)'' as in Modula-2 (except that here, the tokens must be surrounded by white- space). Comments may be nested. If the comment runs to the end of a file, the last ``*)'' may be omitted. .TP .B Include\-file statements The token following an ``include'' token is expected to be a file name. The result of the statement is to include the contents of the file at that point. Include-file statments can be nested within included files, and within shell includes. .TP .B Strings In places where strings are required (as in graph and curve labels), they are denoted by the token ``:''. The second character after the ``:'' starts the string, and the next newline character terminates it. Thus, the string ``Graph #1'' can be denoted as: .nf : Graph #1 or : Graph #1 .fi One can get multiline strings by making a backslash the last character before the newline on all but the last line. Notice that in strings white-space is not ignored. This way of denoting strings allows the user to embed leading and trailing spaces, as well as the null string. For example, the null string ``'' is represented by: .nf : .fi Once a string has been started, it may contain any character. Specifically, it may contain the sequence ``(*'', ``shell'', or ``include'' without starting a comment or including a file. Each line of a string must contain less than 1000 characters. Otherwise string sizes are limited only by the size of memory. .TP .B Shell\-include statements Shell include statements are of the form ``shell'', ``:'', and then a string. The result of the statement is that the string is executed (using popen, which passes the string to sh), and the standard output is included at that point. Shell-includes can be freely nested within include-files and other shell-includes. Shell commands may be more than one line, but must not exceed 1000 characters. The shell statement is not (yet) available on VMS. .TP .B Notation In the descriptions below: .RS .TP \fBtk \|{\fIinteger\fB\|}\fR means that token \fBtk \fR must be followed by an integer. .TP \fBtk \|[\fIinteger\fB\|]\fR means that \fBtk\fR may be followed by an integer, but doesn't have to. In most cases, if \fBtk\fR is not followed by an integer, then the command denoted by \fBtk \fR is ignored. .TP \fBtk \|[\|{\fIinteger\fB\|} \|{\fIinteger\fB\|}\|]* means that \fBtk\fR must be followed by an even number of integers. .PD .LP Supported types other than integer are: \fB\|{\fIfloat\fB\|} \fR for floating point entries, \fB\|{\fItoken\fB\|} \fR for any token, and \fB\|{\fIstring\fB\|} \fR for a string as defined above. .RE .TP .B TOP-LEVEL DESCRIPTION COMMANDS .RS .TP .B newgraph This starts editing a new graph (see GRAPH EDITING COMMANDS). Note that multiple graphs may be drawn on the same page. .TP \fBgraph \|{\fIinteger\fB\|}\fR This edits the graph denoted by \fB\|{\fIinteger\fB\|}. \fR If the graph doesn't exist, then this command creates it and starts editing it. \fBNewgraph\fR is simply an abbreviation for \fB\fIgraph\fB \fIn\fB\fR where n=0 if this is the first graph, otherwise n=m+1, where m is the largest number of any graph so far. .TP \fBcopygraph \|[\fIinteger\fB\|]\fR This creates a new graph, and copies all the attributes from the graph \fB\|[\fIinteger\fB\|]'s\fR x and y axes, as well as its \fB\fIx_translate\fB\fR and \fB\fIy_translate\fB\fR values, the clipping, the legend defaults, and the title defaults. If the \fB\|[\fIinteger\fB\|]\fR is omitted, then it copies its values from the ``previous'' graph, which is defined to be the graph with the largest number less than the currrent graph's number. If the current graph has the smallest number, then it will take the last graph from the previous page of graphs. If there is no previous page, then an error will be flagged. (copygraph does not copy the values of the \fB\fIhash_at\fB, \fImhash_at\fB,\fR and \fB\fI\fIhash_label\fB\fR attributes). .TP .B newpage This command is for plotting graphs on multiple pages. After a \fBnewpage,\fR the graphs that the user enters will be plotted on a new page. New graphs and strings will be numbered starting with 0. Essentially, \fB\fInewpage\fB\fR is the same as appending together the output of separate calls of jgraph on the text before the \fB\fInewpage,\fB\fR and on the text after the \fB\fInewpage.\fB\fR \fB\fINewpage\fB\fR will most likely produce bizarre results if the \fB\-P\fR option is not specified. .TP \fBX \|[\fIfloat\fB\|]\fR .br .ns .TP \fBY \|[\fIfloat\fB\|]\fR Postscript files to be embedded in LaTeX (and some other programs) contain a ``bounding box'' which defines the area which LaTeX will allocate for the postscript. Other programs use this bounding box as well, sometimes using it to define where to clip the postscript image. \fBJgraph \fR uses the axis lines and labels, and the title to generate its bounding box. Most of the time that's good enough to work in LaTeX. The \fB\fIY\fB\fR and \fB\fIX\fB\fR commands say to make the height and width of the bounding box at least \fB\fIY\fB\fR and \fB\fIX\fB\fR inches, respectively, but to maintain the current centering of the graph. If you still need further control over the bounding box (e.g. to change the centering), try the \fB\fIbbox\fB\fR command. If there's more than one page in the jgraph file, \fB\fIY,\fB\fR \fB\fIX\fB\fR and \fB\fIbbox\fB\fR values can be given for each graph. .TP \fBbbox \fIfloat\fB \fIfloat\fB \fIfloat\fB \fIfloat\fB\fR If the \fB\fIY\fB\fR and \fB\fIX\fB\fR commands aren't enough to help you define a good bounding box, this command lets you explicitly enter one which will go directly into the jgraph output. Its units are the final postscript units. It's probably best to use the \fB\-p\FR option to see what the bounding box is that jgraph produces, and then alter that accordingly with \fB\fIbbox.\fB\fR The main use for this is to change the automatic centering that jgraph performs: Usually the center of the bounding box that jgraph computes is put at the center of the page. Changing the bbox changes this center. .TP \fBpreamble : \|{\fIstring\fB\|}\fR .br .ns .TP \fBpreamble {\fItoken\fB\|}\fR .br .ns .TP \fBepilogue : \|{\fIstring\fB\|}\fR .br .ns .TP \fBepilogue {\fItoken\fB\|}\fR These two commands allow the user to include strings or files (the token specifies the filename) which will be copied directly into jgraph's output. The \fIpreamble\fB is included at the beginning of the output (after some initial postscript to set things up for jgraph), and the \fIepilogue\fB is included at the end. A good use for the \fIpreamble\fB is to set up a postscript dictionary if you're using postscript marks. .PD .RE .LP .TP .B GRAPH EDITING COMMANDS These commands act on the current graph. Graph editing is terminated when one of the top-level description commands is given. .RS .TP \fBxaxis\fR .br .ns .TP \fByaxis\fR Edit the x or y axis (see AXIS EDITING COMMANDS) .TP \fBnewcurve\fR This starts editing a new curve of the graph (see CURVE EDITING COMMANDS). .TP \fBcurve \|{\fIinteger\fB\|}\fR This edits the curve denoted by \fB\|{\fIinteger\fB\|}. \fR If the curve doesn't exist, then this command creates it and starts editing it. \fINewcurve\fB and \fIcurve\fB interact as \fInewgraph\fB and \fIgraph\fB do. .TP \fBnewline\fR This is an abbreviation for: .PP .nf newcurve marktype none linetype solid .fi .PP .TP \fBcopycurve \|[\fIinteger\fB\|]\fR This starts editing a new curve of the graph, and copies all its values except for the points from curve \fB\|[\fIinteger.\fB\|]\fR If the \fB\|[\fIinteger\fB\|]\fR is omitted, then it copies its values from the last curve in this graph. If this graph currently has no curves, then it searches backwards from the previous graph. .TP \fBtitle\fR This edits the title of the graph (see LABEL EDITING COMMANDS). The title is given a default location centered beneath the graph, and a default font size of 12, however, as with all labels, this can be changed. .TP \fBlegend\fR The edits the legend of the graph (see LEGEND EDITING COMMANDS). As a default, the graph will contain a legend if any of its curves have labels. .TP \fBnewstring\fR This edits a new text string (see LABEL EDITING COMMANDS). This is useful as it allows the user to plot text on the graph as well as curves. .TP \fBstring \|{\fIinteger\fB\|}\fR .br .ns .TP \fBcopystring \|[\fIinteger\fB\|]\fR \fIString\fB and \fIcopystring\fB are to \fInewstring\fB as \fIcurve\fB and \fIcopycurve\fB are to \fInewcurve.\fB .TP \fBborder\fR .br .ns .TP \fBnoborder\fR \fIBorder\fR\fB draws a square border around the area defined by the axes. \fINoborder\fB specifies no border. \fINoborder\fB is the default. .TP \fBclip\fR .br .ns .TP \fBnoclip\fR \fIClip\fB specifies that all curves in the graph will be clipped -- that is, no points outside of the of axes will be plotted. Clipping can also be specified on a per-curve basis. The default is \fInoclip.\fB .TP \fBinherit_axes\fR This is an old command which is kept for backward compatibility. \fICopycurve.\fB is equivalent to: .PP .nf newgraph inherit_axes .fi .PP .TP \fBx_translate \|[\fIfloat\fB\|]\fR .br .ns .TP \fBy_translate \|[\fIfloat\fB\|]\fR By default, the bottom left-hand corner of each graph is at point (0,0) (final postscript units). \fIX_translate\fB and \fIY_translate\fB translate the bottom left-hand corner of the graph \fB\|[\fIfloat\fB\|] \fR inches. The main use of this is to draw more than one graph on a page. Note that jgraph considers all the graphs drawn on the page when it computes its bounding box for centering. Thus, if only one graph is drawn, it will always be centered on the page, regardless of its \fIX_translate\fB and \fIY_translate\fB values. These values are used for relative placement of the graphs. To change the centering of the graphs, use \fIbbox.\fB .TP \fBX \|[\fIfloat\fB\|]\fR .br .ns .TP \fBY \|[\fIfloat\fB\|]\fR These are the same as \fIX\fB and \fIY\fB in the Top-level commands, except that they let the user continue editing the current graph. .PD .RE .LP .TP .B SIMPLE AXIS EDITING COMMANDS These commands act on the current axis as chosen by \fIxaxis\fB or \fIyaxis\fB (see GRAPH EDITING COMMANDS). Axis editing terminates when a graph or top-level command is given. There are more advanced axis editing commands given below which have to do with moving the hash marks, adding new hash marks and labels, etc. See ADVANCED AXIS EDITING COMMANDS. .RS .TP \fBlinear\fR .br .ns .TP .B log Set the axis to be linear or logarithmic. The default is linear. If the axis is set to be logarithmic, then values <= 0.0 will be disallowed, as they are at negative infinity on the axis. .TP \fBmin \|[\fIfloat\fB\|]\fR .br .ns .TP \fBmax \|[\fIfloat\fB\|]\fR Set the minimum and maximum values of this axis. Defaults depend on the points given. They can be seen by using the \fB\-p \fR option. Unless stated, all units (for example point plotting, string plotting, etc.) will be in terms of the \fImin\fB and \fImax\fB values of the x and y axes. .TP \fBsize \|[\fIfloat\fB\|]\fR Set the size of this axis in inches. .TP \fBlog_base \|[\fIfloat\fB\|]\fR Set the base of the logarithmic axis. Default = 10. This is the value which determines which hash marks and hash labels are automatically produced. .TP \fBhash \|[\fIfloat\fB\|]\fR Hash marks will be \fB\|[\fIfloat\fB\|] \fR units apart. Default = -1. If this value equals 0, then there will be no hash marks. If this value is less than 0, then the hash marks will be automatically set by \fBjgraph \fR (see \fB\-p \fR for the value). By default, each hash mark will be labeled with its value. \fIHash\fB and \fIshash\fB are ignored if the axes are logarithmic. .TP \fBshash \|[\fIfloat\fB\|]\fR Make sure there is a hash mark at the point \fB\|[\fIfloat\fB\|] \fR along the axis. The default is set by \fBjgraph\fR if \fBhash\fR = -1. If \fIhash\fB is set by the user, \fIshash\fB is defaulted to the \fImin\fB value of the axis. .TP \fBmhash \|[\fIinteger\fB\|]\fR Put \fB\|[\fIinteger\fB\|] \fR minor hash marks between the above hash marks. Default = -1. If this value equals 0, then there will be no minor hash marks. If this value is negative, then the value will be chosen by \fBjgraph \fR (see \fB\-p\fR for the value). .TP \fBprecision \|[\fIinteger\fB\|]\fR .TP \fBhash_format \fItoken\fB\fR These control how jgraph formats the automatic hash labels. The user shouldn't have to worry about these values, except in extreme cases. Jgraph uses \fBprintf\fR to format the labels. If \fBhash_format\fR is ``f'' (the default), then the value of a hash label is printed with .PP .nf printf("%.*f", precision, value). .fi .PP Other valid \fBhash_format\fR values are ``G'', ``g'', ``E'', and ``e''. ``G'' is a good generic format which converts to scientific notation if the value becomes too big or too small. If the precision is negative, then jgraph chooses a default: For ``g'' and ``G'', the default is 6. For ``e'' and ``E'', the default is 0, and for ``f'', jgraph tries to determine a reasonable default. Please read the man page of \fBprinf(1)\fR for a complete description of how it formats floating point numbers. .TP \fBlabel\fR Edit the label of this axis (see LABEL EDITING COMMANDS). By default, the label is in font ``Times-Bold'', and has a font size of 10. If the user doesn't change any of the plotting attributes of the label, \fBjgraph \fR chooses an appropriate place for the axis label. .TP \fBdraw_at \|[\fIfloat\fB\|]\fR Draw the axis line at this point on the other axis. The default is usually the other axis's \fImin, \fB however if \fIhash_scale \fB is positive (see \fIhash_scale \fB under ADVANCED AXIS EDITING), it will be the other axis's \fImax.\fB .TP \fBnodraw\fR Do not draw the axis, the hash marks or any labels. This is useful for plotting points with no axes, and for overlaying graphs on top of one another with no clashes. This is equivalent to \fIno_draw_axis,\fB \fIno_draw_axis_label,\fB \fIno_draw_hash_marks,\fB and \fIno_draw_hash_labels.\fB .TP \fBdraw\fR Cancels the effect of \fInodraw. \fB Default = \fIdraw.\fB This is equivalent to \fIdraw_axis,\fB \fIdraw_axis_label,\fB \fIdraw_hash_marks,\fB and \fIdraw_hash_labels.\fB .TP \fBgrid_lines\fR .br .ns .TP \fBno_grid_lines\fR \fIGrid_lines\fB specifies to plot a grid line at each major hash mark on this axis. The default is \fIno_grid_lines.\fB .TP \fBmgrid_lines\fR .br .ns .TP \fBno_mgrid_lines\fR \fIMgrid_lines\fB specifies to plot a grid line at each minor hash mark on this axis. The default is \fIno_mgrid_lines.\fB .PD .RE .LP .TP .B CURVE EDITING COMMANDS These commands act on the current curve as chosen by \fInewcurve\fB or \fIcurve\fB (see GRAPH EDITING COMMANDS). Curve editing terminates when a graph or top-level command is given. .RS .TP \fBpts \|[\|{\fIfloat\fB\|} \|{\fIfloat\fB\|}\|]*\fR This sets the points to plot in this curve. The first \fIfloat\fB is the x value, and the second \fIfloat\fB is the y value of the point. Points are plotted in the order specified. This command stops reading points when a non-float is given. The user can specify this command multiple times within a curve -- each time, simply more points are added to the curve. .TP \fBx_epts \|[\|{\fIfloat\fB\|} \|{\fIfloat\fB\|} \|{\fIfloat\fB\|} \|{\fIfloat\fB\|}\|]*\fR .br .ns .TP \fBy_epts \|[\|{\fIfloat\fB\|} \|{\fIfloat\fB\|} \|{\fIfloat\fB\|} \|{\fIfloat\fB\|}\|]*\fR This allows the user to specify points and ``confidence values'' (otherwise known as ``error bars''). The first two \fIfloats\fB specify the x and y values of the point, as above. If \fBx_epts\fR is specified, then the second two \fIfloats\fB specify range or confidence values for the x value of the point. Error bars will be printed to each of these x values (using the original point's y value) from the original point. Similarly, \fIy_epts\fB specifies range or confidence values for the y value of the point. \fIpts\fB \fIx_epts\fB and \fIy_epts\fB can all be intermixed. .TP \fBmarktype\fR This sets the kind of mark that is plotted for this curve. Valid marks are: \fIcircle\fR, \fIbox\fR, \fIdiamond\fR, \fItriangle\fR, \fIx\fR, \fIcross\fR, \fIellipse\fR, \fIxbar\fR, \fIybar\fR, \fItext\fR, \fIpostscript\fR, \fIeps\fR, \fInone\fR, and variants of \fIgeneral\fR. Most of these are self-explanatory, except for the last few: \fIXbar\fR makes the curve into a bar graph with the bars going to the x axis. \fIYbar\fR has the bars going to the y axis. \fIText\fR lets the user plot text instead of a mark. The text is editted as a label (see LABEL EDITING COMMANDS) immediately following the \fItext\fR command. The x and y fields of the label have special meanings here: They define where the label is to be printed in relation to the curve points. For example, if they are both 0, the label will be printed directly on the curve points. If x is 1.0 and y is -1.0, then the label will be printed one unit to the right and one unit below the curve points (units are units of the x and y axes). Default label values are 0 for x and y, and center justification. \fIPostscript:\fR See the \fIpostscript\fB token below. \fIEps:\fR See the \fIeps\fB token below. \fINone\fR means that no mark will be plotted (this is useful for drawing lines). There are four types of \fIgeneral\fR marks, which work using the \fIgmarks\fB command described below. The four marktypes are \fIgeneral\fR, \fIgeneral_nf\fR, \fIgeneral_bez\fR, and \fIgeneral_bez_nf\fR. By default, a new mark is chosen for each curve. .TP \fBmarksize \|[\fIfloat\fB\|] \|[\fIfloat\fB\|]\fR This sets the size of the mark. The first \fB\|[\fIfloat\fB\|] \fR is the width of the mark, and the second is the height. Units are those of the x and y axes respectively, unless that axis is logarithmic, in which case the units are inches. Negative marksizes are allowed (e.g. a negative height will flip a \fItriangle\fR mark). The default mark size can be determined using the \fB\-p\fR option of \fBjgraph\fR .TP \fBmrotate \|[\fIfloat\fB\|]\fR This allows the user to rotate the mark \fB\|[\fIfloat\fB\|] \fR degrees. Default is zero. .TP \fBgray \|[\fIfloat\fB\|]\fR .br .ns .TP \fBcolor \|[\fIfloat\fB \fIfloat\fB \fIfloat\fB\|]\fR These specify either the grayness of the curve or its color. Values for \fIgray\fR should be from 0 (black) to 1 (white). Values for \fIcolor\fR\fB should also be from 0 to 1. They are RGB values, and thus define the amount of red, green and blue in the curve respectively. Specifying color nullifies the gray value, and vice versa. The default is \fIgray 0\fB .TP \fBfill \|[\fIfloat\fB\|]\fR .br .ns .TP \fBcfill \|[\fIfloat\fB\| \|\fIfloat\fB\| \|\fIfloat\fB\|]\fR This sets the filling of marks which define an area to fill (e.g. \fIbox\fR, \fIcircle\fR, \fIxbar\fR). \fIfill\fB defines a gray value, and \fIcfill\fB defines a color value (see \fIgray\fB and \fIcolor\fB above for a description of the units). The default is \fIfill 0\fB (black). .TP \fBpattern \fItoken\fB \|[\fIfloat\fB\|]\fR This defines the how the mark is to be filled. \fIToken\fR may be \fIsolid\fR (the default), \fIstripe\fR, or \fIestripe\fR. If \fIsolid\fR, then the \fIfloat\fR is ignored, and the mark is completely filled in with either the gray value defined by \fIfill\fR or the color value defined by \fIcfill\fR. If \fIstripe\fR, then the mark will be filled with stripes of either the gray value defined by \fIfill\fR or the color defined by \fIcfill\fR. The stripes will be rotated by \fIfloat\fR degrees. \fIEstripe\fR differs from \fIstripe\fR only in that \fIstripe\fR draws stripes on a white background, while \fIestripe\fR simply draws the stripes on an empty background. .TP \fBpoly\fR .br .ns .TP \fBnopoly\fR .br .ns .TP \fBpfill \|[\fIfloat\fB\|]\fR .br .ns .TP \fBpcfill \|[\fIfloat\fB\| \|\fIfloat\fB\| \|\fIfloat\fB\|]\fR .br .ns .TP \fBppattern \fItoken\fB \|[\fIfloat\fB\|]\fR \fIPoly\fB allows the user to make jgraph treat the curve as a closed polygon (or in the case of a bezier, a closed bezier curve). \fIpfill\fB, \fIpcfill\fB and \fIppattern\fB specify the filling of the polygon, and work like \fIfill\fB, \fIcfill\fB and \fIpattern\fB above. The default is \fInopoly\fB. .TP \fBgmarks \|[\|{\fIfloat\fB\|} \|{\fIfloat\fB\|}\|]*\fR \fIGmarks\fB is a way for the user to define custom marks. For each mark on \fI(x,y),\fB Each pair of \fB\|{\fIfloat_x\fB\|}, \|{\fIfloat_y\fB\|}, \fR will define a point on the mark (x + \fB(\fIfloat_x\fB * \fImarksize_x\fB / 2), y + (\fIfloat_y\fB * \fImarksize_y\fB / 2)).\fR Thus, for example, the \fIbox\fR mark could be defined as .PP .nf gmarks -1 -1 -1 1 1 1 1 -1 marktype general .fi .PP The marktypes \fIgeneral\fR, \fIgeneral_nf\fR, \fIgeneral_bez\fR, and \fIgeneral_bez_nf\fR, allow the gmarks points to define a closed polygon, a line, a closed bezier curve and a regular bezier curve respectively (the ``nf'' stands for ``non-filled''). .TP \fBpostscript : \|{\fIstring\fB\|}\fR .br .ns .TP \fBpostscript {\fItoken\fB\|}\fR This allows the user to enter direct postscript as a mark. It automatically sets the marktype to \fIpostscript\fR. If a string is entered, then that string is used as the mark in the jgraph output. If a token is entered, then that token must stand for a filename, which will be copied to the output once for every mark. The postscript will be set up so that when the string or file is put to the output, (0, 0) of the the axes is in the middle of the mark, it is rotated by \fImrotate\fB degrees, and scaled by (\fImarksize_x\fB / 2), \fImarksize_y\fB / 2). Thus, the \fIbox\fR mark could be defined as: .PP .nf postscript : 1 setlinewidth -1 -1 moveto -1 1 lineto \\ 1 1 lineto 1 -1 lineto -1 -1 lineto stroke .fi .PP If the \fImarksize_x\fB is defined to be (0, 0), then jgraph does no scaling. This is useful when the postscript has strings, and the user does not want the strings to be scaled. .TP \fBeps {\fItoken\fB\|}\fR This allows the user to include an encapsulated postscript file and treat it as a mark. It automatically sets the marktype to \fIeps\fB. The file will be scaled so that the bounding box is \fImarksize\fR units. Among other things, this allows the user to include whole jgraph files as marks. Please see ad.jgr, explained in HINTS AND EXAMPLE GRAPHS below for an example of this feature. .TP \fBlarrows\fR .br .ns .TP \fBrarrows\fR .br .ns .TP \fBnolarrows\fR .br .ns .TP \fBnorarrows\fR \fIRarrows\fB specifies to draw an arrow at the end of every line segment in the curve. \fILarrows\fB specifies to draw an arrow at the beginning of every line segment. The size of the arrows can be changed by using \fIasize.\fB The default is \fInolarrows\fB and \fInorarrows\fB. Arrows always go exactly to the point specified, with the exception of when the marktype is ``circle''. In this case, the arrow goes to the edge of the circle. .TP \fBlarrow\fR .br .ns .TP \fBrarrow\fR .br .ns .TP \fBnolarrow\fR .br .ns .TP \fBnorarrow\fR This is analgous to the above, except that with \fIlarrow\fB, the only arrow drawn is to the beginning of the first segment in the curve, and with \fIrarrow\fB, the only arrow drawn is to the end of the last segment. .TP \fBasize \|[\fIfloat\fB\|] \|[\fIfloat\fB\|]\fR This sets the size of the arrows. The first \fB\|[\fIfloat\fB\|] \fR controls the arrow's width. Its units are those of the x-axis. The second \fB\|[\fIfloat\fB\|] \fR controls the arrow's height. It is in the units of the y-axis. Use the -p option of jgraph to see the default values. .TP \fBafill \|[\fIfloat\fB\|]\fR .br .ns .TP \fBafill \|[\fIfloat\fB\|]\fR .br .ns .TP \fBapattern \fItoken\fB \|[\fIfloat\fB\|]\fR These control the grayness or color of arrowheads. \fIAfill\fB, \fIacfill\fB and \fIapattern\fB work in the same way as \fIfill\fB, \fIcfill\fB and \fIpattern\fB described above. The default is \fIafill 0\fB (black). .TP \fBlinetype \|[\fItoken\fB\|]\fR This defines the type of the line connecting the points. Valid entries are \fIsolid\fR, \fIdotted\fR, \fIdashed\fR, \fIlongdash\fR, \fIdotdash\fR, \fIdotdotdash\fR, \fIdotdotdashdash\fR, \fIgeneral\fR, and \fInone\fR. The default is \fInone\fR. \fIGeneral\fR lets the user define his own linetype using the \fIglines\fB command described below. Points are connected in the order in which they are inserted using the \fIpts\fB command. .TP \fBglines \|[\fIfloat\fB\|]*\fR This lets the user specify the exact dashing of a line. The format is as in postscript -- the first number is the length of the first dash, the second is the length of the space after the first dash, etc. For example, \fIdotdash\fB could be defined as ``\fIglines\fB 5 3 1 3''. .TP \fBlinethickness \|[\fIfloat\fB\|]\fR This defines the line thickness (in absolute postscript units) of the connecting line. Default = 1.0. .TP \fBbezier\fR .br .ns .TP \fBnobezier\fR .br .ns \fIBezier\fB specifies to use the curve's points to define successive bezier curves. The first point is the starting point. The next two are control points for the bezier curve and the next point is the ending point. If there is another bezier, this ending point is also the beginning point of the next curve. The next two points are again control points, and the next point is the ending point. Thus, a bezier must have a total of (3n + 1) points, where n is at least 1. In bezier curves, marks and arrows only apply to every third point. \fINobezier\fB is the default. .TP \fBclip\fR This specifies that this curve will be clipped -- that is, no points outside of the of axes will be plotted. .TP \fBnoclip\fR This turns off clipping. If clipping was specified for the entire graph, then \fInoclip\fB has no effect. \fINoclip\fB is the default. .TP \fBlabel\fR This edits the label of this curve for the purposed of drawing a legend. (see LABEL EDITING COMMANDS and LEGEND EDITING COMMANDS). Unless the legend entry is \fIcustom\fB, setting any label attribute except for the text itself will have no effect. .PD .RE .LP .TP .B LABEL EDITING COMMANDS The following commands are used for editing labels. Unless stated otherwise, the defaults are written with each command. Label editing terminates when one of these tokens is not given. .RS .TP \fB: \|{\fIstring\fB\|}\fR This sets the string of the label. If no string is set, the label will not be printed. .TP \fBx \|[\fIfloat\fB\|]\fR .br .ns .TP \fBy \|[\fIfloat\fB\|]\fR This sets the x or y coordinate of the label. Units are the units of the x and y axes respectively. .TP \fBfont \|[\fItoken\fB\|]\fR This sets the font. Default is usually ``Times-Roman''. .TP \fBfontsize \|[\fIfloat\fB\|]\fR This sets the fontsize in points. Default is usually 9. .TP \fBlinesep \|[\fIfloat\fB\|]\fR This sets the distance between lines in multilined labels. Units are points. The default is the fontsize. .TP \fBhjl\fR .br .ns .TP \fBhjc\fR .br .ns .TP \fBhjr\fR These set the horizontal justification to left, center, and right, respectively. Default = \fIhjc.\fB .TP \fBvjt\fR .br .ns .TP \fBvjc\fR .br .ns .TP \fBvjb\fR These set the vertical justification to top center, and bottom, respectively. Default = \fIvjb.\fB .TP \fBrotate \|[\fIfloat\fB\|]\fR This will rotate the string \fB\|[\fIfloat\fB\|] \fR degrees. The point of rotation is defined by the \fIvj\fB and \fIhj\fB commands. For example, to rotate 90 degrees about the center of a string, one would use \fIvjc hjc rotate 90.\fB .TP \fBlgray \|[\fIfloat\fB\|]\fR .br .ns .TP \fBlcolor \|[\fIfloat\fB \fIfloat\fB \fIfloat\fB\|]\fR These control the color or the grayness of the label. It works just as \fIgray\fB and \fIcolor\fB do for curves and axes. The default depends on the context. For example, for strings and the title, the default is black. For axis labels and hash labels, the default is the color of the axis. For text as marks, the default is the curve color. .PD .RE .LP .TP .B LEGEND EDITING COMMANDS These commands allow the user to alter the appearance of the legend. Legends are printed out for each curve having a non-null label. The legend entries are printed out in the order of ascending curve numbers. Legend editing terminates when a graph command or top level command is issued. In earlier versions of jgraph (before version 8.0), the characteristics of each legend entry were set in the label portion of the entry's curve. Thus, for example, if you wanted each entry's fontsize to be 18, you had to set it in each entry's curve. Now, default legend entry characteristics are set using the \fIdefaults\fB keyword. Unless a \fIcustom\fB legend is specified, these default values override any values set in the entry's curve. Thus, to get all entries to have a fontsize of 18, it must be set using \fIdefaults fontsize 18.\fB If legend editing seems cryptic, try the following example: .PP .nf newgraph newcurve marktype box linetype solid label : Solid box pts 0 0 1 1 2 1 3 1 newcurve marktype circle linetype dotted label : Dotted circle pts 0 1 1 2 2 2 3 2 newcurve marktype x linetype dashed label : Dashed x pts 0 2 1 3 2 3 3 3 legend defaults font Times-Italic fontsize 14 x 1.5 y 3.5 hjc vjb .fi .PP The legend of this graph should be centered over the top of the graph, and all legend entries should be 14pt Times-Italic. .RS .TP \fBon\fR .br .ns .TP \fBoff\R These turn printing of the legend on and off. The default is on (but, of course, if there are no curve labels defined, there will be no legend). .TP \fBlinelength \|[\fIfloat\fB\|]\fR This sets the length of the line printed in front of legend entries corresponding to curves which have lines. Units are those of the x axis, unless the x axis is logarithmic, in which case the units are inches. The default may be gotten using the \fB\-p\fR option. .TP \fBlinebreak \|[\fIfloat\fB\|]\fR This sets the vertical distance between individual legend entries. Units are those of the y axis, unless the y axis is logarithmic, in which case the units are inches. The default may be gotten using the \fB\-p\fR option. .TP \fBmidspace \|[\fIfloat\fB\|]\fR This sets one of two things. If any of the legend entries have lines in them, then this sets the distance between the end of the line and the legend entry text. Otherwise, this sets the distance between center of the mark and the legend entry text. Units are those of the x axis, unless the x axis is logarithmic, in which case the units are inches. The default may be gotten using the \fB\-p\fR option. .TP \fBdefaults\fR This lets the user change the attributes of all legend entries. The defaults are editted as a label (see LABEL EDITING COMMANDS). A few of the label fields have special meanings: The \fI:\fR field is ignored. The \fIx\fR and \fIy\fR fields define where the label will be printed. The \fIhj\fR and \fIvj\fR fields define the justification of the legend about the \fIx\fR and \fIy\fR point. Thus, if \fIx\fR is 10 and \fIy\fR is 15, and \fIhjc vjb\fR are specified, then the legend will be centered horizontally about x=10, and the bottom of the legend will be placed on y=15. This is analagous to label plotting. The \fIrotate\fR field is also analagous to label plotting. Defaults are as follows. \fIRotate\fR is 0. \fIfont\fR is ``Times-Roman'' and \fIfontsize\fR is 9. The color is black. Default justification is \fIhjl\fR and \fIvjc\fR. The default \fIx\fR and \fIy\fR values are set according to the \fIhj\fR and \fIvj\fR fields. See the \fB\-p\fR option. .TP \fBleft\fR .br .ns .TP \fIright\fB These will automatically produce a legend to the left or the right of the graph. \fILeft\fB is equivalent to \fIdefaults hjr vjc\fB and \fIright\fB is equivalent to \fIdefaults hjl vjc.\fB .TP \fBtop\fR .br .ns .TP \fBbottom\fR These will automatically produce a legend on the top or the bottom of the graph. \fITop\fB is equivalent to \fIdefaults hjl vjb\fB and \fIbottom\fB is equivalent to \fIdefaults hjl vjt.\fB .TP \fBx \|[\fIfloat\fB\|]\fR .br .ns .TP \fBy \|[\fIfloat\fB\|]\fR These are included mainly for backward compatability to earlier versions of jgraph. Setting \fIx\fB and \fIy\fB is equivalent to ``defaults x \fIfloat\fB y \fIfloat\fB hjl vjt'' .TP \fBcustom\fR This lets the user control where each individual legend entry goes. The values of the \fIdefaults\fB fields are ignored, and instead, the values of the curve's labels are used. All justifications have defined results, except for \fIhjc\fB. Similarly, rotation other than 0 is likely to produce bad effects. .PD .RE .LP .TP .B ADVANCED AXIS EDITING These are more advanced commands for editing an axis. This includes drawing explicit hash marks and labels, moving the hash marks, axes, and labels, not drawing the hash marks, labels, axes, etc. .RS .TP \fBgray \|[\fIfloat\fB\|]\fR .br .ns .TP \fBcolor \|[\fIfloat\fB \fIfloat\fB \fIfloat\fB\|]\fR These specify either the grayness of the axis or its color. Values for \fIgray\fB should be from 0 (black) to 1 (white). Values for \fIcolor\fB should also be from 0 to 1. They are RGB values, and thus define the amount of red, green and blue in the axis respectively. Specifying color nullifies the gray value, and vice versa. The default is \fIgray 0\fB. These values affect every part of the axis: the label, the hash marks and labels, the axis line and the grid lines. .TP \fBgrid_gray \|[\fIfloat\fB\|]\fR .br .ns .TP \fBgrid_color \|[\fIfloat\fB \fIfloat\fB \fIfloat\fB\|]\fR .br .ns .TP \fBmgrid_gray \|[\fIfloat\fB\|]\fR .br .ns .TP \fBmgrid_color \|[\fIfloat\fB \fIfloat\fB \fIfloat\fB\|]\fR These allow the user to define the grayness or color of the gridlines and the mgridlines to be different from those of the axis lines. The default \fIgrid_gray\fB and \fIgrid_color\fB is the same as the axis's \fIgray\fB and \fIcolor\fB. The default \fImgrid_gray\fB and \fImgrid_color\fB is the same as \fIgrid_gray\fB and \fIgrid_color\fB. .TP \fBhash_at \|[\fIfloat\fB\|]\fR Draw a hash mark at this point. No label is made for this hash mark. .TP \fBmhash_at \|[\fIfloat\fB\|]\fR Draw a minor hash mark at this point. .TP \fBhash_label\fR Edit a hash label (see HASH LABEL EDITING COMMANDS). .TP \fBhash_labels\fR Edit the default characteristics of the hash labels. This is so that the user can change the fontsize, justification, etc., of the hash labels. Editing \fIhash_labels \fB is just like editing normal labels (see LABEL EDITING COMMANDS), except that the \fI:,\fB \fIx,\fB and \fIy\fB values are all ignored. Defaults for hash labels are as follows: Fontsize=9, Font=``Times-Roman'', Justification is dependent on whether it is the x or y axis and whether \fIhash_scale\fB is positive or negative. .TP \fBhash_scale \|[\fIfloat\fB\|]\fR This is to change the size and orientation of the hash marks. Default = -1.0. Changing this to -2.0 will double the length of the hash marks. Changing this to +1.0 will make the hash marks come above or to the right of the axis. .TP \fBdraw_hash_marks_at \|[\fIfloat\fB\|]\fR By default, the hash marks are drawn either above or below the axis. This command changes where they are drawn. \fIHash_scale\fB still determines whether they are drawn above or below this point, and their size. .TP \fBdraw_hash_labels_at \|[\fIfloat\fB\|]\fR By default, the hash labels are drawn either above or below the hash marks (again, this is dependent on \fIhash_scale\fB). This command changes where they are drawn. Justification and fontsize, etc., can be changed with the \fIhash_labels\fB command. .TP \fBauto_hash_marks\fR .br .ns .TP \fBno_auto_hash_marks\fR This toggles whether or not \fBjgraph \fR will automatically create hash marks according to \fIhash,\fB \fImhash\fB and \fIshash\fB (or \fIlog_base\fB and \fImhash\fB for logarithmic axes). The default is \fIauto_hash_marks.\fB .TP \fBauto_hash_labels\fR .br .ns .TP \fBno_auto_hash_labels\fR This toggles whether or not \fBjgraph \fR will automatically create hash labels for the \fIauto_hash_marks\fB. Default = \fIauto_hash_labels\fB. .TP \fBdraw_axis\fR .br .ns .TP \fBno_draw_axis\fR This toggles whether or not the axis line is drawn. Default = \fIdraw_axis.\fB .TP \fBdraw_axis_label\fR .br .ns .TP \fBno_draw_axis_label\fR This toggles whether or not the axis label (as editted by the \fIlabel\fB command) is drawn. Default = \fIdraw_axis_label.\fB .TP \fBdraw_hash_marks\fR .br .ns .TP \fBno_draw_hash_marks\fR This toggles whether or not the hash marks (both automatic and those created with \fIhash_at\fB and \fImhash_at\fB) are drawn. Default = \fIdraw_hash_marks.\fB .TP \fBdraw_hash_labels\fR .br .ns .TP \fBno_draw_hash_labels\fR This toggles whether or not the hash labels are drawn. Default = \fIdraw_hash_labels.\fB .PD .RE .LP .TP .B HASH LABEL EDITING COMMANDS Hash labels are simply strings printed along the appropriate axis. As a default, they are printed at the place denoted by the most recent \fIhash_at\fB or \fImhash_at\fB for this axis, but this can be changed by the \fIat\fB command. If there has been no \fIhash_at\fB or \fImhash_at,\fB then an \fIat\fB command must be given, or there will be an error. Hash editing terminates when either one of these commands is not given. .RS .TP \fB: \|{\fIstring\fB\|}\fR This sets the string of the hash label (see \fBStrings\fR above under THE DESCRIPTION LANGUAGE). .TP \fBat \|[\fIfloat\fB\|]\fR This sets the location of the hash label along the current axis. .PD .RE .LP .SH FUNCTION PLOTTING AND OTHER NON-INHERENT FEATURES Although \fBjgraph \fR doesn't have any built-in functions for interpolation or function plotting, both can be effected in \fBjgraph \fR with a little outside help: .TP \fBFunction plotting\fR With the \fIinclude\fB and \fIshell\fB statement, it's easy to create a file of points of a function with a c or awk program, and include it into a graph. See the section HINTS AND EXAMPLE GRAPHS for an example of a sin graph produced in this manner. .TP \fBPoint interpolation\fR Point interpolation is essentially the same as function plotting, and therefore is left out of \fBjgraph. \fR The UNIX spline(1) routine is a simple way to get interpolation between points. See bailey.jgr described below. Maybe in a future release. .SH HINTS AND EXAMPLE GRAPHS \fBJgraph \fR should be able to draw any kind of scatter/line/bar graph that a user desires. To embellish the graph with extra text, axes, lines, etc., it is helpful to use \fIcopygraph.\fB The following example graphs show a few examples of different features of jgraph. They should be in the directory JGRAPH_DIR. .sp - acc.jgr is a simple bar graph. Acc.tex is also included to show how one can include the output of jgraph in a LaTeX file. To get this to work, you might have to substitute the entire pathname of the file acc.jps in the acc.tex file. .sp - g8.jgr is a simple graph with some plotted text. - g8col.jgr shows how to produce a color background -- it is the same as g8.jgr only all on a yellow background. - ebars.jgr is a simple graph with error bars. - sin.jgr shows how a sin function can be plotted using a simple c program to produce the sin wave. Moreover, this file shows a use of \fIcopygraph\fB to plot an extra x and y axis at the 0 point. .sp - sin1.jgr is a further extension of sin.jgr only with one x and y axis at 0, but with the axis labels at the left and the bottom of the graph. .sp - sin2.jgr is a different sin wave with a logarithmic x axis. .sp - sin3.jgr shows how a bizarre effect can be gotten by sorting the points in a different manner. .sp - bailey.jgr shows how to use the UNIX spline(1) routine to get interpolation between points. .sp - gpaper.jgr shows how you can get jgraph to easily produce graph paper. .sp - g9n10.jgr contains two graphs with complicated legends. It contains a description of how the legend was created. .sp - ex1.jgr and ex2.jgr are two examples which were figures 1 and two in an extended abstract for a paper about jgraph. .sp - mab2.jgr is a graph created by Matt Blaze which shows how a complicated output graph can be quite concisely and simply stated. In this graph, the x axis is a time line. It shows usage of the \fIhash_label\fB and \fIhash_labels\fB commands, as well as displaying how jgraph lets you extract data from output files with awk. .sp - nr.jgr is an example of a rather complicated bar graph with stripe-filled bars. It was created by Norman Ramsey. .sp - hypercube.jgr shows an interesting use of jgraph for picture-drawing. .sp - ad.jgr is an example which shows how one can include jgraph output as jgraph input. The file uses the \fIeps\fR token to include cube.jgr, a jgraph drawing of an Intel hypercube, and disk.jgr, a jgraph drawing of a disk, in a picture. .sp - alb.jgr is another use of jgraph for picture drawing. This file was created by an awk script which Adam Buchsbaum wrote to draw trees and graphs. .sp - wortman.jgr is a neat graph of processor utilization written by Dave Wortman for SIGPLAN '92. It was created by an awk script, which processed the data and emitted the jgraph. .sp To view these graphs, use jgraph -P, and view the resulting output file with \fIgs,\fB or a similar postscript viewer. To make a hard copy of these graphs, pipe the output of jgraph -P directly to \fIlpr.\fB .SH USING JGRAPH TO DRAW PICTURES As hypercube.jgr and alb.jgr show, jgraph can be used as a postscript preprocessor to make drawings. There are two advantages using jgraph to draw pictures instead of using standard drawing tools like \fIxfig\fB, \fIfigtool\fB, or \fIidraw\fB. The first is that with jgraph, you know exactly where strings, lines, boxes, etc, will end up, because you plot them explicitly. The second advantage is that for iterative drawings, with lots of patters, you can combine jgraph with awk or c or any other programming language to get complex output in a simple way. Most what-you-see-is-what-you-get (WYSIWYG) drawing tools cannot do this. The major disadvantage of using jgraph to draw pictures is that jgraph is not WYSIWYG. You have to set up axes and plot points, lines and strings. It's all a matter of taste. If you'd like to see some more complex pictures drawn with jgraph, as well as some hints to make picture-drawing easier, send me email (jsp@princeton.edu). .SH EMBEDDING THE OUTPUT IN LATEX I haven't read the manuals, but the way I've been loading these files into LaTeX has been as follows: .PP .nf 1. Toward the beginning of my LaTeX file, I've had ``\\input{psfig}'' 2. Where I've wanted my file, I've put: \\begin{figure} \\centerline{\\psfig{figure=/}} \\end{figure} Some versions of dvips or dvi2ps work without the path-name. Others require that the path-name be present. 3. After running latex on the file, do lpr -d file.dvi 4. If that doesn't work, try dvips-ing the file and printing the postscript. .fi .PP .SH BUGS Logarithmic axes cannot contain points <= 0. If I have enough complaints to convince me that this is a bug, I'll try to fix it. .sp There is no real way to make the axes such that they decrease from left to right or low to high -- or at least not without writing your own hash labels. .sp There may well be loads of other bugs. Send to jsp@princeton.edu. .sp This is $Revision: 8.3 $. jgraph/jgraph.c0000755005471000040510000002271013207316747012605 0ustar plankloci/* jgraph.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/jgraph.c,v $ * $Revision: 8.5 $ * $Date: 2017/11/28 17:33:27 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #ifdef VMS #include #endif #include "jgraph.h" int NMARKTYPES = 17; int NORMALMARKTYPES = 6; char *MARKTYPESTRS[] = { "circle", "box", "diamond", "triangle", "x", "cross", "ellipse", "general", "general_nf", "general_bez", "general_bez_nf", "postscript", "eps", "xbar", "ybar", "none", "text"}; char MARKTYPES[] = { 'o', 'b', 'd', 't', 'x', 'c', 'e', 'g', 'G', 'Z', 'B', 'p', 'E', 'X', 'Y', 'n', 'l' }; int NPATTERNS = 3; char *PATTERNS[] = { "solid", "stripe", "estripe" }; char PTYPES[] = { 's', '/', 'e' }; Label new_label() { Label l; int i; l = (Label) malloc (sizeof(struct label)); l->label = CNULL; l->hj = 'c'; l->vj = 'b'; l->font = "Times-Roman"; l->fontsize = 9.0; l->rotate = 0; l->graytype = 'n'; for (i = 0; i < 3; i++) l->gray[i] = 0.0; l->linesep = FSIG; return l; } Curve new_curve(c, num) Curve c; int num; { Curve new_c; int i; new_c = (Curve) get_node((List) c); new_c->num = num; new_c->l = new_label(); new_c->l->vj = 't'; new_c->lmark = new_label(); new_c->lmark->hj = 'c'; new_c->lmark->vj = 'c'; new_c->clip = 0; new_c->pattern = 's'; new_c->parg = FSIG; new_c->apattern = 's'; new_c->aparg = FSIG; new_c->ppattern = 's'; new_c->pparg = FSIG; new_c->graytype = 'n'; for (i = 0; i < 3; i++) new_c->gray[i] = 0.0; new_c->afilltype = 'g'; for (i = 0; i < 3; i++) new_c->afill[i] = 0.0; new_c->pts = (Point) make_list(sizeof(struct point)); new_c->yepts = (Point) make_list(sizeof(struct point)); new_c->xepts = (Point) make_list(sizeof(struct point)); new_c->npts = 0; new_c->gen_linetype = (Flist) make_list(sizeof(struct flist)); new_c->marktype = MARKTYPES[num % NORMALMARKTYPES]; new_c->linetype = '0'; new_c->linethick = 1.0; new_c->marksize[0] = FSIG; new_c->marksize[1] = FSIG; new_c->mrotate = 0.0; new_c->general_marks = (Point) make_list(sizeof(struct point)); new_c->filltype = 'n'; for (i = 0; i < 3; i++) new_c->fill[i] = 0.0; new_c->pfilltype = 'n'; for (i = 0; i < 3; i++) new_c->pfill[i] = 0.0; new_c->poly = 0; new_c->rarrow = 0; new_c->larrow = 0; new_c->rarrows = 0; new_c->larrows = 0; new_c->asize[0] = FSIG; new_c->asize[1] = FSIG; new_c->bezier = 0; new_c->postscript = CNULL; new_c->postfile = 0; new_c->eps = CNULL; prio_insert(new_c, c, 0); return new_c; } Curve new_line(c, num) Curve c; int num; { Curve new_c; new_c = new_curve(c, num); new_c->linetype = 's'; new_c->marktype = 'n'; return new_c; } Curve get_curve(c, num) Curve c; int num; { Curve new_c; for(new_c = last(c); new_c != nil(c) && new_c->num > num; new_c = prev(new_c)); if (new_c == nil(c) || new_c->num < num) return new_curve(c, num); return new_c; } Axis new_axis(is_x) int is_x; { int i; Axis a; a = (Axis) malloc (sizeof(struct axis)); a->label = new_label(); a->label->x = FSIG; a->label->y = FSIG; a->label->font = "Times-Bold"; a->label->fontsize = 10.0; a->label->rotate = FSIG; a->label->hj = '0'; a->label->vj = '0'; a->size = 3.0; a->max = FSIG; a->min = FSIG; a->pmax = FSIG; a->pmin = FSIG; a->hash_interval = -1.0; a->log_base = 10.0; a->minor_hashes = -1; a->precision = -1; a->hl = new_label(); a->hl->label = ""; a->hl->font = "Times-Roman"; a->hl->fontsize = 9.0; a->hl->rotate = 0.0; a->hl->hj = '0'; a->hl->vj = '0'; a->hash_format = 'f'; a->draw_at = FSIG; a->draw_hash_marks_at = FSIG; a->draw_hash_labels_at = FSIG; a->draw_hash_labels = 1; a->draw_axis_line = 1; a->draw_hash_marks = 1; a->draw_axis_label = 1; a->auto_hash_labels = 1; a->auto_hash_marks = 1; a->start_given = 0; a->hash_scale = -1.0; a->grid_lines = 0; a->mgrid_lines = 0; a->graytype = 'n'; for (i = 0; i < 3; i++) a->gray[i] = 0.0; a->gr_graytype = '0'; for (i = 0; i < 3; i++) a->gr_gray[i] = 0.0; a->mgr_graytype = '0'; for (i = 0; i < 3; i++) a->mgr_gray[i] = 0.0; a->is_x = is_x; a->is_lg = 0; a->hash_labels = (String) make_list (sizeof(struct string)); a->hash_lines = (Hash) make_list (sizeof(struct hash)); return a; } Legend new_legend() { Legend l; l = (Legend) malloc (sizeof(struct legend)); l->linelength = FSIG; l->linebreak = FSIG; l->midspace = FSIG; l->type = 'u'; l->l = new_label(); l->l->label = ""; l->l->hj = 'l'; l->l->vj = 'c'; l->l->x = FSIG; l->l->y = FSIG; return l; } Label new_title() { Label t; t = new_label(); t->x = FSIG; t->y = FSIG; t->rotate = 0.0; t->hj = 'c'; t->vj = 't'; t->fontsize = 12.0; return t; } String new_string(s, num) String s; int num; { String new_s; new_s = (String) get_node((List) s); new_s->num = num; new_s->s = new_label(); prio_insert(new_s, s, 0); return new_s; } String get_string(s, num) String s; int num; { String new_s; for(new_s = last(s); new_s != nil(s) && new_s->num > num; new_s = prev(new_s)); if (new_s == nil(s) || new_s->num < num) return new_string(s, num); return new_s; } /* Default new_default() { Default new_d; new_d = (Default) malloc (sizeof(default)); new_d->rotate = FSIG; new_d->fontsize = FSIG; new_d->general_marks = GMNULL; new_d->fill = FSIG; new_d->linethick = FSIG; new_d->font = CNULL; new_d->hj = '!'; new_d->vj = '!'; new_d->marktype = '!'; new_d->linetype = '!'; new_d->marksize[0] = FSIG; new_d->marksize[1] = FSIG; } */ Graph new_graph(gs, num) Graph gs; int num; { Graph g; g = (Graph) get_node((List) gs); g->num = num; g->xminval = 0.0; g->yminval = 0.0; g->xmaxval = 0.0; g->ymaxval = 0.0; g->x_axis = new_axis(1); g->y_axis = new_axis(0); g->x_translate = 0.0; g->y_translate = 0.0; g->curves = (Curve) make_list(sizeof(struct curve)); g->strings = (String) make_list(sizeof(struct string)); g->title = new_title(); g->clip = 0; g->border = 0; g->legend = new_legend(); /* g->def = new_default(); */ prio_insert(g, gs, 0); return g; } Graph get_graph(g, num) Graph g; int num; { Graph new_g; for(new_g = last(g); new_g != nil(g) && new_g->num > num; new_g = prev(new_g)); if (new_g == nil(g) || new_g->num < num) return new_graph(g, num); return new_g; } void new_graphs(gs) Graphs gs; { Graphs newg; newg = (Graphs) get_node((List) gs); newg->g = (Graph) make_list(sizeof(struct graph)); newg->height = 0.0; newg->width = 0.0; newg->bb[0] = ISIG; newg->bb[1] = ISIG; newg->bb[2] = ISIG; newg->bb[3] = ISIG; newg->preamble = CNULL; newg->epilogue = CNULL; newg->prefile = 0; newg->epifile = 0; if (first(gs) == nil(gs)) newg->page = 1; else newg->page = last(gs)->page+1; insert((List) newg, (List) gs); } int main(argc, argv) int argc; char **argv; { Graphs gs; int i; int show, pp; int landscape; int comments; int nfiles; #ifdef VMS IOSTREAM = stdin; /* for token.c -hdd */ #endif show = 0; pp = 0; comments = 0; landscape = 0; nfiles = 0; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-p") == 0) show = 1; else if (strcmp(argv[i], "-comments") == 0) comments = 1; else if (strcmp(argv[i], "-P") == 0) pp = 1; else if (strcmp(argv[i], "-L") == 0) landscape = 1; else { nfiles++; set_input_file(argv[i]); } } if (nfiles == 0) set_input_file(CNULL); gs = (Graphs) make_list(sizeof(struct graphs)); set_comment(comments); new_graphs(gs); edit_graphs(gs); process_graphs(gs); if (show) show_graphs(gs); else draw_graphs(gs, pp, landscape); exit(0); return 0; } jgraph/jgraph.com0000777005471000040510000000254111447702136013140 0ustar plankloci$! JGRAPH.COM: Execute jgraph on VMS. $ SAVE_VER = 'F$VERIFY( F$TRNLNM( "JGRAPH_VERIFY"))' $ ! How to use this procedure: $ ! (1) define a symbol to execute the command file $ ! $ JGRAPH :== @dev:[directory]JGRAPH.COM $ ! We will assume that both this jgraph.com and jgraph.exe reside $ ! in dev:[directory]. $ ! (2) Then, to run the program with say the HYPERCUBE.JGR file, $ ! $ JGRAPH HYPERCUBE ! (Yes you can leave off the .JGR extension) $ ! To generate a stand-alone PostScript file that can be sent directly $ ! to the printer, use: $ ! $ JGRAPH HYPERCUBE "-P" $ ! or simply $ ! $ JGRAPH HYPERCUBE -P $ ! If you really want lowercase to reprint input in expanded form: $ ! $ JGRAPH HYPERCUBE "-p" $ ! The resulting output file will have a ".jps" extension. $! $ ON ERROR THEN GOTO EXIT $ ON CONTROL_Y THEN GOTO EXIT $! $L1: $ P1 = F$SEARCH( F$PARSE( P1, ".JGR")) $ IF P1 .NES. "" THEN GOTO L2 $ INQUIRE /LOCAL P1 "Input File : " $ GOTO L1 $L2: $ JPS_FILE = F$PARSE( P1,,, "NAME") + ".JPS" $ THIS_FILE = F$ENVIRONMENT("PROCEDURE") $ HERE = F$PARSE(THIS_FILE,,,"DEVICE",) + F$PARSE(THIS_FILE,,,"DIRECTORY",) $ RUN_JGRAPH := $'HERE'JGRAPH $! $ TMP = F$VERIFY( 1) $ RUN_JGRAPH <'p1' >'jps_file' "''P2'" $ $status = $STATUS $ TMP = 'F$VERIFY( TMP) $! $EXIT: $ EXIT $status + 0*F$VERIFY( SAVE_VER) jgraph/jgraph.h0000755005471000040510000001346012037030664012603 0ustar plankloci/* jgraph.h * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/jgraph.h,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "list.h" #include "prio_list.h" #include #define PPI 120 #define FPPI 120.0 #define CPI 72.0 #define FCPI 72.0 #define CNULL ((char *)0) #define GMNULL ((Point)0) #define FSIG -10010.0 #define ISIG -11111111 #define HASH_SIZE 5.0 #define MHASH_SIZE 2.0 typedef struct point { struct point *flink; struct point *blink; float x; float y; char e; /* 'x' for x_ebars, 'y' for y_ebars, 'p' for neither */ } *Point; typedef struct flist { struct flist *flink; struct flist *blink; float f; } *Flist; typedef struct label { char *label; float x; float y; float rotate; char *font; float fontsize; char hj; char vj; float gray[3]; char graytype; float linesep; float xmin; float xmax; float ymin; float ymax; int nlines; } *Label; typedef struct curve { struct curve *flink; struct curve *blink; int num; Label l; Label lmark; Point pts; Point yepts; Point xepts; int npts; Point general_marks; float marksize[2]; float fill[3]; float gray[3]; float afill[3]; float pfill[3]; float linethick; float mrotate; Flist gen_linetype; char graytype ; char filltype ; char afilltype; char pfilltype; char pattern; float parg; char apattern; float aparg; char ppattern; float pparg; char marktype; char linetype; char *postscript; char *eps; int postfile; int rarrow; int larrow; int rarrows; int larrows; int bezier; int poly; float asize[2]; int clip; } *Curve; typedef struct string { struct string *flink; struct string *blink; int num; Label s; } *String; typedef struct hash { struct hash *flink; struct hash *blink; float loc; float size; int major; } *Hash; typedef struct deflt { float rotate; float fontsize; Point general_marks; float fill; float linethick; float marksize[2]; char *font; char hj; char vj; char marktype; } *Default; typedef struct axis { Label label; Label hl; float max; float min; float pmax; float pmin; float logmin; float logfactor; float size; float psize; float factor; float hash_interval; float hash_start; float hash_scale; float log_base; float draw_hash_marks_at; float draw_hash_labels_at; float draw_at; float gray[3]; char graytype; float gr_gray[3]; char gr_graytype; float mgr_gray[3]; char mgr_graytype; char hash_format; int grid_lines; int mgrid_lines; int draw_hash_labels; int draw_axis_line; int draw_hash_marks; int draw_axis_label; int auto_hash_labels; int auto_hash_marks; int minor_hashes; int precision; int start_given; String hash_labels; Hash hash_lines; int is_x; int is_lg; } *Axis; typedef struct legend { float linelength; float linebreak; int anylines; float midspace; char type; /* 'n' = off, 'u' = userdefined (use Label), 'c' = custom */ Label l; } *Legend; typedef struct graph { struct graph *flink; struct graph *blink; int num; float xminval; float yminval; float xmaxval; float ymaxval; float x_translate; float y_translate; Axis x_axis; Axis y_axis; Curve curves; Legend legend; String strings; Label title; int clip; int border; Default def; } *Graph; typedef struct graphs { struct graphs *flink; struct graphs *blink; Graph g; float height; float width; int bb[4]; /* Bounding box */ char *preamble; char *epilogue; int prefile; int epifile; int page; } *Graphs; extern float ctop(); extern float disttop(); extern float intop(); extern float ptoc(); extern float ptodist(); extern char *getlabel(); extern char *getmultiline(); /* Stuff defined in jgraph.c */ extern Curve new_line(); extern Curve new_curve(); extern Curve get_curve(); extern Graph new_graph(); extern Graph get_graph(); extern String new_string(); extern String get_string(); extern Label new_label(); extern char *MARKTYPESTRS[]; extern char MARKTYPES[]; extern int NMARKTYPES; extern int NORMALMARKTYPES; extern char *PATTERNS[]; extern char PTYPES[]; extern int NPATTERNS; jgraph/jmalloc.c0000755005471000040510000002650111447702136012750 0ustar plankloci#include #include #include #include #include /* Each memory block has 8 extra 32-bit values associated with it. If malloc returns the pointer p to you, the state really looks like: jmal(p)------> |------------------------------------------------------------| | flink (next malloc block in absolute order) | |------------------------------------------------------------| | blink (prev malloc block in absolute order) | |------------------------------------------------------------| | nextfree (next free malloc block - no particular order) | |------------------------------------------------------------| | prevfree (next free malloc block - no particular order) | |------------------------------------------------------------| | size (size of memory allocated) | |------------------------------------------------------------| | cs2 (pointer to the second checksum, which is right after | | the mem block) | |------------------------------------------------------------| | cs (checksum right before mem block. used to determine if | | there is an error of writing around the memory block) | p------------> |------------------------------------------------------------| | space: the memory block | | ... | | ... | |------------------------------------------------------------| | the second checksum | |------------------------------------------------------------| */ typedef struct jmalloc { struct jmalloc *flink; struct jmalloc *blink; struct jmalloc *nextfree; struct jmalloc *prevfree; int size; int *cs2; int cs; char *space; } *Jmalloc; #define JMSZ (sizeof(struct jmalloc)) #define PTSZ (sizeof(char *)) /* Also assuming its > sizeof int */ #define CHUNK_SIZE (16384 - JMSZ) /* 16K */ #define MASK 0x17826a9b #define JNULL ((Jmalloc) 0) static struct jmalloc j_head; static Jmalloc memlist; static int nfree = 0; static int nblocks = 0; static int init = 0; static Jmalloc start; static int free_called = 0; static int malloc_called = 0; static int used_mem = 0; static int free_mem = 0; static int used_blocks = 0; static int free_blocks = 0; #define cksum(p) (((int) &(p->cs)) - 1) #define jloc(l) ((char *) (&l->space)) #define jmal(l) ((Jmalloc) (((char *)l) - JMSZ + PTSZ)) #define isfree(l) (l->nextfree != JNULL) #define do_init() \ if (!init) {\ memlist = &j_head;\ memlist->flink = memlist;\ memlist->blink = memlist;\ memlist->nextfree = memlist;\ memlist->prevfree = memlist;\ memlist->size = 0;\ memlist->cs = cksum(memlist);\ memlist->cs2 = &memlist->cs;\ memlist->space = (char *) 0;\ start = memlist;\ init = 1;\ } dump_core() { memlist->space[0] = 0; } char *set_used(l) Jmalloc l; { start = l->nextfree; l->prevfree->nextfree = l->nextfree; l->nextfree->prevfree = l->prevfree; l->prevfree = JNULL; l->nextfree = JNULL; used_mem += l->size; free_mem -= l->size; used_blocks++; free_blocks--; return jloc(l); } void *malloc(size) int size; { int redo; int done; Jmalloc l; char *tmp; Jmalloc newl; int newsize; do_init(); malloc_called++; if (size <= 0) { fprintf(stderr, "Error: Malloc(%d) called\n", size); /* Dump core */ dump_core(); } if (size % PTSZ != 0) size += PTSZ - (size % PTSZ); done = 0; l = start; while(!done) { if (l->size >= size) { done = 1; redo = 0; } else { l = l->nextfree; done = (l == start); redo = done; } } if (redo) { if (size > CHUNK_SIZE) newsize = size + JMSZ; else newsize = CHUNK_SIZE + JMSZ; newl = (Jmalloc) sbrk(newsize); while (newl == (Jmalloc) -1 && newsize > size + JMSZ) { newsize /= 2; if (newsize < size + JMSZ) newsize = size + JMSZ; newl = (Jmalloc) sbrk(newsize); } if (newl == (Jmalloc) -1) { /* fprintf(stderr, "Jmalloc: out of memory\n"); */ /* fprintf(stderr, "Used bytes = %d, Free bytes = %d\n", */ /* used_mem, free_mem); */ /* fprintf(stderr, "Trying to get %d bytes (chunk of %d)\n", */ /* size, newsize); */ return NULL; } newl->flink = memlist; newl->blink = memlist->blink; newl->flink->blink = newl; newl->blink->flink = newl; newl->nextfree = memlist; newl->prevfree = memlist->prevfree; newl->nextfree->prevfree = newl; newl->prevfree->nextfree = newl; newl->size = ((char *) sbrk(0)) - jloc(newl) - PTSZ; free_mem += newl->size; newl->cs = cksum(newl); newl->cs2 = ((int *) (jloc(newl) + newl->size)); *(newl->cs2) = cksum(newl); if(newl->size < size) { fprintf(stderr, "Newl->size(%d) < size(%d)\n", newl->size, size); exit(1); } free_blocks++; l = newl; } if (l->size - size < JMSZ) { return set_used(l); } else { tmp = jloc(l); newl = (Jmalloc) (tmp + size + PTSZ); newl->flink = l->flink; newl->blink = l; newl->flink->blink = newl; newl->blink->flink = newl; newl->nextfree = l->nextfree; newl->prevfree = l; newl->nextfree->prevfree = newl; newl->prevfree->nextfree = newl; newl->size = l->size - size - JMSZ; newl->cs = cksum(newl); newl->cs2 = (int *) (jloc(newl) + newl->size); *(newl->cs2) = cksum(newl); free_mem += size + newl->size - l->size; free_blocks++; l->size = size; l->cs2 = ((int *) (jloc(l) + l->size)); *(l->cs2) = cksum(l); return set_used(l); } } jmalloc_print_mem() { Jmalloc l; int done; char *bufs[100]; int sizes[100]; int mc; int fc; int i, j; do_init(); mc = malloc_called; fc = free_called; if (jmal(jloc(memlist)) != memlist) { fprintf(stderr, "TROUBLE: memlist=0x%x, jmal(jloc(memlist))=0x%x)\n", memlist, jmal(jloc(memlist))); exit(1); } done = 0; l = start; i = 0; while (!done) { if (cksum(l) != l->cs) { printf("Memory location 0x%x corrupted\n", jloc(l)); exit(1); } else if (cksum(l) != *(l->cs2)) { printf("Memory location 0x%x corrupted\n", jloc(l)); exit(1); } bufs[i] = jloc(l); sizes[i] = l->size; if (l->nextfree == 0) sizes[i] = -sizes[i]; i++; l = l->flink; done = ((l == start) || i >= 100); } printf("Malloc called %d times\n", mc); printf("Free called %d times\n", fc); for (j = 0; j < i; j++) { printf("Loc = 0x%x, size = %d, free = %d\n", bufs[j], (sizes[j] > 0) ? sizes[j] : -sizes[j], (sizes[j] >= 0)); } } jmalloc_check_mem() { Jmalloc l; int done; done = 0; l = start; while (!done) { if (cksum(l) != l->cs) { fprintf(stderr, "Memory chunk violated: 0x%x: %s 0x%x. %s 0x%x\n", jloc(l), "Checksum 1 is ", l->cs, "It should be", cksum(l)); dump_core(); } else if (cksum(l) != *(l->cs2)) { fprintf(stderr, "Memory chunk violated: 0x%x: %s 0x%x. %s 0x%x\n", jloc(l), "Checksum 2 is ", *(l->cs2), "It should be", cksum(l)); dump_core(); } l = l->flink; done = (l == start); } } void free(loc) char *loc; { Jmalloc l; Jmalloc pl, nl; do_init(); free_called++; l = jmal(loc); if (cksum(l) != l->cs) { fprintf(stderr, "Error on free: memory chunk violated: 0x%x\n", loc); dump_core(); } else if (cksum(l) != *(l->cs2)) { fprintf(stderr, "Error on free: memory chunk violated: 0x%x\n", loc); dump_core(); } used_mem -= l->size; free_mem += l->size; free_blocks++; used_blocks--; pl = l->blink; nl = l->flink; if (isfree(pl) && (jloc(pl)+pl->size + PTSZ == (char *) l)) { free_mem += JMSZ; pl->size += l->size + JMSZ; pl->flink = nl; pl->flink->blink = pl; l = pl; free_blocks--; } else { l->prevfree = start; l->nextfree = start->nextfree; l->nextfree->prevfree = l; l->prevfree->nextfree = l; } if (isfree(nl) && jloc(l)+l->size + PTSZ == (char *) nl) { free_mem += JMSZ; l->size += nl->size + JMSZ; l->flink = nl->flink; l->flink->blink = l; free_blocks--; nl->nextfree->prevfree = nl->prevfree; nl->prevfree->nextfree = nl->nextfree; } start = l; } void *realloc(loc, size) char *loc; int size; { Jmalloc l; Jmalloc l2, nl; char *loc2; int i; Jmalloc newl; do_init(); if (size <= 0) { fprintf(stderr, "Error: Malloc(%d) called\n", size); /* Dump core */ dump_core(); } if (size % PTSZ != 0) size += PTSZ - (size % PTSZ); l = jmal(loc); if (cksum(l) != l->cs) { fprintf(stderr, "Error on realloc: memory chunk violated: 0x%x\n", loc); dump_core(); } else if (cksum(l) != *(l->cs2)) { fprintf(stderr, "Error on realloc: memory chunk violated: 0x%x\n", loc); dump_core(); } if (size < l->size) { if (l->size - size < JMSZ + 4) return loc; newl = (Jmalloc) (loc + size + PTSZ); newl->flink = l->flink; newl->blink = l; newl->flink->blink = newl; newl->blink->flink = newl; newl->nextfree = start->nextfree; newl->prevfree = start; newl->nextfree->prevfree = newl; newl->prevfree->nextfree = newl; newl->size = l->size - size - JMSZ; newl->cs = cksum(newl); newl->cs2 = (int *) (jloc(newl) + newl->size); *(newl->cs2) = cksum(newl); used_mem += size - l->size; free_mem += newl->size; free_blocks++; l->size = size; l->cs2 = ((int *) (jloc(l) + l->size)); *(l->cs2) = cksum(l); start = newl; return loc; } nl = l->flink; if (isfree(nl) && (jloc(l)+l->size + PTSZ == (char *) nl) && l->size + JMSZ + nl->size >= size) { start = nl; i = size - l->size - JMSZ; if (i < 0) i = 4; loc2 = malloc(i); l2 = jmal(loc2); if (l2 != nl) { fprintf(stderr, "Realloc internal error: l2 != nl\n"); dump_core(); } nl->flink->blink = nl->blink; nl->blink->flink = nl->flink; free_mem -= nl->size; used_mem += nl->size + JMSZ; free_blocks--; l->size += nl->size + JMSZ; l->cs2 = ((int *) (jloc(l) + l->size)); *(l->cs2) = cksum(l); return loc; } else { loc2 = malloc(size); for (i = 0; i < l->size; i++) loc2[i] = loc[i]; free(loc); return loc2; } } char *calloc(nelem, elsize) int nelem, elsize; { int *iptr; char *ptr; int sz; int i; sz = nelem*elsize; ptr = malloc(sz); iptr = (int *) ptr; for (i = 0; i < sz/sizeof(int); i++) iptr[i] = 0; for (i = i * sizeof(int); i < sz; i++) ptr[i] = 0; return ptr; } int mallopt(cmd, value) int cmd, value; { fprintf(stderr, "Mallopt is not defined...\n"); exit(1); } jmalloc_usage() { fprintf(stderr, "Jmalloc: %d %s %d block%s. %d %s %d block%s\n", used_mem, "bytes used in", used_blocks, (used_blocks == 1) ? "" : "s", free_mem, "bytes free in", free_blocks, (free_blocks == 1) ? "" : "s"); } jgraph/License.txt0000755005471000040510000000274612037027044013305 0ustar planklociCopyright (c) 2012, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. jgraph/list.c0000755005471000040510000000756413207316747012317 0ustar plankloci/* list.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/list.c,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include /* Basic includes and definitions */ #include #include #include #include "list.h" #define boolean int #define TRUE 1 #define FALSE 0 /*---------------------------------------------------------------------* * PROCEDURES FOR MANIPULATING DOUBLY LINKED LISTS * Each list contains a sentinal node, so that * the first item in list l is l->flink. If l is * empty, then l->flink = l->blink = l. * The sentinal contains extra information so that these operations * can work on lists of any size and type. * Memory management is done explicitly to avoid the slowness of * malloc and free. The node size and the free list are contained * in the sentinal node. *---------------------------------------------------------------------*/ typedef struct int_list { /* Information held in the sentinal node */ struct int_list *flink; struct int_list *blink; int size; List free_list; } *Int_list; void insert(List item, List list) /* Inserts to the end of a list */ { List last_node; last_node = list->blink; list->blink = item; last_node->flink = item; item->blink = last_node; item->flink = list; } void delete_item(List item) /* Deletes an arbitrary iterm */ { item->flink->blink = item->blink; item->blink->flink = item->flink; } List make_list(int size) { Int_list l; l = (Int_list) malloc(sizeof(struct int_list)); l->flink = l; l->blink = l; l->size = size; l->free_list = (List) malloc (sizeof(struct list)); l->free_list->flink = l->free_list; return (List) l; } List get_node(List list) /* Allocates a node to be inserted into the list */ { Int_list l; List to_return; l = (Int_list) list; if (l->free_list->flink == l->free_list) { return (List) malloc(l->size); } else { to_return = l->free_list; l->free_list = to_return->flink; return to_return; } } void free_node(List node, List list) /* Deallocates a node from the list */ { Int_list l; l = (Int_list) list; node->flink = l->free_list; l->free_list = node; } jgraph/list.h0000755005471000040510000000530612037030664012303 0ustar plankloci/* list.h * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/list.h,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* This is the header file for the list manipulation routines in list.c. * Any struct can be turned into a list as long as its first two fields are * flink and blink. */ typedef struct list { struct list *flink; struct list *blink; } *List; /* Nil, first, next, and prev are macro expansions for list traversal * primitives. */ #define nil(l) (l) #define first(l) (l->flink) #define last(l) (l->blink) #define next(n) (n->flink) #define prev(n) (n->blink) /* These are the routines for manipluating lists */ void insert(List item, List list); /* Inserts a node to the end of a list */ void delete_item(List node); /* Deletes an arbitrary node */ List make_list(int node_size); /* Creates a new list */ List get_node(List list); /* Allocates a node to be inserted into the list */ void free_node(List node, List list); /* Deallocates a node from the list */ jgraph/mab2.jgr0000777005471000040510000000100011447702136012477 0ustar planklocinewgraph legend x 15 y 6000 newcurve pts shell : awk -F'|' '{printf "%d %d\n",NR,($2/2)}' mab2.times linetype dotted marktype none label : Writes newcurve pts shell : awk -F'|' '{printf "%d %d\n", NR,($3+$4)/2}' mab2.times linetype solid marktype none label : Reads (all) yaxis label : Reads/Writes per hour xaxis size 4.75 no_auto_hash_labels no_auto_hash_marks hash_labels rotate -90 vjt hjl shell : awk -F'|' '(NR%3 == 1) {printf "hash_at %d hash_label at %d : %s\n",NR,NR,$1}' mab2.times hash_label at 1 : jgraph/mab2.times0000777005471000040510000000500711447702136013051 0ustar planklociThu 00:00 | 746 | 397 | 787 Thu 02:00 | 625 | 85 | 1066 Thu 04:00 | 844 | 170 | 903 Thu 06:00 | 779 | 169 | 638 Thu 08:00 | 1168 | 978 | 3219 Thu 10:00 | 2269 | 1599 | 5515 Thu 12:00 | 1983 | 1963 | 5478 Thu 14:00 | 2822 | 2077 | 7526 Thu 16:00 | 1926 | 1730 | 5588 Thu 18:00 | 1256 | 904 | 2559 Thu 20:00 | 1110 | 672 | 2728 Thu 22:00 | 1699 | 1414 | 4502 Fri 00:00 | 919 | 418 | 1714 Fri 02:00 | 793 | 131 | 1778 Fri 04:00 | 785 | 114 | 1419 Fri 06:00 | 685 | 84 | 285 Fri 08:00 | 1382 | 795 | 3309 Fri 10:00 | 2186 | 1485 | 5984 Fri 12:00 | 1425 | 1212 | 4021 Fri 14:00 | 1831 | 1884 | 4378 Fri 16:00 | 1736 | 1243 | 4205 Fri 18:00 | 1231 | 506 | 2768 Fri 20:00 | 915 | 273 | 1224 Fri 22:00 | 987 | 456 | 1411 Sat 00:00 | 668 | 138 | 540 Sat 02:00 | 766 | 120 | 1342 Sat 04:00 | 781 | 129 | 648 Sat 06:00 | 725 | 90 | 431 Sat 08:00 | 687 | 169 | 519 Sat 10:00 | 768 | 268 | 1013 Sat 12:00 | 1513 | 977 | 1965 Sat 14:00 | 1294 | 584 | 2318 Sat 16:00 | 1337 | 699 | 2491 Sat 18:00 | 1191 | 479 | 1662 Sat 20:00 | 1249 | 497 | 1470 Sat 22:00 | 1056 | 538 | 1467 Sun 00:00 | 808 | 413 | 627 Sun 02:00 | 914 | 97 | 1331 Sun 04:00 | 654 | 60 | 493 Sun 06:00 | 657 | 51 | 453 Sun 08:00 | 780 | 216 | 755 Sun 10:00 | 945 | 429 | 1304 Sun 12:00 | 698 | 261 | 884 Sun 14:00 | 345 | 135 | 684 Sun 16:00 | 1157 | 406 | 1836 Sun 18:00 | 1231 | 782 | 1710 Sun 20:00 | 1229 | 386 | 1844 Sun 22:00 | 1270 | 301 | 1882 Mon 00:00 | 864 | 442 | 1309 Mon 02:00 | 783 | 668 | 1444 Mon 04:00 | 887 | 173 | 895 Mon 06:00 | 801 | 164 | 756 Mon 08:00 | 1370 | 682 | 3020 Mon 10:00 | 1839 | 1083 | 8333 Mon 12:00 | 1980 | 1205 | 10969 Mon 14:00 | 1810 | 1546 | 6967 Mon 16:00 | 2110 | 1793 | 5441 Mon 18:00 | 2397 | 1763 | 7879 Mon 20:00 | 1426 | 573 | 2943 Mon 22:00 | 983 | 467 | 1686 Tue 00:00 | 701 | 172 | 665 Tue 02:00 | 998 | 161 | 1765 Tue 04:00 | 814 | 157 | 892 Tue 06:00 | 537 | 55 | 354 Tue 08:00 | 701 | 588 | 3944 Tue 10:00 | 1248 | 1038 | 3637 Tue 12:00 | 2089 | 1170 | 4042 Tue 14:00 | 3054 | 1694 | 7062 Tue 16:00 | 4524 | 1642 | 8415 Tue 18:00 | 1380 | 1491 | 2491 Tue 20:00 | 1845 | 1530 | 2655 Tue 22:00 | 1504 | 1513 | 2460 Wed 00:00 | 863 | 467 | 686 Wed 02:00 | 3833 | 428 | 4074 Wed 04:00 | 860 | 196 | 767 Wed 06:00 | 850 | 164 | 1568 Wed 08:00 | 1574 | 1421 | 3551 Wed 10:00 | 2692 | 2135 | 6666 Wed 12:00 | 2041 | 2033 | 4309 Wed 14:00 | 1882 | 2069 | 4106 Wed 16:00 | 2403 | 2359 | 4947 Wed 18:00 | 1632 | 1420 | 2779 Wed 20:00 | 1984 | 1888 | 3410 Wed 22:00 | 936 | 640 | 950 jgraph/makefile0000777005471000040510000000314713207307336012667 0ustar plankloci# Before installing, you should change the string "JGRAPH_DIR" in # jgraph.1 to be the directory containing the example jgraphs. CC = gcc -ansi -pedantic OBJS = draw.o \ edit.o \ jgraph.o \ list.o \ printline.o \ prio_list.o \ process.o \ show.o \ token.o EXAMPLES = \ acc.jps \ acc.eps \ alb.jps \ ad.jps \ bailey.jps \ ebars.jps \ ex1.jps \ ex2.jps \ g8.jps \ g8col.jps \ g9n10.jps \ gpaper.jps \ hypercube.jps \ mab2.jps \ nr.jps \ sin.jps \ sin1.jps \ sin2.jps \ sin3.jps \ tree1.jps \ tree2.jps \ wortman.jps all: jgraph examples: $(EXAMPLES) .SUFFIXES: .c .o .h .jgr .jps .eps .tex .dvi .jgr.jps: jgraph -P < $*.jgr > $*.jps .jgr.eps: jgraph < $*.jgr > $*.eps .tex.dvi: latex $*.tex .c.o: $(CC) -c -g $*.c jgraph: $(OBJS) $(CC) -g $(OBJS) -lm -o jgraph sin: sin.o cc -o sin sin.o -lm ad.jps: cube.eps disk.eps bailey.jps: bailey.pts ex2.jps: data.txt mab2.jps: mab2.times sin.jps: sin sin2.jps: sin2.pts sin3.jps: sin3.pts tree1.jps: tree.awk ( echo "4 3" | nawk -f tree.awk ; echo "xaxis size 5.4" ) | \ jgraph -P > tree1.jps tree2.jps: tree.awk ( echo "5 2" | nawk -f tree.awk ; echo "xaxis size 5.4" ) | \ jgraph -P > tree2.jps ### draw.o: draw.c jgraph.h list.h prio_list.h edit.o: edit.c jgraph.h list.h prio_list.h jgraph.o: jgraph.c jgraph.h list.h prio_list.h list.o: list.c list.h printline.o: printline.c jgraph.h list.h prio_list.h prio_list.o: prio_list.c list.h prio_list.h process.o: process.c jgraph.h list.h prio_list.h show.o: show.c jgraph.h list.h prio_list.h token.o: token.c list.h clean: rm -f *.o a.out *.jps jgraph/MSDOS.help0000777005471000040510000000050012037027641012712 0ustar planklociThis from Alan S. Raskin: You may be interested in knowing what it takes to get jgraph to compile MS-DOS/MS-QuickC: 1) Ignore all of the "function should return a value" warnings. :-) 2) Use the blank VMS templates for popen and pclose in token.c 3) Define float=double to avoid math-overflow run-time errors. -Alan jgraph/nr.jgr0000777005471000040510000000670511447702136012316 0ustar plankloci(* Bar graph from Norman Ramsey's PhD dissertation *) newgraph xaxis size 6.0 min 0 hash 100 label : Number of lines yaxis min -4.625 max -0.375 size 2.5 yaxis no_auto_hash_labels no_draw_hash_marks no_draw_axis_label (* MIPS *) yaxis hash_label at -1 : MIPS newcurve pts 545 -1 marktype ybar fill 0.3 marksize 75 0.75 pattern stripe -45 newcurve pts 458 -1 marktype ybar fill 0.75 marksize 75 0.75 pattern stripe -45 newcurve pts 411 -1 marktype ybar fill 0.1 marksize 75 0.75 pattern stripe -45 newcurve pts 338 -1 marktype ybar fill 1.0 marksize 75 0.75 pattern solid newcurve pts 303 -1 marktype ybar fill 0.2 marksize 75 0.75 pattern solid newcurve pts 246 -1 marktype ybar fill 0.85 marksize 75 0.75 pattern stripe 45 newcurve pts 171 -1 marktype ybar fill 0.5 marksize 75 0.75 pattern stripe 45 newcurve pts 66 -1 marktype ybar fill 0 marksize 75 0.75 pattern stripe 45 (* SPARC *) yaxis hash_label at -2 : SPARC newcurve pts 535 -2 marktype ybar fill 0.3 marksize 75 0.75 pattern stripe -45 newcurve pts 386 -2 marktype ybar fill 0.75 marksize 75 0.75 pattern stripe -45 newcurve pts 330 -2 marktype ybar fill 0.1 marksize 75 0.75 pattern stripe -45 newcurve pts 208 -2 marktype ybar fill 1.0 marksize 75 0.75 pattern solid newcurve pts 190 -2 marktype ybar fill 0.2 marksize 75 0.75 pattern solid newcurve pts 174 -2 marktype ybar fill 0.5 marksize 75 0.75 pattern stripe 45 newcurve pts 74 -2 marktype ybar fill 0 marksize 75 0.75 pattern stripe 45 (* VAX *) yaxis hash_label at -3 : VAX newcurve pts 213 -3 marktype ybar fill 1.0 marksize 75 0.75 pattern solid newcurve pts 200 -3 marktype ybar fill 0.2 marksize 75 0.75 pattern solid newcurve pts 135 -3 marktype ybar fill 0.5 marksize 75 0.75 pattern stripe 45 newcurve pts 52 -3 marktype ybar fill 0 marksize 75 0.75 pattern stripe 45 (* 68020 *) yaxis hash_label at -4 : 68020 newcurve pts 185 -4 marktype ybar fill 1.0 marksize 75 0.75 pattern solid newcurve pts 169 -4 marktype ybar fill 0.2 marksize 75 0.75 pattern solid newcurve pts 98 -4 marktype ybar fill 0.5 marksize 75 0.75 pattern stripe 45 newcurve pts 53 -4 marktype ybar fill 0 marksize 75 0.75 pattern stripe 45 xaxis max 600 (* first column of legend *) newcurve marktype ybar fill 0 marksize 50 0.75 pattern stripe 45 label : configuration newcurve marktype ybar fill 0.5 marksize 50 0.75 pattern stripe 45 label : stack walking newcurve marktype ybar fill 0.85 marksize 50 0.75 pattern stripe 45 label : runtime procedure table newcurve marktype ybar fill 0.2 marksize 50 0.75 pattern solid label : nub code legend bottom defaults hjl linelength 75 x 50 y -6.0 copygraph xaxis nodraw yaxis nodraw (* for second legend *) (* second column of legend *) legend bottom defaults hjl x 250.0 y -6.0 newcurve marktype ybar fill 1.0 marksize 50 0.75 pattern solid label : PostScript newcurve marktype ybar fill 0.1 marksize 50 0.75 pattern stripe -45 label : instruction-set specification newcurve marktype ybar fill 0.75 marksize 50 0.75 pattern stripe -45 label : follow sets newcurve marktype ybar fill 0.3 marksize 50 0.75 pattern stripe -45 label : disassembler (* top X axis *) copygraph xaxis draw hash -1 hash_scale +1.0 min 0 max 4.457652303 label : percentage of total size jgraph/printline.c0000755005471000040510000002165113207316747013341 0ustar plankloci/* printline.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/printline.c,v $ * $Revision: 8.5 $ * $Date: 2017/11/28 17:33:27 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "jgraph.h" #include #include #include void gsave(); void grestore(); void setfont(); void setfill(); void setgray(); void printline(); void print_ebar(); void start_line(); void cont_line(); void end_line(); void bezier_control(); void bezier_end(); void start_poly(); void cont_poly(); void end_poly(); void printellipse(); void set_comment(); void comment(); void printline_c(); void print_label(); void setlinewidth(); void setlinestyle(); #define LINEWIDTHFACTOR 0.700 #define MAX(a, b) ((a > b) ? (a) : (b)) typedef struct fontlist { struct fontlist *flink; struct fontlist *blink; int level; float s; char *f; } *Fontlist; static Fontlist Jgraph_fonts; static int Jgraph_gsave_level = -100; static int Jgraph_comment; void gsave() { if (Jgraph_gsave_level == -100) { Jgraph_gsave_level = 0; Jgraph_fonts = (Fontlist) make_list(sizeof(struct fontlist)); } Jgraph_gsave_level++; printf(" gsave "); } void grestore() { Fontlist l; if (last(Jgraph_fonts) != nil(Jgraph_fonts)) { l = last(Jgraph_fonts); if (l->level == Jgraph_gsave_level) { delete_item((List) l); free_node((List) l, (List) Jgraph_fonts); } } Jgraph_gsave_level--; printf(" grestore "); } void setfont(f, s) char *f; float s; { Fontlist l; int ins; if (last(Jgraph_fonts) != nil(Jgraph_fonts)) { l = last(Jgraph_fonts); ins = (strcmp(l->f, f) != 0 || s != l->s); if (ins) { delete_item((List) l); free_node((List) l, (List) Jgraph_fonts); } } else { ins = 1; } if (ins) { l = (Fontlist) get_node((List) Jgraph_fonts); l->level = Jgraph_gsave_level; l->s = s; l->f = f; insert((List) l, (List) Jgraph_fonts); printf("/%s findfont %f scalefont setfont\n", f, s); } } void setfill( x, y, t, f, p, a) char t, p ; float x, y; float f[], a ; { /* fprintf(stderr, "Hello? %c %f %c %f\n", t, f[0], p, a); */ if (t == 'g' && f[0] < 0.0) return; printf("gsave "); if ( t == 'g' ) { if( f[0] >= 0.0 ) printf("%f setgray ", f[0] ); } else if ( t == 'c' ) { printf("%f %f %f setrgbcolor ", f[0], f[1], f[2] ); } if (p == 's') { printf(" fill"); } else if (p == '/') { printf(" 6.1 10 %f %f %f 1 JSTR", a, x, y); } else if (p == 'e') { printf(" 6.1 10 %f %f %f 0 JSTR", a, x, y); } printf(" grestore\n"); } void setgray( t, f) char t ; float f[] ; { if ( t == 'g' ) { if( f[0] >= 0.0 ) printf("%f setgray\n", f[0] ); } else if ( t == 'c' ) { printf("%f %f %f setrgbcolor\n", f[0], f[1], f[2] ); } } void printline(x1, y1,x2, y2, orientation) float x1, y1, x2, y2; char orientation; { if (orientation == 'x') printf("newpath %f %f moveto %f %f lineto stroke\n", x1, y1, x2, y2); else printf("newpath %f %f moveto %f %f lineto stroke\n", y1, x1, y2, x2); fflush(stdout); } void print_ebar(x1, y1, x2, ms, orientation) float x1, y1, x2, ms; char orientation; { printline(x1, y1, x2, y1, orientation); printline(x2, y1-ms, x2, y1+ms, orientation); } void start_line(x1, y1, c) float x1, y1; Curve c; { setlinewidth(c->linethick); setlinestyle(c->linetype, c->gen_linetype); printf("%f %f moveto ", x1, y1); } void cont_line(x1, y1) float x1, y1; { printf(" %f %f lineto\n", x1, y1); } void end_line() { printf("stroke\n"); setlinewidth(1.0); setlinestyle('s', (Flist) 0); fflush(stdout); } void bezier_control(x1, y1) float x1, y1; { printf(" %f %f ", x1, y1); } void bezier_end(x1, y1) float x1, y1; { printf(" %f %f curveto\n", x1, y1); } void start_poly(x1, y1) float x1, y1; { printf(" newpath %f %f moveto", x1, y1); } void cont_poly(x1, y1) float x1, y1; { printf(" %f %f lineto\n", x1, y1); } void end_poly(x, y, ftype, fill, pattern, parg) float x, y; char ftype, pattern ; float fill[], parg; { printf("closepath "); setfill( x, y, ftype, fill, pattern, parg ); printf("stroke\n"); fflush(stdout); } /* Ellipse at 0, 0 -- assumes that you've already translated to x, y */ void printellipse(x, y, radius1, radius2, ftype, fill, pattern, parg) char ftype, pattern; float x, y, radius1, radius2, fill[], parg; { printf("newpath %f %f JDE\n", radius1, radius2); setfill( x, y, ftype, fill, pattern, parg ); printf("stroke\n"); fflush(stdout); } void set_comment(c) int c; { Jgraph_comment = c; } void comment(s) char *s; { if (Jgraph_comment) printf("%% %s\n", s); } void printline_c(x1, y1, x2, y2, g) float x1, y1, x2, y2; Graph g; { printline(ctop(x1, g->x_axis), ctop(y1, g->y_axis), ctop(x2, g->x_axis), ctop(y2, g->y_axis), 'x'); } void print_label(l) Label l; { int f, i, nlines; float fnl; char *s; if (l->label == CNULL) return; nlines = 0; for (i = 0; l->label[i] != '\0'; i++) { if (l->label[i] == '\n') { l->label[i] = '\0'; nlines++; } } fnl = (float) nlines; setfont(l->font, l->fontsize); printf("gsave %f %f translate %f rotate\n", l->x, l->y, l->rotate); if (l->graytype == 'g') { printf(" %f setgray\n", l->gray[0]); } else if (l->graytype == 'c') { printf(" %f %f %f setrgbcolor\n", l->gray[0], l->gray[1], l->gray[2]); } if (l->vj == 'b') { printf("0 %f translate ", fnl * (l->fontsize + l->linesep) * FCPI / FPPI); } else if (l->vj == 'c') { if (nlines % 2 == 0) { printf("0 %f translate ", (fnl/2.0*(l->fontsize + l->linesep) - l->fontsize/2.0) * FCPI / FPPI); } else { printf("0 %f translate ", ((fnl-1.0)/2.0*(l->fontsize + l->linesep) + l->linesep/2.0) * FCPI / FPPI); } } else { printf("0 %f translate ", -l->fontsize * FCPI / FPPI); } s = l->label; for (i = 0; i <= nlines; i++) { printf("(%s) dup stringwidth pop ", s); if (l->hj == 'c') { printf("2 div neg 0 moveto\n"); } else if (l->hj == 'r') { printf("neg 0 moveto\n"); } else { printf("pop 0 0 moveto\n"); } /* I would put string blanking in here if I had the time... */ if (i != nlines) { f = strlen(s); s[f] = '\n'; s = &(s[f+1]); printf("show 0 %f translate\n", - (l->fontsize + l->linesep) * FCPI / FPPI); } else { printf("show\n"); } } printf("grestore\n"); } void setlinewidth(size) float size; { printf("%f setlinewidth ", size * LINEWIDTHFACTOR); } void setlinestyle(style, glist) char style; Flist glist; { Flist fl; switch(style) { case '0': printf(" [0 2] setdash\n"); break; case 's': printf(" [] 0 setdash\n"); break; case '.': printf(" [1 3.200000] 0 setdash\n"); break; case '-': printf(" [4.00000] 0 setdash\n"); break; case 'l': printf(" [7 2] 0 setdash\n"); break; case 'd': printf(" [5 3 1 3] 0 setdash\n"); break; case 'D': printf(" [5 3 1 2 1 3] 0 setdash\n"); break; case '2': printf(" [5 3 5 3 1 2 1 3] 0 setdash\n"); break; case 'g': printf(" ["); for (fl = first(glist); fl != nil(glist); fl = next(fl)) printf("%f ", fl->f); printf("] 0 setdash\n"); break; default: fprintf(stderr, "Error: Unknown line type: %c\n", style); exit(1); break; } } jgraph/prio_list.c0000755005471000040510000000675713207316747013353 0ustar plankloci/* prio_list.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/prio_list.c,v $ * $Revision: 8.5 $ * $Date: 2017/11/28 17:33:27 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "list.h" #include "prio_list.h" #include #include #include typedef int Boolean; /* A prioirity list is any list with the first three fields being flink, * blink and prio. Use the routines of list.c to do everything except * insertion */ typedef struct prio_list { struct prio_list *flink; struct prio_list *blink; int prio; } *Prio_list; /* Prio_insert inserts nodes into their proper places in priority lists. It first * checks for inserting into the head or tail, and then proceeds sequentially. * Thus, it is worst case linear, but for most cases constant time (right). */ void prio_insert(node, list, desc) Prio_list node; Prio_list list; Boolean desc; { Prio_list p; /* Check nil and head of list */ if (first(list) == nil(list) || (!desc && first(list)->prio >= node->prio) || (desc && first(list)->prio <= node->prio) ) { node->blink = list; node->flink = list->flink; list->flink->blink = node; list->flink = node; return; } /* Check tail of list */ if ((desc && last(list)->prio >= node->prio) || (!desc && last(list)->prio <= node->prio) ) { node->flink = list; node->blink = list->blink; list->blink->flink = node; list->blink = node; return; } /* Check the rest of the list sequentially */ for(p = next(first(list)); ; p = next(p)) { if (p == nil(list)) fprintf(stderr, "inserting into tail did not work\n"); if ((!desc && p->prio >= node->prio) || (desc && p->prio <= node->prio)) { node->flink = p; node->blink = p->blink; p->blink->flink = node; p->blink = node; return; } } } jgraph/prio_list.h0000755005471000040510000000526712037030664013342 0ustar plankloci/* prio_list.h * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/prio_list.h,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Priority lists are just like normal lists of list.h and list.c, except * that their third field is a (int) prioriy. The routines of list.c should all * be used except for insert, because it will always put an item at the * end of a list. Instead, use prio_insert, which will put the item * into its proper place in the list. The last argument of prio_insert should * be TRUE if the list is to be kept in descending order; it should be FALSE * for ascending order. * Priority list should be: struct prio_list { struct prio_list *flink; struct prio_list *blink; int prio; ... } 10/15/2012: prio_lists are the true embarrassing feature of jgraph -- an n^2 algorithm? For shame. I always say that I'll fix it someday, but I doubt that's going to happen. */ /* void prio_insert(node, list, descending); */ jgraph/process.c0000755005471000040510000006271113207316747013015 0ustar plankloci/* process.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/process.c,v $ * $Revision: 8.5 $ * $Date: 2017/11/28 17:33:27 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "jgraph.h" #define ABS(a) ((a > 0.0) ? (a) : (-a)) #define MAX(a, b) ((a > b) ? (a) : (b)) #define MIN(a, b) ((a < b) ? (a) : (b)) #define AXIS_CHAR(a) ((a->is_x) ? 'x' : 'y') #define HASH_DIR(a) ((a->hash_scale > 0.0) ? 1 : -1) static double Pi; void process_title(); void process_legend(); void process_axis1(); void process_axis2(); void process_label(); void process_label_max_n_mins(); void process_strings(); void process_curve(); void process_curves(); void process_extrema(); void process_label_extrema(); void process_graph(); void process_graphs(); void process_title(g) Graph g; { float ytitleloc; if (g->title->x == FSIG) g->title->x = g->x_axis->psize / 2.0; else g->title->x = ctop(g->title->x, g->x_axis); if (g->title->y != FSIG) g->title->y = ctop(g->title->y, g->y_axis); else { ytitleloc = 0.0; if (g->x_axis->draw_axis_label && g->x_axis->label->label != CNULL) ytitleloc = MIN(ytitleloc, g->x_axis->label->ymin); if (g->x_axis->draw_hash_labels) ytitleloc = MIN(ytitleloc, g->x_axis->hl->ymin); if (g->x_axis->draw_hash_marks) ytitleloc = MIN(ytitleloc, g->x_axis->draw_hash_marks_at - HASH_SIZE); if (g->legend->type == 'u') ytitleloc = MIN(ytitleloc, g->legend->l->ymin); g->title->y = ytitleloc - 10.0; } process_label(g->title, g, 0); } void process_legend(g) Graph g; { Legend l; int anything; float height, hdist, y, x, width, maxmark, maxmarky; Curve c; char *s; l = g->legend; if (l->type == 'n') return; if (l->l->linesep == FSIG) l->l->linesep = l->l->fontsize; l->anylines = 0; maxmark = 0.0; maxmarky = 0.0; anything = 0; for (c = first(g->curves); c != nil(g->curves); c = next(c)) { if (c->l->label != CNULL) { anything = 1; if (c->marktype == 'l') { maxmark = MAX(maxmark, c->lmark->xmax - c->lmark->xmin); maxmarky = MAX(maxmarky, c->lmark->ymax - c->lmark->ymin); } else if (c->marktype != 'n') { maxmark = MAX(maxmark, ABS(c->marksize[0])); maxmarky = MAX(maxmarky, ABS(c->marksize[1])); } if (c->linetype != '0') l->anylines = 1; } } if (l->linelength == FSIG) l->linelength = (l->anylines) ? (MAX(maxmark + 6.0, 24.0)) : 0.0; else l->linelength = disttop(l->linelength, g->x_axis); if (l->midspace == FSIG) l->midspace = (l->anylines) ? 4.0 : (maxmark / 2.0) + 4.0; else l->midspace = disttop(l->midspace, g->x_axis); if (l->linebreak == FSIG) l->linebreak = MAX(l->l->linesep * FCPI / FPPI, maxmarky); else l->linebreak = disttop(l->linebreak, g->y_axis); if (l->type == 'c') { for (c = first(g->curves); c != nil(g->curves); c = next(c)) { if (c->l->label != CNULL) process_label(c->l, g, 1); } return; } if (!anything) { l->anylines = -1; return; } width = 0.0; height = -l->linebreak; for (c = first(g->curves); c != nil(g->curves); c = next(c)) { if (c->l->label != CNULL) { s = c->l->label; copy_label(c->l, l->l); c->l->x = 0.0; c->l->y = 0.0; c->l->rotate = 0.0; c->l->hj = 'l'; c->l->vj = 'b'; c->l->label = s; process_label(c->l, g, 0); height += c->l->ymax + l->linebreak; width = MAX(width, c->l->xmax); } } hdist = (l->anylines) ? l->midspace + l->linelength : l->midspace; width += hdist; if (l->l->x == FSIG) { if (l->l->hj == 'c') { l->l->x = g->x_axis->psize / 2; } else if (l->l->hj == 'l') { if (l->l->vj == 'c') { l->l->x = g->x_axis->psize; if (g->y_axis->draw_axis_label) l->l->x = MAX(l->l->x, g->y_axis->label->xmax); if (g->y_axis->draw_hash_labels) l->l->x = MAX(l->l->x, g->y_axis->hl->xmax); if (g->y_axis->draw_hash_marks) { l->l->x = MAX(l->l->x, g->y_axis->draw_hash_marks_at); l->l->x = MAX(l->l->x, g->y_axis->draw_hash_marks_at + HASH_DIR(g->y_axis) * HASH_SIZE); } l->l->x += 15.0; } else { l->l->x = 0.0; } } else { if (l->l->vj == 'c') { l->l->x = 0.0; if (g->y_axis->draw_axis_label) l->l->x = MIN(l->l->x, g->y_axis->label->xmin); if (g->y_axis->draw_hash_labels) l->l->x = MIN(l->l->x, g->y_axis->hl->xmin); if (g->y_axis->draw_hash_marks) { l->l->x = MIN(l->l->x, g->y_axis->draw_hash_marks_at); l->l->x = MIN(l->l->x, g->y_axis->draw_hash_marks_at + HASH_DIR(g->y_axis) * HASH_SIZE); } l->l->x = l->l->x - 15.0; } else { l->l->x = g->x_axis->psize; } } } else { l->l->x = ctop(l->l->x, g->x_axis); } if (l->l->y == FSIG) { if (l->l->vj == 'c') { l->l->y = g->y_axis->psize / 2.0; } else if (l->l->vj == 'b') { l->l->y = g->y_axis->psize; if (g->x_axis->draw_axis_label) l->l->y = MAX(l->l->y, g->x_axis->label->ymax); if (g->x_axis->draw_hash_labels) l->l->y = MAX(l->l->y, g->x_axis->hl->ymax); if (g->x_axis->draw_hash_marks) { l->l->y = MAX(l->l->y, g->x_axis->draw_hash_marks_at); l->l->y = MAX(l->l->y, g->x_axis->draw_hash_marks_at + HASH_DIR(g->x_axis) * HASH_SIZE); } l->l->y += 15.0; } else { l->l->y = 0.0; if (g->x_axis->draw_axis_label) l->l->y = MIN(l->l->y, g->x_axis->label->ymin); if (g->x_axis->draw_hash_labels) l->l->y = MIN(l->l->y, g->x_axis->hl->ymin); if (g->x_axis->draw_hash_marks) { l->l->y = MIN(l->l->y, g->x_axis->draw_hash_marks_at); l->l->y = MIN(l->l->y, g->x_axis->draw_hash_marks_at + HASH_DIR(g->x_axis) * HASH_SIZE); } l->l->y -= 15.0; } } else { l->l->y = ctop(l->l->y, g->y_axis); } if (l->l->hj == 'l') x = 0.0; else if (l->l->hj == 'c') x = - width/2.0; else x = -width; if (l->l->vj == 't') y = 0.0; else if (l->l->vj == 'c') y = height / 2.0; else y = height; for (c = first(g->curves); c != nil(g->curves); c = next(c)) { if (c->l->label != CNULL) { c->l->x = hdist + x; c->l->y = y; c->l->vj = 't'; c->l->hj = 'l'; c->l->rotate = 0.0; process_label(c->l, g, 0); y = c->l->ymin - l->linebreak; } } process_label_max_n_mins(l->l, width, height); } float find_reasonable_hash_interval(a) Axis a; { float s, d; if (a->is_lg) return 0.0; s = a->max - a->min; d = 1.0; if (s > 5.0) { while(1) { if (s / d < 6.0) return d; d *= 2.0; if (s / d < 6.0) return d; d *= 2.5; if (s / d < 6.0) return d; d *= 2.0; } } else { while(1) { if (s / d > 2.0) return d; d /= 2.0; if (s / d > 2.0) return d; d /= 2.5; if (s / d > 2.0) return d; d /= 2.0; } } } float find_reasonable_hash_start(a) Axis a; { int i; if (a->is_lg) return 0.0; if (a->max > 0.0 && a->min < 0.0) return 0.0; i = ((int) (a->min / a->hash_interval)); return ((float) i) * a->hash_interval; } int find_reasonable_precision(a) Axis a; { int i, b, b2, done; float x, x2, tolerance; if (a->hash_format == 'g' || a->hash_format == 'G') return 6; if (a->hash_format == 'e' || a->hash_format == 'E') return 0; if (a->is_lg) return 0; tolerance = 0.000001; b = 0; x = a->hash_interval; done = 0; while(b < 6 && !done) { i = (int) (x + 0.4); x2 = i; if (x2 - x < tolerance && x - x2 < tolerance) done = 1; else { b++; x *= 10.0; tolerance *= 10.0; } } tolerance = 0.000001; b2 = 0; x = a->hash_start; done = 0; while(b2 < 6 && !done) { i = (int) (x + 0.4); x2 = i; if (x2 - x < tolerance && x - x2 < tolerance) done = 1; else { b2++; x *= 10.0; tolerance *= 10.0; } } return MAX(b, b2); } int find_reasonable_minor_hashes(a) Axis a; { float d; int i; if (a->is_lg) { d = a->log_base; while(d > 10.0) d /= 10.0; while(d <= 1.0) d *= 10.0; i = (int) d; return MAX((i - 2), 0); } else { d = a->hash_interval; if (d == 0.0) return 0; while(d > 10.0) d /= 10.0; while(d <= 1.0) d *= 10.0; i = (int) d; if (((float) i) != d) return 0; return i-1; } } void process_axis1(a, g) Axis a; Graph g; { float tmp; int i; if (a->min == FSIG) { if (a->pmin == FSIG) { error_header(); fprintf(stderr, "Graph %d: %c axis has no minimum, and cannot derive one\n", g->num, AXIS_CHAR(a)); fprintf(stderr, " Use %caxis min\n", AXIS_CHAR(a)); exit(1); } else if (a->pmin <= 0.0 && a->is_lg) { error_header(); fprintf(stderr, "Trying to derive %c axis\n", AXIS_CHAR(a)); fprintf(stderr, " Minimum value %f will be -infinity with log axes\n", a->pmin); exit(1); } else a->min = a->pmin; } if (a->max == FSIG) { if (a->pmax == FSIG) { error_header(); fprintf(stderr, "Graph %d: %c axis has no maximum, and cannot derive one\n", g->num, AXIS_CHAR(a)); fprintf(stderr, " Use %caxis max\n", AXIS_CHAR(a)); exit(1); } else if (a->pmax <= 0.0 && a->is_lg) { error_header(); fprintf(stderr, "Trying to derive %c axis\n", AXIS_CHAR(a)); fprintf(stderr, " Maximum value %f will be -infinity with log axes\n", a->pmax); exit(1); } else a->max = a->pmax; } if (a->max < a->min) { tmp = a->max; a->max = a->min; a->min = tmp; } else if (a->max == a->min) { if (!a->is_lg) a->min -= 1; a->max += 1; } a->psize = intop(a->size); if (a->is_lg) { if (a->min <= 0.0) { error_header(); fprintf(stderr, "Graph %d, %c axis: Min value = %f. This is -infinity with logrhythmic axes\n", g->num, (a->is_x) ? 'x' : 'y', a->min); exit(1); } a->logfactor = log(a->log_base); a->logmin = log(a->min) / a->logfactor; a->factor = a->psize / (log(a->max) / a->logfactor - a->logmin); } else { a->factor = a->psize / (a->max - a->min); } if (a->gr_graytype == '0') { a->gr_graytype = a->graytype; for (i = 0; i < 3; i++) a->gr_gray[i] = a->gray[i]; } if (a->mgr_graytype == '0') { a->mgr_graytype = a->gr_graytype; for (i = 0; i < 3; i++) a->mgr_gray[i] = a->gr_gray[i]; } } void process_axis2(a, g) Axis a; Graph g; { float t1, t2, t3, minor_hashes, hloc, tmp; float ymin, ymax, xmin, xmax; int prec, i1; Hash h; String s; Axis other; other = (a->is_x) ? g->y_axis : g->x_axis; if (a->draw_at == FSIG) a->draw_at = (HASH_DIR(a) == -1) ? 0.0 : other->psize; else a->draw_at = ctop(a->draw_at, other); if (a->hash_interval < 0.0) { a->hash_interval = find_reasonable_hash_interval(a); if (!a->start_given) a->hash_start = find_reasonable_hash_start(a); } else if (!a->start_given) a->hash_start = a->min; if (a->minor_hashes < 0) { a->minor_hashes = find_reasonable_minor_hashes(a); } if (a->precision < 0) a->precision = find_reasonable_precision(a); for (h = first(a->hash_lines) ; h != nil(a->hash_lines); h = next(h)) { h->loc = ctop(h->loc, a); } for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) { s->s->x = ctop(s->s->x, a); s->s->y = ctop(s->s->y, a); } if (((a->hash_interval != 0.0 && !a->is_lg) || a->is_lg) && a->auto_hash_marks) { if (a->is_lg) { for (t1 = 1.0; t1 > a->min; t1 /= a->log_base) ; t2 = t1 * a->log_base - t1; } else { for (t1 = a->hash_start; t1 > a->min; t1 -= a->hash_interval) ; t2 = a->hash_interval; } while (t1 <= a->max) { hloc = ctop(t1, a); if (hloc > -.05 && hloc < a->psize + .05) { h = (Hash) get_node((List) a->hash_lines); h->loc = hloc; h->size = HASH_SIZE; h->major = 1; insert((List) h, (List) a->hash_lines); if (a->auto_hash_labels) { s = (String) get_node ((List) a->hash_labels); s->s = new_label(); s->s->x = hloc; s->s->y = hloc; s->s->label = (char *) malloc (80); if (a->precision >= 0) { prec = a->precision; } else { if (ABS(t1) >= 1.0 || t1 == 0.0) prec = 0; else { tmp = ABS(t1); prec = -1; while(tmp < 1.0) {tmp *= 10.0; prec++;} } } switch(a->hash_format) { case 'G': sprintf(s->s->label, "%.*G", prec, t1); break; case 'g': sprintf(s->s->label, "%.*g", prec, t1); break; case 'E': sprintf(s->s->label, "%.*E", prec, t1); break; case 'e': sprintf(s->s->label, "%.*e", prec, t1); break; case 'f': sprintf(s->s->label, "%.*f", prec, t1); break; default: fprintf(stderr, "Internal jgraph error: hl_st\n"); exit(1); } insert((List) s, (List) a->hash_labels); } } minor_hashes = t2 / ((float) (a->minor_hashes + 1)); t3 = t1; for (i1 = 1; i1 <= a->minor_hashes; i1++) { t3 += minor_hashes; hloc = ctop(t3, a); if (hloc > -.05 && hloc < a->psize + .05) { h = (Hash) get_node((List) a->hash_lines); h->loc = hloc; h->size = MHASH_SIZE; h->major = 0; insert((List) h, (List) a->hash_lines); } } if (a->is_lg) { t1 *= a->log_base; t2 = t1 * a->log_base - t1; } else t1 += t2; } } if (a->draw_hash_marks_at == FSIG) a->draw_hash_marks_at = a->draw_at; else a->draw_hash_marks_at = ctop(a->draw_hash_marks_at, other); if (a->draw_hash_labels_at == FSIG) a->draw_hash_labels_at = a->draw_hash_marks_at + a->hash_scale * HASH_SIZE + HASH_DIR(a) * 3.0; else a->draw_hash_labels_at = ctop(a->draw_hash_labels_at, other); if (a->is_x) { a->hl->y = a->draw_hash_labels_at; if (a->hl->hj == '0') a->hl->hj = 'c'; if (a->hl->vj == '0') a->hl->vj = (HASH_DIR(a) == -1) ? 't' : 'b'; } else { a->hl->x = a->draw_hash_labels_at; if (a->hl->vj == '0') a->hl->vj = 'c'; if (a->hl->hj == '0') a->hl->hj = (HASH_DIR(a) == -1) ? 'r' : 'l'; } ymin = (a->is_x) ? a->hl->y : 0; ymax = (a->is_x) ? a->hl->y : a->psize; xmin = (!a->is_x) ? a->hl->x : 0; xmax = (!a->is_x) ? a->hl->x : a->psize; for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) { if (a->is_x) a->hl->x = s->s->x; else a->hl->y = s->s->y; a->hl->label = s->s->label; process_label(a->hl, g, 0); xmin = MIN(a->hl->xmin, xmin); ymin = MIN(a->hl->ymin, ymin); xmax = MAX(a->hl->xmax, xmax); ymax = MAX(a->hl->ymax, ymax); } a->hl->xmin = xmin; a->hl->ymin = ymin; a->hl->xmax = xmax; a->hl->ymax = ymax; /* HERE -- now either test or continue */ if (a->is_x) { if (a->label->x == FSIG) a->label->x = a->psize / 2.0; else a->label->x = ctop(a->label->x, g->x_axis); if (a->label->y == FSIG) { ymin = 0.0; ymax = other->psize; if (a->draw_hash_labels) { ymin = MIN(ymin, a->hl->ymin); ymax = MAX(ymax, a->hl->ymax); } if (a->draw_hash_marks) { ymin = MIN(ymin, a->draw_hash_marks_at); ymin = MIN(ymin, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE); ymax = MAX(ymax, a->draw_hash_marks_at); ymax = MAX(ymax, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE); } a->label->y = (HASH_DIR(a) == -1) ? ymin - 8.0 : ymax + 8.0 ; } else a->label->y = ctop(a->label->y, g->y_axis); if (a->label->hj == '0') a->label->hj = 'c'; if (a->label->vj == '0') a->label->vj = (HASH_DIR(a) == -1) ? 't' : 'b' ; if (a->label->rotate == FSIG) a->label->rotate = 0.0; } else { if (a->label->y == FSIG) a->label->y = a->psize / 2.0; else a->label->y = ctop(a->label->y, g->y_axis); if (a->label->x == FSIG) { xmin = 0.0; xmax = other->psize; if (a->draw_hash_labels) { xmin = MIN(xmin, a->hl->xmin); xmax = MAX(xmax, a->hl->xmax); } if (a->draw_hash_marks) { xmin = MIN(xmin, a->draw_hash_marks_at); xmin = MIN(xmin, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE); xmax = MAX(xmax, a->draw_hash_marks_at); xmax = MAX(xmax, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE); } a->label->x = (HASH_DIR(a) == -1) ? xmin - 8.0 : xmax + 8.0 ; } else a->label->x = ctop(a->label->x, g->x_axis); if (a->label->hj == '0') a->label->hj = 'c'; if (a->label->vj == '0') a->label->vj = 'b'; if (a->label->rotate == FSIG) a->label->rotate = (HASH_DIR(a) == -1) ? 90.0 : -90.0; } process_label (a->label, g, 0); } void process_label(l, g, adjust) Label l; Graph g; int adjust; { float len, height; int f, i; float fnl, tmp; char *s; if (l->label == CNULL) return; if (adjust) { l->x = ctop(l->x, g->x_axis); l->y = ctop(l->y, g->y_axis); } if (l->linesep == FSIG) l->linesep = l->fontsize; l->nlines = 0; for (i = 0; l->label[i] != '\0'; i++) { if (l->label[i] == '\n') { l->label[i] = '\0'; l->nlines++; } } fnl = (float) l->nlines; len = 0.0; s = l->label; for (i = 0; i <= l->nlines; i++) { tmp = l->fontsize * FCPI / FPPI * strlen(s) * 0.8; len = MAX(len, tmp); if (i != l->nlines) { f = strlen(s); s[f] = '\n'; s = &(s[f+1]); } } height = (l->fontsize * (fnl+1) + l->linesep * fnl) * FCPI / FPPI; process_label_max_n_mins(l, len, height); } void process_label_max_n_mins(l, len, height) Label l; float len; float height; { float xlen, ylen, xheight, yheight; float x, y; xlen = len * cos(l->rotate * Pi / 180.00); ylen = height * cos((l->rotate + 90.0) * Pi / 180.00); xheight = len * sin(l->rotate * Pi / 180.00); yheight = height * sin((l->rotate + 90.0) * Pi / 180.00); x = l->x; y = l->y; if (l->hj == 'c') { x -= xlen / 2.0; y -= xheight / 2.0; } else if (l->hj == 'r') { x -= xlen; y -= xheight; } if (l->vj == 'c') { x -= ylen / 2.0; y -= yheight / 2.0; } else if (l->vj == 't') { x -= ylen; y -= yheight; } l->xmin = MIN(x, x + xlen); l->xmin = MIN(l->xmin, x + xlen + ylen); l->xmin = MIN(l->xmin, x + ylen); l->ymin = MIN(y, y + xheight); l->ymin = MIN(l->ymin, y + yheight); l->ymin = MIN(l->ymin, y + xheight + yheight); l->xmax = MAX(x, x + xlen); l->xmax = MAX(l->xmax, x + xlen + ylen); l->xmax = MAX(l->xmax, x + ylen); l->ymax = MAX(y, y + xheight); l->ymax = MAX(l->ymax, y + yheight); l->ymax = MAX(l->ymax, y + xheight + yheight); } void process_strings(g) Graph g; { String s; for(s = first(g->strings); s != nil(g->strings); s = next(s)) { process_label(s->s, g, 1); } } void process_curve(c, g) Curve c; Graph g; { if (c->bezier && (c->npts < 4 || (c->npts % 3 != 1))) { error_header(); fprintf(stderr, " Graph %d Curve %d:\n", g->num, c->num); fprintf(stderr, " Curve has %d points\n", c->npts); fprintf(stderr, " Bezier must have 3n + 1 points (n > 0)\n"); exit(1); } c->marksize[0] = (c->marksize[0] == FSIG) ? 4.0 : disttop(c->marksize[0], g->x_axis); c->marksize[1] = (c->marksize[1] == FSIG) ? 4.0 : disttop(c->marksize[1], g->y_axis); if (c->marktype == 'o') c->marksize[1] = c->marksize[0]; c->asize[0] = (c->asize[0] == FSIG) ? 6.0 : disttop(c->asize[0], g->x_axis); c->asize[1] = (c->asize[1] == FSIG) ? 2.0 : disttop(c->asize[1], g->y_axis) / 2.0; c->lmark->x = disttop(c->lmark->x, g->x_axis); c->lmark->y = disttop(c->lmark->y, g->y_axis); process_label(c->lmark, g, 0); if (c->parg == FSIG) c->parg = 0.0; if (c->aparg == FSIG) c->aparg = 0.0; if (c->pparg == FSIG) c->pparg = 0.0; } void process_curves(g) Graph g; { Curve c; for(c = first(g->curves); c != nil(g->curves); c = next(c)) { process_curve(c, g); } } void process_extrema(g) /* This finds all the minval/maxvals for bbox calc */ Graph g; { Curve c; String s; Axis xa, ya; xa = g->x_axis; ya = g->y_axis; g->xminval = 0.0; g->yminval = 0.0; g->xmaxval = xa->psize; g->ymaxval = ya->psize; if (xa->draw_axis_label) process_label_extrema(xa->label, g); if (ya->draw_axis_label) process_label_extrema(ya->label, g); if (xa->draw_hash_labels) process_label_extrema(xa->hl, g); if (ya->draw_hash_labels) process_label_extrema(ya->hl, g); if (xa->draw_hash_marks) { g->yminval = MIN(g->yminval, xa->draw_hash_marks_at); g->yminval = MIN(g->yminval, xa->draw_hash_marks_at + HASH_DIR(xa) * HASH_SIZE); g->ymaxval = MAX(g->ymaxval, xa->draw_hash_marks_at); g->ymaxval = MAX(g->ymaxval, xa->draw_hash_marks_at + HASH_DIR(xa) * HASH_SIZE); } if (ya->draw_hash_marks) { g->xminval = MIN(g->xminval, ya->draw_hash_marks_at); g->xminval = MIN(g->xminval, ya->draw_hash_marks_at + HASH_DIR(ya) * HASH_SIZE); g->xmaxval = MAX(g->xmaxval, ya->draw_hash_marks_at); g->xmaxval = MAX(g->xmaxval, ya->draw_hash_marks_at + HASH_DIR(ya) * HASH_SIZE); } process_label_extrema(g->title, g); if (g->legend->type == 'c') { for (c = first(g->curves); c != nil(g->curves); c = next(c)) { process_label_extrema(c->l, g); } } else if (g->legend->type == 'u' && g->legend->anylines >= 0) { process_label_extrema(g->legend->l, g); } for(s = first(g->strings); s != nil(g->strings); s = next(s)) { process_label_extrema(s->s, g); } } void process_label_extrema(l, g) Label l; Graph g; { if (l->label == CNULL) return; g->yminval = MIN(g->yminval, l->ymin); g->ymaxval = MAX(g->ymaxval, l->ymax); g->xminval = MIN(g->xminval, l->xmin); g->xmaxval = MAX(g->xmaxval, l->xmax); } void process_graph(g) Graph g; { g->x_translate = intop(g->x_translate); g->y_translate = intop(g->y_translate); process_axis1(g->x_axis, g); process_axis1(g->y_axis, g); process_axis2(g->x_axis, g); process_axis2(g->y_axis, g); process_curves(g); process_legend(g); process_strings(g); process_title(g); process_extrema(g); } void process_graphs(gs) Graphs gs; { Graphs the_g; Graph g; float diff, max_y, min_y, max_x, min_x; int do_bb, i; Pi = acos(-1.0); for (the_g = first(gs); the_g != nil(gs); the_g = next(the_g)) { for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) process_graph(g); max_x = 0.0; min_x = 0.0; max_y = 0.0; min_y = 0.0; for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) { max_y = MAX(max_y, g->y_translate + g->ymaxval); min_y = MIN(min_y, g->y_translate + g->yminval); max_x = MAX(max_x, g->x_translate + g->xmaxval); min_x = MIN(min_x, g->x_translate + g->xminval); } if (the_g->height >= 0.00) { the_g->height *= FCPI; if (the_g->height > max_y - min_y) { diff = (the_g->height - max_y + min_y) / 2.0; max_y += diff; min_y -= diff; } else { the_g->height = max_y - min_y; } } else { the_g->height = max_y - min_y; } if (the_g->width >= 0.00) { the_g->width *= FCPI; if (the_g->width > max_x - min_x) { diff = (the_g->width - max_x + min_x) / 2.0; max_x += diff; min_x -= diff; } else { the_g->width = max_x - min_x; } } else { the_g->width = max_x - min_x; } do_bb = 1; for (i = 0; i < 4; i++) do_bb = (do_bb && the_g->bb[i] == ISIG); if (do_bb) { the_g->bb[0] = (int) (min_x - 1.0); the_g->bb[1] = (int) (min_y - 1.0); the_g->bb[2] = (int) (max_x + 1.0); the_g->bb[3] = (int) (max_y + 1.0); } } } jgraph/RCS/0000755005471000040510000000000013207320431011571 5ustar planklocijgraph/RCS/draw.c,v0000555005471000040510000006213313207316747013161 0ustar planklocihead 8.5; access; symbols; locks plank:8.5; strict; comment @ * @; 8.5 date 2017.11.28.17.33.27; author plank; state Exp; branches; next 8.4; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.5 log @Clang requires explicit voids. @ text @/* draw.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/draw.c,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "jgraph.h" #include #include #include #include void draw_label(); void draw_axis(); void draw_label(); void draw_curves(); void draw_curve(); void draw_mark(); void draw_arrow(); void draw_legend(); void draw_strings(); void draw_graph(); void draw_graphs(); void draw_header(); void draw_footer(); static char real_eof = EOF; float ctop(val, axis) float val; Axis axis; { if (axis->is_lg) { if (val <= 0.0) { error_header(); fprintf(stderr, "Value of %f is at negative infinity with logrhythmic %c axis\n", val, (axis->is_x) ? 'x' : 'y'); exit(1); } return (log(val) / axis->logfactor - axis->logmin) * axis->factor; } else { return (val - axis->min) * axis->factor; } } float disttop(val, axis) float val; Axis axis; { if (axis->is_lg) { return FCPI * val; } else { return (val) * axis->factor; } } float intop(val) float val; { return FCPI * val; } #define MAXIMUM(a,b) ((a > b) ? a : b) void draw_axis(a, other) Axis a, other; { char orientation; Hash h; String s; orientation = (a->is_x) ? 'x' : 'y'; setlinewidth(1.0); comment("Drawing Axis"); if (a->grid_lines) { comment("Drawing Grid lines"); gsave(); setgray(a->gr_graytype, a->gr_gray); for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) { if (h->major) { printline(h->loc, 0.0, h->loc, other->psize, orientation); } } grestore(); } if (a->mgrid_lines) { comment("Drawing Minor Grid lines"); gsave(); setgray(a->mgr_graytype, a->mgr_gray); for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) { if (!h->major) { printline(h->loc, 0.0, h->loc, other->psize, orientation); } } grestore(); } gsave(); setgray(a->graytype, a->gray); if (a->draw_axis_line) { printline(0.0, a->draw_at, a->psize, a->draw_at, orientation); } if (a->draw_hash_marks) { comment("Drawing Hash Marks"); for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) { printline(h->loc, a->draw_hash_marks_at, h->loc, a->draw_hash_marks_at + (h->size * a->hash_scale), orientation); } } if (a->draw_hash_labels) { comment("Drawing Hash Labels"); for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) { a->hl->label = s->s->label; if (a->is_x) { a->hl->x = s->s->x; } else { a->hl->y = s->s->y; } draw_label(a->hl); } } if (a->draw_axis_label) { comment("Drawing Axis Label"); draw_label(a->label); } grestore(); printf("\n"); } void draw_label(l) Label l; { if (l->label == CNULL) return; comment(l->label); print_label(l); } void set_clip(g) Graph g; { comment("Setting Clip"); printf("newpath\n"); printf(" 0 0 moveto 0 %f lineto %f %f lineto %f 0 lineto\n", g->y_axis->psize, g->x_axis->psize, g->y_axis->psize, g->x_axis->psize); printf(" closepath clip newpath\n"); } void draw_curves(g) Graph g; { Curve c; gsave(); printf("\n"); if (g->clip) set_clip(g); for(c = first(g->curves); c != nil(g->curves); c = next(c)) { draw_curve(c, g); } grestore(); printf("\n"); } void draw_curve(c, g) Curve c; Graph g; { Point p, px, py; int i, j; float this_x, this_y, last_x, last_y, x, y; gsave(); setgray(c->graytype, c->gray); if (c->clip) set_clip(g); if (first(c->xepts) != nil(c->xepts) || first(c->yepts) != nil(c->yepts)) { comment("Drawing Epts"); px = first(c->xepts); py = first(c->yepts); setlinewidth(c->linethick); setlinestyle('s', (Flist)0); for (p = first(c->pts); p != nil(c->pts); p = next(p)) { if (p->e == 'x') { x = ctop(p->x, g->x_axis); y = ctop(p->y, g->y_axis); print_ebar(x, y, ctop(px->x, g->x_axis), c->marksize[1]/2.0, 'x'); px = next(px); print_ebar(x, y, ctop(px->x, g->x_axis), c->marksize[1]/2.0, 'x'); px = next(px); } else if (p->e == 'y') { x = ctop(p->x, g->x_axis); y = ctop(p->y, g->y_axis); print_ebar(y, x, ctop(py->y, g->y_axis), c->marksize[0]/2.0, 'y'); py = next(py); print_ebar(y, x, ctop(py->y, g->y_axis), c->marksize[0]/2.0, 'y'); py = next(py); } } } comment("Drawing Curve"); if (c->linetype != '0' || c->poly) { if (c->bezier) { i = 0; j = 0; if (c->poly) printf("newpath "); for (p = first(c->pts); p != nil(c->pts); p = next(p)) { if (j == 0 && i == 0) { start_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis), c); j++; } else if (i != 0) { bezier_control(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis)); } else { bezier_end(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis)); j++; } if (!c->poly && j == 30 && i == 0) { end_line(); p = prev(p); j = 0; i = 0; } else i = (i + 1) % 3; } if (j != 0) { if (c->poly) { printf("closepath "); setfill(0.0, 0.0, c->pfilltype, c->pfill, c->ppattern, c->pparg); } end_line(); } } else { i = 0; if (c->poly) printf("newpath "); for (p = first(c->pts); p != nil(c->pts); p = next(p)) { if (i == 0) { start_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis), c); } else { cont_line(ctop(p->x, g->x_axis), ctop(p->y, g->y_axis)); } if (!c->poly && i == 100 && next(p)) { end_line(); p = prev(p); i = 0; } else i++; } if (i != 0) { if (c->poly) { printf("closepath "); setfill(0.0, 0.0, c->pfilltype, c->pfill, c->ppattern, c->pparg); } end_line(); } } } comment("Drawing Curve points"); i = 0; for (p = first(c->pts); p != nil(c->pts); p = next(p)) { this_x = ctop(p->x, g->x_axis); this_y = ctop(p->y, g->y_axis); if (!c->bezier || i == 0) draw_mark(this_x, this_y, c, g); if (p != first(c->pts)) { if (c->rarrows || (c->rarrow && p == last(c->pts))) { if (!c->bezier || i == 0) draw_arrow(this_x, this_y, last_x, last_y, c); } if (c->larrows || (c->larrow && prev(p) == first(c->pts))) { if (!c->bezier || i == 1) draw_arrow(last_x, last_y, this_x, this_y, c); } } last_x = this_x; last_y = this_y; i = (i + 1) % 3; } grestore(); printf("\n"); } void draw_mark(x, y, c, g) float x, y; Curve c; Graph g; { Point p; float ms0, ms1, scx, scy, trx, try; int i, j; FILE *f; char ch; int done; char inp[1000]; int bb[4]; if (c->marktype == 'n') return; ms0 = c->marksize[0] / 2.0; ms1 = c->marksize[1] / 2.0; gsave(); printf(" %f %f translate %f rotate\n", x, y, c->mrotate); switch (c->marktype) { case 'n': break; case 'E': if (c->eps == CNULL) break; f = fopen(c->eps, "r"); if (f == NULL) { fprintf(stderr, "Error: eps file %s couldn't be opened\n", c->eps); exit(1); } /* Get bbox */ done = 0; while (!done && fgets(inp, 1000, f) != NULL) { if (strncmp("%%BoundingBox:", inp, 14) == 0) done = 1; } if (!done) { fprintf(stderr, "Error: Eps file '%s' has %s\n", c->eps, "no bounding box"); exit(1); } if (sscanf(inp+14, "%d %d %d %d", bb, bb+1, bb+2, bb+3) != 4) { fprintf(stderr, "Error: Eps file '%s': bad bounding box.\n", c->eps); exit(1); } if (bb[2] - bb[0] == 0) { scx = ms0; trx = 0.0; } else { scx = ms0 * 2.0/(float)(bb[2] - bb[0]); trx = -(float)(bb[2] - bb[0])/2.0 - bb[0]; } if (bb[3] - bb[1] == 0) { scy = ms1; try = 0.0; } else { scy = ms1 * 2.0/(float)(bb[3] - bb[1]); try = -(float)(bb[3] - bb[1])/2.0 - bb[1]; } /* Don't scale if ms == 0 0 */ if (ms0 == 0.0 && ms1 == 0.0) { scx = 1.0; scy = 1.0; } sprintf(inp, "Including eps file %s", c->eps); comment(inp); /* Use bbox to scale and translate */ printf("%f %f scale %f %f translate\n", scx, scy, trx, try); /* Include the rest of the file */ for (ch = getc(f); ch != real_eof; ch = getc(f)) putchar(ch); putchar('\n'); fclose(f); break; case 'p': if (c->postscript == CNULL) break; if (ms0 != 0.0 || ms1 != 0.0) { printf("%f %f scale\n", ms0, ms1); } if (!c->postfile) { printf("%s\n", c->postscript); } else { f = fopen(c->postscript, "r"); if (f == NULL) { fprintf(stderr, "Error: postscript file %s couldn't be opened\n", c->postscript); exit(1); } for (ch = getc(f); ch != real_eof; ch = getc(f)) putchar(ch); putchar('\n'); fclose(f); } break; case 'c': printline(-ms0, 0.0, ms0, 0.0, 'x'); printline(-ms1, 0.0, ms1, 0.0, 'y'); break; case 'b': start_poly(-ms0, -ms1); cont_poly(ms0, -ms1); cont_poly(ms0, ms1); cont_poly(-ms0, ms1); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'd': start_poly(-ms0, 0.0); cont_poly(0.0, -ms1); cont_poly(ms0, 0.0); cont_poly(0.0, ms1); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'g': p = first(c->general_marks); if (p == nil(c->general_marks)) break; if (next(p) == nil(c->general_marks)) break; start_poly(p->x*ms0, p->y*ms1); for(p = next(p); p != nil(c->general_marks); p = next(p)) cont_poly(p->x*ms0, p->y*ms1); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'G': i = 0; for (p = first(c->general_marks); p != nil(c->general_marks); p = next(p)) { if (i == 0) { printf("%f %f moveto ", p->x*ms0, p->y*ms1); } else { printf("%f %f lineto\n", p->x*ms0, p->y*ms1); } if (i == 100) { printf("stroke\n"); p = prev(p); i = 0; } else i++; } if (i != 0) printf("stroke\n"); break; case 'B': i = 0; j = 0; for (p = first(c->general_marks); p != nil(c->general_marks); p = next(p)) { if (j == 0 && i == 0) { printf("%f %f moveto ", p->x*ms0, p->y*ms1); j++; } else if (i != 0) { printf("%f %f ", p->x*ms0, p->y*ms1); } else { printf("%f %f curveto\n", p->x*ms0, p->y*ms1); j++; } if (j == 30 && i == 0) { printf(" stroke\n"); p = prev(p); j = 0; i = 0; } else i = (i + 1) % 3; } if (j != 0) printf(" stroke\n"); if (! ((i == 1) || (i == 0 && j == 0))) { fprintf(stderr, "Error: curve %d, %s\n", c->num, "wrong number of points for bezier marktype\n"); exit(1); } break; case 'Z': i = 0; j = 0; for (p = first(c->general_marks); p != nil(c->general_marks); p = next(p)) { if (i == 0 && j == 0) { printf("newpath %f %f moveto ", p->x*ms0, p->y*ms1); j++; } else if (i != 0) { printf("%f %f ", p->x*ms0, p->y*ms1); } else { printf("%f %f curveto\n", p->x*ms0, p->y*ms1); } i = (i + 1) % 3; } printf("closepath "); setfill(x, y, c->filltype, c->fill, c->pattern, c->parg); printf("stroke\n"); if (i != 1) { fprintf(stderr, "Error: curve %d, %s\n", c->num, "wrong number of points for bezier marktype\n"); exit(1); } break; case 'x': printline(-ms0, -ms1, ms0, ms1, 'x'); printline(-ms0, ms1, ms0, -ms1, 'x'); break; case 'o': printellipse(x, y, ms0, ms0, c->filltype, c->fill, c->pattern, c->parg); break; case 'e': printellipse(x, y, ms0, ms1, c->filltype, c->fill, c->pattern, c->parg); break; case 't': start_poly(ms0, -ms1); cont_poly(0.0, ms1); cont_poly(-ms0, -ms1); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'X': start_poly(ms0, 0.0); cont_poly(-ms0, 0.0); cont_poly(-ms0, g->x_axis->draw_at - y); cont_poly(ms0, g->x_axis->draw_at - y); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'Y': start_poly(0.0, ms1); cont_poly(0.0, -ms1); cont_poly(g->y_axis->draw_at - x, -ms1); cont_poly(g->y_axis->draw_at - x, ms1); end_poly(x, y, c->filltype, c->fill, c->pattern, c->parg); break; case 'l': draw_label(c->lmark); break; default: error_header(); fprintf(stderr, "Unknown mark: %c\n", c->marktype); break; } grestore(); } void draw_arrow(x1, y1, x2, y2, c) float x1, y1, x2, y2; Curve c; { float dx, dy; float ms0; float theta, ct, st; if (c->marktype == 'o') { dx = x1 - x2; dy = y1 - y2; if (dx == 0.0 && dy == 0.0) return; ms0 = c->marksize[0] / 2.0; if (dx == 0.0) theta = asin(1.0); else theta = atan(dy/dx); if (theta < 0.0) theta = -theta; ct = cos(theta)*ms0; st = sin(theta)*ms0; x1 = x1 + ct*(dx > 0.0 ? -1.0 : 1.0); y1 = y1 + st*(dy > 0.0 ? -1.0 : 1.0); if ( ((x1 - x2 > 0) != (dx > 0)) || ((y1 - y2 > 0) != (dy > 0)) ) return; } dx = x1 - x2; dy = y1 - y2; if (dx == 0.0 && dy == 0.0) return; gsave(); printf("%f %f translate %f %f atan rotate\n", x1, y1, dy, dx); start_poly(0.0, 0.0); cont_poly(-(c->asize[0]), (c->asize[1])); cont_poly(-(c->asize[0]), -(c->asize[1])); end_poly(0.0, 0.0, c->afilltype, c->afill, c->apattern, c->aparg); grestore(); printf("\n"); } void draw_legend(g) Graph g; { Curve c; Legend l; float x, y; char tmpmktype; l = g->legend; comment("Drawing legend"); if (l->type == 'n' || l->anylines < 0) return; gsave(); if (l->type == 'u') { printf("%f %f translate %f rotate\n", l->l->x, l->l->y, l->l->rotate); } for (c = first(g->curves); c != nil(g->curves); c = next(c)) { if (c->l->label != CNULL) { gsave(); setgray(c->graytype, c->gray); y = (c->l->ymax + c->l->ymin) / 2.0; if (l->anylines) { if (c->linetype != '0' && l->linelength != 0) { if (l->type == 'c' && c->l->hj == 'r') { x = c->l->x + l->midspace; } else { x = c->l->x - l->midspace - l->linelength; } start_line(x, y, c); cont_line(x+l->linelength, y); end_line(); } tmpmktype = c->marktype; c->marktype = 'n'; if (c->larrows || c->larrow) draw_arrow(x, y, x+l->linelength, y, c); if (c->rarrows || c->rarrow) draw_arrow(x+l->linelength, y, x, y, c); c->marktype = tmpmktype; if (l->type == 'c' && c->l->hj == 'r') { x = c->l->x + l->midspace + l->linelength / 2.0; } else { x = c->l->x - l->midspace - l->linelength / 2.0; } } else if (l->type == 'c' && c->l->hj == 'r') { x = c->l->x + l->midspace; } else { x = c->l->x - l->midspace; } if (c->marktype == 'X' || c->marktype == 'Y') { char old; old = c->marktype; c->marktype = 'b'; draw_mark(x, y, c, g); c->marktype = old; } else { draw_mark(x, y, c, g); } grestore(); printf("\n"); draw_label(c->l); } } grestore(); printf("\n"); } void draw_strings(g) Graph g; { String s; comment("Drawing strings"); for (s = first(g->strings); s != nil(g->strings); s = next(s)) draw_label(s->s); } void draw_graph(g) Graph g; { comment("Drawing New Graph"); printf("%f %f translate\n", g->x_translate, g->y_translate); if (g->border) { printline(0.0, 0.0, 0.0, g->y_axis->psize, 'x'); printline(0.0, 0.0, 0.0, g->x_axis->psize, 'y'); printline(g->x_axis->psize, 0.0, g->x_axis->psize, g->y_axis->psize, 'x'); printline(g->y_axis->psize, 0.0, g->y_axis->psize, g->x_axis->psize, 'y'); } draw_axis(g->x_axis, g->y_axis); draw_axis(g->y_axis, g->x_axis); draw_label(g->title); draw_curves(g); draw_legend(g); draw_strings(g); printf("%f %f translate\n", - g->x_translate, - g->y_translate); } void draw_graphs(gs, pp, landscape) Graphs gs; int pp; int landscape; { Graphs gs_p; Graph g; for (gs_p = first(gs); gs_p != nil(gs); gs_p = next(gs_p)) { draw_header(gs_p, pp, landscape); for (g = first(gs_p->g); g != nil(gs_p->g); g = next(g)) { draw_graph(g); } draw_footer(gs_p, pp); } } void draw_header(gs, pp, landscape) Graphs gs; int pp; int landscape; { FILE *f; char c; if (gs->page == 1) printf("%%!PS-Adobe-2.0 EPSF-1.2\n"); printf("%%%%Page: %d %d\n", gs->page, gs->page); if (landscape) { printf("%%%%BoundingBox: %d %d %d %d\n", gs->bb[1], gs->bb[0], gs->bb[3], gs->bb[2]); } else { printf("%%%%BoundingBox: %d %d %d %d\n", gs->bb[0], gs->bb[1], gs->bb[2], gs->bb[3]); } printf("%%%%EndComments\n"); if (landscape) { printf("-90 rotate\n"); } if (pp) { if (landscape) { printf("%f 0 translate\n", -(11.0 * FCPI)); printf("%f %f translate\n", (((11.0 * FCPI) - (gs->bb[2] - gs->bb[0])) / 2.0) - gs->bb[0], (((8.5 * FCPI) - (gs->bb[3] - gs->bb[1])) / 2.0) - gs->bb[1]); } else { printf("%f %f translate\n", (((8.5 * FCPI) - (gs->bb[2] - gs->bb[0])) / 2.0) - gs->bb[0], (((11.0 * FCPI) - (gs->bb[3] - gs->bb[1])) / 2.0) - gs->bb[1]); } } else if (landscape) { printf("%f 0 translate\n", (double) (-gs->bb[2] - gs->bb[0])); } printf("1 setlinecap 1 setlinejoin\n"); printf("0.700 setlinewidth\n"); printf("0.00 setgray\n"); printf("\n"); printf("/Jrnd { exch cvi exch cvi dup 3 1 roll idiv mul } def\n"); printf("/JDEdict 8 dict def\n"); printf("JDEdict /mtrx matrix put\n"); printf("/JDE {\n"); printf(" JDEdict begin\n"); printf(" /yrad exch def\n"); printf(" /xrad exch def\n"); printf(" /savematrix mtrx currentmatrix def\n"); printf(" xrad yrad scale\n"); printf(" 0 0 1 0 360 arc\n"); printf(" savematrix setmatrix\n"); printf(" end\n"); printf("} def\n"); printf("/JSTR {\n"); printf(" gsave 1 eq { gsave 1 setgray fill grestore } if\n"); printf(" exch neg exch neg translate \n"); printf(" clip \n"); printf(" rotate \n"); printf(" 4 dict begin\n"); printf(" pathbbox /&top exch def\n"); printf(" /&right exch def\n"); printf(" /&bottom exch def\n"); printf(" &right sub /&width exch def\n"); printf(" newpath\n"); printf(" currentlinewidth mul round dup \n"); printf(" &bottom exch Jrnd exch &top \n"); printf(" 4 -1 roll currentlinewidth mul setlinewidth \n"); printf(" { &right exch moveto &width 0 rlineto stroke } for \n"); printf(" end\n"); printf(" grestore\n"); printf(" newpath\n"); printf("} bind def\n"); gsave(); setfont("Times-Roman", 9.00); if (gs->preamble != CNULL) { if (gs->prefile) { f = fopen(gs->preamble, "r"); if (f == NULL) { fprintf(stderr, "Error: preamble file %s couldn't be opened\n", gs->preamble); exit(1); } for (c = getc(f); c != real_eof; c = getc(f)) putchar(c); putchar('\n'); fclose(f); } else { printf("%s\n", gs->preamble); } } } void draw_footer(gs, pp) Graphs gs; int pp; { FILE *f; char c; if (gs->epilogue != CNULL) { if (gs->epifile) { f = fopen(gs->epilogue, "r"); if (f == NULL) { fprintf(stderr, "Error: epilogue file %s couldn't be opened\n", gs->epilogue); exit(1); } for (c = getc(f); c != real_eof; c = getc(f)) putchar(c); putchar('\n'); fclose(f); } else { printf("%s\n", gs->epilogue); } } grestore(); if (pp) printf("showpage\n"); else printf("\n"); } @ 8.4 log @Fixing the seg fault and all of those warnings. @ text @d6 4 a9 4 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/draw.c,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ d56 14 d109 1 a109 1 draw_axis(a, other) d175 1 a175 1 draw_label(l) d183 1 a183 1 set_clip(g) d194 1 a194 1 draw_curves(g) d209 1 a209 1 draw_curve(c, g) d328 1 a328 1 draw_mark(x, y, c, g) d338 2 a339 2 int done, newline; char inp[100]; a358 1 newline = 1; d360 7 a366 12 while(!done) { while(!newline) { ch = getc(f); if (ch == real_eof) { fprintf(stderr, "Error: Eps file '%s' has %s\n", c->eps, "no bounding box"); exit(1); } newline = (ch == '\n'); } fscanf(f, "%s", inp); if (strcmp(inp, "%%BoundingBox:") == 0) done = 1; d368 3 a370 6 for (i = 0; i < 4; i++) { if (fscanf(f, "%d", &(bb[i])) == 0) { fprintf(stderr, "Error: Eps file '%s': eof in %s\n", c->eps, "bounding box"); exit(1); } d551 1 a551 1 draw_arrow(x1, y1, x2, y2, c) d591 1 a591 1 draw_legend(g) d655 1 a655 1 draw_strings(g) d665 1 a665 1 draw_graph(g) d686 1 a686 1 draw_graphs(gs, pp, landscape) d703 1 a703 1 draw_header(gs, pp, landscape) d798 1 a798 1 draw_footer(gs, pp) @ jgraph/RCS/edit.c,v0000555005471000040510000011142113207316747013144 0ustar planklocihead 8.5; access; symbols; locks plank:8.5; strict; comment @ * @; 8.5 date 2017.11.28.17.33.27; author plank; state Exp; branches; next 8.4; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.5 log @Clang requires explicit voids. @ text @/* edit.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/edit.c,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "jgraph.h" #define MAX(a,b) ((a > b) ? a : b) #define MIN(a,b) ((a < b) ? a : b) void edit_label(); void copy_curve(); void copy_label(); void copy_axis(); void copy_legend(); void inherit_axes(); void getpattern(); void edit_curve(); void edit_hash_label(); void edit_axis(); void edit_legend(); void edit_graph(); void edit_graphs(); void edit_label(l) Label l; { char *txt, inp_str[80]; float f; int i; while ( getstring(inp_str) ) { if (strcmp(inp_str, ":") == 0) { if ((txt = getlabel()) == CNULL) return; l->label = txt; } else if (strcmp(inp_str, "x") == 0) { if (!getfloat(&f)) rejecttoken(); else l->x = f; } else if (strcmp(inp_str, "y") == 0) { if (!getfloat(&f)) rejecttoken(); else l->y = f; } else if (strcmp(inp_str, "fontsize") == 0) { if (!getfloat(&f)) rejecttoken(); else l->fontsize = f; } else if (strcmp(inp_str, "linesep") == 0) { if (!getfloat(&f)) rejecttoken(); else l->linesep = f; } else if (strcmp(inp_str, "hjl") == 0) { l->hj = 'l'; } else if (strcmp(inp_str, "hjc") == 0) { l->hj = 'c'; } else if (strcmp(inp_str, "hjr") == 0) { l->hj = 'r'; } else if (strcmp(inp_str, "vjc") == 0) { l->vj = 'c'; } else if (strcmp(inp_str, "vjt") == 0) { l->vj = 't'; } else if (strcmp(inp_str, "vjb") == 0) { l->vj = 'b'; } else if (strcmp(inp_str, "font") == 0) { if (!getstring(inp_str)) return; txt = (char *) malloc (sizeof(char)*strlen(inp_str)+2); strcpy(txt, inp_str); l->font = txt; } else if (strcmp(inp_str, "rotate") == 0) { if (!getfloat(&f)) rejecttoken(); else l->rotate = f; } else if (strcmp(inp_str, "lgray") == 0) { if (!getfloat(&f)) rejecttoken(); else { l->graytype = 'g'; l->gray[0] = f; } } else if (strcmp(inp_str, "lcolor") == 0) { l->graytype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); l->graytype = 'n'; break ; } else l->gray[i] = f ; } } else { rejecttoken(); return; } } } void copy_curve(c1, c2) /* Copies curve c2 to c1 */ Curve c1, c2; { Flist f, newf; Point p, newp; copy_label(c1->l, c2->l); copy_label(c1->lmark, c2->lmark); c1->l->label = CNULL; c1->clip = c2->clip; for (f = first(c2->gen_linetype); f != nil(c2->gen_linetype); f = next(f)) { newf = (Flist) get_node((List) c1->gen_linetype); newf->f = f->f; insert((List) newf, (List) c1->gen_linetype); } c1->pattern = c2->pattern; c1->apattern = c2->apattern; c1->ppattern = c2->ppattern; c1->parg = c2->parg; c1->aparg = c2->aparg; c1->pparg = c2->pparg; c1->marktype = c2->marktype; c1->linetype = c2->linetype; c1->linethick = c2->linethick; c1->marksize[0] = c2->marksize[0]; c1->marksize[1] = c2->marksize[1]; c1->mrotate = c2->mrotate; for (p = first(c2->general_marks); p != nil(c2->general_marks); p = next(p)) { newp = (Point) get_node((List) c1->general_marks); newp->x = p->x; newp->y = p->y; insert((List) newp, (List) c1->general_marks); } c1->graytype = c2->graytype; c1->gray[0] = c2->gray[0]; c1->gray[1] = c2->gray[1]; c1->gray[2] = c2->gray[2]; c1->filltype = c2->filltype; c1->fill[0] = c2->fill[0]; c1->fill[1] = c2->fill[1]; c1->fill[2] = c2->fill[2]; c1->poly = c2->poly; c1->pfilltype = c2->pfilltype; c1->pfill[0] = c2->pfill[0]; c1->pfill[1] = c2->pfill[1]; c1->pfill[2] = c2->pfill[2]; c1->afilltype = c2->afilltype; c1->afill[0] = c2->afill[0]; c1->afill[1] = c2->afill[1]; c1->afill[2] = c2->afill[2]; c1->postscript = c2->postscript; c1->postfile = c2->postfile; c1->eps = c2->eps; c1->rarrow = c2->rarrow; c1->larrow = c2->larrow; c1->rarrows = c2->rarrows; c1->larrows = c2->larrows; c1->asize[0] = c2->asize[0]; c1->asize[1] = c2->asize[1]; c1->bezier = c2->bezier; } void copy_label(l1, l2) /* Copies label l2 to l1 */ Label l1, l2; { l1->label = l2->label; l1->x = l2->x; l1->y = l2->y; l1->rotate = l2->rotate; l1->font = l2->font; l1->fontsize = l2->fontsize; l1->hj = l2->hj; l1->vj = l2->vj; l1->graytype = l2->graytype; l1->gray[0] = l2->gray[0]; l1->gray[1] = l2->gray[1]; l1->gray[2] = l2->gray[2]; l1->linesep = l2->linesep; } void copy_axis(a1, a2) /* Copies axis a2 to a1 */ Axis a1, a2; { copy_label(a1->label, a2->label); copy_label(a1->hl, a2->hl); a1->max = a2->max; a1->min = a2->min; a1->pmax = a2->pmax; a1->pmin = a2->pmin; a1->size = a2->size; a1->hash_interval = a2->hash_interval; a1->hash_start = a2->hash_start; a1->log_base = a2->log_base; a1->draw_hash_marks_at = a2->draw_hash_marks_at; a1->draw_hash_labels_at = a2->draw_hash_labels_at; a1->draw_at = a2->draw_at; a1->draw_hash_labels = a2->draw_hash_labels; a1->draw_axis_line = a2->draw_axis_line; a1->draw_hash_marks = a2->draw_hash_marks; a1->draw_axis_label = a2->draw_axis_label; a1->auto_hash_labels = a2->auto_hash_labels; a1->auto_hash_marks = a2->auto_hash_marks; a1->minor_hashes = a2->minor_hashes; a1->hash_scale = a2->hash_scale; a1->hash_format = a2->hash_format; a1->graytype = a2->graytype; a1->gray[0] = a2->gray[0]; a1->gray[1] = a2->gray[1]; a1->gray[2] = a2->gray[2]; a1->mgr_graytype = a2->mgr_graytype; a1->mgr_gray[0] = a2->mgr_gray[0]; a1->mgr_gray[1] = a2->mgr_gray[1]; a1->mgr_gray[2] = a2->mgr_gray[2]; a1->gr_graytype = a2->gr_graytype; a1->gr_gray[0] = a2->gr_gray[0]; a1->gr_gray[1] = a2->gr_gray[1]; a1->gr_gray[2] = a2->gr_gray[2]; a1->grid_lines = a2->grid_lines; a1->mgrid_lines = a2->mgrid_lines; a1->precision = a2->precision; a1->start_given = a2->start_given; a1->is_lg = a2->is_lg; a1->is_x = a2->is_x; } Curve do_copy_curve(g, gs, all_gs) Graph g; Graphs gs; Graphs all_gs; { Curve lastc, newc; Graph oldg; Graphs oldgs; int num; if (!getint(&num)) { rejecttoken(); oldg = g; oldgs = gs; while(gs != nil(all_gs)) { if (gs != oldgs) g = last(gs->g); while(g != nil(gs->g)) { if (first(g->curves) == nil(g->curves)) g = prev(g); else { lastc = last(g->curves); if (first(oldg->curves) == nil(oldg->curves)) newc = new_curve(oldg->curves, 0); else newc = new_curve(oldg->curves, last(oldg->curves)->num + 1); copy_curve(newc, lastc); return newc; } } gs = prev(gs); } error_header(); fprintf(stderr, "Cannot perform copycurve on first curve\n"); exit(1); } else { if (first(g->curves) == nil(g->curves)) newc = new_curve(g->curves, 0); else newc = new_curve(g->curves, last(g->curves)->num + 1); lastc = g->curves; while(1) { lastc = prev(lastc); if (lastc == nil(g->curves) || lastc->num < num) { error_header(); fprintf(stderr, "copycurve: curve #%d not found\n", num); exit(1); } if (lastc->num == num) { copy_curve(newc, lastc); return newc; } } } return newc; /* To shut lint up */ } Label do_copy_string(g, gs, all_gs) Graph g; Graphs gs; Graphs all_gs; { String lastl, newl; Graph oldg; Graphs oldgs; int num; if (!getint(&num)) { rejecttoken(); oldgs = gs; oldg = g; while(gs != nil(all_gs)) { if (gs != oldgs) g = last(gs->g); while(g != nil(gs->g)) { if (first(g->strings) == nil(g->strings)) g = prev(g); else { lastl = last(g->strings); if (first(oldg->strings) == nil(oldg->strings)) newl = new_string(oldg->strings, 0); else newl = new_string(oldg->strings, last(oldg->strings)->num + 1); copy_label(newl->s, lastl->s); return newl->s; } } gs = prev(gs); } error_header(); fprintf(stderr, "Cannot perform copystring on first string\n"); exit(1); return newl->s; /* To shut lint up */ } else { if (first(g->strings) == nil(g->strings)) newl = new_string(g->strings, 0); else newl = new_string(g->strings, last(g->strings)->num + 1); lastl = g->strings; while(1) { lastl = prev(lastl); if (lastl == nil(g->strings) || lastl->num < num) { error_header(); fprintf(stderr, "copystring: string #%d not found\n", num); exit(1); } if (lastl->num == num) { copy_label(newl->s, lastl->s); return newl->s; } } } } Graph last_graph(g, gs, all_gs) Graph g; Graphs gs; Graphs all_gs; { Graph lastg; lastg = prev(g); while(lastg == nil(gs->g)) { if (prev(gs) == nil(all_gs)) { error_header(); fprintf(stderr, "First graph cannot inherit axes\n"); exit(1); } else { gs = prev(gs); lastg = last(gs->g); } } return lastg; } void copy_legend(l1, l2) Legend l1, l2; { l1->linelength = l2->linelength; l1->linebreak = l2->linebreak; l1->midspace = l2->midspace; l1->type = l2->type; copy_label(l1->l, l2->l); } void inherit_axes(g, lastg) Graph g; Graph lastg; { char *s; copy_axis(g->x_axis, lastg->x_axis); copy_axis(g->y_axis, lastg->y_axis); g->x_translate = lastg->x_translate; g->y_translate = lastg->y_translate; g->clip = lastg->clip; g->border = lastg->border; copy_legend(g->legend, lastg->legend); s = g->title->label; copy_label(g->title, lastg->title); g->title->label = s; } void getpattern(inp_str, key, p, a) char *inp_str, *key, *p; float *a; { int i; float f; if (!getstring(inp_str)) return; for (i = 0; i < NPATTERNS; i++) { if (strcmp(inp_str, PATTERNS[i]) == 0) { *p = PTYPES[i]; if (getfloat(&f)) { *a = f; } else { rejecttoken(); } i = NPATTERNS + 1; } } if (i == NPATTERNS) { error_header(); fprintf(stderr, "Bad %s: %s\n", key, inp_str); error_header(); fprintf(stderr, " Valid %ss are:", key); for (i = 0; i < NPATTERNS; i++) fprintf(stderr, " %s", PATTERNS[i]); fprintf(stderr, "\n"); exit(1); } return; } void edit_curve(c, g) Curve c; Graph g; { char inp_str[256], *txt; float x, y, f, e1, e2; float xh, yh, xl, yl; Point p, p1, p2; Flist fl; FILE *fi; int i; char e; while ( getstring(inp_str) ) { if (strcmp(inp_str, "y_epts") == 0 || strcmp(inp_str, "pts") == 0 || strcmp(inp_str, "x_epts") == 0) { e = inp_str[0]; while (getfloat(&x)) { if (e == 'p') { if (!getfloat(&y)) { error_header(); fprintf(stderr, "Reading Points, no y value for x=%f\n", x); exit(1); } } else { if (!getfloat(&y) || !getfloat(&e1) || !getfloat(&e2)) { error_header(); fprintf(stderr, "Reading %s, need 4 values per data point\n", inp_str); exit(1); } } p = (Point) get_node((List) c->pts); p->x = x; p->y = y; p->e = e; insert((List) p, (List) c->pts); c->npts++; if (e == 'x') { p1 = (Point) get_node((List) c->xepts); p1->x = e1; p1->y = y; p2 = (Point) get_node((List) c->xepts); p2->x = e2; p2->y = y; insert((List) p1, (List) c->xepts); insert((List) p2, (List) c->xepts); xh = MAX(e1, e2); xh = MAX(xh, x); xl = MIN(e1, e2); xl = MIN(xl, x); yh = y; yl = y; } else if (e == 'y') { p1 = (Point) get_node((List) c->yepts); p1->y = e1; p1->x = x; p2 = (Point) get_node((List) c->yepts); p2->y = e2; p2->x = x; insert((List) p1, (List) c->yepts); insert((List) p2, (List) c->yepts); yh = MAX(e1, e2); yh = MAX(yh, y); yl = MIN(e1, e2); yl = MIN(yl, y); xh = x; xl = x; } else { xh = x; xl = x; yh = y; yl = y; } if (g->x_axis->pmax == FSIG) { g->x_axis->pmax = xh; g->x_axis->pmin = xl; g->y_axis->pmax = yh; g->y_axis->pmin = yl; } else { g->x_axis->pmax = MAX(g->x_axis->pmax, xh); g->x_axis->pmin = MIN(g->x_axis->pmin, xl); g->y_axis->pmax = MAX(g->y_axis->pmax, yh); g->y_axis->pmin = MIN(g->y_axis->pmin, yl); } } rejecttoken(); } else if (strcmp(inp_str, "label") == 0) { edit_label(c->l); } else if (strcmp(inp_str, "marksize") == 0) { if (!getfloat(&f)) rejecttoken(); else { c->marksize[0] = f; if (!getfloat(&f)) rejecttoken(); else c->marksize[1] = f; } } else if (strcmp(inp_str, "gmarks") == 0) { while (getfloat(&x)) { if (!getfloat(&y)) { error_header(); fprintf(stderr, "Reading GMarks, no y value for x=%f\n", x); exit(1); } p = (Point) get_node((List) c->general_marks); p->x = x; p->y = y; insert((List) p, (List) c->general_marks); } rejecttoken(); } else if (strcmp(inp_str, "pfill") == 0) { if (!getfloat(&f)) rejecttoken(); else { /* grey fill */ c->pfilltype = 'g'; c->pfill[0] = f; } } else if (strcmp(inp_str, "pcfill") == 0) { /* color fill */ c->pfilltype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); c->pfilltype = 'n'; break ; } else c->pfill[i] = f ; } } else if (strcmp(inp_str, "fill") == 0) { if (!getfloat(&f)) rejecttoken(); else { /* grey fill */ c->filltype = 'g'; c->fill[0] = f; } } else if (strcmp(inp_str, "cfill") == 0) { /* color fill */ c->filltype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); c->filltype = 'n'; break ; } else c->fill[i] = f ; } } else if (strcmp(inp_str, "afill") == 0) { if (!getfloat(&f)) rejecttoken(); else { c->afilltype = 'g'; c->afill[0] = f; } } else if (strcmp(inp_str, "acfill") == 0) { c->afilltype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); c->afilltype = 'n'; break ; } else c->afill[i] = f ; } } else if (strcmp(inp_str, "marktype") == 0) { if (!getstring(inp_str)) return; for (i = 0; i < NMARKTYPES && strcmp(inp_str, MARKTYPESTRS[i]) != 0; i++) ; if (i == NMARKTYPES) { error_header(); fprintf(stderr, "Bad mark: %s\n", inp_str); fprintf(stderr, " Valid marks are:"); for (i = 0; i < NMARKTYPES; i++) { fprintf(stderr, " %s", MARKTYPESTRS[i]); } fprintf(stderr, "\n"); exit(1); } else { c->marktype = MARKTYPES[i]; if (c->marktype == 'l') edit_label(c->lmark); } } else if (strcmp(inp_str, "glines") == 0) { while (getfloat(&f)) { fl = (Flist) get_node((List) c->gen_linetype); fl->f = f; insert((List) fl, (List) c->gen_linetype); } rejecttoken(); } else if (strcmp(inp_str, "pattern") == 0) { getpattern(inp_str, "pattern", &(c->pattern), &(c->parg)); } else if (strcmp(inp_str, "apattern") == 0) { getpattern(inp_str, "apattern", &(c->apattern), &(c->aparg)); } else if (strcmp(inp_str, "ppattern") == 0) { getpattern(inp_str, "ppattern", &(c->ppattern), &(c->pparg)); } else if (strcmp(inp_str, "linetype") == 0) { if (!getstring(inp_str)) return; if (strcmp(inp_str, "none") == 0) c->linetype = '0'; else if (strcmp(inp_str, "solid") == 0) c->linetype = 's'; else if (strcmp(inp_str, "dotted") == 0) c->linetype = '.'; else if (strcmp(inp_str, "dashed") == 0) c->linetype = '-'; else if (strcmp(inp_str, "longdash") == 0) c->linetype = 'l'; else if (strcmp(inp_str, "dotdash") == 0) c->linetype = 'd'; else if (strcmp(inp_str, "dotdotdash") == 0) c->linetype = 'D'; else if (strcmp(inp_str, "dotdotdashdash") == 0) c->linetype = '2'; else if (strcmp(inp_str, "general") == 0) c->linetype = 'g'; else { error_header(); fprintf(stderr, "Bad line type: %s\n", inp_str); error_header(); fprintf(stderr, " Valid marks are %s\n", "solid, dotted, dashed, longdash, dotdash,"); error_header(); fprintf(stderr, " %s.\n", "dotdotdash, dotdotdashdash, none"); exit(1); } } else if (strcmp(inp_str, "linethickness") == 0) { if (!getfloat(&f)) rejecttoken(); else c->linethick = f; } else if (strcmp(inp_str, "gray") == 0) { if (!getfloat(&f)) rejecttoken(); else { c->graytype = 'g'; c->gray[0] = f; } } else if (strcmp(inp_str, "color") == 0) { c->graytype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); c->graytype = 'n'; break ; } else c->gray[i] = f ; } } else if (strcmp(inp_str, "mrotate") == 0) { if (!getfloat(&f)) rejecttoken(); else { c->mrotate = f; } } else if (strcmp(inp_str, "eps") == 0) { if (!getstring(inp_str)) { error_header(); fprintf(stderr, "eps token must be followed by an %s\n", "encapsulated postscript file\n"); exit(1); } c->marktype = 'E'; c->eps = (char *) malloc ((strlen(inp_str)+1)*sizeof(char)); strcpy(c->eps, inp_str); fi = fopen(c->eps, "r"); if (fi == NULL) { error_header(); fprintf(stderr, "couldn't open eps file '%s'\n", c->eps); exit(1); } fclose(fi); } else if (strcmp(inp_str, "postscript") == 0) { if (!getstring(inp_str)) return; c->marktype = 'p'; if (strcmp(inp_str, ":") == 0) { c->postfile = 0; if ((txt = getmultiline()) == CNULL) return; c->postscript = txt; } else { c->postfile = 1; c->postscript = (char *) malloc ((strlen(inp_str)+1)*sizeof(char)); strcpy(c->postscript, inp_str); fi = fopen(c->postscript, "r"); if (fi == NULL) { error_header(); fprintf(stderr, "couldn't open postscript file '%s'\n", c->postscript); exit(1); } fclose(fi); } } else if (strcmp(inp_str, "poly") == 0) { c->poly = 1; } else if (strcmp(inp_str, "nopoly") == 0) { c->poly = 0; } else if (strcmp(inp_str, "larrow") == 0) { c->larrow = 1; } else if (strcmp(inp_str, "nolarrow") == 0) { c->larrow = 0; } else if (strcmp(inp_str, "rarrow") == 0) { c->rarrow = 1; } else if (strcmp(inp_str, "norarrow") == 0) { c->rarrow = 0; } else if (strcmp(inp_str, "larrows") == 0) { c->larrows = 1; } else if (strcmp(inp_str, "nolarrows") == 0) { c->larrows = 0; } else if (strcmp(inp_str, "rarrows") == 0) { c->rarrows = 1; } else if (strcmp(inp_str, "norarrows") == 0) { c->rarrows = 0; } else if (strcmp(inp_str, "bezier") == 0) { c->bezier = 1; } else if (strcmp(inp_str, "nobezier") == 0) { c->bezier = 0; } else if (strcmp(inp_str, "asize") == 0) { if (!getfloat(&f)) rejecttoken(); else { c->asize[0] = f; if (!getfloat(&f)) rejecttoken(); else c->asize[1] = f; } } else if (strcmp(inp_str, "clip") == 0) { c->clip = 1; } else if (strcmp(inp_str, "noclip") == 0) { c->clip = 0; } else { rejecttoken(); return; } } } void edit_hash_label(a) Axis a; { float at, f; char *s; char inp_str[256]; String st; int done; s = CNULL; at = (first(a->hash_lines) == nil(a->hash_lines)) ? FSIG : first(a->hash_lines)->loc; while(1) { done = 0; if (getstring(inp_str)) { if (strcmp(inp_str, ":") == 0) { if ((s = getlabel()) == CNULL) return; } else if (strcmp(inp_str, "at") == 0) { if (getfloat(&f)) { at = f; } else { rejecttoken(); done = 1; } } else { rejecttoken(); done = 1; } } else { done = 1; } if (done) { if (s == CNULL) return; if (at == FSIG) { error_header(); fprintf(stderr, "hash_label either needs \"at\" or an associated \"hash_at\"\n"); exit(1); } st = (String) get_node((List) a->hash_labels); st->s = new_label(); st->s->label = s; st->s->x = at; st->s->y = at; insert((List) st, (List) a->hash_labels); return; } } } void edit_axis(a) Axis a; { char inp_str[256]; float f; int i; Hash h; while ( getstring(inp_str) ) { if (strcmp(inp_str, "size") == 0) { if ( getfloat(&f)) a->size = f; else rejecttoken(); } else if (strcmp(inp_str, "max") == 0) { if ( getfloat(&f)) a->max = f; else rejecttoken(); } else if (strcmp(inp_str, "min") == 0) { if ( getfloat(&f)) a->min = f; else rejecttoken(); } else if (strcmp(inp_str, "hash") == 0) { if ( getfloat(&f)) a->hash_interval = f; else rejecttoken(); } else if (strcmp(inp_str, "shash") == 0) { if ( getfloat(&f)) { a->hash_start = f; a->start_given = 1; } else rejecttoken(); } else if (strcmp(inp_str, "mhash") == 0) { if (getint(&i)) a->minor_hashes = i; else rejecttoken(); } else if (strcmp(inp_str, "precision") == 0) { if (getint(&i)) a->precision = i; else rejecttoken(); } else if (strcmp(inp_str, "label") == 0) { edit_label(a->label); } else if (strcmp(inp_str, "hash_format") == 0) { if (!getstring(inp_str)) return; if (strcmp(inp_str, "g") == 0) { a->hash_format = 'g'; } else if (strcmp(inp_str, "G") == 0) { a->hash_format = 'G'; } else if (strcmp(inp_str, "E") == 0) { a->hash_format = 'E'; } else if (strcmp(inp_str, "e") == 0) { a->hash_format = 'e'; } else if (strcmp(inp_str, "f") == 0) { a->hash_format = 'f'; } else { error_header(); fprintf(stderr, "Invalid hash_style %s. Must be f, g, G, e or E\n", inp_str); exit(1); } } else if (strcmp(inp_str, "hash_labels") == 0) { edit_label(a->hl); } else if (strcmp(inp_str, "log_base") == 0) { if (getfloat(&f)) { if (f <= 1.0) { error_header(); fprintf(stderr, "\"log_base %f\": log_base must be > 1.0\n", f); exit(1); } else a->log_base = f; } else rejecttoken(); } else if (strcmp(inp_str, "draw_at") == 0) { if ( getfloat(&f)) a->draw_at = f; else rejecttoken(); } else if (strcmp(inp_str, "log") == 0) { a->is_lg = 1; } else if (strcmp(inp_str, "linear") == 0) { a->is_lg = 0; } else if (strcmp(inp_str, "nodraw") == 0) { a->draw_hash_labels = 0; a->draw_axis_line = 0; a->draw_hash_marks = 0; a->draw_axis_label = 0; } else if (strcmp(inp_str, "draw") == 0) { a->draw_hash_labels = 1; a->draw_axis_line = 1; a->draw_hash_marks = 1; a->draw_axis_label = 1; } else if (strcmp(inp_str, "hash_at") == 0 || strcmp(inp_str, "mhash_at") == 0) { if (getfloat(&f)) { h = (Hash) get_node((List) a->hash_lines); h->loc = f; h->major = (inp_str[0] == 'h'); h->size = h->major ? HASH_SIZE : MHASH_SIZE; insert((List) h, (List) a->hash_lines); } else rejecttoken(); } else if (strcmp(inp_str, "hash_label") == 0) { edit_hash_label(a); } else if (strcmp(inp_str, "hash_scale") == 0) { if ( getfloat(&f)) a->hash_scale = f; else rejecttoken(); } else if (strcmp(inp_str, "auto_hash_marks") == 0) { a->auto_hash_marks = 1; } else if (strcmp(inp_str, "no_auto_hash_marks") == 0) { a->auto_hash_marks = 0; } else if (strcmp(inp_str, "auto_hash_labels") == 0) { a->auto_hash_labels = 1; } else if (strcmp(inp_str, "no_auto_hash_labels") == 0) { a->auto_hash_labels = 0; } else if (strcmp(inp_str, "draw_hash_labels_at") == 0) { if (getfloat(&f)) a->draw_hash_labels_at = f; else rejecttoken(); } else if (strcmp(inp_str, "draw_hash_marks_at") == 0) { if (getfloat(&f)) a->draw_hash_marks_at = f; else rejecttoken(); } else if (strcmp(inp_str, "no_draw_hash_labels") == 0) { a->draw_hash_labels = 0; } else if (strcmp(inp_str, "draw_hash_labels") == 0) { a->draw_hash_labels = 1; } else if (strcmp(inp_str, "no_draw_axis_line") == 0) { a->draw_axis_line = 0; } else if (strcmp(inp_str, "draw_axis_line") == 0) { a->draw_axis_line = 1; } else if (strcmp(inp_str, "no_draw_axis") == 0) { a->draw_axis_line = 0; } else if (strcmp(inp_str, "draw_axis") == 0) { a->draw_axis_line = 1; } else if (strcmp(inp_str, "no_draw_hash_marks") == 0) { a->draw_hash_marks = 0; } else if (strcmp(inp_str, "draw_hash_marks") == 0) { a->draw_hash_marks = 1; } else if (strcmp(inp_str, "no_draw_axis_label") == 0) { a->draw_axis_label = 0; } else if (strcmp(inp_str, "draw_axis_label") == 0) { a->draw_axis_label = 1; } else if (strcmp(inp_str, "no_grid_lines") == 0) { a->grid_lines = 0; } else if (strcmp(inp_str, "grid_lines") == 0) { a->grid_lines = 1; } else if (strcmp(inp_str, "no_mgrid_lines") == 0) { a->mgrid_lines = 0; } else if (strcmp(inp_str, "mgrid_lines") == 0) { a->mgrid_lines = 1; } else if (strcmp(inp_str, "gray") == 0) { if (!getfloat(&f)) rejecttoken(); else { a->graytype = 'g'; a->gray[0] = f; } } else if (strcmp(inp_str, "color") == 0) { a->graytype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); a->graytype = 'n'; break ; } else a->gray[i] = f ; } } else if (strcmp(inp_str, "grid_gray") == 0) { if (!getfloat(&f)) rejecttoken(); else { a->gr_graytype = 'g'; a->gr_gray[0] = f; } } else if (strcmp(inp_str, "grid_color") == 0) { a->gr_graytype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); a->gr_graytype = 'n'; break ; } else a->gr_gray[i] = f ; } } else if (strcmp(inp_str, "mgrid_gray") == 0) { if (!getfloat(&f)) rejecttoken(); else { a->mgr_graytype = 'g'; a->mgr_gray[0] = f; } } else if (strcmp(inp_str, "mgrid_color") == 0) { a->mgr_graytype = 'c'; for( i = 0 ; i < 3 ; i++ ) { if(!getfloat(&f)) { rejecttoken(); a->mgr_graytype = 'n'; break ; } else a->mgr_gray[i] = f ; } } else { rejecttoken(); return; } } } void edit_legend(l) Legend l; { char inp_str[256]; float f; while ( getstring(inp_str) ) { if (strcmp(inp_str, "x") == 0) { if (!getfloat(&f)) rejecttoken(); else { l->l->x = f; l->l->hj = 'l'; l->l->vj = 't'; l->type = 'u'; } } else if (strcmp(inp_str, "y") == 0) { if (!getfloat(&f)) rejecttoken(); else { l->l->y = f; l->l->hj = 'l'; l->l->vj = 't'; l->type = 'u'; } } else if (strcmp(inp_str, "right") == 0 || strcmp(inp_str, "on") == 0) { l->type = 'u'; l->l->y = FSIG; l->l->x = FSIG; l->l->hj = 'l'; l->l->vj = 'c'; } else if (strcmp(inp_str, "left") == 0) { l->type = 'u'; l->l->y = FSIG; l->l->x = FSIG; l->l->hj = 'r'; l->l->vj = 'c'; } else if (strcmp(inp_str, "off") == 0) { l->type = 'n'; } else if (strcmp(inp_str, "top") == 0) { l->type = 'u'; l->l->y = FSIG; l->l->x = FSIG; l->l->hj = 'l'; l->l->vj = 'b'; } else if (strcmp(inp_str, "bottom") == 0) { l->type = 'u'; l->l->y = FSIG; l->l->x = FSIG; l->l->hj = 'l'; l->l->vj = 't'; } else if (strcmp(inp_str, "custom") == 0) { l->type = 'c'; } else if (strcmp(inp_str, "linelength") == 0) { if (!getfloat(&f)) rejecttoken(); else l->linelength = f; } else if (strcmp(inp_str, "linebreak") == 0) { if (!getfloat(&f)) rejecttoken(); else l->linebreak = f; } else if (strcmp(inp_str, "midspace") == 0) { if (!getfloat(&f)) rejecttoken(); else l->midspace = f; } else if (strcmp(inp_str, "defaults") == 0) { edit_label(l->l); } else { rejecttoken(); return; } } } void edit_graph(g, gs, all_gs) Graph g; Graphs gs; Graphs all_gs; { char inp_str[80]; int num; String s; float f; while ( getstring(inp_str) ) { if (strcmp(inp_str, "xaxis") == 0) edit_axis(g->x_axis); else if (strcmp(inp_str, "yaxis") == 0) edit_axis(g->y_axis); else if (strcmp(inp_str, "curve") == 0) { if (!getint(&num)) { error_header(); fprintf(stderr, "\"curve\" not followed by number\n"); exit(1); } edit_curve(get_curve(g->curves, num), g); } else if (strcmp(inp_str, "newcurve") == 0) { if (first(g->curves) == nil(g->curves)) edit_curve(new_curve(g->curves, 0), g); else edit_curve(new_curve(g->curves, last(g->curves)->num + 1), g); } else if (strcmp(inp_str, "copycurve") == 0) { edit_curve(do_copy_curve(g, gs, all_gs), g); } else if (strcmp(inp_str, "newline") == 0) { if (first(g->curves) == nil(g->curves)) edit_curve(new_line(g->curves, 0), g); else edit_curve(new_line(g->curves, last(g->curves)->num + 1), g); } else if (strcmp(inp_str, "title") == 0) { edit_label(g->title); } else if (strcmp(inp_str, "legend") == 0) { edit_legend(g->legend); } else if (strcmp(inp_str, "x_translate") == 0) { if (!getfloat(&f)) rejecttoken(); else g->x_translate = f; } else if (strcmp(inp_str, "y_translate") == 0) { if (!getfloat(&f)) rejecttoken(); else g->y_translate = f; } else if (strcmp(inp_str, "string") == 0) { if (!getint(&num)) { error_header(); fprintf(stderr, "\"string\" not followed by number\n"); exit(1); } s = get_string(g->strings, num); edit_label(s->s); } else if (strcmp(inp_str, "newstring") == 0) { if (first(g->strings) == nil(g->strings)) s = new_string(g->strings, 0); else s = new_string(g->strings, last(g->strings)->num + 1); edit_label(s->s); } else if (strcmp(inp_str, "copystring") == 0 || strcmp(inp_str, "copyline") == 0) { edit_label(do_copy_string(g, gs, all_gs)); } else if (strcmp(inp_str, "inherit_axes") == 0) { inherit_axes(g, last_graph(g, gs, all_gs)); } else if (strcmp(inp_str, "Y") == 0) { if (!getfloat(&f)) rejecttoken(); else gs->height = f; } else if (strcmp(inp_str, "X") == 0) { if (!getfloat(&f)) rejecttoken(); else gs->width = f; } else if (strcmp(inp_str, "border") == 0) { g->border = 1; } else if (strcmp(inp_str, "noborder") == 0) { g->border = 0; } else if (strcmp(inp_str, "clip") == 0) { g->clip = 1; } else if (strcmp(inp_str, "noclip") == 0) { g->clip = 0; } else { rejecttoken(); return; } } } void edit_graphs(gs) Graphs gs; { Graphs the_g; Graph g, tmp_g; char inp_str[80]; float f; int num, i, ok, j; the_g = first(gs); while ( getstring(inp_str) ) { if (strcmp(inp_str, "graph") == 0) { if (!getint(&num)) { error_header(); fprintf(stderr, "\"graph\" not followed by number\n"); exit(1); } edit_graph(get_graph(the_g->g, num), the_g, gs); } else if (strcmp(inp_str, "newgraph") == 0) { if (first(the_g->g) == nil(the_g->g)) edit_graph(new_graph(the_g->g, 0), the_g, gs); else edit_graph(new_graph(the_g->g, last(the_g->g)->num + 1), the_g, gs); } else if (strcmp(inp_str, "copygraph") == 0) { if (first(the_g->g) == nil(the_g->g)) g = new_graph(the_g->g, 0); else g = new_graph(the_g->g, last(the_g->g)->num + 1); if (!getint(&num)) { rejecttoken(); inherit_axes(g, last_graph(g, the_g, gs)); } else { ok = 0; tmp_g = the_g->g; while(!ok) { tmp_g = prev(tmp_g); if (tmp_g == nil(the_g->g) || tmp_g->num < num) { error_header(); fprintf(stderr, "copygraph: no graph #%d\n", num); exit(1); } ok = (tmp_g->num == num); } inherit_axes(g, tmp_g); } edit_graph(g, the_g, gs); } else if (strcmp(inp_str, "Y") == 0) { if (!getfloat(&f)) rejecttoken(); else the_g->height = f; } else if (strcmp(inp_str, "X") == 0) { if (!getfloat(&f)) rejecttoken(); else the_g->width = f; } else if (strcmp(inp_str, "newpage") == 0) { new_graphs(gs); the_g = last(gs); } else if (strcmp(inp_str, "bbox") == 0) { for (i = 0; i < 4; i++) { if (!getint(&j)) { error_header(); fprintf(stderr, "Bbox definition must have four integers\n"); exit(1); } else { the_g->bb[i] = j; } } } else if (strcmp(inp_str, "preamble") == 0) { if (!getstring(inp_str)) return; if (strcmp(inp_str, ":") != 0) { the_g->prefile = 1; the_g->preamble = (char *) malloc (sizeof(char)*(strlen(inp_str)+1)); strcpy(the_g->preamble, inp_str); } else { the_g->prefile = 0; the_g->preamble = getmultiline(); if (the_g->preamble == CNULL) return; } } else if (strcmp(inp_str, "epilogue") == 0) { if (!getstring(inp_str)) return; if (strcmp(inp_str, ":") != 0) { the_g->epifile = 1; the_g->epilogue = (char *) malloc (sizeof(char)*(strlen(inp_str)+1)); strcpy(the_g->epilogue, inp_str); } else { the_g->epifile = 0; the_g->epilogue = getmultiline(); if (the_g->epilogue == CNULL) return; } } else { error_header(); fprintf(stderr, "Bad token: %s\n", inp_str); exit(1); } } } @ 8.4 log @Fixing the seg fault and all of those warnings. @ text @d6 4 a9 4 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/edit.c,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ d61 15 a75 1 edit_label(l) d134 1 a134 1 copy_curve(c1, c2) /* Copies curve c2 to c1 */ d200 1 a200 1 copy_label(l1, l2) /* Copies label l2 to l1 */ d218 1 a218 1 copy_axis(a1, a2) /* Copies axis a2 to a1 */ d391 1 a391 1 copy_legend(l1, l2) d401 1 a401 1 inherit_axes(g, lastg) d418 1 a418 1 getpattern(inp_str, key, p, a) d447 1 a447 1 edit_curve(c, g) d742 1 a742 1 edit_hash_label(a) d793 1 a793 1 edit_axis(a) d969 1 a969 1 edit_legend(l) d1036 1 a1036 1 edit_graph(g, gs, all_gs) d1111 1 a1111 1 edit_graphs(gs) @ jgraph/RCS/exit.c,v0000555005471000040510000000244412037030661013160 0ustar planklocihead 8.4; access; symbols; locks plank:8.4; strict; comment @ * @; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.4 log @Fixing the seg fault and all of those warnings. @ text @/* **++ ** FUNCTIONAL DESCRIPTION: ** ** Exit is a VMS replacement for the standard Unix exit function ** ** FORMAL PARAMETERS: ** ** error_code integer passed by value (optional) ** ** SIDE EFFECTS: ** ** Exit will never return to calling program ** VMS exit status ($STATUS) will be set **-- **/ #include exit(va_alist) va_dcl { int nargs; va_list va; int exit_code = 0; /* * Pick up the argument, if present */ va_count(nargs); va_start(va); if (nargs > 0) exit_code = va_arg(va,int); /* * Set the VMS $STATUS to the appropriate value: * if exit_code == 0 then $STATUS := success * if exit_code > 0 then $STATUS := error * if exit_code < 0 then $STATUS := severe_error * and perform exit. * * Note: * the %X10000000 added to the actual success/error indicator * will prevent DCL from printing a message. * A 'on error' will be obeyed however. */ if (exit_code == 0) /* success */ sys$exit(0x10000001); else if (exit_code > 0) /* error */ sys$exit(0x10000002); else /* severe error */ sys$exit(0x10000004); } @ jgraph/RCS/jgraph.c,v0000555005471000040510000002376013207316747013502 0ustar planklocihead 8.5; access; symbols; locks plank:8.5; strict; comment @ * @; 8.5 date 2017.11.28.17.33.27; author plank; state Exp; branches; next 8.4; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.5 log @Clang requires explicit voids. @ text @/* jgraph.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/jgraph.c,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #ifdef VMS #include #endif #include "jgraph.h" int NMARKTYPES = 17; int NORMALMARKTYPES = 6; char *MARKTYPESTRS[] = { "circle", "box", "diamond", "triangle", "x", "cross", "ellipse", "general", "general_nf", "general_bez", "general_bez_nf", "postscript", "eps", "xbar", "ybar", "none", "text"}; char MARKTYPES[] = { 'o', 'b', 'd', 't', 'x', 'c', 'e', 'g', 'G', 'Z', 'B', 'p', 'E', 'X', 'Y', 'n', 'l' }; int NPATTERNS = 3; char *PATTERNS[] = { "solid", "stripe", "estripe" }; char PTYPES[] = { 's', '/', 'e' }; Label new_label() { Label l; int i; l = (Label) malloc (sizeof(struct label)); l->label = CNULL; l->hj = 'c'; l->vj = 'b'; l->font = "Times-Roman"; l->fontsize = 9.0; l->rotate = 0; l->graytype = 'n'; for (i = 0; i < 3; i++) l->gray[i] = 0.0; l->linesep = FSIG; return l; } Curve new_curve(c, num) Curve c; int num; { Curve new_c; int i; new_c = (Curve) get_node((List) c); new_c->num = num; new_c->l = new_label(); new_c->l->vj = 't'; new_c->lmark = new_label(); new_c->lmark->hj = 'c'; new_c->lmark->vj = 'c'; new_c->clip = 0; new_c->pattern = 's'; new_c->parg = FSIG; new_c->apattern = 's'; new_c->aparg = FSIG; new_c->ppattern = 's'; new_c->pparg = FSIG; new_c->graytype = 'n'; for (i = 0; i < 3; i++) new_c->gray[i] = 0.0; new_c->afilltype = 'g'; for (i = 0; i < 3; i++) new_c->afill[i] = 0.0; new_c->pts = (Point) make_list(sizeof(struct point)); new_c->yepts = (Point) make_list(sizeof(struct point)); new_c->xepts = (Point) make_list(sizeof(struct point)); new_c->npts = 0; new_c->gen_linetype = (Flist) make_list(sizeof(struct flist)); new_c->marktype = MARKTYPES[num % NORMALMARKTYPES]; new_c->linetype = '0'; new_c->linethick = 1.0; new_c->marksize[0] = FSIG; new_c->marksize[1] = FSIG; new_c->mrotate = 0.0; new_c->general_marks = (Point) make_list(sizeof(struct point)); new_c->filltype = 'n'; for (i = 0; i < 3; i++) new_c->fill[i] = 0.0; new_c->pfilltype = 'n'; for (i = 0; i < 3; i++) new_c->pfill[i] = 0.0; new_c->poly = 0; new_c->rarrow = 0; new_c->larrow = 0; new_c->rarrows = 0; new_c->larrows = 0; new_c->asize[0] = FSIG; new_c->asize[1] = FSIG; new_c->bezier = 0; new_c->postscript = CNULL; new_c->postfile = 0; new_c->eps = CNULL; prio_insert(new_c, c, 0); return new_c; } Curve new_line(c, num) Curve c; int num; { Curve new_c; new_c = new_curve(c, num); new_c->linetype = 's'; new_c->marktype = 'n'; return new_c; } Curve get_curve(c, num) Curve c; int num; { Curve new_c; for(new_c = last(c); new_c != nil(c) && new_c->num > num; new_c = prev(new_c)); if (new_c == nil(c) || new_c->num < num) return new_curve(c, num); return new_c; } Axis new_axis(is_x) int is_x; { int i; Axis a; a = (Axis) malloc (sizeof(struct axis)); a->label = new_label(); a->label->x = FSIG; a->label->y = FSIG; a->label->font = "Times-Bold"; a->label->fontsize = 10.0; a->label->rotate = FSIG; a->label->hj = '0'; a->label->vj = '0'; a->size = 3.0; a->max = FSIG; a->min = FSIG; a->pmax = FSIG; a->pmin = FSIG; a->hash_interval = -1.0; a->log_base = 10.0; a->minor_hashes = -1; a->precision = -1; a->hl = new_label(); a->hl->label = ""; a->hl->font = "Times-Roman"; a->hl->fontsize = 9.0; a->hl->rotate = 0.0; a->hl->hj = '0'; a->hl->vj = '0'; a->hash_format = 'f'; a->draw_at = FSIG; a->draw_hash_marks_at = FSIG; a->draw_hash_labels_at = FSIG; a->draw_hash_labels = 1; a->draw_axis_line = 1; a->draw_hash_marks = 1; a->draw_axis_label = 1; a->auto_hash_labels = 1; a->auto_hash_marks = 1; a->start_given = 0; a->hash_scale = -1.0; a->grid_lines = 0; a->mgrid_lines = 0; a->graytype = 'n'; for (i = 0; i < 3; i++) a->gray[i] = 0.0; a->gr_graytype = '0'; for (i = 0; i < 3; i++) a->gr_gray[i] = 0.0; a->mgr_graytype = '0'; for (i = 0; i < 3; i++) a->mgr_gray[i] = 0.0; a->is_x = is_x; a->is_lg = 0; a->hash_labels = (String) make_list (sizeof(struct string)); a->hash_lines = (Hash) make_list (sizeof(struct hash)); return a; } Legend new_legend() { Legend l; l = (Legend) malloc (sizeof(struct legend)); l->linelength = FSIG; l->linebreak = FSIG; l->midspace = FSIG; l->type = 'u'; l->l = new_label(); l->l->label = ""; l->l->hj = 'l'; l->l->vj = 'c'; l->l->x = FSIG; l->l->y = FSIG; return l; } Label new_title() { Label t; t = new_label(); t->x = FSIG; t->y = FSIG; t->rotate = 0.0; t->hj = 'c'; t->vj = 't'; t->fontsize = 12.0; return t; } String new_string(s, num) String s; int num; { String new_s; new_s = (String) get_node((List) s); new_s->num = num; new_s->s = new_label(); prio_insert(new_s, s, 0); return new_s; } String get_string(s, num) String s; int num; { String new_s; for(new_s = last(s); new_s != nil(s) && new_s->num > num; new_s = prev(new_s)); if (new_s == nil(s) || new_s->num < num) return new_string(s, num); return new_s; } /* Default new_default() { Default new_d; new_d = (Default) malloc (sizeof(default)); new_d->rotate = FSIG; new_d->fontsize = FSIG; new_d->general_marks = GMNULL; new_d->fill = FSIG; new_d->linethick = FSIG; new_d->font = CNULL; new_d->hj = '!'; new_d->vj = '!'; new_d->marktype = '!'; new_d->linetype = '!'; new_d->marksize[0] = FSIG; new_d->marksize[1] = FSIG; } */ Graph new_graph(gs, num) Graph gs; int num; { Graph g; g = (Graph) get_node((List) gs); g->num = num; g->xminval = 0.0; g->yminval = 0.0; g->xmaxval = 0.0; g->ymaxval = 0.0; g->x_axis = new_axis(1); g->y_axis = new_axis(0); g->x_translate = 0.0; g->y_translate = 0.0; g->curves = (Curve) make_list(sizeof(struct curve)); g->strings = (String) make_list(sizeof(struct string)); g->title = new_title(); g->clip = 0; g->border = 0; g->legend = new_legend(); /* g->def = new_default(); */ prio_insert(g, gs, 0); return g; } Graph get_graph(g, num) Graph g; int num; { Graph new_g; for(new_g = last(g); new_g != nil(g) && new_g->num > num; new_g = prev(new_g)); if (new_g == nil(g) || new_g->num < num) return new_graph(g, num); return new_g; } void new_graphs(gs) Graphs gs; { Graphs newg; newg = (Graphs) get_node((List) gs); newg->g = (Graph) make_list(sizeof(struct graph)); newg->height = 0.0; newg->width = 0.0; newg->bb[0] = ISIG; newg->bb[1] = ISIG; newg->bb[2] = ISIG; newg->bb[3] = ISIG; newg->preamble = CNULL; newg->epilogue = CNULL; newg->prefile = 0; newg->epifile = 0; if (first(gs) == nil(gs)) newg->page = 1; else newg->page = last(gs)->page+1; insert((List) newg, (List) gs); } int main(argc, argv) int argc; char **argv; { Graphs gs; int i; int show, pp; int landscape; int comments; int nfiles; #ifdef VMS IOSTREAM = stdin; /* for token.c -hdd */ #endif show = 0; pp = 0; comments = 0; landscape = 0; nfiles = 0; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-p") == 0) show = 1; else if (strcmp(argv[i], "-comments") == 0) comments = 1; else if (strcmp(argv[i], "-P") == 0) pp = 1; else if (strcmp(argv[i], "-L") == 0) landscape = 1; else { nfiles++; set_input_file(argv[i]); } } if (nfiles == 0) set_input_file(CNULL); gs = (Graphs) make_list(sizeof(struct graphs)); set_comment(comments); new_graphs(gs); edit_graphs(gs); process_graphs(gs); if (show) show_graphs(gs); else draw_graphs(gs, pp, landscape); exit(0); return 0; } @ 8.4 log @Fixing the seg fault and all of those warnings. @ text @d6 4 a9 4 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/jgraph.c,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ d345 1 a345 1 new_graphs(gs) d364 1 a364 1 main(argc, argv) @ jgraph/RCS/jgraph.h,v0000555005471000040510000001402512037030664013470 0ustar planklocihead 8.4; access; symbols; locks plank:8.4; strict; comment @ * @; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.4 log @Fixing the seg fault and all of those warnings. @ text @/* jgraph.h * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/jgraph.h,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "list.h" #include "prio_list.h" #include #define PPI 120 #define FPPI 120.0 #define CPI 72.0 #define FCPI 72.0 #define CNULL ((char *)0) #define GMNULL ((Point)0) #define FSIG -10010.0 #define ISIG -11111111 #define HASH_SIZE 5.0 #define MHASH_SIZE 2.0 typedef struct point { struct point *flink; struct point *blink; float x; float y; char e; /* 'x' for x_ebars, 'y' for y_ebars, 'p' for neither */ } *Point; typedef struct flist { struct flist *flink; struct flist *blink; float f; } *Flist; typedef struct label { char *label; float x; float y; float rotate; char *font; float fontsize; char hj; char vj; float gray[3]; char graytype; float linesep; float xmin; float xmax; float ymin; float ymax; int nlines; } *Label; typedef struct curve { struct curve *flink; struct curve *blink; int num; Label l; Label lmark; Point pts; Point yepts; Point xepts; int npts; Point general_marks; float marksize[2]; float fill[3]; float gray[3]; float afill[3]; float pfill[3]; float linethick; float mrotate; Flist gen_linetype; char graytype ; char filltype ; char afilltype; char pfilltype; char pattern; float parg; char apattern; float aparg; char ppattern; float pparg; char marktype; char linetype; char *postscript; char *eps; int postfile; int rarrow; int larrow; int rarrows; int larrows; int bezier; int poly; float asize[2]; int clip; } *Curve; typedef struct string { struct string *flink; struct string *blink; int num; Label s; } *String; typedef struct hash { struct hash *flink; struct hash *blink; float loc; float size; int major; } *Hash; typedef struct deflt { float rotate; float fontsize; Point general_marks; float fill; float linethick; float marksize[2]; char *font; char hj; char vj; char marktype; } *Default; typedef struct axis { Label label; Label hl; float max; float min; float pmax; float pmin; float logmin; float logfactor; float size; float psize; float factor; float hash_interval; float hash_start; float hash_scale; float log_base; float draw_hash_marks_at; float draw_hash_labels_at; float draw_at; float gray[3]; char graytype; float gr_gray[3]; char gr_graytype; float mgr_gray[3]; char mgr_graytype; char hash_format; int grid_lines; int mgrid_lines; int draw_hash_labels; int draw_axis_line; int draw_hash_marks; int draw_axis_label; int auto_hash_labels; int auto_hash_marks; int minor_hashes; int precision; int start_given; String hash_labels; Hash hash_lines; int is_x; int is_lg; } *Axis; typedef struct legend { float linelength; float linebreak; int anylines; float midspace; char type; /* 'n' = off, 'u' = userdefined (use Label), 'c' = custom */ Label l; } *Legend; typedef struct graph { struct graph *flink; struct graph *blink; int num; float xminval; float yminval; float xmaxval; float ymaxval; float x_translate; float y_translate; Axis x_axis; Axis y_axis; Curve curves; Legend legend; String strings; Label title; int clip; int border; Default def; } *Graph; typedef struct graphs { struct graphs *flink; struct graphs *blink; Graph g; float height; float width; int bb[4]; /* Bounding box */ char *preamble; char *epilogue; int prefile; int epifile; int page; } *Graphs; extern float ctop(); extern float disttop(); extern float intop(); extern float ptoc(); extern float ptodist(); extern char *getlabel(); extern char *getmultiline(); /* Stuff defined in jgraph.c */ extern Curve new_line(); extern Curve new_curve(); extern Curve get_curve(); extern Graph new_graph(); extern Graph get_graph(); extern String new_string(); extern String get_string(); extern Label new_label(); extern char *MARKTYPESTRS[]; extern char MARKTYPES[]; extern int NMARKTYPES; extern int NORMALMARKTYPES; extern char *PATTERNS[]; extern char PTYPES[]; extern int NPATTERNS; @ jgraph/RCS/jmalloc.c,v0000555005471000040510000002703612037030661013634 0ustar planklocihead 8.4; access; symbols; locks plank:8.4; strict; comment @ * @; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.4 log @Fixing the seg fault and all of those warnings. @ text @#include #include #include #include #include /* Each memory block has 8 extra 32-bit values associated with it. If malloc returns the pointer p to you, the state really looks like: jmal(p)------> |------------------------------------------------------------| | flink (next malloc block in absolute order) | |------------------------------------------------------------| | blink (prev malloc block in absolute order) | |------------------------------------------------------------| | nextfree (next free malloc block - no particular order) | |------------------------------------------------------------| | prevfree (next free malloc block - no particular order) | |------------------------------------------------------------| | size (size of memory allocated) | |------------------------------------------------------------| | cs2 (pointer to the second checksum, which is right after | | the mem block) | |------------------------------------------------------------| | cs (checksum right before mem block. used to determine if | | there is an error of writing around the memory block) | p------------> |------------------------------------------------------------| | space: the memory block | | ... | | ... | |------------------------------------------------------------| | the second checksum | |------------------------------------------------------------| */ typedef struct jmalloc { struct jmalloc *flink; struct jmalloc *blink; struct jmalloc *nextfree; struct jmalloc *prevfree; int size; int *cs2; int cs; char *space; } *Jmalloc; #define JMSZ (sizeof(struct jmalloc)) #define PTSZ (sizeof(char *)) /* Also assuming its > sizeof int */ #define CHUNK_SIZE (16384 - JMSZ) /* 16K */ #define MASK 0x17826a9b #define JNULL ((Jmalloc) 0) static struct jmalloc j_head; static Jmalloc memlist; static int nfree = 0; static int nblocks = 0; static int init = 0; static Jmalloc start; static int free_called = 0; static int malloc_called = 0; static int used_mem = 0; static int free_mem = 0; static int used_blocks = 0; static int free_blocks = 0; #define cksum(p) (((int) &(p->cs)) - 1) #define jloc(l) ((char *) (&l->space)) #define jmal(l) ((Jmalloc) (((char *)l) - JMSZ + PTSZ)) #define isfree(l) (l->nextfree != JNULL) #define do_init() \ if (!init) {\ memlist = &j_head;\ memlist->flink = memlist;\ memlist->blink = memlist;\ memlist->nextfree = memlist;\ memlist->prevfree = memlist;\ memlist->size = 0;\ memlist->cs = cksum(memlist);\ memlist->cs2 = &memlist->cs;\ memlist->space = (char *) 0;\ start = memlist;\ init = 1;\ } dump_core() { memlist->space[0] = 0; } char *set_used(l) Jmalloc l; { start = l->nextfree; l->prevfree->nextfree = l->nextfree; l->nextfree->prevfree = l->prevfree; l->prevfree = JNULL; l->nextfree = JNULL; used_mem += l->size; free_mem -= l->size; used_blocks++; free_blocks--; return jloc(l); } void *malloc(size) int size; { int redo; int done; Jmalloc l; char *tmp; Jmalloc newl; int newsize; do_init(); malloc_called++; if (size <= 0) { fprintf(stderr, "Error: Malloc(%d) called\n", size); /* Dump core */ dump_core(); } if (size % PTSZ != 0) size += PTSZ - (size % PTSZ); done = 0; l = start; while(!done) { if (l->size >= size) { done = 1; redo = 0; } else { l = l->nextfree; done = (l == start); redo = done; } } if (redo) { if (size > CHUNK_SIZE) newsize = size + JMSZ; else newsize = CHUNK_SIZE + JMSZ; newl = (Jmalloc) sbrk(newsize); while (newl == (Jmalloc) -1 && newsize > size + JMSZ) { newsize /= 2; if (newsize < size + JMSZ) newsize = size + JMSZ; newl = (Jmalloc) sbrk(newsize); } if (newl == (Jmalloc) -1) { /* fprintf(stderr, "Jmalloc: out of memory\n"); */ /* fprintf(stderr, "Used bytes = %d, Free bytes = %d\n", */ /* used_mem, free_mem); */ /* fprintf(stderr, "Trying to get %d bytes (chunk of %d)\n", */ /* size, newsize); */ return NULL; } newl->flink = memlist; newl->blink = memlist->blink; newl->flink->blink = newl; newl->blink->flink = newl; newl->nextfree = memlist; newl->prevfree = memlist->prevfree; newl->nextfree->prevfree = newl; newl->prevfree->nextfree = newl; newl->size = ((char *) sbrk(0)) - jloc(newl) - PTSZ; free_mem += newl->size; newl->cs = cksum(newl); newl->cs2 = ((int *) (jloc(newl) + newl->size)); *(newl->cs2) = cksum(newl); if(newl->size < size) { fprintf(stderr, "Newl->size(%d) < size(%d)\n", newl->size, size); exit(1); } free_blocks++; l = newl; } if (l->size - size < JMSZ) { return set_used(l); } else { tmp = jloc(l); newl = (Jmalloc) (tmp + size + PTSZ); newl->flink = l->flink; newl->blink = l; newl->flink->blink = newl; newl->blink->flink = newl; newl->nextfree = l->nextfree; newl->prevfree = l; newl->nextfree->prevfree = newl; newl->prevfree->nextfree = newl; newl->size = l->size - size - JMSZ; newl->cs = cksum(newl); newl->cs2 = (int *) (jloc(newl) + newl->size); *(newl->cs2) = cksum(newl); free_mem += size + newl->size - l->size; free_blocks++; l->size = size; l->cs2 = ((int *) (jloc(l) + l->size)); *(l->cs2) = cksum(l); return set_used(l); } } jmalloc_print_mem() { Jmalloc l; int done; char *bufs[100]; int sizes[100]; int mc; int fc; int i, j; do_init(); mc = malloc_called; fc = free_called; if (jmal(jloc(memlist)) != memlist) { fprintf(stderr, "TROUBLE: memlist=0x%x, jmal(jloc(memlist))=0x%x)\n", memlist, jmal(jloc(memlist))); exit(1); } done = 0; l = start; i = 0; while (!done) { if (cksum(l) != l->cs) { printf("Memory location 0x%x corrupted\n", jloc(l)); exit(1); } else if (cksum(l) != *(l->cs2)) { printf("Memory location 0x%x corrupted\n", jloc(l)); exit(1); } bufs[i] = jloc(l); sizes[i] = l->size; if (l->nextfree == 0) sizes[i] = -sizes[i]; i++; l = l->flink; done = ((l == start) || i >= 100); } printf("Malloc called %d times\n", mc); printf("Free called %d times\n", fc); for (j = 0; j < i; j++) { printf("Loc = 0x%x, size = %d, free = %d\n", bufs[j], (sizes[j] > 0) ? sizes[j] : -sizes[j], (sizes[j] >= 0)); } } jmalloc_check_mem() { Jmalloc l; int done; done = 0; l = start; while (!done) { if (cksum(l) != l->cs) { fprintf(stderr, "Memory chunk violated: 0x%x: %s 0x%x. %s 0x%x\n", jloc(l), "Checksum 1 is ", l->cs, "It should be", cksum(l)); dump_core(); } else if (cksum(l) != *(l->cs2)) { fprintf(stderr, "Memory chunk violated: 0x%x: %s 0x%x. %s 0x%x\n", jloc(l), "Checksum 2 is ", *(l->cs2), "It should be", cksum(l)); dump_core(); } l = l->flink; done = (l == start); } } void free(loc) char *loc; { Jmalloc l; Jmalloc pl, nl; do_init(); free_called++; l = jmal(loc); if (cksum(l) != l->cs) { fprintf(stderr, "Error on free: memory chunk violated: 0x%x\n", loc); dump_core(); } else if (cksum(l) != *(l->cs2)) { fprintf(stderr, "Error on free: memory chunk violated: 0x%x\n", loc); dump_core(); } used_mem -= l->size; free_mem += l->size; free_blocks++; used_blocks--; pl = l->blink; nl = l->flink; if (isfree(pl) && (jloc(pl)+pl->size + PTSZ == (char *) l)) { free_mem += JMSZ; pl->size += l->size + JMSZ; pl->flink = nl; pl->flink->blink = pl; l = pl; free_blocks--; } else { l->prevfree = start; l->nextfree = start->nextfree; l->nextfree->prevfree = l; l->prevfree->nextfree = l; } if (isfree(nl) && jloc(l)+l->size + PTSZ == (char *) nl) { free_mem += JMSZ; l->size += nl->size + JMSZ; l->flink = nl->flink; l->flink->blink = l; free_blocks--; nl->nextfree->prevfree = nl->prevfree; nl->prevfree->nextfree = nl->nextfree; } start = l; } void *realloc(loc, size) char *loc; int size; { Jmalloc l; Jmalloc l2, nl; char *loc2; int i; Jmalloc newl; do_init(); if (size <= 0) { fprintf(stderr, "Error: Malloc(%d) called\n", size); /* Dump core */ dump_core(); } if (size % PTSZ != 0) size += PTSZ - (size % PTSZ); l = jmal(loc); if (cksum(l) != l->cs) { fprintf(stderr, "Error on realloc: memory chunk violated: 0x%x\n", loc); dump_core(); } else if (cksum(l) != *(l->cs2)) { fprintf(stderr, "Error on realloc: memory chunk violated: 0x%x\n", loc); dump_core(); } if (size < l->size) { if (l->size - size < JMSZ + 4) return loc; newl = (Jmalloc) (loc + size + PTSZ); newl->flink = l->flink; newl->blink = l; newl->flink->blink = newl; newl->blink->flink = newl; newl->nextfree = start->nextfree; newl->prevfree = start; newl->nextfree->prevfree = newl; newl->prevfree->nextfree = newl; newl->size = l->size - size - JMSZ; newl->cs = cksum(newl); newl->cs2 = (int *) (jloc(newl) + newl->size); *(newl->cs2) = cksum(newl); used_mem += size - l->size; free_mem += newl->size; free_blocks++; l->size = size; l->cs2 = ((int *) (jloc(l) + l->size)); *(l->cs2) = cksum(l); start = newl; return loc; } nl = l->flink; if (isfree(nl) && (jloc(l)+l->size + PTSZ == (char *) nl) && l->size + JMSZ + nl->size >= size) { start = nl; i = size - l->size - JMSZ; if (i < 0) i = 4; loc2 = malloc(i); l2 = jmal(loc2); if (l2 != nl) { fprintf(stderr, "Realloc internal error: l2 != nl\n"); dump_core(); } nl->flink->blink = nl->blink; nl->blink->flink = nl->flink; free_mem -= nl->size; used_mem += nl->size + JMSZ; free_blocks--; l->size += nl->size + JMSZ; l->cs2 = ((int *) (jloc(l) + l->size)); *(l->cs2) = cksum(l); return loc; } else { loc2 = malloc(size); for (i = 0; i < l->size; i++) loc2[i] = loc[i]; free(loc); return loc2; } } char *calloc(nelem, elsize) int nelem, elsize; { int *iptr; char *ptr; int sz; int i; sz = nelem*elsize; ptr = malloc(sz); iptr = (int *) ptr; for (i = 0; i < sz/sizeof(int); i++) iptr[i] = 0; for (i = i * sizeof(int); i < sz; i++) ptr[i] = 0; return ptr; } int mallopt(cmd, value) int cmd, value; { fprintf(stderr, "Mallopt is not defined...\n"); exit(1); } jmalloc_usage() { fprintf(stderr, "Jmalloc: %d %s %d block%s. %d %s %d block%s\n", used_mem, "bytes used in", used_blocks, (used_blocks == 1) ? "" : "s", free_mem, "bytes free in", free_blocks, (free_blocks == 1) ? "" : "s"); } @ jgraph/RCS/list.c,v0000555005471000040510000001013112037030661013152 0ustar planklocihead 8.4; access; symbols; locks plank:8.4; strict; comment @ * @; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.4 log @Fixing the seg fault and all of those warnings. @ text @/* list.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/list.c,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include /* Basic includes and definitions */ #include #include #include #include "list.h" #define boolean int #define TRUE 1 #define FALSE 0 /*---------------------------------------------------------------------* * PROCEDURES FOR MANIPULATING DOUBLY LINKED LISTS * Each list contains a sentinal node, so that * the first item in list l is l->flink. If l is * empty, then l->flink = l->blink = l. * The sentinal contains extra information so that these operations * can work on lists of any size and type. * Memory management is done explicitly to avoid the slowness of * malloc and free. The node size and the free list are contained * in the sentinal node. *---------------------------------------------------------------------*/ typedef struct int_list { /* Information held in the sentinal node */ struct int_list *flink; struct int_list *blink; int size; List free_list; } *Int_list; void insert(List item, List list) /* Inserts to the end of a list */ { List last_node; last_node = list->blink; list->blink = item; last_node->flink = item; item->blink = last_node; item->flink = list; } void delete_item(List item) /* Deletes an arbitrary iterm */ { item->flink->blink = item->blink; item->blink->flink = item->flink; } List make_list(int size) { Int_list l; l = (Int_list) malloc(sizeof(struct int_list)); l->flink = l; l->blink = l; l->size = size; l->free_list = (List) malloc (sizeof(struct list)); l->free_list->flink = l->free_list; return (List) l; } List get_node(List list) /* Allocates a node to be inserted into the list */ { Int_list l; List to_return; l = (Int_list) list; if (l->free_list->flink == l->free_list) { return (List) malloc(l->size); } else { to_return = l->free_list; l->free_list = to_return->flink; return to_return; } } void free_node(List node, List list) /* Deallocates a node from the list */ { Int_list l; l = (Int_list) list; node->flink = l->free_list; l->free_list = node; } @ jgraph/RCS/list.h,v0000555005471000040510000000565312037030664013177 0ustar planklocihead 8.4; access; symbols; locks plank:8.4; strict; comment @ * @; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.4 log @Fixing the seg fault and all of those warnings. @ text @/* list.h * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/list.h,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* This is the header file for the list manipulation routines in list.c. * Any struct can be turned into a list as long as its first two fields are * flink and blink. */ typedef struct list { struct list *flink; struct list *blink; } *List; /* Nil, first, next, and prev are macro expansions for list traversal * primitives. */ #define nil(l) (l) #define first(l) (l->flink) #define last(l) (l->blink) #define next(n) (n->flink) #define prev(n) (n->blink) /* These are the routines for manipluating lists */ void insert(List item, List list); /* Inserts a node to the end of a list */ void delete_item(List node); /* Deletes an arbitrary node */ List make_list(int node_size); /* Creates a new list */ List get_node(List list); /* Allocates a node to be inserted into the list */ void free_node(List node, List list); /* Deallocates a node from the list */ @ jgraph/RCS/printline.c,v0000555005471000040510000002431613207316747014231 0ustar planklocihead 8.5; access; symbols; locks plank:8.5; strict; comment @ * @; 8.5 date 2017.11.28.17.33.27; author plank; state Exp; branches; next 8.4; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.5 log @Clang requires explicit voids. @ text @/* printline.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/printline.c,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "jgraph.h" #include #include #include void gsave(); void grestore(); void setfont(); void setfill(); void setgray(); void printline(); void print_ebar(); void start_line(); void cont_line(); void end_line(); void bezier_control(); void bezier_end(); void start_poly(); void cont_poly(); void end_poly(); void printellipse(); void set_comment(); void comment(); void printline_c(); void print_label(); void setlinewidth(); void setlinestyle(); #define LINEWIDTHFACTOR 0.700 #define MAX(a, b) ((a > b) ? (a) : (b)) typedef struct fontlist { struct fontlist *flink; struct fontlist *blink; int level; float s; char *f; } *Fontlist; static Fontlist Jgraph_fonts; static int Jgraph_gsave_level = -100; static int Jgraph_comment; void gsave() { if (Jgraph_gsave_level == -100) { Jgraph_gsave_level = 0; Jgraph_fonts = (Fontlist) make_list(sizeof(struct fontlist)); } Jgraph_gsave_level++; printf(" gsave "); } void grestore() { Fontlist l; if (last(Jgraph_fonts) != nil(Jgraph_fonts)) { l = last(Jgraph_fonts); if (l->level == Jgraph_gsave_level) { delete_item((List) l); free_node((List) l, (List) Jgraph_fonts); } } Jgraph_gsave_level--; printf(" grestore "); } void setfont(f, s) char *f; float s; { Fontlist l; int ins; if (last(Jgraph_fonts) != nil(Jgraph_fonts)) { l = last(Jgraph_fonts); ins = (strcmp(l->f, f) != 0 || s != l->s); if (ins) { delete_item((List) l); free_node((List) l, (List) Jgraph_fonts); } } else { ins = 1; } if (ins) { l = (Fontlist) get_node((List) Jgraph_fonts); l->level = Jgraph_gsave_level; l->s = s; l->f = f; insert((List) l, (List) Jgraph_fonts); printf("/%s findfont %f scalefont setfont\n", f, s); } } void setfill( x, y, t, f, p, a) char t, p ; float x, y; float f[], a ; { /* fprintf(stderr, "Hello? %c %f %c %f\n", t, f[0], p, a); */ if (t == 'g' && f[0] < 0.0) return; printf("gsave "); if ( t == 'g' ) { if( f[0] >= 0.0 ) printf("%f setgray ", f[0] ); } else if ( t == 'c' ) { printf("%f %f %f setrgbcolor ", f[0], f[1], f[2] ); } if (p == 's') { printf(" fill"); } else if (p == '/') { printf(" 6.1 10 %f %f %f 1 JSTR", a, x, y); } else if (p == 'e') { printf(" 6.1 10 %f %f %f 0 JSTR", a, x, y); } printf(" grestore\n"); } void setgray( t, f) char t ; float f[] ; { if ( t == 'g' ) { if( f[0] >= 0.0 ) printf("%f setgray\n", f[0] ); } else if ( t == 'c' ) { printf("%f %f %f setrgbcolor\n", f[0], f[1], f[2] ); } } void printline(x1, y1,x2, y2, orientation) float x1, y1, x2, y2; char orientation; { if (orientation == 'x') printf("newpath %f %f moveto %f %f lineto stroke\n", x1, y1, x2, y2); else printf("newpath %f %f moveto %f %f lineto stroke\n", y1, x1, y2, x2); fflush(stdout); } void print_ebar(x1, y1, x2, ms, orientation) float x1, y1, x2, ms; char orientation; { printline(x1, y1, x2, y1, orientation); printline(x2, y1-ms, x2, y1+ms, orientation); } void start_line(x1, y1, c) float x1, y1; Curve c; { setlinewidth(c->linethick); setlinestyle(c->linetype, c->gen_linetype); printf("%f %f moveto ", x1, y1); } void cont_line(x1, y1) float x1, y1; { printf(" %f %f lineto\n", x1, y1); } void end_line() { printf("stroke\n"); setlinewidth(1.0); setlinestyle('s', (Flist) 0); fflush(stdout); } void bezier_control(x1, y1) float x1, y1; { printf(" %f %f ", x1, y1); } void bezier_end(x1, y1) float x1, y1; { printf(" %f %f curveto\n", x1, y1); } void start_poly(x1, y1) float x1, y1; { printf(" newpath %f %f moveto", x1, y1); } void cont_poly(x1, y1) float x1, y1; { printf(" %f %f lineto\n", x1, y1); } void end_poly(x, y, ftype, fill, pattern, parg) float x, y; char ftype, pattern ; float fill[], parg; { printf("closepath "); setfill( x, y, ftype, fill, pattern, parg ); printf("stroke\n"); fflush(stdout); } /* Ellipse at 0, 0 -- assumes that you've already translated to x, y */ void printellipse(x, y, radius1, radius2, ftype, fill, pattern, parg) char ftype, pattern; float x, y, radius1, radius2, fill[], parg; { printf("newpath %f %f JDE\n", radius1, radius2); setfill( x, y, ftype, fill, pattern, parg ); printf("stroke\n"); fflush(stdout); } void set_comment(c) int c; { Jgraph_comment = c; } void comment(s) char *s; { if (Jgraph_comment) printf("%% %s\n", s); } void printline_c(x1, y1, x2, y2, g) float x1, y1, x2, y2; Graph g; { printline(ctop(x1, g->x_axis), ctop(y1, g->y_axis), ctop(x2, g->x_axis), ctop(y2, g->y_axis), 'x'); } void print_label(l) Label l; { int f, i, nlines; float fnl; char *s; if (l->label == CNULL) return; nlines = 0; for (i = 0; l->label[i] != '\0'; i++) { if (l->label[i] == '\n') { l->label[i] = '\0'; nlines++; } } fnl = (float) nlines; setfont(l->font, l->fontsize); printf("gsave %f %f translate %f rotate\n", l->x, l->y, l->rotate); if (l->graytype == 'g') { printf(" %f setgray\n", l->gray[0]); } else if (l->graytype == 'c') { printf(" %f %f %f setrgbcolor\n", l->gray[0], l->gray[1], l->gray[2]); } if (l->vj == 'b') { printf("0 %f translate ", fnl * (l->fontsize + l->linesep) * FCPI / FPPI); } else if (l->vj == 'c') { if (nlines % 2 == 0) { printf("0 %f translate ", (fnl/2.0*(l->fontsize + l->linesep) - l->fontsize/2.0) * FCPI / FPPI); } else { printf("0 %f translate ", ((fnl-1.0)/2.0*(l->fontsize + l->linesep) + l->linesep/2.0) * FCPI / FPPI); } } else { printf("0 %f translate ", -l->fontsize * FCPI / FPPI); } s = l->label; for (i = 0; i <= nlines; i++) { printf("(%s) dup stringwidth pop ", s); if (l->hj == 'c') { printf("2 div neg 0 moveto\n"); } else if (l->hj == 'r') { printf("neg 0 moveto\n"); } else { printf("pop 0 0 moveto\n"); } /* I would put string blanking in here if I had the time... */ if (i != nlines) { f = strlen(s); s[f] = '\n'; s = &(s[f+1]); printf("show 0 %f translate\n", - (l->fontsize + l->linesep) * FCPI / FPPI); } else { printf("show\n"); } } printf("grestore\n"); } void setlinewidth(size) float size; { printf("%f setlinewidth ", size * LINEWIDTHFACTOR); } void setlinestyle(style, glist) char style; Flist glist; { Flist fl; switch(style) { case '0': printf(" [0 2] setdash\n"); break; case 's': printf(" [] 0 setdash\n"); break; case '.': printf(" [1 3.200000] 0 setdash\n"); break; case '-': printf(" [4.00000] 0 setdash\n"); break; case 'l': printf(" [7 2] 0 setdash\n"); break; case 'd': printf(" [5 3 1 3] 0 setdash\n"); break; case 'D': printf(" [5 3 1 2 1 3] 0 setdash\n"); break; case '2': printf(" [5 3 5 3 1 2 1 3] 0 setdash\n"); break; case 'g': printf(" ["); for (fl = first(glist); fl != nil(glist); fl = next(fl)) printf("%f ", fl->f); printf("] 0 setdash\n"); break; default: fprintf(stderr, "Error: Unknown line type: %c\n", style); exit(1); break; } } @ 8.4 log @Fixing the seg fault and all of those warnings. @ text @d6 4 a9 4 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/printline.c,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ d55 23 d94 1 a94 1 gsave() d104 1 a104 1 grestore() d119 1 a119 1 setfont(f, s) d146 1 a146 1 setfill( x, y, t, f, p, a) d171 1 a171 1 setgray( t, f) d182 1 a182 1 printline(x1, y1,x2, y2, orientation) d193 1 a193 1 print_ebar(x1, y1, x2, ms, orientation) d201 1 a201 1 start_line(x1, y1, c) d210 1 a210 1 cont_line(x1, y1) d216 1 a216 1 end_line() d225 1 a225 1 bezier_control(x1, y1) d231 1 a231 1 bezier_end(x1, y1) d238 1 a238 1 start_poly(x1, y1) d244 1 a244 1 cont_poly(x1, y1) d250 1 a250 1 end_poly(x, y, ftype, fill, pattern, parg) d263 1 a263 1 printellipse(x, y, radius1, radius2, ftype, fill, pattern, parg) d273 1 a273 1 set_comment(c) d279 1 a279 1 comment(s) d285 1 a285 1 printline_c(x1, y1, x2, y2, g) d293 1 a293 1 print_label(l) d361 1 a361 1 setlinewidth(size) d367 1 a367 1 setlinestyle(style, glist) @ jgraph/RCS/prio_list.c,v0000555005471000040510000001001013207316747014213 0ustar planklocihead 8.5; access; symbols; locks plank:8.5; strict; comment @ * @; 8.5 date 2017.11.28.17.33.27; author plank; state Exp; branches; next 8.4; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.5 log @Clang requires explicit voids. @ text @/* prio_list.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/prio_list.c,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "list.h" #include "prio_list.h" #include #include #include typedef int Boolean; /* A prioirity list is any list with the first three fields being flink, * blink and prio. Use the routines of list.c to do everything except * insertion */ typedef struct prio_list { struct prio_list *flink; struct prio_list *blink; int prio; } *Prio_list; /* Prio_insert inserts nodes into their proper places in priority lists. It first * checks for inserting into the head or tail, and then proceeds sequentially. * Thus, it is worst case linear, but for most cases constant time (right). */ void prio_insert(node, list, desc) Prio_list node; Prio_list list; Boolean desc; { Prio_list p; /* Check nil and head of list */ if (first(list) == nil(list) || (!desc && first(list)->prio >= node->prio) || (desc && first(list)->prio <= node->prio) ) { node->blink = list; node->flink = list->flink; list->flink->blink = node; list->flink = node; return; } /* Check tail of list */ if ((desc && last(list)->prio >= node->prio) || (!desc && last(list)->prio <= node->prio) ) { node->flink = list; node->blink = list->blink; list->blink->flink = node; list->blink = node; return; } /* Check the rest of the list sequentially */ for(p = next(first(list)); ; p = next(p)) { if (p == nil(list)) fprintf(stderr, "inserting into tail did not work\n"); if ((!desc && p->prio >= node->prio) || (desc && p->prio <= node->prio)) { node->flink = p; node->blink = p->blink; p->blink->flink = node; p->blink = node; return; } } } @ 8.4 log @Fixing the seg fault and all of those warnings. @ text @d6 4 a9 4 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/prio_list.c,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ d73 1 a73 1 prio_insert(node, list, desc) @ jgraph/RCS/prio_list.h,v0000555005471000040510000000563412037030664014227 0ustar planklocihead 8.4; access; symbols; locks plank:8.4; strict; comment @ * @; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.4 log @Fixing the seg fault and all of those warnings. @ text @/* prio_list.h * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/prio_list.h,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Priority lists are just like normal lists of list.h and list.c, except * that their third field is a (int) prioriy. The routines of list.c should all * be used except for insert, because it will always put an item at the * end of a list. Instead, use prio_insert, which will put the item * into its proper place in the list. The last argument of prio_insert should * be TRUE if the list is to be kept in descending order; it should be FALSE * for ascending order. * Priority list should be: struct prio_list { struct prio_list *flink; struct prio_list *blink; int prio; ... } 10/15/2012: prio_lists are the true embarrassing feature of jgraph -- an n^2 algorithm? For shame. I always say that I'll fix it someday, but I doubt that's going to happen. */ /* void prio_insert(node, list, descending); */ @ jgraph/RCS/process.c,v0000555005471000040510000006467613207316747013720 0ustar planklocihead 8.5; access; symbols; locks plank:8.5; strict; comment @ * @; 8.5 date 2017.11.28.17.33.27; author plank; state Exp; branches; next 8.4; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.5 log @Clang requires explicit voids. @ text @/* process.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/process.c,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "jgraph.h" #define ABS(a) ((a > 0.0) ? (a) : (-a)) #define MAX(a, b) ((a > b) ? (a) : (b)) #define MIN(a, b) ((a < b) ? (a) : (b)) #define AXIS_CHAR(a) ((a->is_x) ? 'x' : 'y') #define HASH_DIR(a) ((a->hash_scale > 0.0) ? 1 : -1) static double Pi; void process_title(); void process_legend(); void process_axis1(); void process_axis2(); void process_label(); void process_label_max_n_mins(); void process_strings(); void process_curve(); void process_curves(); void process_extrema(); void process_label_extrema(); void process_graph(); void process_graphs(); void process_title(g) Graph g; { float ytitleloc; if (g->title->x == FSIG) g->title->x = g->x_axis->psize / 2.0; else g->title->x = ctop(g->title->x, g->x_axis); if (g->title->y != FSIG) g->title->y = ctop(g->title->y, g->y_axis); else { ytitleloc = 0.0; if (g->x_axis->draw_axis_label && g->x_axis->label->label != CNULL) ytitleloc = MIN(ytitleloc, g->x_axis->label->ymin); if (g->x_axis->draw_hash_labels) ytitleloc = MIN(ytitleloc, g->x_axis->hl->ymin); if (g->x_axis->draw_hash_marks) ytitleloc = MIN(ytitleloc, g->x_axis->draw_hash_marks_at - HASH_SIZE); if (g->legend->type == 'u') ytitleloc = MIN(ytitleloc, g->legend->l->ymin); g->title->y = ytitleloc - 10.0; } process_label(g->title, g, 0); } void process_legend(g) Graph g; { Legend l; int anything; float height, hdist, y, x, width, maxmark, maxmarky; Curve c; char *s; l = g->legend; if (l->type == 'n') return; if (l->l->linesep == FSIG) l->l->linesep = l->l->fontsize; l->anylines = 0; maxmark = 0.0; maxmarky = 0.0; anything = 0; for (c = first(g->curves); c != nil(g->curves); c = next(c)) { if (c->l->label != CNULL) { anything = 1; if (c->marktype == 'l') { maxmark = MAX(maxmark, c->lmark->xmax - c->lmark->xmin); maxmarky = MAX(maxmarky, c->lmark->ymax - c->lmark->ymin); } else if (c->marktype != 'n') { maxmark = MAX(maxmark, ABS(c->marksize[0])); maxmarky = MAX(maxmarky, ABS(c->marksize[1])); } if (c->linetype != '0') l->anylines = 1; } } if (l->linelength == FSIG) l->linelength = (l->anylines) ? (MAX(maxmark + 6.0, 24.0)) : 0.0; else l->linelength = disttop(l->linelength, g->x_axis); if (l->midspace == FSIG) l->midspace = (l->anylines) ? 4.0 : (maxmark / 2.0) + 4.0; else l->midspace = disttop(l->midspace, g->x_axis); if (l->linebreak == FSIG) l->linebreak = MAX(l->l->linesep * FCPI / FPPI, maxmarky); else l->linebreak = disttop(l->linebreak, g->y_axis); if (l->type == 'c') { for (c = first(g->curves); c != nil(g->curves); c = next(c)) { if (c->l->label != CNULL) process_label(c->l, g, 1); } return; } if (!anything) { l->anylines = -1; return; } width = 0.0; height = -l->linebreak; for (c = first(g->curves); c != nil(g->curves); c = next(c)) { if (c->l->label != CNULL) { s = c->l->label; copy_label(c->l, l->l); c->l->x = 0.0; c->l->y = 0.0; c->l->rotate = 0.0; c->l->hj = 'l'; c->l->vj = 'b'; c->l->label = s; process_label(c->l, g, 0); height += c->l->ymax + l->linebreak; width = MAX(width, c->l->xmax); } } hdist = (l->anylines) ? l->midspace + l->linelength : l->midspace; width += hdist; if (l->l->x == FSIG) { if (l->l->hj == 'c') { l->l->x = g->x_axis->psize / 2; } else if (l->l->hj == 'l') { if (l->l->vj == 'c') { l->l->x = g->x_axis->psize; if (g->y_axis->draw_axis_label) l->l->x = MAX(l->l->x, g->y_axis->label->xmax); if (g->y_axis->draw_hash_labels) l->l->x = MAX(l->l->x, g->y_axis->hl->xmax); if (g->y_axis->draw_hash_marks) { l->l->x = MAX(l->l->x, g->y_axis->draw_hash_marks_at); l->l->x = MAX(l->l->x, g->y_axis->draw_hash_marks_at + HASH_DIR(g->y_axis) * HASH_SIZE); } l->l->x += 15.0; } else { l->l->x = 0.0; } } else { if (l->l->vj == 'c') { l->l->x = 0.0; if (g->y_axis->draw_axis_label) l->l->x = MIN(l->l->x, g->y_axis->label->xmin); if (g->y_axis->draw_hash_labels) l->l->x = MIN(l->l->x, g->y_axis->hl->xmin); if (g->y_axis->draw_hash_marks) { l->l->x = MIN(l->l->x, g->y_axis->draw_hash_marks_at); l->l->x = MIN(l->l->x, g->y_axis->draw_hash_marks_at + HASH_DIR(g->y_axis) * HASH_SIZE); } l->l->x = l->l->x - 15.0; } else { l->l->x = g->x_axis->psize; } } } else { l->l->x = ctop(l->l->x, g->x_axis); } if (l->l->y == FSIG) { if (l->l->vj == 'c') { l->l->y = g->y_axis->psize / 2.0; } else if (l->l->vj == 'b') { l->l->y = g->y_axis->psize; if (g->x_axis->draw_axis_label) l->l->y = MAX(l->l->y, g->x_axis->label->ymax); if (g->x_axis->draw_hash_labels) l->l->y = MAX(l->l->y, g->x_axis->hl->ymax); if (g->x_axis->draw_hash_marks) { l->l->y = MAX(l->l->y, g->x_axis->draw_hash_marks_at); l->l->y = MAX(l->l->y, g->x_axis->draw_hash_marks_at + HASH_DIR(g->x_axis) * HASH_SIZE); } l->l->y += 15.0; } else { l->l->y = 0.0; if (g->x_axis->draw_axis_label) l->l->y = MIN(l->l->y, g->x_axis->label->ymin); if (g->x_axis->draw_hash_labels) l->l->y = MIN(l->l->y, g->x_axis->hl->ymin); if (g->x_axis->draw_hash_marks) { l->l->y = MIN(l->l->y, g->x_axis->draw_hash_marks_at); l->l->y = MIN(l->l->y, g->x_axis->draw_hash_marks_at + HASH_DIR(g->x_axis) * HASH_SIZE); } l->l->y -= 15.0; } } else { l->l->y = ctop(l->l->y, g->y_axis); } if (l->l->hj == 'l') x = 0.0; else if (l->l->hj == 'c') x = - width/2.0; else x = -width; if (l->l->vj == 't') y = 0.0; else if (l->l->vj == 'c') y = height / 2.0; else y = height; for (c = first(g->curves); c != nil(g->curves); c = next(c)) { if (c->l->label != CNULL) { c->l->x = hdist + x; c->l->y = y; c->l->vj = 't'; c->l->hj = 'l'; c->l->rotate = 0.0; process_label(c->l, g, 0); y = c->l->ymin - l->linebreak; } } process_label_max_n_mins(l->l, width, height); } float find_reasonable_hash_interval(a) Axis a; { float s, d; if (a->is_lg) return 0.0; s = a->max - a->min; d = 1.0; if (s > 5.0) { while(1) { if (s / d < 6.0) return d; d *= 2.0; if (s / d < 6.0) return d; d *= 2.5; if (s / d < 6.0) return d; d *= 2.0; } } else { while(1) { if (s / d > 2.0) return d; d /= 2.0; if (s / d > 2.0) return d; d /= 2.5; if (s / d > 2.0) return d; d /= 2.0; } } } float find_reasonable_hash_start(a) Axis a; { int i; if (a->is_lg) return 0.0; if (a->max > 0.0 && a->min < 0.0) return 0.0; i = ((int) (a->min / a->hash_interval)); return ((float) i) * a->hash_interval; } int find_reasonable_precision(a) Axis a; { int i, b, b2, done; float x, x2, tolerance; if (a->hash_format == 'g' || a->hash_format == 'G') return 6; if (a->hash_format == 'e' || a->hash_format == 'E') return 0; if (a->is_lg) return 0; tolerance = 0.000001; b = 0; x = a->hash_interval; done = 0; while(b < 6 && !done) { i = (int) (x + 0.4); x2 = i; if (x2 - x < tolerance && x - x2 < tolerance) done = 1; else { b++; x *= 10.0; tolerance *= 10.0; } } tolerance = 0.000001; b2 = 0; x = a->hash_start; done = 0; while(b2 < 6 && !done) { i = (int) (x + 0.4); x2 = i; if (x2 - x < tolerance && x - x2 < tolerance) done = 1; else { b2++; x *= 10.0; tolerance *= 10.0; } } return MAX(b, b2); } int find_reasonable_minor_hashes(a) Axis a; { float d; int i; if (a->is_lg) { d = a->log_base; while(d > 10.0) d /= 10.0; while(d <= 1.0) d *= 10.0; i = (int) d; return MAX((i - 2), 0); } else { d = a->hash_interval; if (d == 0.0) return 0; while(d > 10.0) d /= 10.0; while(d <= 1.0) d *= 10.0; i = (int) d; if (((float) i) != d) return 0; return i-1; } } void process_axis1(a, g) Axis a; Graph g; { float tmp; int i; if (a->min == FSIG) { if (a->pmin == FSIG) { error_header(); fprintf(stderr, "Graph %d: %c axis has no minimum, and cannot derive one\n", g->num, AXIS_CHAR(a)); fprintf(stderr, " Use %caxis min\n", AXIS_CHAR(a)); exit(1); } else if (a->pmin <= 0.0 && a->is_lg) { error_header(); fprintf(stderr, "Trying to derive %c axis\n", AXIS_CHAR(a)); fprintf(stderr, " Minimum value %f will be -infinity with log axes\n", a->pmin); exit(1); } else a->min = a->pmin; } if (a->max == FSIG) { if (a->pmax == FSIG) { error_header(); fprintf(stderr, "Graph %d: %c axis has no maximum, and cannot derive one\n", g->num, AXIS_CHAR(a)); fprintf(stderr, " Use %caxis max\n", AXIS_CHAR(a)); exit(1); } else if (a->pmax <= 0.0 && a->is_lg) { error_header(); fprintf(stderr, "Trying to derive %c axis\n", AXIS_CHAR(a)); fprintf(stderr, " Maximum value %f will be -infinity with log axes\n", a->pmax); exit(1); } else a->max = a->pmax; } if (a->max < a->min) { tmp = a->max; a->max = a->min; a->min = tmp; } else if (a->max == a->min) { if (!a->is_lg) a->min -= 1; a->max += 1; } a->psize = intop(a->size); if (a->is_lg) { if (a->min <= 0.0) { error_header(); fprintf(stderr, "Graph %d, %c axis: Min value = %f. This is -infinity with logrhythmic axes\n", g->num, (a->is_x) ? 'x' : 'y', a->min); exit(1); } a->logfactor = log(a->log_base); a->logmin = log(a->min) / a->logfactor; a->factor = a->psize / (log(a->max) / a->logfactor - a->logmin); } else { a->factor = a->psize / (a->max - a->min); } if (a->gr_graytype == '0') { a->gr_graytype = a->graytype; for (i = 0; i < 3; i++) a->gr_gray[i] = a->gray[i]; } if (a->mgr_graytype == '0') { a->mgr_graytype = a->gr_graytype; for (i = 0; i < 3; i++) a->mgr_gray[i] = a->gr_gray[i]; } } void process_axis2(a, g) Axis a; Graph g; { float t1, t2, t3, minor_hashes, hloc, tmp; float ymin, ymax, xmin, xmax; int prec, i1; Hash h; String s; Axis other; other = (a->is_x) ? g->y_axis : g->x_axis; if (a->draw_at == FSIG) a->draw_at = (HASH_DIR(a) == -1) ? 0.0 : other->psize; else a->draw_at = ctop(a->draw_at, other); if (a->hash_interval < 0.0) { a->hash_interval = find_reasonable_hash_interval(a); if (!a->start_given) a->hash_start = find_reasonable_hash_start(a); } else if (!a->start_given) a->hash_start = a->min; if (a->minor_hashes < 0) { a->minor_hashes = find_reasonable_minor_hashes(a); } if (a->precision < 0) a->precision = find_reasonable_precision(a); for (h = first(a->hash_lines) ; h != nil(a->hash_lines); h = next(h)) { h->loc = ctop(h->loc, a); } for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) { s->s->x = ctop(s->s->x, a); s->s->y = ctop(s->s->y, a); } if (((a->hash_interval != 0.0 && !a->is_lg) || a->is_lg) && a->auto_hash_marks) { if (a->is_lg) { for (t1 = 1.0; t1 > a->min; t1 /= a->log_base) ; t2 = t1 * a->log_base - t1; } else { for (t1 = a->hash_start; t1 > a->min; t1 -= a->hash_interval) ; t2 = a->hash_interval; } while (t1 <= a->max) { hloc = ctop(t1, a); if (hloc > -.05 && hloc < a->psize + .05) { h = (Hash) get_node((List) a->hash_lines); h->loc = hloc; h->size = HASH_SIZE; h->major = 1; insert((List) h, (List) a->hash_lines); if (a->auto_hash_labels) { s = (String) get_node ((List) a->hash_labels); s->s = new_label(); s->s->x = hloc; s->s->y = hloc; s->s->label = (char *) malloc (80); if (a->precision >= 0) { prec = a->precision; } else { if (ABS(t1) >= 1.0 || t1 == 0.0) prec = 0; else { tmp = ABS(t1); prec = -1; while(tmp < 1.0) {tmp *= 10.0; prec++;} } } switch(a->hash_format) { case 'G': sprintf(s->s->label, "%.*G", prec, t1); break; case 'g': sprintf(s->s->label, "%.*g", prec, t1); break; case 'E': sprintf(s->s->label, "%.*E", prec, t1); break; case 'e': sprintf(s->s->label, "%.*e", prec, t1); break; case 'f': sprintf(s->s->label, "%.*f", prec, t1); break; default: fprintf(stderr, "Internal jgraph error: hl_st\n"); exit(1); } insert((List) s, (List) a->hash_labels); } } minor_hashes = t2 / ((float) (a->minor_hashes + 1)); t3 = t1; for (i1 = 1; i1 <= a->minor_hashes; i1++) { t3 += minor_hashes; hloc = ctop(t3, a); if (hloc > -.05 && hloc < a->psize + .05) { h = (Hash) get_node((List) a->hash_lines); h->loc = hloc; h->size = MHASH_SIZE; h->major = 0; insert((List) h, (List) a->hash_lines); } } if (a->is_lg) { t1 *= a->log_base; t2 = t1 * a->log_base - t1; } else t1 += t2; } } if (a->draw_hash_marks_at == FSIG) a->draw_hash_marks_at = a->draw_at; else a->draw_hash_marks_at = ctop(a->draw_hash_marks_at, other); if (a->draw_hash_labels_at == FSIG) a->draw_hash_labels_at = a->draw_hash_marks_at + a->hash_scale * HASH_SIZE + HASH_DIR(a) * 3.0; else a->draw_hash_labels_at = ctop(a->draw_hash_labels_at, other); if (a->is_x) { a->hl->y = a->draw_hash_labels_at; if (a->hl->hj == '0') a->hl->hj = 'c'; if (a->hl->vj == '0') a->hl->vj = (HASH_DIR(a) == -1) ? 't' : 'b'; } else { a->hl->x = a->draw_hash_labels_at; if (a->hl->vj == '0') a->hl->vj = 'c'; if (a->hl->hj == '0') a->hl->hj = (HASH_DIR(a) == -1) ? 'r' : 'l'; } ymin = (a->is_x) ? a->hl->y : 0; ymax = (a->is_x) ? a->hl->y : a->psize; xmin = (!a->is_x) ? a->hl->x : 0; xmax = (!a->is_x) ? a->hl->x : a->psize; for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) { if (a->is_x) a->hl->x = s->s->x; else a->hl->y = s->s->y; a->hl->label = s->s->label; process_label(a->hl, g, 0); xmin = MIN(a->hl->xmin, xmin); ymin = MIN(a->hl->ymin, ymin); xmax = MAX(a->hl->xmax, xmax); ymax = MAX(a->hl->ymax, ymax); } a->hl->xmin = xmin; a->hl->ymin = ymin; a->hl->xmax = xmax; a->hl->ymax = ymax; /* HERE -- now either test or continue */ if (a->is_x) { if (a->label->x == FSIG) a->label->x = a->psize / 2.0; else a->label->x = ctop(a->label->x, g->x_axis); if (a->label->y == FSIG) { ymin = 0.0; ymax = other->psize; if (a->draw_hash_labels) { ymin = MIN(ymin, a->hl->ymin); ymax = MAX(ymax, a->hl->ymax); } if (a->draw_hash_marks) { ymin = MIN(ymin, a->draw_hash_marks_at); ymin = MIN(ymin, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE); ymax = MAX(ymax, a->draw_hash_marks_at); ymax = MAX(ymax, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE); } a->label->y = (HASH_DIR(a) == -1) ? ymin - 8.0 : ymax + 8.0 ; } else a->label->y = ctop(a->label->y, g->y_axis); if (a->label->hj == '0') a->label->hj = 'c'; if (a->label->vj == '0') a->label->vj = (HASH_DIR(a) == -1) ? 't' : 'b' ; if (a->label->rotate == FSIG) a->label->rotate = 0.0; } else { if (a->label->y == FSIG) a->label->y = a->psize / 2.0; else a->label->y = ctop(a->label->y, g->y_axis); if (a->label->x == FSIG) { xmin = 0.0; xmax = other->psize; if (a->draw_hash_labels) { xmin = MIN(xmin, a->hl->xmin); xmax = MAX(xmax, a->hl->xmax); } if (a->draw_hash_marks) { xmin = MIN(xmin, a->draw_hash_marks_at); xmin = MIN(xmin, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE); xmax = MAX(xmax, a->draw_hash_marks_at); xmax = MAX(xmax, a->draw_hash_marks_at + a->hash_scale * HASH_SIZE); } a->label->x = (HASH_DIR(a) == -1) ? xmin - 8.0 : xmax + 8.0 ; } else a->label->x = ctop(a->label->x, g->x_axis); if (a->label->hj == '0') a->label->hj = 'c'; if (a->label->vj == '0') a->label->vj = 'b'; if (a->label->rotate == FSIG) a->label->rotate = (HASH_DIR(a) == -1) ? 90.0 : -90.0; } process_label (a->label, g, 0); } void process_label(l, g, adjust) Label l; Graph g; int adjust; { float len, height; int f, i; float fnl, tmp; char *s; if (l->label == CNULL) return; if (adjust) { l->x = ctop(l->x, g->x_axis); l->y = ctop(l->y, g->y_axis); } if (l->linesep == FSIG) l->linesep = l->fontsize; l->nlines = 0; for (i = 0; l->label[i] != '\0'; i++) { if (l->label[i] == '\n') { l->label[i] = '\0'; l->nlines++; } } fnl = (float) l->nlines; len = 0.0; s = l->label; for (i = 0; i <= l->nlines; i++) { tmp = l->fontsize * FCPI / FPPI * strlen(s) * 0.8; len = MAX(len, tmp); if (i != l->nlines) { f = strlen(s); s[f] = '\n'; s = &(s[f+1]); } } height = (l->fontsize * (fnl+1) + l->linesep * fnl) * FCPI / FPPI; process_label_max_n_mins(l, len, height); } void process_label_max_n_mins(l, len, height) Label l; float len; float height; { float xlen, ylen, xheight, yheight; float x, y; xlen = len * cos(l->rotate * Pi / 180.00); ylen = height * cos((l->rotate + 90.0) * Pi / 180.00); xheight = len * sin(l->rotate * Pi / 180.00); yheight = height * sin((l->rotate + 90.0) * Pi / 180.00); x = l->x; y = l->y; if (l->hj == 'c') { x -= xlen / 2.0; y -= xheight / 2.0; } else if (l->hj == 'r') { x -= xlen; y -= xheight; } if (l->vj == 'c') { x -= ylen / 2.0; y -= yheight / 2.0; } else if (l->vj == 't') { x -= ylen; y -= yheight; } l->xmin = MIN(x, x + xlen); l->xmin = MIN(l->xmin, x + xlen + ylen); l->xmin = MIN(l->xmin, x + ylen); l->ymin = MIN(y, y + xheight); l->ymin = MIN(l->ymin, y + yheight); l->ymin = MIN(l->ymin, y + xheight + yheight); l->xmax = MAX(x, x + xlen); l->xmax = MAX(l->xmax, x + xlen + ylen); l->xmax = MAX(l->xmax, x + ylen); l->ymax = MAX(y, y + xheight); l->ymax = MAX(l->ymax, y + yheight); l->ymax = MAX(l->ymax, y + xheight + yheight); } void process_strings(g) Graph g; { String s; for(s = first(g->strings); s != nil(g->strings); s = next(s)) { process_label(s->s, g, 1); } } void process_curve(c, g) Curve c; Graph g; { if (c->bezier && (c->npts < 4 || (c->npts % 3 != 1))) { error_header(); fprintf(stderr, " Graph %d Curve %d:\n", g->num, c->num); fprintf(stderr, " Curve has %d points\n", c->npts); fprintf(stderr, " Bezier must have 3n + 1 points (n > 0)\n"); exit(1); } c->marksize[0] = (c->marksize[0] == FSIG) ? 4.0 : disttop(c->marksize[0], g->x_axis); c->marksize[1] = (c->marksize[1] == FSIG) ? 4.0 : disttop(c->marksize[1], g->y_axis); if (c->marktype == 'o') c->marksize[1] = c->marksize[0]; c->asize[0] = (c->asize[0] == FSIG) ? 6.0 : disttop(c->asize[0], g->x_axis); c->asize[1] = (c->asize[1] == FSIG) ? 2.0 : disttop(c->asize[1], g->y_axis) / 2.0; c->lmark->x = disttop(c->lmark->x, g->x_axis); c->lmark->y = disttop(c->lmark->y, g->y_axis); process_label(c->lmark, g, 0); if (c->parg == FSIG) c->parg = 0.0; if (c->aparg == FSIG) c->aparg = 0.0; if (c->pparg == FSIG) c->pparg = 0.0; } void process_curves(g) Graph g; { Curve c; for(c = first(g->curves); c != nil(g->curves); c = next(c)) { process_curve(c, g); } } void process_extrema(g) /* This finds all the minval/maxvals for bbox calc */ Graph g; { Curve c; String s; Axis xa, ya; xa = g->x_axis; ya = g->y_axis; g->xminval = 0.0; g->yminval = 0.0; g->xmaxval = xa->psize; g->ymaxval = ya->psize; if (xa->draw_axis_label) process_label_extrema(xa->label, g); if (ya->draw_axis_label) process_label_extrema(ya->label, g); if (xa->draw_hash_labels) process_label_extrema(xa->hl, g); if (ya->draw_hash_labels) process_label_extrema(ya->hl, g); if (xa->draw_hash_marks) { g->yminval = MIN(g->yminval, xa->draw_hash_marks_at); g->yminval = MIN(g->yminval, xa->draw_hash_marks_at + HASH_DIR(xa) * HASH_SIZE); g->ymaxval = MAX(g->ymaxval, xa->draw_hash_marks_at); g->ymaxval = MAX(g->ymaxval, xa->draw_hash_marks_at + HASH_DIR(xa) * HASH_SIZE); } if (ya->draw_hash_marks) { g->xminval = MIN(g->xminval, ya->draw_hash_marks_at); g->xminval = MIN(g->xminval, ya->draw_hash_marks_at + HASH_DIR(ya) * HASH_SIZE); g->xmaxval = MAX(g->xmaxval, ya->draw_hash_marks_at); g->xmaxval = MAX(g->xmaxval, ya->draw_hash_marks_at + HASH_DIR(ya) * HASH_SIZE); } process_label_extrema(g->title, g); if (g->legend->type == 'c') { for (c = first(g->curves); c != nil(g->curves); c = next(c)) { process_label_extrema(c->l, g); } } else if (g->legend->type == 'u' && g->legend->anylines >= 0) { process_label_extrema(g->legend->l, g); } for(s = first(g->strings); s != nil(g->strings); s = next(s)) { process_label_extrema(s->s, g); } } void process_label_extrema(l, g) Label l; Graph g; { if (l->label == CNULL) return; g->yminval = MIN(g->yminval, l->ymin); g->ymaxval = MAX(g->ymaxval, l->ymax); g->xminval = MIN(g->xminval, l->xmin); g->xmaxval = MAX(g->xmaxval, l->xmax); } void process_graph(g) Graph g; { g->x_translate = intop(g->x_translate); g->y_translate = intop(g->y_translate); process_axis1(g->x_axis, g); process_axis1(g->y_axis, g); process_axis2(g->x_axis, g); process_axis2(g->y_axis, g); process_curves(g); process_legend(g); process_strings(g); process_title(g); process_extrema(g); } void process_graphs(gs) Graphs gs; { Graphs the_g; Graph g; float diff, max_y, min_y, max_x, min_x; int do_bb, i; Pi = acos(-1.0); for (the_g = first(gs); the_g != nil(gs); the_g = next(the_g)) { for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) process_graph(g); max_x = 0.0; min_x = 0.0; max_y = 0.0; min_y = 0.0; for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) { max_y = MAX(max_y, g->y_translate + g->ymaxval); min_y = MIN(min_y, g->y_translate + g->yminval); max_x = MAX(max_x, g->x_translate + g->xmaxval); min_x = MIN(min_x, g->x_translate + g->xminval); } if (the_g->height >= 0.00) { the_g->height *= FCPI; if (the_g->height > max_y - min_y) { diff = (the_g->height - max_y + min_y) / 2.0; max_y += diff; min_y -= diff; } else { the_g->height = max_y - min_y; } } else { the_g->height = max_y - min_y; } if (the_g->width >= 0.00) { the_g->width *= FCPI; if (the_g->width > max_x - min_x) { diff = (the_g->width - max_x + min_x) / 2.0; max_x += diff; min_x -= diff; } else { the_g->width = max_x - min_x; } } else { the_g->width = max_x - min_x; } do_bb = 1; for (i = 0; i < 4; i++) do_bb = (do_bb && the_g->bb[i] == ISIG); if (do_bb) { the_g->bb[0] = (int) (min_x - 1.0); the_g->bb[1] = (int) (min_y - 1.0); the_g->bb[2] = (int) (max_x + 1.0); the_g->bb[3] = (int) (max_y + 1.0); } } } @ 8.4 log @Fixing the seg fault and all of those warnings. @ text @d6 4 a9 4 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/process.c,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ d65 15 a79 1 process_title(g) d104 1 a104 1 process_legend(g) d376 1 a376 1 process_axis1(a, g) d446 1 a446 1 process_axis2(a, g) d636 1 a636 1 process_label(l, g, adjust) d678 1 a678 1 process_label_max_n_mins(l, len, height) d727 1 a727 1 process_strings(g) d737 1 a737 1 process_curve(c, g) d765 1 a765 1 process_curves(g) d774 1 a774 1 process_extrema(g) /* This finds all the minval/maxvals for bbox calc */ d824 1 a824 1 process_label_extrema(l, g) d835 1 a835 1 process_graph(g) d851 1 a851 1 process_graphs(gs) @ jgraph/RCS/show.c,v0000555005471000040510000003446613207316747013214 0ustar planklocihead 8.5; access; symbols; locks plank:8.5; strict; comment @ * @; 8.5 date 2017.11.28.17.33.27; author plank; state Exp; branches; next 8.4; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.5 log @Clang requires explicit voids. @ text @/* show.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/show.c,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "jgraph.h" static void show_mltiline(); void show_string(); void show_label(); void show_lmark(); void show_curve(); void show_axis(); void show_legend(); void show_graph(); void show_graphs(); static void spaces(nsp) int nsp; { while(nsp-- > 0) putchar(' '); } float ptoin(p) float p; { return p / FCPI; } float ptoc(p, a) float p; Axis a; { if (a->is_lg) { return (float) exp((p / a->factor + a->logmin) * a->logfactor); } else { return (p / a->factor) + a->min; } } float ptodist(p, a) float p; Axis a; { if (a->is_lg) { return p / FCPI; } else { return (p / a->factor); } } static void show_mltiline(s) char *s; { int i; if (s != CNULL) { for (i = 0; s[i] != '\0'; i++) { if (s[i] == '\n') putchar('\\'); putchar(s[i]); } } putchar('\n'); } void show_string(s) char *s; { int i; if (s != CNULL) { printf(": "); for (i = 0; s[i] != '\0'; i++) { if (s[i] == '\n') putchar('\\'); if (s[i] == '\\') i++; putchar(s[i]); } } putchar('\n'); } void show_label(l, nsp, g) Label l; int nsp; Graph g; { spaces(nsp); show_string(l->label); spaces(nsp); printf("x %f ", ptoc(l->x, g->x_axis)); printf("y %f\n", ptoc(l->y, g->y_axis)); spaces(nsp); printf("hj%c vj%c ", l->hj, l->vj); printf("rotate %f\n", l->rotate); spaces(nsp); printf("font %s ", l->font); printf("fontsize %f ", l->fontsize); printf("linesep %f\n", l->linesep); if (l->graytype == 'g') { spaces(nsp); printf("lgray %f\n", l->gray[0]); } else if (l->graytype == 'c') { spaces(nsp); printf("lcolor %f %f %f\n", l->gray[0], l->gray[1], l->gray[2]); } return; } void show_lmark(l, nsp, g) Label l; int nsp; Graph g; { spaces(nsp); show_string(l->label); spaces(nsp); printf("x %f ", ptodist(l->x, g->x_axis)); printf("y %f\n", ptodist(l->y, g->y_axis)); spaces(nsp); printf("hj%c vj%c ", l->hj, l->vj); printf("rotate %f\n", l->rotate); spaces(nsp); printf("font %s ", l->font); printf("fontsize %f\n", l->fontsize); return; } void show_curve(c, nsp, g) Curve c; int nsp; Graph g; { Point p; Point px; Point py; int i; Flist fl; if (c->l->label != CNULL) { spaces(nsp); printf("label\n"); spaces(nsp+2); printf("(* unless , this label\'s x\'s and y\'s will be ignored *)\n"); show_label(c->l, nsp+2, g); } px = first(c->xepts); py = first(c->yepts); for(p = first(c->pts); p != nil(c->pts); p = next(p)) { if (p->e == 'p') { spaces(nsp); printf("pts %f %f\n", p->x, p->y); } else if (p->e == 'x') { spaces(nsp); printf("x_epts %f %f %f %f\n", p->x, p->y, px->x, next(px)->x); px = next(next(px)); } else if (p->e == 'y') { spaces(nsp); printf("y_epts %f %f %f %f\n", p->y, p->y, py->y, next(py)->y); py = next(next(py)); } else { fprintf(stderr, "Internal error: p->e == %c\n", p->e); exit(1); } } if (c->eps != CNULL) { spaces(nsp); printf("eps %s\n", c->eps); } if (c->postscript != CNULL) { spaces(nsp); printf("postscript "); if (!c->postfile) printf(": "); show_mltiline(c->postscript); } spaces(nsp); printf("marktype "); for (i = 0; i < NMARKTYPES && c->marktype != MARKTYPES[i]; i++) ; if (i == NMARKTYPES) { error_header(); fprintf(stderr, "Unknown mark type %c\n", c->marktype); exit(1); } else printf("%s ", MARKTYPESTRS[i]); if (c->marktype == 'l') { show_lmark(c->lmark, nsp+2, g); spaces(nsp); } printf("marksize %f %f ", ptodist(c->marksize[0], g->x_axis), ptodist(c->marksize[1], g->y_axis)); printf("mrotate %f ", c->mrotate); if (c->filltype == 'g') { printf("fill %f\n", c->fill[0] ); } else if (c->filltype == 'c') { printf("cfill %f %f %f\n", c->fill[0], c->fill[1], c->fill[2] ); } if (first(c->general_marks) != c->general_marks) { spaces(nsp); printf("gmarks"); for(p = first(c->general_marks); p != nil(c->general_marks); p = next(p)) printf(" %f %f ", p->x, p->y); } printf("\n"); spaces(nsp); if(!c->poly) printf("no"); printf("poly "); if (c->pfilltype == 'g') { printf("pfill %f", c->pfill[0] ); } else if (c->pfilltype == 'c') { printf("pcfill %f %f %f", c->pfill[0], c->pfill[1], c->pfill[2] ); } printf("\n"); spaces(nsp); printf("linetype "); if (c->linetype == '0') printf("none "); else if (c->linetype == 's') printf("solid "); else if (c->linetype == '.') printf("dotted "); else if (c->linetype == '-') printf("dashed "); else if (c->linetype == 'l') printf("longdash "); else if (c->linetype == 'd') printf("dotdash "); else if (c->linetype == 'D') printf("dotdotdash "); else if (c->linetype == '2') printf("dotdotdashdash "); else if (c->linetype == 'g') { printf("general\n"); spaces(nsp+2); printf("glines "); i = 0; for (fl = first(c->gen_linetype); fl != nil(c->gen_linetype); fl = next(fl)) { if (i == 6) { printf("\n"); spaces(nsp + 9); i = 0; } printf("%f ", fl->f); i++; } printf("\n"); spaces(nsp); } printf("linethickness %f\n", c->linethick); spaces(nsp); if (c->graytype == 'g') { printf("gray %f ", c->gray[0]); } else if (c->graytype == 'c') { printf("color %f %f %f ", c->gray[0], c->gray[1], c->gray[2]); } if(!c->clip) printf("no"); printf("clip\n"); spaces(nsp); for (i = 0; i < NPATTERNS && PTYPES[i] != c->pattern; i++) ; printf("pattern %s %f ", PATTERNS[i], c->parg); for (i = 0; i < NPATTERNS && PTYPES[i] != c->ppattern; i++) ; printf("ppattern %s %f ", PATTERNS[i], c->pparg); for (i = 0; i < NPATTERNS && PTYPES[i] != c->apattern; i++) ; printf("apattern %s %f\n", PATTERNS[i], c->aparg); spaces(nsp); if(!c->rarrow) printf("no"); printf("rarrow "); if(!c->larrow) printf("no"); printf("larrow "); if(!c->rarrows) printf("no"); printf("rarrows "); if(!c->larrows) printf("no"); printf("larrows "); if (c->afilltype == 'g') { printf("afill %f\n", c->afill[0] ); } else if (c->afilltype == 'c') { printf("acfill %f %f %f\n", c->afill[0], c->afill[1], c->afill[2] ); } spaces(nsp); if(!c->bezier) printf("no"); printf("bezier "); printf("asize %f %f\n", ptodist(c->asize[0], g->x_axis), ptodist(c->asize[1], g->y_axis) * 2.0); } void show_axis(a, nsp, g) Axis a; int nsp; Graph g; { Axis other; Hash h; String s; if (a->is_x) other = g->y_axis; else other = g->x_axis; spaces(nsp); printf("size %f\n", a->size); spaces(nsp); printf("min %f max %f %s\n", a->min, a->max, (a->is_lg) ? "log" : "linear"); if (!(a->draw_hash_labels || a->draw_axis_line || a->draw_hash_marks || a->draw_axis_label)) { spaces(nsp); printf("nodraw\n"); return; } spaces(nsp); printf("draw_at %f\n", ptoc(a->draw_at, other)); if (a->label->label != CNULL) { spaces(nsp); printf("label\n"); show_label(a->label, nsp+2, g); } spaces(nsp); printf("%sdraw_hash_labels\n", (a->draw_hash_labels) ? "" : "no_"); spaces(nsp); printf("%sdraw_axis_line\n", (a->draw_axis_line) ? "" : "no_"); spaces(nsp); printf("%sdraw_hash_marks\n", (a->draw_hash_marks) ? "" : "no_"); spaces(nsp); printf("%sgrid_lines\n", (a->grid_lines) ? "" : "no_"); spaces(nsp); printf("%smgrid_lines\n", (a->mgrid_lines) ? "" : "no_"); spaces(nsp); printf("%sdraw_axis_label\n", (a->draw_axis_label) ? "" : "no_"); spaces(nsp); if (a->graytype == 'g') { printf("gray %f\n", a->gray[0]); } else if (a->graytype == 'c') { printf("color %f %f %f\n", a->gray[0], a->gray[1], a->gray[2]); } spaces(nsp); if (a->gr_graytype == 'g') { printf("gr_gray %f ", a->gr_gray[0]); } else if (a->gr_graytype == 'c') { printf("color %f %f %f ", a->gr_gray[0], a->gr_gray[1], a->gr_gray[2]); } if (a->mgr_graytype == 'g') { printf("mgr_gray %f\n", a->mgr_gray[0]); } else if (a->mgr_graytype == 'c') { printf("color %f %f %f\n", a->mgr_gray[0], a->mgr_gray[1], a->mgr_gray[2]); } spaces(nsp); printf("(* The real settings for generating auto_hash_labels:\n"); spaces(nsp+5); printf("%sauto_hash_marks ", (a->auto_hash_marks) ? "" : "no_"); printf("%sauto_hash_labels\n", (a->auto_hash_labels) ? "" : "no_"); spaces(nsp+5); printf("hash %f shash %f mhash %d hash_format %c\n", a->hash_interval, a->hash_start, a->minor_hashes, a->hash_format); spaces(nsp+5); if (a->is_lg) { printf("log_base %f ", a->log_base); } printf("hash_scale %f ", a->hash_scale); printf("precision %d\n", a->precision); spaces(nsp+3); printf("The following are explicit and implicit hash marks and labels *)\n"); spaces(nsp); printf("hash 0 draw_hash_marks_at %f draw_hash_labels_at %f\n", ptoc(a->draw_hash_marks_at, other), ptoc(a->draw_hash_labels_at, other)); spaces(nsp); printf("hash_labels (* The :, x, and y values are ignored *)\n"); show_label(a->hl, nsp + 2, g); for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) { spaces(nsp); printf("%s %f\n", ((h->size == HASH_SIZE) ? "hash_at" : "mhash_at"), ptoc(h->loc, a)); } for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) { spaces(nsp); printf("hash_label at %f ", ptoc(s->s->x, a)); show_string(s->s->label); } } void show_legend(l, nsp, g) Legend l; int nsp; Graph g; { if (l->type == 'c') { spaces(nsp); printf("custom\n"); } else if (l->type == 'n') { spaces(nsp); printf("off\n"); } spaces(nsp); printf("linelength %f linebreak %f midspace %f\n", ptodist(l->linelength, g->x_axis), ptodist(l->linebreak, g->y_axis), ptodist(l->midspace, g->x_axis)); if (l->type == 'u') { spaces(nsp); printf("defaults"); show_label(l->l, nsp+2, g); } } void show_graph(g, nsp) Graph g; int nsp; { Curve c; String s; spaces(nsp); printf("x_translate %f y_translate %f\n", ptoin(g->x_translate), ptoin(g->y_translate)); spaces(nsp); printf("xaxis\n"); show_axis(g->x_axis, nsp+2, g); spaces(nsp); printf("yaxis\n"); show_axis(g->y_axis, nsp+2, g); spaces(nsp); if(!g->clip) printf("no"); printf("clip "); if(!g->border) printf("no"); printf("border\n"); for (c = first(g->curves); c != nil(g->curves); c = next(c)) { spaces(nsp); printf("curve %d\n", c->num); show_curve(c, nsp+2, g); } spaces(nsp); printf("legend\n"); show_legend(g->legend, nsp+2, g); if (g->title->label != CNULL) { spaces(nsp); printf("title\n"); show_label(g->title, nsp+2, g); } for (s = first(g->strings); s != nil(g->strings); s = next(s)) { spaces(nsp); printf("string %d\n", s->num); show_label(s->s, nsp+2, g); } } void show_graphs(gs) Graphs gs; { Graphs the_g; Graph g; char started; int i; started = 0; for (the_g = first(gs); the_g != nil(gs); the_g = next(the_g)) { if (started) printf("\nnewpage\n"); started = 1; printf("X %f Y %f\n", ptoin(the_g->width), ptoin(the_g->height)); if (the_g->preamble != CNULL) { printf("preamble "); if (!the_g->prefile) printf(": "); show_mltiline(the_g->preamble); } if (the_g->epilogue != CNULL) { printf("epilogue "); if (!the_g->epifile) printf(": "); show_mltiline(the_g->epilogue); } printf("bbox"); for (i = 0; i < 4; i++) printf(" %d", the_g->bb[i]); printf("\n"); for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) { printf("graph %d\n", g->num); show_graph(g, 2); } } } @ 8.4 log @Fixing the seg fault and all of those warnings. @ text @d6 4 a9 4 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/show.c,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ d56 11 a66 1 static spaces(nsp) d100 1 a100 1 static show_mltiline(s) d114 1 a114 1 show_string(s) d131 1 a131 1 show_label(l, nsp, g) d155 1 a155 1 show_lmark(l, nsp, g) d170 1 a170 1 show_curve(c, nsp, g) d308 1 a308 1 show_axis(a, nsp, g) d399 1 a399 1 show_legend(l, nsp, g) d419 1 a419 1 show_graph(g, nsp) d451 1 a451 1 show_graphs(gs) @ jgraph/RCS/sin.c,v0000555005471000040510000000055412037030663013002 0ustar planklocihead 8.4; access; symbols; locks plank:8.4; strict; comment @ * @; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.4 log @Fixing the seg fault and all of those warnings. @ text @#include main() { double x; for (x = -10.0; x < 10.0; x += .03) printf("%f %f\n", x, sin(x)); } @ jgraph/RCS/sin2.c,v0000555005471000040510000000055312037030663013063 0ustar planklocihead 8.4; access; symbols; locks plank:8.4; strict; comment @ * @; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.4 log @Fixing the seg fault and all of those warnings. @ text @#include main() { double x; for (x = 0.1; x < 100.0; x += .03) printf("%f %f\n", x, sin(x)); } @ jgraph/RCS/token.c,v0000555005471000040510000002463713207316747013353 0ustar planklocihead 8.5; access; symbols; locks plank:8.5; strict; comment @ * @; 8.5 date 2017.11.28.17.33.27; author plank; state Exp; branches; next 8.4; 8.4 date 2012.10.15.15.54.18; author plank; state Exp; branches; next ; desc @@ 8.5 log @Clang requires explicit voids. @ text @/* token.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/token.c,v $ * $Revision: 8.4 $ * $Date: 2012/10/15 15:54:18 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #ifdef VMS #include #include #endif #include "list.h" void set_input_file(); void error_header(); void ungettokenchar(); void get_comment(); static void push_iostack(); static void pop_iostack(); static void nexttoken(); void rejecttoken(); #define CNULL ((char *)0) typedef struct iostack { struct iostack *flink; struct iostack *blink; char *filename; FILE *stream; int oldcharvalid; char oldchar; char pipe; int line; } *Iostack; static char INPUT[1000]; static int getnew = 1; static char oldchar = '\0'; static oldcharvalid = 0; static char pipe = 0; static int eof = 0; static int init = 0; static Iostack stack; static char real_eof = EOF; static FILE *IOSTREAM; static char FILENAME[300]; static int line = 1; #ifdef VMS /* On VMS, there are no popen() and pclose(), so we provide dummies here. */ FILE *popen(command, type) char *command, *type; { return(NULL); } int pclose(stream) FILE *stream; { return(-1); } #endif /*VMS*/ void set_input_file(char *s) { FILE *f; Iostack n; if (init == 0) { stack = (Iostack) make_list(sizeof(struct iostack)); if (s == CNULL) { IOSTREAM = stdin; strcpy(FILENAME, ""); } else { IOSTREAM = fopen(s, "r"); if (IOSTREAM == NULL) { fprintf(stderr, "Error: cannot open file \"%s\"\n", s); exit(1); } strcpy(FILENAME, s); } init = 1; } else { n = (Iostack) get_node((List) stack); n->stream = NULL; n->filename = (char *) malloc (sizeof(char)*(strlen(s)+2)); strcpy(n->filename, s); n->oldchar = oldchar; n->oldcharvalid = oldcharvalid; n->pipe = pipe; n->line = line; insert((List) n, (List) stack->flink); } } void error_header() { fprintf(stderr, "%s,%d: ", FILENAME, line); } int gettokenchar() { if (oldcharvalid == 0) oldchar = getc(IOSTREAM); oldcharvalid = 0; if (oldchar == '\n') line++; return oldchar; } void ungettokenchar() { oldcharvalid = 1; if (oldchar == '\n') line--; } int gettoken(s) char *s; { int i; char c; for (c = gettokenchar(); c == ' ' || c == '\t' || c == '\n'; c = gettokenchar()) ; for (i = 0; c != real_eof && c != ' ' && c != '\t' && c != '\n'; c = gettokenchar()) { s[i++] = c; } s[i] = '\0'; ungettokenchar(); return i; } void get_comment() { if (eof) return; while (1) { if (gettoken(INPUT) == 0) return; else if (strcmp(INPUT, "(*") == 0) get_comment(); else if (strcmp(INPUT, "*)") == 0) return; } } static int iostackempty() { return (first(stack) == nil(stack)); } static void push_iostack(p) int p; { Iostack n; n = (Iostack) get_node((List) stack); n->stream = IOSTREAM; n->filename = (char *) malloc (sizeof(char)*(strlen(FILENAME)+2)); n->oldchar = oldchar; n->oldcharvalid = oldcharvalid; n->pipe = pipe; n->line = line; strcpy(n->filename, FILENAME); insert((List) n, (List) stack); if (p) { IOSTREAM = (FILE *) popen(INPUT, "r"); } else { IOSTREAM = fopen(INPUT, "r"); } pipe = p; line = 1; if (IOSTREAM == NULL) { error_header(); fprintf(stderr, "Include file \"%s\" does not exist\n", INPUT); exit(1); } strcpy(FILENAME, INPUT); } static void pop_iostack() { Iostack n; fflush(IOSTREAM); if (pipe) { if (pclose(IOSTREAM)) { /*error_header(); fprintf(stderr, "\n\nPipe returned a non-zero error code.\n"); exit(1); */ } } else { fclose(IOSTREAM); } n = last(stack); if (n->stream == NULL) { n->stream = fopen(n->filename, "r"); if (n->stream == NULL) { fprintf(stderr, "Error: cannot open file \"%s\"\n", n->filename); exit(1); } } IOSTREAM = n->stream; strcpy(FILENAME, n->filename); free(n->filename); pipe = n->pipe; line = n->line; oldchar = n->oldchar; oldcharvalid = n->oldcharvalid; delete_item((List) n); free_node((List) n, (List) stack); } static void nexttoken() { if (eof) return; if (getnew) { while (1) { if (gettoken(INPUT) == 0) { if (iostackempty()) { eof = 1; getnew = 0; return; } else { pop_iostack(); } } else if (strcmp(INPUT, "(*") == 0) { get_comment(); } else if (strcmp(INPUT, "include") == 0) { if (gettoken(INPUT) == 0) { error_header(); fprintf(stderr, "Empty include statement\n"); exit(1); } else { push_iostack(0); } } else if (strcmp(INPUT, "shell") == 0) { #ifdef VMS fprintf(stderr, "No shell option on VMS, sorry.\n"); exit(1); #endif /*VMS*/ if (gettoken(INPUT) == 0 || strcmp(INPUT, ":") != 0) { error_header(); fprintf(stderr, "'shell' must be followed by ':'\n"); exit(1); } if (getsystemstring() == 0) { fprintf(stderr, "Empty shell statement\n"); exit(1); } push_iostack(1); } else { getnew = 1; return; } } } getnew = 1; return; } int getstring(s) char *s; { nexttoken(); if (eof) return 0; strcpy(s, INPUT); return 1; } int getint(i) int *i; { int j; nexttoken(); if (eof) return 0; *i = atoi(INPUT); if (*i == 0) { for (j = 0; INPUT[j] != '\0'; j++) if (INPUT[j] != '0') return 0; } return 1; } int getfloat(f) float *f; { int j; nexttoken(); if (eof) return 0; *f = (float) atof(INPUT); if (*f == 0.0) { for (j = 0; INPUT[j] == '-'; j++); while (INPUT[j] == '0') j++; if (INPUT[j] == '.') j++; while (INPUT[j] == '0') j++; if (INPUT[j] == 'e' || INPUT[j] == 'E') { j++; if (INPUT[j] == '+' || INPUT[j] == '-') j++; while (INPUT[j] == '0') j++; } return (INPUT[j] == '\0'); } else return 1; } static char *new_printable_text(s) char *s; { char *new_s; int to_pad, i, j; to_pad = 0; for (i = 0; s[i] != '\0'; i++) { if (s[i] == '\\' || s[i] == ')' || s[i] == '(') { to_pad++; } } j = sizeof(char) * (i + to_pad + 2); if ((j % 8) != 0) j += 8 - j % 8; new_s = (char *) malloc (j); j = 0; for (i = 0; s[i] != '\0'; i++) { if (s[i] == '\\' || s[i] == ')' || s[i] == '(') { new_s[j++] = '\\'; } new_s[j++] = s[i]; } new_s[j] = '\0'; /* added: tie off -hdd */ return new_s; } char *getmultiline() { char c; int i, j, done, len, started; char *out_str; if (getnew == 0) return CNULL; c = gettokenchar(); if (c == real_eof) { ungettokenchar(); return CNULL; } done = 0; started = 0; while (!done) { i = 0; for (c = gettokenchar(); c != real_eof && c != '\n'; c = gettokenchar()) { INPUT[i++] = c; } INPUT[i] = '\0'; if (!started) { out_str = (char *) malloc (sizeof(char)*(i+1)); strcpy(out_str, INPUT); len = i; started = 1; } else { out_str = (char *) realloc(out_str, (len + i + 3) * sizeof(char)); sprintf(&(out_str[len]), "\n%s", INPUT); len += i+1; } if (c == '\n' && len != 0 && out_str[len-1] == '\\') { len--; } else { done = 1; } } ungettokenchar(); return out_str; } char *getlabel() { char c; char *txt, *new; int i; txt = getmultiline(); if (txt == CNULL) return CNULL; new = new_printable_text(txt); free(txt); return new; } int getsystemstring() { char c; int i; int done; if (getnew == 0) return 0; c = gettokenchar(); if (c == real_eof) { ungettokenchar(); return 0; } i = 0; done = 0; while (!done) { for (c = gettokenchar(); c != real_eof && c != '\n'; c = gettokenchar()) { INPUT[i++] = c; } if (c == '\n' && i > 0 && INPUT[i-1] == '\\') { INPUT[i++] = '\n'; } else { done = 1; } } ungettokenchar(); INPUT[i] = '\0'; return 1; } void rejecttoken() { getnew = 0; } @ 8.4 log @Fixing the seg fault and all of those warnings. @ text @d6 4 a9 4 * $Source: /tmp_mnt/n/fs/grad1/jsp/src/jgraph/RCS/token.c,v $ * $Revision: 8.3 $ * $Date: 92/11/30 11:42:10 $ * $Author: jsp $ d62 9 d112 1 a112 1 set_input_file(char *s) d144 1 a144 1 error_header() d157 1 a157 1 ungettokenchar() d182 1 a182 1 get_comment() d199 1 a199 1 static push_iostack(p) d228 1 a228 1 static pop_iostack() d261 1 a261 1 static nexttoken() d466 1 a466 1 rejecttoken() @ jgraph/README0000777005471000040510000000403612037027623012043 0ustar plankloci$Revision: 8.3 $ ------------------------------------------------------------ Comments in October, 2012: Jgraph is a Unix graphing package that produces postscript. I was pretty proud that jgraph was unmodified for over 19 years (November, 1992 to October, 2012), but C compilers finally "progressed" to the point where my old-style C finally choked. So I fixed it in October of 2012, and it's back humming along, although that was some pretty disgusting code that I wrote as a graduate student in 1989. In the new revision, besides getting jgraph to compile and not seg fault, I've put it under the New BSD License. If you use jgraph, please drop me a quick email at plank@cs.utk.edu. Documentation of usage of my open-source code is always a good thing for department heads, deans and funding agencies. Thanks -- Jim ------------------------------------------------------------ Jgraph takes the description of a graph or graphs in the standard input, and produces a postscript file on the standard output. Jgraph is ideal for plotting any mixture of scatter point graphs, line graphs, and/or bar graphs, and embedding the output into LaTeX, or any other text processing system which can read postscript. The graph description language is simple enough to get nice looking graphs with a minimum of effort, yet powerful enough to give the user the flexibility to tailor the appearance of the graph to his or her individual preferences. This includes plotting multiple graphs and laying them out separately on the page (or pages). The program is written in C, and shouldn't take anything too fancy or machine-dependent. It has been tested on DECstations, sun3's, and sparc's (and is being used on many other types of machines, including those running VMS and DOS). There is a makefile, a man page (in jgraph.1), source code, and example graphs. Jgraph is available at http://web.eecs.utk.edu/~plank/plank/jgraph/jgraph.html Please send me comments and/or bug reports. Author: James S. Plank Email: plank@cs.utk.edu Web: http://web.eecs.utk.edu/~plank jgraph/redexp.vms0000777005471000040510000004546411447702136013216 0ustar plankloci/* --redexp.vms-- This 'C' module may be included prior to the ``main'' programs on VMS in order to allow 'C' arguments to contain redirection symbols (<,>,>>) and VMS wild cards (*,%, ...], [-). By including this module, two programs redirect() and expand() are run prior to turning control over to your main() entry point. redirect-- Gregg Townsend circa 1983, expand-- John Campbell circa 1987 This code is public domain, others may use it freely. Credit, however, to Gregg Townsend (who wrote ``redirect()'') and John Campbell (who followed with ``expand()'') would be appreciated. If someone writes the next logical successor ``pipe()'', please email a copy to ...!arizona!naucse!jdc (John Campbell) (Gregg works on unix :-). HISTORY */ #include /* No easy way to tell if this has already been included. */ #ifndef ERANGE #include /* Include only if missing. */ #endif #ifndef __FILE #include /* Include only if missing. */ #endif #include /* Added for conversion to lower case */ #ifndef __STRING_LOADED #include #endif /* !__STRING_LOADED */ /* Expansion of wild cards is done using RMS. */ struct NAMBLK { struct NAM nam; /* VMS nam block structure */ char es[NAM$C_MAXRSS], /* Extended string */ rs[NAM$C_MAXRSS]; /* Resultant string */ }; #define ErrorExit 1 /* Allow the user to override _N_FARGS or _E_FLAG if they wish. */ #ifndef _N_FARGS #define _N_FARGS 0 /* no automatic redirection please */ #endif #ifndef _E_FLAG #define _E_FLAG 4 /* only include dev and dir if different from default */ #endif /* Since the following will possibly be included in a single module, try hard to avoid name conflicts. (Just being static doesn't cut it if compiled in the same module.) */ #define redirect _r_edirect #define filearg _f_ilearg #define expand _e_xpand #define wild_found _w_ild_found #define wild_expand _w_ild_expand /* forward protypes */ static void redirect(int *argc, char *argv[], int nfargs); char **expand (int *argc, const char *argv[], const int flag); main(int argc, char *argv[], char *envp[]) { redirect (&argc, argv, _N_FARGS); argv = expand (&argc, argv, _E_FLAG); /* Make the user's main entry point this routine's entry point. */ #define main _user_main _user_main (argc, argv, envp); } /* ------------------------ REDIRECT code ------------------------ */ /* * redirect(&argc,argv,nfargs) - redirect standard I/O * int *argc number of command arguments (from call to main) * char *argv[] command argument list (from call to main) * int nfargs number of filename arguments to process * * argc and argv will be adjusted by redirect. * * redirect processes a program's command argument list and handles redirection * of stdin, and stdout. Any arguments which redirect I/O are removed from the * argument list, and argc is adjusted accordingly. redirect would typically be * called as the first statement in the main program. * * Files are redirected based on syntax or position of command arguments. * Arguments of the following forms always redirect a file: * * file redirects standard output to write to the given file * >>file redirects standard output to append to the given file * * It is often useful to allow alternate input and output files as the * first two command arguments without requiring the file * syntax. If the nfargs argument to redirect is 2 or more then the * first two command arguments, if supplied, will be interpreted in this * manner: the first argument replaces stdin and the second stdout. * A filename of "-" may be specified to occupy a position without * performing any redirection. * * If nfargs is 1, only the first argument will be considered and will * replace standard input if given. Any arguments processed by setting * nfargs > 0 will be removed from the argument list, and again argc will * be adjusted. Positional redirection follows syntax-specified * redirection and therefore overrides it. * */ /* forward prototype for local routine */ static void filearg(int *argc, char *argv[], int n, int i, FILE *fp, char mode[]); static void redirect(int *argc, char *argv[], int nfargs) { int i; i = 1; while (i < *argc) { /* for every command argument... */ switch (argv[i][0]) { /* check first character */ case '<': /* ': /* >file or >>file redirects stdout */ if (argv[i][1] == '>') filearg(argc,argv,i,2,stdout,"a"); else filearg(argc,argv,i,1,stdout,"w"); break; default: /* not recognized, go on to next arg */ i++; } } if (nfargs >= 1 && *argc > 1) /* if positional redirection & 1 arg */ filearg(argc,argv,1,0,stdin,"r"); /* then redirect stdin */ if (nfargs >= 2 && *argc > 1) /* likewise for 2nd arg if wanted */ filearg(argc,argv,1,0,stdout,"w");/* redirect stdout */ } /* local routine for redirect() */ /* filearg(&argc,argv,n,i,fp,mode) - redirect and remove file argument * int *argc number of command arguments (from call to main) * char *argv[] command argument list (from call to main) * int n argv entry to use as file name and then delete * int i first character of file name to use (skip '<' etc.) * FILE *fp file pointer for file to reopen (typically stdin etc.) * char mode[] file access mode (see freopen spec) */ static void filearg(int *argc, char *argv[], int n, int i, FILE *fp, char mode[]) { if (strcmp(argv[n]+i,"-")) /* alter file if arg not "-" */ fp = freopen(argv[n]+i,mode,fp,"mbf=8","mbc=16"); if (fp == NULL) { /* abort on error */ fprintf(stderr,"%%can't open %s",argv[n]+i); exit(ErrorExit); } for ( ; n < *argc; n++) /* move down following arguments */ argv[n] = argv[n+1]; *argc = *argc - 1; /* decrement argument count */ } /* ------------------------ EXPAND code ------------------------ */ /*- ``expand()'' is a routine to expand wild-cards to file specifications. This routine is often used in conjunction with ``redirect()'' to provide both wild card expansion and standard file redirection prior to doing any real work in a 'C' program. Normal usage is to include the following line prior to using argc or argv in main(): argv = expand (&argc, argv, 0); ``argc'' will be adjusted by ``expand()'', the return value from expand will replace ``argv''. ``expand()'' processes a program's command argument list and expands any wild cards into zero or more argv entries. Only arguments that posses VMS wild-cards are expanded. Wild cards searched for are ``*'', ``%'', ``...]'', and ``[-''. If the wild-card is found inside a single or double quote ("*" or '%') then they are not counted as wild-cards. Be aware that the expansion of a VMS wild card will match all VMS files, including directory files (".DIR;1"). NOTE: The use of quotes in VMS requires thinking about how the CLI expands things before handing the argument line over to your program. Do not expect "*" to avoid expansion, use """*""" instead. Likewise, expression substitution precludes the use of (') to quote wild cards: $ A := HELLO $ ECHO 'a' ! 'C' program that calls ``expand()'' hello The easiest way to escape a wild-card may be "'*'". The point is that ``expand()'' will only recognize quotes passed into main(). Note: I have added '\' as an escape character -hdd. ``expand()'' references the VMS runtime routines, you will need to link with the 'C' RTL whenever expand is used. Parameters: argc: Pointer to the number of command arguments (from main), the contents of this parameter are modified. argv: Pointer to the initial command argument list (from main), the contents are copied into a new array which is returned from this routine. flag: Flag indicating how to expand wild-cards: 0 - Complete file name expansion 1 - only file name (no directory or version). 2 - directory info and file name (no version). 3 - file name and version info (no directory). 4 - omit fields that are the same as RMS default. -*/ /* Local prototypes. */ int wild_found (char *string); char **wild_expand (const char *string, char **argv, int *argc, int extra, int flag); /* General note: removing the prototyping and const keywords should allow this code to compile with VMS 'C' compilers prior to version 2.3-024. */ char **expand (int *argc, const char *argv[], const int flag) { int i, nargc; char **nargv; char *s1; /* Get an initial amount of memory for the master nargv array. */ if ((nargv = (char **)malloc ((*argc+1) * sizeof (char *))) == NULL) { fprintf (stderr, "Not enough memory to expand argument list\n"); exit (ErrorExit); } /* Copy the command name (0th argument), but only the name of the exe */ nargv[0] = strchr(argv[0],']'); if (nargv[0] != NULL) { nargv[0]++; if ((s1=strrchr(nargv[0],'.')) != NULL) *s1 = '\0'; } else { nargv[0] = argv[0]; /* if nothing suitable take original */ } /* Copy all other arguments, expanding those that have wild characters. */ for (nargc = i = 1; i < *argc; i++) { if (wild_found(argv[i])) nargv = wild_expand(argv[i], nargv, &nargc, *argc-i, flag); else nargv[nargc++] = argv[i]; } *argc = nargc; nargv[nargc] = NULL; /* realloc always 0 fills, but... */ return nargv; } static int wild_found (char *string) /* Routine to search the given string for a VMS wild-card pattern. Returns 1 if "*", "%", "[-", or "...]" is found. (This may not be all VMS wild-cards but it is enough for now--anyone that wants to recognize others can change this code.) Parameter: string: '\0' terminated character array. */ { int state = 0; /* State of 0 is "rest" state. State 1 on our way to [-, states 2-4 on our way to ...], negative states indicate the two quotes (' -10, " -1). */ for ( ;*string; string++) { switch (*string) { case '*': case '%': if (state >= 0) return 1; /* Unquoted % or * found. */ break; case '[': if (state >= 0) state = 1; break; case ']': if (state == 4) return 1; /* Unquoted ...] found. */ else if (state >= 0) state = 0; break; case '-': if (state == 1) return 1; /* Unquoted [- found. */ else if (state >= 0) state = 0; break; case '.': if (state == 1 || state == 0) state = 2; /* First '.' */ else if (state > 1 && state < 5) state++; /* ... == states 2, 3, 4 */ else if (state >= 0) state = 0; break; case '\'': if (state <= -10) state += 10; /* One ', possibly one " also */ else if (state < 0) state -= 10; /* 0 ', possibly one " */ else state = -10; /* No ' or " prior to this ' */ break; case '"': if (state == -11) state = -10; /* Both " and ' prior to this. */ else if (state == -10) state = -11; /* A ' prior to this. */ else if (state == -1) state = 0; /* A " prior to this. */ else state = -1; /* No ' or " prior to this " */ break; case '\\': string = strcpy(string, string+1); state = 0; break; } } return 0; } static char **wild_expand(const char *wild, char **argv, int *argc, int extra, int flag) /* Routine to expand wild into new arguments appended to the end of argv[*argc]. This routine must realloc in order to make room for the individual arguments and malloc for enough space for each of the arguments. The return value is a new **argv. Parameters: wild: '\0' terminated string that needs to be expanded. argv: initial starting address of the argv array. argc: pointer to an integer that tells the current end of the argument list. extra: The number of extra pointers that the returned argv must have available for future assignments. flag: Flag indicating how to expand wild-card: 0 - Complete file name expansion 1 - only file name (no directory or version). 2 - directory info and file name (no version) 3 - file name and version info (no directory). 4 - omit fields that are the same as RMS default. */ { int more_to_go = 1, err, length, status, len_wild, i, ddev_l, ddir_l; char *namptr; struct FAB fab_blk; struct NAMBLK nam_blk; char path[256]; char *ddevice = &path[0]; /* default device and directory */ char *ddirectory, *ppath; char *env = getenv("PATH"); ppath = &path[0]; while (*env) { char *p = env++; if ((*ppath++ = _toupper(*p)) == ':') { ddev_l = ppath - &path[0]; *ppath++ = 0; ddirectory = ppath; } } *ppath++ = 0; ddir_l = ppath - ddirectory - 1; len_wild = strlen(wild); /* Initialize all the fab and nam fields needed for parse and search */ fab_blk = cc$rms_fab; /* Initialize FAB structure */ nam_blk.nam = cc$rms_nam; /* Initialize NAM structure */ fab_blk.fab$l_dna = ".*"; /* Default file specif. */ fab_blk.fab$b_dns = 2; /* Length of default spec. */ fab_blk.fab$l_nam = &nam_blk.nam; /* Set address of NAM in FAB*/ nam_blk.nam.nam$b_ess = NAM$C_MAXRSS; /* Set extended string size*/ nam_blk.nam.nam$l_esa = nam_blk.es; /* and address */ nam_blk.nam.nam$b_rss = NAM$C_MAXRSS; /* Set resultant string size*/ nam_blk.nam.nam$l_rsa = nam_blk.rs; /* and address */ nam_blk.nam.nam$l_rlf = NULL; /* No related file address */ fab_blk.fab$l_fna = wild; /* Address of file name string */ fab_blk.fab$b_fns = len_wild; /* Length of file name string */ /* Prepare to enter the search loop, parse fab. */ err = SYS$PARSE (&fab_blk); /* Catch the directory not found error and return no files found. */ if (err != RMS$_NORMAL) exit(err); while (more_to_go) { err = SYS$SEARCH (&fab_blk); if (err == RMS$_NMF || err == RMS$_FNF) more_to_go = 0; /* Done, no more files found */ else if (err != RMS$_NORMAL) exit (err); else { /* Count that we now have this many arguments. */ (*argc)++; /* Make sure there is room for a new pointer. */ if ((argv = realloc (argv, (*argc + extra)*sizeof(char *))) == NULL) { fprintf (stderr, "Not enough memory to expand argument list\n"); exit(ErrorExit); } /* Move the right name into the list. */ switch (flag) { case 0: /* Complete file name */ length = nam_blk.nam.nam$b_rsl; namptr = nam_blk.rs; break; case 1: /* File name only (no directory or version). */ length = nam_blk.nam.nam$b_name + nam_blk.nam.nam$b_type; namptr = nam_blk.nam.nam$l_name; break; case 2: /* directory and file name (no version) */ length = nam_blk.nam.nam$b_rsl - nam_blk.nam.nam$b_ver; namptr = nam_blk.rs; break; case 3: /* File name and version (no directory). */ length = nam_blk.nam.nam$b_name + nam_blk.nam.nam$b_type + nam_blk.nam.nam$b_ver; namptr = nam_blk.nam.nam$l_name; break; case 4: /* Remove redundant fields, no version */ length = nam_blk.nam.nam$b_rsl - nam_blk.nam.nam$b_ver; namptr = nam_blk.rs; if ((nam_blk.nam.nam$b_dev==ddev_l) && !strncmp(namptr, ddevice, nam_blk.nam.nam$b_dev)) { length -= nam_blk.nam.nam$b_dev; namptr += nam_blk.nam.nam$b_dev; if ((nam_blk.nam.nam$b_dir==ddir_l) && !strncmp(namptr, ddirectory, nam_blk.nam.nam$b_dir)) { length -= nam_blk.nam.nam$b_dir; namptr += nam_blk.nam.nam$b_dir; } } break; default: fprintf (stderr, "illegal flag used in VMS expand call\n"); exit (ErrorExit); } /* end of switch */ /* Copy the requested string into the argument array. */ if ((argv[*argc-1] = malloc (length+1)) == NULL) { fprintf (stderr, "Not enough memory to expand argument list\n"); exit (ErrorExit); } /* Copy the string, translate to lower case */ /* strncpy (argv[*argc-1], namptr, length); */ for (i=0; i /* here come the 3 lines that make this Unix program into a VMS one: */ #ifdef VMS #include #endif /* This main program allows you to run experiments with redexp.vms. Try $ echo *.*, $ echo -f1 [-...]*.*, $ echo -f[0-3] *.*. Questions about using "%", "\", etc. may be answered by testing with this version of echo. To use this, cut from the "#if 0" above up to the last #endif, and put the text in echo.c. Assuming you have defined VAXC$INCLUDE to also look in the directory where you put redexp.VMS, you should be able to compile and link echo. Define a symbol echo as echo :== $sys$disk:[]echo and you are ready to run. */ main(argc, argv) int argc; char *argv[]; { int i = 0; while (i < argc) { printf("argv[%d]: %s\n", i, argv[i]); i++; } } /* ------------------------ ECHO sample code end --------------------- */ #endif /* if 0 */ jgraph/show.c0000755005471000040510000003276613207316747012326 0ustar plankloci/* show.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/show.c,v $ * $Revision: 8.5 $ * $Date: 2017/11/28 17:33:27 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include "jgraph.h" static void show_mltiline(); void show_string(); void show_label(); void show_lmark(); void show_curve(); void show_axis(); void show_legend(); void show_graph(); void show_graphs(); static void spaces(nsp) int nsp; { while(nsp-- > 0) putchar(' '); } float ptoin(p) float p; { return p / FCPI; } float ptoc(p, a) float p; Axis a; { if (a->is_lg) { return (float) exp((p / a->factor + a->logmin) * a->logfactor); } else { return (p / a->factor) + a->min; } } float ptodist(p, a) float p; Axis a; { if (a->is_lg) { return p / FCPI; } else { return (p / a->factor); } } static void show_mltiline(s) char *s; { int i; if (s != CNULL) { for (i = 0; s[i] != '\0'; i++) { if (s[i] == '\n') putchar('\\'); putchar(s[i]); } } putchar('\n'); } void show_string(s) char *s; { int i; if (s != CNULL) { printf(": "); for (i = 0; s[i] != '\0'; i++) { if (s[i] == '\n') putchar('\\'); if (s[i] == '\\') i++; putchar(s[i]); } } putchar('\n'); } void show_label(l, nsp, g) Label l; int nsp; Graph g; { spaces(nsp); show_string(l->label); spaces(nsp); printf("x %f ", ptoc(l->x, g->x_axis)); printf("y %f\n", ptoc(l->y, g->y_axis)); spaces(nsp); printf("hj%c vj%c ", l->hj, l->vj); printf("rotate %f\n", l->rotate); spaces(nsp); printf("font %s ", l->font); printf("fontsize %f ", l->fontsize); printf("linesep %f\n", l->linesep); if (l->graytype == 'g') { spaces(nsp); printf("lgray %f\n", l->gray[0]); } else if (l->graytype == 'c') { spaces(nsp); printf("lcolor %f %f %f\n", l->gray[0], l->gray[1], l->gray[2]); } return; } void show_lmark(l, nsp, g) Label l; int nsp; Graph g; { spaces(nsp); show_string(l->label); spaces(nsp); printf("x %f ", ptodist(l->x, g->x_axis)); printf("y %f\n", ptodist(l->y, g->y_axis)); spaces(nsp); printf("hj%c vj%c ", l->hj, l->vj); printf("rotate %f\n", l->rotate); spaces(nsp); printf("font %s ", l->font); printf("fontsize %f\n", l->fontsize); return; } void show_curve(c, nsp, g) Curve c; int nsp; Graph g; { Point p; Point px; Point py; int i; Flist fl; if (c->l->label != CNULL) { spaces(nsp); printf("label\n"); spaces(nsp+2); printf("(* unless , this label\'s x\'s and y\'s will be ignored *)\n"); show_label(c->l, nsp+2, g); } px = first(c->xepts); py = first(c->yepts); for(p = first(c->pts); p != nil(c->pts); p = next(p)) { if (p->e == 'p') { spaces(nsp); printf("pts %f %f\n", p->x, p->y); } else if (p->e == 'x') { spaces(nsp); printf("x_epts %f %f %f %f\n", p->x, p->y, px->x, next(px)->x); px = next(next(px)); } else if (p->e == 'y') { spaces(nsp); printf("y_epts %f %f %f %f\n", p->y, p->y, py->y, next(py)->y); py = next(next(py)); } else { fprintf(stderr, "Internal error: p->e == %c\n", p->e); exit(1); } } if (c->eps != CNULL) { spaces(nsp); printf("eps %s\n", c->eps); } if (c->postscript != CNULL) { spaces(nsp); printf("postscript "); if (!c->postfile) printf(": "); show_mltiline(c->postscript); } spaces(nsp); printf("marktype "); for (i = 0; i < NMARKTYPES && c->marktype != MARKTYPES[i]; i++) ; if (i == NMARKTYPES) { error_header(); fprintf(stderr, "Unknown mark type %c\n", c->marktype); exit(1); } else printf("%s ", MARKTYPESTRS[i]); if (c->marktype == 'l') { show_lmark(c->lmark, nsp+2, g); spaces(nsp); } printf("marksize %f %f ", ptodist(c->marksize[0], g->x_axis), ptodist(c->marksize[1], g->y_axis)); printf("mrotate %f ", c->mrotate); if (c->filltype == 'g') { printf("fill %f\n", c->fill[0] ); } else if (c->filltype == 'c') { printf("cfill %f %f %f\n", c->fill[0], c->fill[1], c->fill[2] ); } if (first(c->general_marks) != c->general_marks) { spaces(nsp); printf("gmarks"); for(p = first(c->general_marks); p != nil(c->general_marks); p = next(p)) printf(" %f %f ", p->x, p->y); } printf("\n"); spaces(nsp); if(!c->poly) printf("no"); printf("poly "); if (c->pfilltype == 'g') { printf("pfill %f", c->pfill[0] ); } else if (c->pfilltype == 'c') { printf("pcfill %f %f %f", c->pfill[0], c->pfill[1], c->pfill[2] ); } printf("\n"); spaces(nsp); printf("linetype "); if (c->linetype == '0') printf("none "); else if (c->linetype == 's') printf("solid "); else if (c->linetype == '.') printf("dotted "); else if (c->linetype == '-') printf("dashed "); else if (c->linetype == 'l') printf("longdash "); else if (c->linetype == 'd') printf("dotdash "); else if (c->linetype == 'D') printf("dotdotdash "); else if (c->linetype == '2') printf("dotdotdashdash "); else if (c->linetype == 'g') { printf("general\n"); spaces(nsp+2); printf("glines "); i = 0; for (fl = first(c->gen_linetype); fl != nil(c->gen_linetype); fl = next(fl)) { if (i == 6) { printf("\n"); spaces(nsp + 9); i = 0; } printf("%f ", fl->f); i++; } printf("\n"); spaces(nsp); } printf("linethickness %f\n", c->linethick); spaces(nsp); if (c->graytype == 'g') { printf("gray %f ", c->gray[0]); } else if (c->graytype == 'c') { printf("color %f %f %f ", c->gray[0], c->gray[1], c->gray[2]); } if(!c->clip) printf("no"); printf("clip\n"); spaces(nsp); for (i = 0; i < NPATTERNS && PTYPES[i] != c->pattern; i++) ; printf("pattern %s %f ", PATTERNS[i], c->parg); for (i = 0; i < NPATTERNS && PTYPES[i] != c->ppattern; i++) ; printf("ppattern %s %f ", PATTERNS[i], c->pparg); for (i = 0; i < NPATTERNS && PTYPES[i] != c->apattern; i++) ; printf("apattern %s %f\n", PATTERNS[i], c->aparg); spaces(nsp); if(!c->rarrow) printf("no"); printf("rarrow "); if(!c->larrow) printf("no"); printf("larrow "); if(!c->rarrows) printf("no"); printf("rarrows "); if(!c->larrows) printf("no"); printf("larrows "); if (c->afilltype == 'g') { printf("afill %f\n", c->afill[0] ); } else if (c->afilltype == 'c') { printf("acfill %f %f %f\n", c->afill[0], c->afill[1], c->afill[2] ); } spaces(nsp); if(!c->bezier) printf("no"); printf("bezier "); printf("asize %f %f\n", ptodist(c->asize[0], g->x_axis), ptodist(c->asize[1], g->y_axis) * 2.0); } void show_axis(a, nsp, g) Axis a; int nsp; Graph g; { Axis other; Hash h; String s; if (a->is_x) other = g->y_axis; else other = g->x_axis; spaces(nsp); printf("size %f\n", a->size); spaces(nsp); printf("min %f max %f %s\n", a->min, a->max, (a->is_lg) ? "log" : "linear"); if (!(a->draw_hash_labels || a->draw_axis_line || a->draw_hash_marks || a->draw_axis_label)) { spaces(nsp); printf("nodraw\n"); return; } spaces(nsp); printf("draw_at %f\n", ptoc(a->draw_at, other)); if (a->label->label != CNULL) { spaces(nsp); printf("label\n"); show_label(a->label, nsp+2, g); } spaces(nsp); printf("%sdraw_hash_labels\n", (a->draw_hash_labels) ? "" : "no_"); spaces(nsp); printf("%sdraw_axis_line\n", (a->draw_axis_line) ? "" : "no_"); spaces(nsp); printf("%sdraw_hash_marks\n", (a->draw_hash_marks) ? "" : "no_"); spaces(nsp); printf("%sgrid_lines\n", (a->grid_lines) ? "" : "no_"); spaces(nsp); printf("%smgrid_lines\n", (a->mgrid_lines) ? "" : "no_"); spaces(nsp); printf("%sdraw_axis_label\n", (a->draw_axis_label) ? "" : "no_"); spaces(nsp); if (a->graytype == 'g') { printf("gray %f\n", a->gray[0]); } else if (a->graytype == 'c') { printf("color %f %f %f\n", a->gray[0], a->gray[1], a->gray[2]); } spaces(nsp); if (a->gr_graytype == 'g') { printf("gr_gray %f ", a->gr_gray[0]); } else if (a->gr_graytype == 'c') { printf("color %f %f %f ", a->gr_gray[0], a->gr_gray[1], a->gr_gray[2]); } if (a->mgr_graytype == 'g') { printf("mgr_gray %f\n", a->mgr_gray[0]); } else if (a->mgr_graytype == 'c') { printf("color %f %f %f\n", a->mgr_gray[0], a->mgr_gray[1], a->mgr_gray[2]); } spaces(nsp); printf("(* The real settings for generating auto_hash_labels:\n"); spaces(nsp+5); printf("%sauto_hash_marks ", (a->auto_hash_marks) ? "" : "no_"); printf("%sauto_hash_labels\n", (a->auto_hash_labels) ? "" : "no_"); spaces(nsp+5); printf("hash %f shash %f mhash %d hash_format %c\n", a->hash_interval, a->hash_start, a->minor_hashes, a->hash_format); spaces(nsp+5); if (a->is_lg) { printf("log_base %f ", a->log_base); } printf("hash_scale %f ", a->hash_scale); printf("precision %d\n", a->precision); spaces(nsp+3); printf("The following are explicit and implicit hash marks and labels *)\n"); spaces(nsp); printf("hash 0 draw_hash_marks_at %f draw_hash_labels_at %f\n", ptoc(a->draw_hash_marks_at, other), ptoc(a->draw_hash_labels_at, other)); spaces(nsp); printf("hash_labels (* The :, x, and y values are ignored *)\n"); show_label(a->hl, nsp + 2, g); for (h = first(a->hash_lines); h != nil(a->hash_lines); h = next(h)) { spaces(nsp); printf("%s %f\n", ((h->size == HASH_SIZE) ? "hash_at" : "mhash_at"), ptoc(h->loc, a)); } for (s = first(a->hash_labels); s != nil(a->hash_labels); s = next(s)) { spaces(nsp); printf("hash_label at %f ", ptoc(s->s->x, a)); show_string(s->s->label); } } void show_legend(l, nsp, g) Legend l; int nsp; Graph g; { if (l->type == 'c') { spaces(nsp); printf("custom\n"); } else if (l->type == 'n') { spaces(nsp); printf("off\n"); } spaces(nsp); printf("linelength %f linebreak %f midspace %f\n", ptodist(l->linelength, g->x_axis), ptodist(l->linebreak, g->y_axis), ptodist(l->midspace, g->x_axis)); if (l->type == 'u') { spaces(nsp); printf("defaults"); show_label(l->l, nsp+2, g); } } void show_graph(g, nsp) Graph g; int nsp; { Curve c; String s; spaces(nsp); printf("x_translate %f y_translate %f\n", ptoin(g->x_translate), ptoin(g->y_translate)); spaces(nsp); printf("xaxis\n"); show_axis(g->x_axis, nsp+2, g); spaces(nsp); printf("yaxis\n"); show_axis(g->y_axis, nsp+2, g); spaces(nsp); if(!g->clip) printf("no"); printf("clip "); if(!g->border) printf("no"); printf("border\n"); for (c = first(g->curves); c != nil(g->curves); c = next(c)) { spaces(nsp); printf("curve %d\n", c->num); show_curve(c, nsp+2, g); } spaces(nsp); printf("legend\n"); show_legend(g->legend, nsp+2, g); if (g->title->label != CNULL) { spaces(nsp); printf("title\n"); show_label(g->title, nsp+2, g); } for (s = first(g->strings); s != nil(g->strings); s = next(s)) { spaces(nsp); printf("string %d\n", s->num); show_label(s->s, nsp+2, g); } } void show_graphs(gs) Graphs gs; { Graphs the_g; Graph g; char started; int i; started = 0; for (the_g = first(gs); the_g != nil(gs); the_g = next(the_g)) { if (started) printf("\nnewpage\n"); started = 1; printf("X %f Y %f\n", ptoin(the_g->width), ptoin(the_g->height)); if (the_g->preamble != CNULL) { printf("preamble "); if (!the_g->prefile) printf(": "); show_mltiline(the_g->preamble); } if (the_g->epilogue != CNULL) { printf("epilogue "); if (!the_g->epifile) printf(": "); show_mltiline(the_g->epilogue); } printf("bbox"); for (i = 0; i < 4; i++) printf(" %d", the_g->bb[i]); printf("\n"); for (g = first(the_g->g); g != nil(the_g->g); g = next(g)) { printf("graph %d\n", g->num); show_graph(g, 2); } } } jgraph/sin.c0000755005471000040510000000021711447702136012114 0ustar plankloci#include main() { double x; for (x = -10.0; x < 10.0; x += .03) printf("%f %f\n", x, sin(x)); } jgraph/sin.jgr0000777005471000040510000000101311447702136012453 0ustar plankloci(* This is a file to draw sin(i) for i going from -10 to 10. The actual * points were created by a c program which is included below. *) newgraph yaxis min -1 max 1 label : sin(i) xaxis min -10 max 10 label : i (* Plot the sin curve *) curve 1 marktype none linetype solid pts shell : ./sin (* sin is the executable of the following c program: #include main(); { double x; for (x = -10.0; x < 10.0; x += .03) printf("%f %f\n", x, sin(x)); } *) jgraph/sin.pts0000777005471000040510000003060111447702136012504 0ustar plankloci-10.000000 0.544021 -9.970000 0.518608 -9.940000 0.492728 -9.910000 0.466405 -9.880000 0.439662 -9.850000 0.412523 -9.820000 0.385013 -9.790000 0.357157 -9.760000 0.328979 -9.730000 0.300505 -9.700000 0.271761 -9.670000 0.242772 -9.640000 0.213564 -9.610000 0.184165 -9.580000 0.154599 -9.550000 0.124895 -9.520000 0.095078 -9.490000 0.065176 -9.460000 0.035215 -9.430000 0.005222 -9.400000 -0.024775 -9.370000 -0.054751 -9.340000 -0.084676 -9.310000 -0.114526 -9.280000 -0.144273 -9.250000 -0.173889 -9.220000 -0.203350 -9.190000 -0.232627 -9.160000 -0.261695 -9.130000 -0.290527 -9.100000 -0.319098 -9.070000 -0.347382 -9.040000 -0.375353 -9.010000 -0.402987 -8.980000 -0.430257 -8.950000 -0.457141 -8.920000 -0.483613 -8.890000 -0.509650 -8.860000 -0.535228 -8.830000 -0.560325 -8.800000 -0.584917 -8.770000 -0.608983 -8.740000 -0.632501 -8.710000 -0.655450 -8.680000 -0.677809 -8.650000 -0.699557 -8.620000 -0.720677 -8.590000 -0.741147 -8.560000 -0.760951 -8.530000 -0.780070 -8.500000 -0.798487 -8.470000 -0.816185 -8.440000 -0.833149 -8.410000 -0.849363 -8.380000 -0.864813 -8.350000 -0.879484 -8.320000 -0.893364 -8.290000 -0.906440 -8.260000 -0.918701 -8.230000 -0.930134 -8.200000 -0.940731 -8.170000 -0.950480 -8.140000 -0.959375 -8.110000 -0.967406 -8.080000 -0.974566 -8.050000 -0.980850 -8.020000 -0.986251 -7.990000 -0.990764 -7.960000 -0.994385 -7.930000 -0.997112 -7.900000 -0.998941 -7.870000 -0.999872 -7.840000 -0.999902 -7.810000 -0.999033 -7.780000 -0.997265 -7.750000 -0.994599 -7.720000 -0.991038 -7.690000 -0.986585 -7.660000 -0.981244 -7.630000 -0.975021 -7.600000 -0.967920 -7.570000 -0.959947 -7.540000 -0.951111 -7.510000 -0.941419 -7.480000 -0.930880 -7.450000 -0.919503 -7.420000 -0.907299 -7.390000 -0.894278 -7.360000 -0.880452 -7.330000 -0.865834 -7.300000 -0.850437 -7.270000 -0.834274 -7.240000 -0.817361 -7.210000 -0.799712 -7.180000 -0.781343 -7.150000 -0.762271 -7.120000 -0.742513 -7.090000 -0.722087 -7.060000 -0.701011 -7.030000 -0.679305 -7.000000 -0.656987 -6.970000 -0.634077 -6.940000 -0.610597 -6.910000 -0.586568 -6.880000 -0.562011 -6.850000 -0.536948 -6.820000 -0.511401 -6.790000 -0.485395 -6.760000 -0.458951 -6.730000 -0.432095 -6.700000 -0.404850 -6.670000 -0.377240 -6.640000 -0.349291 -6.610000 -0.321028 -6.580000 -0.292476 -6.550000 -0.263660 -6.520000 -0.234607 -6.490000 -0.205344 -6.460000 -0.175895 -6.430000 -0.146288 -6.400000 -0.116549 -6.370000 -0.086706 -6.340000 -0.056784 -6.310000 -0.026811 -6.280000 0.003185 -6.250000 0.033179 -6.220000 0.063143 -6.190000 0.093051 -6.160000 0.122874 -6.130000 0.152587 -6.100000 0.182163 -6.070000 0.211574 -6.040000 0.240795 -6.010000 0.269800 -5.980000 0.298562 -5.950000 0.327055 -5.920000 0.355254 -5.890000 0.383133 -5.860000 0.410667 -5.830000 0.437832 -5.800000 0.464602 -5.770000 0.490955 -5.740000 0.516865 -5.710000 0.542311 -5.680000 0.567269 -5.650000 0.591716 -5.620000 0.615630 -5.590000 0.638991 -5.560000 0.661776 -5.530000 0.683966 -5.500000 0.705540 -5.470000 0.726480 -5.440000 0.746765 -5.410000 0.766379 -5.380000 0.785303 -5.350000 0.803520 -5.320000 0.821014 -5.290000 0.837769 -5.260000 0.853771 -5.230000 0.869004 -5.200000 0.883455 -5.170000 0.897111 -5.140000 0.909959 -5.110000 0.921989 -5.080000 0.933189 -5.050000 0.943549 -5.020000 0.953060 -4.990000 0.961713 -4.960000 0.969501 -4.930000 0.976416 -4.900000 0.982453 -4.870000 0.987605 -4.840000 0.991869 -4.810000 0.995240 -4.780000 0.997715 -4.750000 0.999293 -4.720000 0.999971 -4.690000 0.999749 -4.660000 0.998628 -4.630000 0.996608 -4.600000 0.993691 -4.570000 0.989880 -4.540000 0.985178 -4.510000 0.979589 -4.480000 0.973119 -4.450000 0.965773 -4.420000 0.957558 -4.390000 0.948481 -4.360000 0.938551 -4.330000 0.927776 -4.300000 0.916166 -4.270000 0.903732 -4.240000 0.890484 -4.210000 0.876435 -4.180000 0.861597 -4.150000 0.845984 -4.120000 0.829609 -4.090000 0.812488 -4.060000 0.794636 -4.030000 0.776068 -4.000000 0.756802 -3.970000 0.736856 -3.940000 0.716246 -3.910000 0.694991 -3.880000 0.673111 -3.850000 0.650625 -3.820000 0.627554 -3.790000 0.603918 -3.760000 0.579738 -3.730000 0.555037 -3.700000 0.529836 -3.670000 0.504159 -3.640000 0.478027 -3.610000 0.451466 -3.580000 0.424498 -3.550000 0.397148 -3.520000 0.369441 -3.490000 0.341401 -3.460000 0.313054 -3.430000 0.284426 -3.400000 0.255541 -3.370000 0.226427 -3.340000 0.197108 -3.310000 0.167612 -3.280000 0.137966 -3.250000 0.108195 -3.220000 0.078327 -3.190000 0.048388 -3.160000 0.018406 -3.130000 -0.011592 -3.100000 -0.041581 -3.070000 -0.071532 -3.040000 -0.101418 -3.010000 -0.131213 -2.980000 -0.160890 -2.950000 -0.190423 -2.920000 -0.219784 -2.890000 -0.248947 -2.860000 -0.277886 -2.830000 -0.306575 -2.800000 -0.334988 -2.770000 -0.363100 -2.740000 -0.390885 -2.710000 -0.418318 -2.680000 -0.445375 -2.650000 -0.472031 -2.620000 -0.498262 -2.590000 -0.524044 -2.560000 -0.549355 -2.530000 -0.574172 -2.500000 -0.598472 -2.470000 -0.622234 -2.440000 -0.645435 -2.410000 -0.668056 -2.380000 -0.690075 -2.350000 -0.711473 -2.320000 -0.732231 -2.290000 -0.752331 -2.260000 -0.771753 -2.230000 -0.790480 -2.200000 -0.808496 -2.170000 -0.825785 -2.140000 -0.842330 -2.110000 -0.858118 -2.080000 -0.873133 -2.050000 -0.887362 -2.020000 -0.900793 -1.990000 -0.913413 -1.960000 -0.925212 -1.930000 -0.936177 -1.900000 -0.946300 -1.870000 -0.955572 -1.840000 -0.963983 -1.810000 -0.971527 -1.780000 -0.978197 -1.750000 -0.983986 -1.720000 -0.988890 -1.690000 -0.992904 -1.660000 -0.996024 -1.630000 -0.998248 -1.600000 -0.999574 -1.570000 -1.000000 -1.540000 -0.999526 -1.510000 -0.998152 -1.480000 -0.995881 -1.450000 -0.992713 -1.420000 -0.988652 -1.390000 -0.983701 -1.360000 -0.977865 -1.330000 -0.971148 -1.300000 -0.963558 -1.270000 -0.955101 -1.240000 -0.945784 -1.210000 -0.935616 -1.180000 -0.924606 -1.150000 -0.912764 -1.120000 -0.900100 -1.090000 -0.886627 -1.060000 -0.872355 -1.030000 -0.857299 -1.000000 -0.841471 -0.970000 -0.824886 -0.940000 -0.807558 -0.910000 -0.789504 -0.880000 -0.770739 -0.850000 -0.751280 -0.820000 -0.731146 -0.790000 -0.710353 -0.760000 -0.688921 -0.730000 -0.666870 -0.700000 -0.644218 -0.670000 -0.620986 -0.640000 -0.597195 -0.610000 -0.572867 -0.580000 -0.548024 -0.550000 -0.522687 -0.520000 -0.496880 -0.490000 -0.470626 -0.460000 -0.443948 -0.430000 -0.416871 -0.400000 -0.389418 -0.370000 -0.361615 -0.340000 -0.333487 -0.310000 -0.305059 -0.280000 -0.276356 -0.250000 -0.247404 -0.220000 -0.218230 -0.190000 -0.188859 -0.160000 -0.159318 -0.130000 -0.129634 -0.100000 -0.099833 -0.070000 -0.069943 -0.040000 -0.039989 -0.010000 -0.010000 0.020000 0.019999 0.050000 0.049979 0.080000 0.079915 0.110000 0.109778 0.140000 0.139543 0.170000 0.169182 0.200000 0.198669 0.230000 0.227978 0.260000 0.257081 0.290000 0.285952 0.320000 0.314567 0.350000 0.342898 0.380000 0.370920 0.410000 0.398609 0.440000 0.425939 0.470000 0.452886 0.500000 0.479426 0.530000 0.505533 0.560000 0.531186 0.590000 0.556361 0.620000 0.581035 0.650000 0.605186 0.680000 0.628793 0.710000 0.651834 0.740000 0.674288 0.770000 0.696135 0.800000 0.717356 0.830000 0.737931 0.860000 0.757843 0.890000 0.777072 0.920000 0.795602 0.950000 0.813416 0.980000 0.830497 1.010000 0.846832 1.040000 0.862404 1.070000 0.877201 1.100000 0.891207 1.130000 0.904412 1.160000 0.916803 1.190000 0.928369 1.220000 0.939099 1.250000 0.948985 1.280000 0.958016 1.310000 0.966185 1.340000 0.973485 1.370000 0.979908 1.400000 0.985450 1.430000 0.990105 1.460000 0.993868 1.490000 0.996738 1.520000 0.998710 1.550000 0.999784 1.580000 0.999958 1.610000 0.999232 1.640000 0.997606 1.670000 0.995083 1.700000 0.991665 1.730000 0.987354 1.760000 0.982154 1.790000 0.976071 1.820000 0.969109 1.850000 0.961275 1.880000 0.952576 1.910000 0.943020 1.940000 0.932615 1.970000 0.921371 2.000000 0.909297 2.030000 0.896406 2.060000 0.882707 2.090000 0.868215 2.120000 0.852940 2.150000 0.836899 2.180000 0.820104 2.210000 0.802571 2.240000 0.784316 2.270000 0.765355 2.300000 0.745705 2.330000 0.725384 2.360000 0.704411 2.390000 0.682803 2.420000 0.660581 2.450000 0.637765 2.480000 0.614374 2.510000 0.590431 2.540000 0.565956 2.570000 0.540972 2.600000 0.515501 2.630000 0.489567 2.660000 0.463191 2.690000 0.436399 2.720000 0.409214 2.750000 0.381661 2.780000 0.353764 2.810000 0.325549 2.840000 0.297041 2.870000 0.268266 2.900000 0.239249 2.930000 0.210017 2.960000 0.180596 2.990000 0.151013 3.020000 0.121293 3.050000 0.091465 3.080000 0.061554 3.110000 0.031587 3.140000 0.001593 3.170000 -0.028404 3.200000 -0.058374 3.230000 -0.088292 3.260000 -0.118131 3.290000 -0.147863 3.320000 -0.177462 3.350000 -0.206902 3.380000 -0.236155 3.410000 -0.265196 3.440000 -0.293998 3.470000 -0.322536 3.500000 -0.350783 3.530000 -0.378715 3.560000 -0.406306 3.590000 -0.433531 3.620000 -0.460366 3.650000 -0.486787 3.680000 -0.512769 3.710000 -0.538291 3.740000 -0.563327 3.770000 -0.587857 3.800000 -0.611858 3.830000 -0.635308 3.860000 -0.658186 3.890000 -0.680473 3.920000 -0.702146 3.950000 -0.723188 3.980000 -0.743579 4.010000 -0.763301 4.040000 -0.782336 4.070000 -0.800667 4.100000 -0.818277 4.130000 -0.835151 4.160000 -0.851273 4.190000 -0.866630 4.220000 -0.881206 4.250000 -0.894989 4.280000 -0.907967 4.310000 -0.920128 4.340000 -0.931461 4.370000 -0.941955 4.400000 -0.951602 4.430000 -0.960392 4.460000 -0.968319 4.490000 -0.975373 4.520000 -0.981550 4.550000 -0.986844 4.580000 -0.991249 4.610000 -0.994763 4.640000 -0.997381 4.670000 -0.999102 4.700000 -0.999923 4.730000 -0.999845 4.760000 -0.998867 4.790000 -0.996990 4.820000 -0.994216 4.850000 -0.990547 4.880000 -0.985986 4.910000 -0.980538 4.940000 -0.974208 4.970000 -0.967001 5.000000 -0.958924 5.030000 -0.949984 5.060000 -0.940189 5.090000 -0.929548 5.120000 -0.918070 5.150000 -0.905767 5.180000 -0.892648 5.210000 -0.878725 5.240000 -0.864012 5.270000 -0.848522 5.300000 -0.832267 5.330000 -0.815264 5.360000 -0.797527 5.390000 -0.779073 5.420000 -0.759917 5.450000 -0.740077 5.480000 -0.719572 5.510000 -0.698418 5.540000 -0.676637 5.570000 -0.654246 5.600000 -0.631267 5.630000 -0.607719 5.660000 -0.583625 5.690000 -0.559005 5.720000 -0.533882 5.750000 -0.508279 5.780000 -0.482218 5.810000 -0.455724 5.840000 -0.428819 5.870000 -0.401529 5.900000 -0.373877 5.930000 -0.345888 5.960000 -0.317589 5.990000 -0.289003 6.020000 -0.260157 6.050000 -0.231078 6.080000 -0.201790 6.110000 -0.172321 6.140000 -0.142697 6.170000 -0.112944 6.200000 -0.083089 6.230000 -0.053160 6.260000 -0.023183 6.290000 0.006815 6.320000 0.036806 6.350000 0.066765 6.380000 0.096664 6.410000 0.126475 6.440000 0.156173 6.470000 0.185730 6.500000 0.215120 6.530000 0.244316 6.560000 0.273293 6.590000 0.302024 6.620000 0.330482 6.650000 0.358644 6.680000 0.386483 6.710000 0.413973 6.740000 0.441092 6.770000 0.467813 6.800000 0.494113 6.830000 0.519969 6.860000 0.545357 6.890000 0.570254 6.920000 0.594637 6.950000 0.618486 6.980000 0.641778 7.010000 0.664493 7.040000 0.686609 7.070000 0.708108 7.100000 0.728969 7.130000 0.749174 7.160000 0.768705 7.190000 0.787545 7.220000 0.805675 7.250000 0.823081 7.280000 0.839746 7.310000 0.855655 7.340000 0.870794 7.370000 0.885149 7.400000 0.898708 7.430000 0.911458 7.460000 0.923388 7.490000 0.934487 7.520000 0.944745 7.550000 0.954152 7.580000 0.962701 7.610000 0.970384 7.640000 0.977193 7.670000 0.983123 7.700000 0.988168 7.730000 0.992324 7.760000 0.995587 7.790000 0.997954 7.820000 0.999423 7.850000 0.999992 7.880000 0.999662 7.910000 0.998431 7.940000 0.996303 7.970000 0.993277 8.000000 0.989358 8.030000 0.984549 8.060000 0.978853 8.090000 0.972277 8.120000 0.964825 8.150000 0.956506 8.180000 0.947325 8.210000 0.937292 8.240000 0.926415 8.270000 0.914705 8.300000 0.902172 8.330000 0.888827 8.360000 0.874681 8.390000 0.859749 8.420000 0.844043 8.450000 0.827577 8.480000 0.810367 8.510000 0.792427 8.540000 0.773774 8.570000 0.754425 8.600000 0.734397 8.630000 0.713708 8.660000 0.692377 8.690000 0.670422 8.720000 0.647865 8.750000 0.624724 8.780000 0.601021 8.810000 0.576777 8.840000 0.552014 8.870000 0.526755 8.900000 0.501021 8.930000 0.474836 8.960000 0.448224 8.990000 0.421209 9.020000 0.393815 9.050000 0.366066 9.080000 0.337988 9.110000 0.309605 9.140000 0.280944 9.170000 0.252031 9.200000 0.222890 9.230000 0.193549 9.260000 0.164033 9.290000 0.134370 9.320000 0.104586 9.350000 0.074708 9.380000 0.044763 9.410000 0.014777 9.440000 -0.015221 9.470000 -0.045207 9.500000 -0.075151 9.530000 -0.105028 9.560000 -0.134810 9.590000 -0.164471 9.620000 -0.193984 9.650000 -0.223323 9.680000 -0.252460 9.710000 -0.281371 9.740000 -0.310028 9.770000 -0.338406 9.800000 -0.366479 9.830000 -0.394223 9.860000 -0.421612 9.890000 -0.448621 9.920000 -0.475227 9.950000 -0.501405 9.980000 -0.527132 jgraph/sin1.jgr0000777005471000040510000000215511447702136012544 0ustar plankloci(* This is an extension of sin.jgr only this time, the axes are at x = 0 and y = 0. The hash labels are printed at the left and bottom. *) newgraph yaxis min -1 max 1 label : sin(i) no_draw_hash_marks no_draw_axis_line xaxis min -10 max 10 label : i no_draw_hash_marks no_draw_axis_line (* Plot the sin curve *) curve 1 marktype none linetype solid pts include sin.pts (* sin.pts was created by the following c program: #include main(); { double x; for (x = -10.0; x < 10.0; x += .03) printf("%f %f\n", x, sin(x)); } *) (* Now, create a new graph with the same dimensions, but with the * x & y axes in a different place, and with no axis or hash labels. * Also, make the hash marks smaller. *) newgraph inherit_axes xaxis draw draw_at 0 hash_scale -.5 no_draw_hash_labels no_draw_axis_label yaxis draw draw_at 0 hash_scale -.5 no_draw_hash_labels no_draw_axis_label (* Finally, we want the hash marks to be centered around the axes, * so draw them again with a scaling of +5. *) newgraph inherit_axes xaxis hash_scale .5 yaxis hash_scale .5 jgraph/sin2.c0000755005471000040510000000021611447702136012175 0ustar plankloci#include main() { double x; for (x = 0.1; x < 100.0; x += .03) printf("%f %f\n", x, sin(x)); } jgraph/sin2.jgr0000777005471000040510000000072511447702136012546 0ustar plankloci(* Now this is a sin wave from 0.1 to 100 with logarithmic axes *) newgraph yaxis min -1 max 1 label : sin(i) xaxis log label : i title : I vs sin(i); (* Plot the sin curve *) curve 1 marktype none linetype solid pts include sin2.pts (* sin2.pts was created by the following c program: #include main(); { double x; for (x = 0.1; x < 100.0; x += .03) printf("%f %f\n", x, sin(x)); } *) jgraph/sin2.pts0000777005471000040510000017612511447702136012602 0ustar plankloci0.100000 0.099833 0.130000 0.129634 0.160000 0.159318 0.190000 0.188859 0.220000 0.218230 0.250000 0.247404 0.280000 0.276356 0.310000 0.305059 0.340000 0.333487 0.370000 0.361615 0.400000 0.389418 0.430000 0.416871 0.460000 0.443948 0.490000 0.470626 0.520000 0.496880 0.550000 0.522687 0.580000 0.548024 0.610000 0.572867 0.640000 0.597195 0.670000 0.620986 0.700000 0.644218 0.730000 0.666870 0.760000 0.688921 0.790000 0.710353 0.820000 0.731146 0.850000 0.751280 0.880000 0.770739 0.910000 0.789504 0.940000 0.807558 0.970000 0.824886 1.000000 0.841471 1.030000 0.857299 1.060000 0.872355 1.090000 0.886627 1.120000 0.900100 1.150000 0.912764 1.180000 0.924606 1.210000 0.935616 1.240000 0.945784 1.270000 0.955101 1.300000 0.963558 1.330000 0.971148 1.360000 0.977865 1.390000 0.983701 1.420000 0.988652 1.450000 0.992713 1.480000 0.995881 1.510000 0.998152 1.540000 0.999526 1.570000 1.000000 1.600000 0.999574 1.630000 0.998248 1.660000 0.996024 1.690000 0.992904 1.720000 0.988890 1.750000 0.983986 1.780000 0.978197 1.810000 0.971527 1.840000 0.963983 1.870000 0.955572 1.900000 0.946300 1.930000 0.936177 1.960000 0.925212 1.990000 0.913413 2.020000 0.900793 2.050000 0.887362 2.080000 0.873133 2.110000 0.858118 2.140000 0.842330 2.170000 0.825785 2.200000 0.808496 2.230000 0.790480 2.260000 0.771753 2.290000 0.752331 2.320000 0.732231 2.350000 0.711473 2.380000 0.690075 2.410000 0.668056 2.440000 0.645435 2.470000 0.622234 2.500000 0.598472 2.530000 0.574172 2.560000 0.549355 2.590000 0.524044 2.620000 0.498262 2.650000 0.472031 2.680000 0.445375 2.710000 0.418318 2.740000 0.390885 2.770000 0.363100 2.800000 0.334988 2.830000 0.306575 2.860000 0.277886 2.890000 0.248947 2.920000 0.219784 2.950000 0.190423 2.980000 0.160890 3.010000 0.131213 3.040000 0.101418 3.070000 0.071532 3.100000 0.041581 3.130000 0.011592 3.160000 -0.018406 3.190000 -0.048388 3.220000 -0.078327 3.250000 -0.108195 3.280000 -0.137966 3.310000 -0.167612 3.340000 -0.197108 3.370000 -0.226427 3.400000 -0.255541 3.430000 -0.284426 3.460000 -0.313054 3.490000 -0.341401 3.520000 -0.369441 3.550000 -0.397148 3.580000 -0.424498 3.610000 -0.451466 3.640000 -0.478027 3.670000 -0.504159 3.700000 -0.529836 3.730000 -0.555037 3.760000 -0.579738 3.790000 -0.603918 3.820000 -0.627554 3.850000 -0.650625 3.880000 -0.673111 3.910000 -0.694991 3.940000 -0.716246 3.970000 -0.736856 4.000000 -0.756802 4.030000 -0.776068 4.060000 -0.794636 4.090000 -0.812488 4.120000 -0.829609 4.150000 -0.845984 4.180000 -0.861597 4.210000 -0.876435 4.240000 -0.890484 4.270000 -0.903732 4.300000 -0.916166 4.330000 -0.927776 4.360000 -0.938551 4.390000 -0.948481 4.420000 -0.957558 4.450000 -0.965773 4.480000 -0.973119 4.510000 -0.979589 4.540000 -0.985178 4.570000 -0.989880 4.600000 -0.993691 4.630000 -0.996608 4.660000 -0.998628 4.690000 -0.999749 4.720000 -0.999971 4.750000 -0.999293 4.780000 -0.997715 4.810000 -0.995240 4.840000 -0.991869 4.870000 -0.987605 4.900000 -0.982453 4.930000 -0.976416 4.960000 -0.969501 4.990000 -0.961713 5.020000 -0.953060 5.050000 -0.943549 5.080000 -0.933189 5.110000 -0.921989 5.140000 -0.909959 5.170000 -0.897111 5.200000 -0.883455 5.230000 -0.869004 5.260000 -0.853771 5.290000 -0.837769 5.320000 -0.821014 5.350000 -0.803520 5.380000 -0.785303 5.410000 -0.766379 5.440000 -0.746765 5.470000 -0.726480 5.500000 -0.705540 5.530000 -0.683966 5.560000 -0.661776 5.590000 -0.638991 5.620000 -0.615630 5.650000 -0.591716 5.680000 -0.567269 5.710000 -0.542311 5.740000 -0.516865 5.770000 -0.490955 5.800000 -0.464602 5.830000 -0.437832 5.860000 -0.410667 5.890000 -0.383133 5.920000 -0.355254 5.950000 -0.327055 5.980000 -0.298562 6.010000 -0.269800 6.040000 -0.240795 6.070000 -0.211574 6.100000 -0.182163 6.130000 -0.152587 6.160000 -0.122874 6.190000 -0.093051 6.220000 -0.063143 6.250000 -0.033179 6.280000 -0.003185 6.310000 0.026811 6.340000 0.056784 6.370000 0.086706 6.400000 0.116549 6.430000 0.146288 6.460000 0.175895 6.490000 0.205344 6.520000 0.234607 6.550000 0.263660 6.580000 0.292476 6.610000 0.321028 6.640000 0.349291 6.670000 0.377240 6.700000 0.404850 6.730000 0.432095 6.760000 0.458951 6.790000 0.485395 6.820000 0.511401 6.850000 0.536948 6.880000 0.562011 6.910000 0.586568 6.940000 0.610597 6.970000 0.634077 7.000000 0.656987 7.030000 0.679305 7.060000 0.701011 7.090000 0.722087 7.120000 0.742513 7.150000 0.762271 7.180000 0.781343 7.210000 0.799712 7.240000 0.817361 7.270000 0.834274 7.300000 0.850437 7.330000 0.865834 7.360000 0.880452 7.390000 0.894278 7.420000 0.907299 7.450000 0.919503 7.480000 0.930880 7.510000 0.941419 7.540000 0.951111 7.570000 0.959947 7.600000 0.967920 7.630000 0.975021 7.660000 0.981244 7.690000 0.986585 7.720000 0.991038 7.750000 0.994599 7.780000 0.997265 7.810000 0.999033 7.840000 0.999902 7.870000 0.999872 7.900000 0.998941 7.930000 0.997112 7.960000 0.994385 7.990000 0.990764 8.020000 0.986251 8.050000 0.980850 8.080000 0.974566 8.110000 0.967406 8.140000 0.959375 8.170000 0.950480 8.200000 0.940731 8.230000 0.930134 8.260000 0.918701 8.290000 0.906440 8.320000 0.893364 8.350000 0.879484 8.380000 0.864813 8.410000 0.849363 8.440000 0.833149 8.470000 0.816185 8.500000 0.798487 8.530000 0.780070 8.560000 0.760951 8.590000 0.741147 8.620000 0.720677 8.650000 0.699557 8.680000 0.677809 8.710000 0.655450 8.740000 0.632501 8.770000 0.608983 8.800000 0.584917 8.830000 0.560325 8.860000 0.535228 8.890000 0.509650 8.920000 0.483613 8.950000 0.457141 8.980000 0.430257 9.010000 0.402987 9.040000 0.375353 9.070000 0.347382 9.100000 0.319098 9.130000 0.290527 9.160000 0.261695 9.190000 0.232627 9.220000 0.203350 9.250000 0.173889 9.280000 0.144273 9.310000 0.114526 9.340000 0.084676 9.370000 0.054751 9.400000 0.024775 9.430000 -0.005222 9.460000 -0.035215 9.490000 -0.065176 9.520000 -0.095078 9.550000 -0.124895 9.580000 -0.154599 9.610000 -0.184165 9.640000 -0.213564 9.670000 -0.242772 9.700000 -0.271761 9.730000 -0.300505 9.760000 -0.328979 9.790000 -0.357157 9.820000 -0.385013 9.850000 -0.412523 9.880000 -0.439662 9.910000 -0.466405 9.940000 -0.492728 9.970000 -0.518608 10.000000 -0.544021 10.030000 -0.568945 10.060000 -0.593356 10.090000 -0.617234 10.120000 -0.640556 10.150000 -0.663302 10.180000 -0.685450 10.210000 -0.706982 10.240000 -0.727878 10.270000 -0.748118 10.300000 -0.767686 10.330000 -0.786562 10.360000 -0.804731 10.390000 -0.822175 10.420000 -0.838880 10.450000 -0.854829 10.480000 -0.870010 10.510000 -0.884407 10.540000 -0.898009 10.570000 -0.910802 10.600000 -0.922775 10.630000 -0.933919 10.660000 -0.944221 10.690000 -0.953674 10.720000 -0.962269 10.750000 -0.969998 10.780000 -0.976854 10.810000 -0.982830 10.840000 -0.987923 10.870000 -0.992126 10.900000 -0.995436 10.930000 -0.997851 10.960000 -0.999367 10.990000 -0.999984 11.020000 -0.999702 11.050000 -0.998519 11.080000 -0.996438 11.110000 -0.993461 11.140000 -0.989589 11.170000 -0.984826 11.200000 -0.979178 11.230000 -0.972648 11.260000 -0.965243 11.290000 -0.956969 11.320000 -0.947834 11.350000 -0.937846 11.380000 -0.927014 11.410000 -0.915348 11.440000 -0.902858 11.470000 -0.889555 11.500000 -0.875452 11.530000 -0.860561 11.560000 -0.844896 11.590000 -0.828470 11.620000 -0.811299 11.650000 -0.793398 11.680000 -0.774782 11.710000 -0.755470 11.740000 -0.735477 11.770000 -0.714823 11.800000 -0.693525 11.830000 -0.671603 11.860000 -0.649077 11.890000 -0.625967 11.920000 -0.602293 11.950000 -0.578077 11.980000 -0.553342 12.010000 -0.528108 12.040000 -0.502399 12.070000 -0.476237 12.100000 -0.449647 12.130000 -0.422653 12.160000 -0.395278 12.190000 -0.367548 12.220000 -0.339486 12.250000 -0.311119 12.280000 -0.282473 12.310000 -0.253571 12.340000 -0.224442 12.370000 -0.195111 12.400000 -0.165604 12.430000 -0.135948 12.460000 -0.106170 12.490000 -0.076296 12.520000 -0.046354 12.550000 -0.016370 12.580000 0.013629 12.610000 0.043616 12.640000 0.073563 12.670000 0.103444 12.700000 0.133232 12.730000 0.162900 12.760000 0.192422 12.790000 0.221770 12.820000 0.250919 12.850000 0.279842 12.880000 0.308513 12.910000 0.336907 12.940000 0.364997 12.970000 0.392759 13.000000 0.420167 13.030000 0.447197 13.060000 0.473825 13.090000 0.500027 13.120000 0.525778 13.150000 0.551056 13.180000 0.575838 13.210000 0.600103 13.240000 0.623827 13.270000 0.646989 13.300000 0.669570 13.330000 0.691548 13.360000 0.712903 13.390000 0.733617 13.420000 0.753671 13.450000 0.773046 13.480000 0.791726 13.510000 0.809693 13.540000 0.826932 13.570000 0.843426 13.600000 0.859162 13.630000 0.874124 13.660000 0.888300 13.690000 0.901676 13.720000 0.914240 13.750000 0.925982 13.780000 0.936891 13.810000 0.946957 13.840000 0.956170 13.870000 0.964523 13.900000 0.972008 13.930000 0.978618 13.960000 0.984347 13.990000 0.989190 14.020000 0.993144 14.050000 0.996203 14.080000 0.998366 14.110000 0.999631 14.140000 0.999996 14.170000 0.999461 14.200000 0.998027 14.230000 0.995694 14.260000 0.992466 14.290000 0.988344 14.320000 0.983333 14.350000 0.977436 14.380000 0.970661 14.410000 0.963011 14.440000 0.954495 14.470000 0.945121 14.500000 0.934895 14.530000 0.923828 14.560000 0.911930 14.590000 0.899211 14.620000 0.885683 14.650000 0.871358 14.680000 0.856249 14.710000 0.840369 14.740000 0.823733 14.770000 0.806355 14.800000 0.788252 14.830000 0.769440 14.860000 0.749935 14.890000 0.729755 14.920000 0.708918 14.950000 0.687444 14.980000 0.665351 15.010000 0.642659 15.040000 0.619388 15.070000 0.595561 15.100000 0.571197 15.130000 0.546319 15.160000 0.520950 15.190000 0.495112 15.220000 0.468828 15.250000 0.442122 15.280000 0.415019 15.310000 0.387542 15.340000 0.359716 15.370000 0.331566 15.400000 0.303118 15.430000 0.274398 15.460000 0.245430 15.490000 0.216242 15.520000 0.186858 15.550000 0.157307 15.580000 0.127614 15.610000 0.097807 15.640000 0.067911 15.670000 0.037954 15.700000 0.007963 15.730000 -0.022035 15.760000 -0.052013 15.790000 -0.081945 15.820000 -0.111802 15.850000 -0.141560 15.880000 -0.171189 15.910000 -0.200665 15.940000 -0.229960 15.970000 -0.259048 16.000000 -0.287903 16.030000 -0.316499 16.060000 -0.344810 16.090000 -0.372811 16.120000 -0.400476 16.150000 -0.427781 16.180000 -0.454701 16.210000 -0.481212 16.240000 -0.507290 16.270000 -0.532911 16.300000 -0.558052 16.330000 -0.582692 16.360000 -0.606807 16.390000 -0.630375 16.420000 -0.653377 16.450000 -0.675791 16.480000 -0.697596 16.510000 -0.718774 16.540000 -0.739304 16.570000 -0.759170 16.600000 -0.778352 16.630000 -0.796834 16.660000 -0.814599 16.690000 -0.831630 16.720000 -0.847913 16.750000 -0.863433 16.780000 -0.878177 16.810000 -0.892129 16.840000 -0.905279 16.870000 -0.917615 16.900000 -0.929124 16.930000 -0.939797 16.960000 -0.949625 16.990000 -0.958598 17.020000 -0.966708 17.050000 -0.973948 17.080000 -0.980312 17.110000 -0.985794 17.140000 -0.990388 17.170000 -0.994092 17.200000 -0.996900 17.230000 -0.998811 17.260000 -0.999824 17.290000 -0.999937 17.320000 -0.999150 17.350000 -0.997463 17.380000 -0.994880 17.410000 -0.991400 17.440000 -0.987029 17.470000 -0.981769 17.500000 -0.975626 17.530000 -0.968605 17.560000 -0.960712 17.590000 -0.951954 17.620000 -0.942340 17.650000 -0.931878 17.680000 -0.920577 17.710000 -0.908448 17.740000 -0.895501 17.770000 -0.881748 17.800000 -0.867202 17.830000 -0.851876 17.860000 -0.835782 17.890000 -0.818937 17.920000 -0.801354 17.950000 -0.783051 17.980000 -0.764043 18.010000 -0.744347 18.040000 -0.723981 18.070000 -0.702964 18.100000 -0.681314 18.130000 -0.659051 18.160000 -0.636195 18.190000 -0.612766 18.220000 -0.588786 18.250000 -0.564276 18.280000 -0.539258 18.310000 -0.513755 18.340000 -0.487790 18.370000 -0.461385 18.400000 -0.434566 18.430000 -0.407355 18.460000 -0.379778 18.490000 -0.351859 18.520000 -0.323623 18.550000 -0.295096 18.580000 -0.266303 18.610000 -0.237271 18.640000 -0.208026 18.670000 -0.178593 18.700000 -0.148999 18.730000 -0.119271 18.760000 -0.089436 18.790000 -0.059521 18.820000 -0.029552 18.850000 0.000444 18.880000 0.030439 18.910000 0.060407 18.940000 0.090321 18.970000 0.120153 19.000000 0.149877 19.030000 0.179466 19.060000 0.208894 19.090000 0.238134 19.120000 0.267159 19.150000 0.295944 19.180000 0.324463 19.210000 0.352690 19.240000 0.380599 19.270000 0.408166 19.300000 0.435365 19.330000 0.462173 19.360000 0.488565 19.390000 0.514517 19.420000 0.540006 19.450000 0.565009 19.480000 0.589504 19.510000 0.613468 19.540000 0.636880 19.570000 0.659718 19.600000 0.681964 19.630000 0.703595 19.660000 0.724593 19.690000 0.744939 19.720000 0.764615 19.750000 0.783603 19.780000 0.801885 19.810000 0.819446 19.840000 0.836270 19.870000 0.852340 19.900000 0.867644 19.930000 0.882167 19.960000 0.895896 19.990000 0.908819 20.020000 0.920924 20.050000 0.932200 20.080000 0.942637 20.110000 0.952226 20.140000 0.960958 20.170000 0.968825 20.200000 0.975821 20.230000 0.981938 20.260000 0.987171 20.290000 0.991516 20.320000 0.994969 20.350000 0.997526 20.380000 0.999186 20.410000 0.999946 20.440000 0.999807 20.470000 0.998768 20.500000 0.996830 20.530000 0.993995 20.560000 0.990265 20.590000 0.985644 20.620000 0.980136 20.650000 0.973747 20.680000 0.966480 20.710000 0.958345 20.740000 0.949346 20.770000 0.939493 20.800000 0.928795 20.830000 0.917261 20.860000 0.904902 20.890000 0.891728 20.920000 0.877751 20.950000 0.862985 20.980000 0.847442 21.010000 0.831137 21.040000 0.814083 21.070000 0.796297 21.100000 0.777794 21.130000 0.758591 21.160000 0.738706 21.190000 0.718156 21.220000 0.696959 21.250000 0.675136 21.280000 0.652704 21.310000 0.629686 21.340000 0.606100 21.370000 0.581970 21.400000 0.557315 21.430000 0.532159 21.460000 0.506524 21.490000 0.480433 21.520000 0.453910 21.550000 0.426978 21.580000 0.399662 21.610000 0.371987 21.640000 0.343977 21.670000 0.315657 21.700000 0.287053 21.730000 0.258190 21.760000 0.229096 21.790000 0.199795 21.820000 0.170314 21.850000 0.140680 21.880000 0.110920 21.910000 0.081060 21.940000 0.051126 21.970000 0.021147 22.000000 -0.008851 22.030000 -0.038842 22.060000 -0.068797 22.090000 -0.098691 22.120000 -0.128495 22.150000 -0.158184 22.180000 -0.187731 22.210000 -0.217109 22.240000 -0.246291 22.270000 -0.275252 22.300000 -0.303965 22.330000 -0.332404 22.360000 -0.360544 22.390000 -0.388360 22.420000 -0.415827 22.450000 -0.442919 22.480000 -0.469612 22.510000 -0.495883 22.540000 -0.521708 22.570000 -0.547063 22.600000 -0.571926 22.630000 -0.596274 22.660000 -0.620085 22.690000 -0.643339 22.720000 -0.666013 22.750000 -0.688088 22.780000 -0.709544 22.810000 -0.730362 22.840000 -0.750522 22.870000 -0.770007 22.900000 -0.788798 22.930000 -0.806880 22.960000 -0.824236 22.990000 -0.840850 23.020000 -0.856707 23.050000 -0.871793 23.080000 -0.886095 23.110000 -0.899599 23.140000 -0.912294 23.170000 -0.924168 23.200000 -0.935210 23.230000 -0.945410 23.260000 -0.954760 23.290000 -0.963250 23.320000 -0.970874 23.350000 -0.977624 23.380000 -0.983494 23.410000 -0.988479 23.440000 -0.992574 23.470000 -0.995776 23.500000 -0.998082 23.530000 -0.999490 23.560000 -0.999998 23.590000 -0.999606 23.620000 -0.998315 23.650000 -0.996126 23.680000 -0.993040 23.710000 -0.989060 23.740000 -0.984190 23.770000 -0.978434 23.800000 -0.971798 23.830000 -0.964288 23.860000 -0.955909 23.890000 -0.946671 23.920000 -0.936580 23.950000 -0.925647 23.980000 -0.913880 24.010000 -0.901291 24.040000 -0.887891 24.070000 -0.873692 24.100000 -0.858707 24.130000 -0.842949 24.160000 -0.826432 24.190000 -0.809172 24.220000 -0.791183 24.250000 -0.772483 24.280000 -0.753087 24.310000 -0.733013 24.340000 -0.712280 24.370000 -0.690906 24.400000 -0.668910 24.430000 -0.646312 24.460000 -0.623132 24.490000 -0.599392 24.520000 -0.575112 24.550000 -0.550315 24.580000 -0.525022 24.610000 -0.499257 24.640000 -0.473043 24.670000 -0.446403 24.700000 -0.419361 24.730000 -0.391942 24.760000 -0.364170 24.790000 -0.336070 24.820000 -0.307668 24.850000 -0.278989 24.880000 -0.250059 24.910000 -0.220904 24.940000 -0.191550 24.970000 -0.162024 25.000000 -0.132352 25.030000 -0.102561 25.060000 -0.072677 25.090000 -0.042728 25.120000 -0.012741 25.150000 0.017258 25.180000 0.047241 25.210000 0.077182 25.240000 0.107053 25.270000 0.136828 25.300000 0.166480 25.330000 0.195982 25.360000 0.225308 25.390000 0.254430 25.420000 0.283324 25.450000 0.311963 25.480000 0.340321 25.510000 0.368373 25.540000 0.396094 25.570000 0.423458 25.600000 0.450441 25.630000 0.477018 25.660000 0.503166 25.690000 0.528862 25.720000 0.554081 25.750000 0.578802 25.780000 0.603002 25.810000 0.626659 25.840000 0.649752 25.870000 0.672261 25.900000 0.694165 25.930000 0.715444 25.960000 0.736079 25.990000 0.756051 26.020000 0.775343 26.050000 0.793938 26.080000 0.811818 26.110000 0.828967 26.140000 0.845371 26.170000 0.861013 26.200000 0.875881 26.230000 0.889961 26.260000 0.903239 26.290000 0.915705 26.320000 0.927347 26.350000 0.938154 26.380000 0.948117 26.410000 0.957226 26.440000 0.965474 26.470000 0.972854 26.500000 0.979358 26.530000 0.984980 26.560000 0.989716 26.590000 0.993562 26.620000 0.996513 26.650000 0.998567 26.680000 0.999723 26.710000 0.999979 26.740000 0.999335 26.770000 0.997792 26.800000 0.995351 26.830000 0.992014 26.860000 0.987785 26.890000 0.982666 26.920000 0.976663 26.950000 0.969782 26.980000 0.962027 27.010000 0.953407 27.040000 0.943928 27.070000 0.933601 27.100000 0.922433 27.130000 0.910435 27.160000 0.897617 27.190000 0.883992 27.220000 0.869571 27.250000 0.854368 27.280000 0.838396 27.310000 0.821669 27.340000 0.804203 27.370000 0.786014 27.400000 0.767116 27.430000 0.747529 27.460000 0.727269 27.490000 0.706354 27.520000 0.684803 27.550000 0.662637 27.580000 0.639874 27.610000 0.616535 27.640000 0.592641 27.670000 0.568214 27.700000 0.543276 27.730000 0.517848 27.760000 0.491955 27.790000 0.465619 27.820000 0.438864 27.850000 0.411714 27.880000 0.384193 27.910000 0.356327 27.940000 0.328140 27.970000 0.299658 28.000000 0.270906 28.030000 0.241910 28.060000 0.212697 28.090000 0.183292 28.120000 0.153722 28.150000 0.124014 28.180000 0.094194 28.210000 0.064290 28.240000 0.034327 28.270000 0.004334 28.300000 -0.025663 28.330000 -0.055637 28.360000 -0.085561 28.390000 -0.115408 28.420000 -0.145152 28.450000 -0.174764 28.480000 -0.204219 28.510000 -0.233491 28.540000 -0.262552 28.570000 -0.291377 28.600000 -0.319940 28.630000 -0.348215 28.660000 -0.376176 28.690000 -0.403799 28.720000 -0.431059 28.750000 -0.457931 28.780000 -0.484390 28.810000 -0.510414 28.840000 -0.535978 28.870000 -0.561060 28.900000 -0.585637 28.930000 -0.609687 28.960000 -0.633189 28.990000 -0.656120 29.020000 -0.678461 29.050000 -0.700192 29.080000 -0.721292 29.110000 -0.741743 29.140000 -0.761527 29.170000 -0.780626 29.200000 -0.799021 29.230000 -0.816698 29.260000 -0.833640 29.290000 -0.849832 29.320000 -0.865259 29.350000 -0.879907 29.380000 -0.893763 29.410000 -0.906815 29.440000 -0.919051 29.470000 -0.930460 29.500000 -0.941031 29.530000 -0.950756 29.560000 -0.959625 29.590000 -0.967630 29.620000 -0.974765 29.650000 -0.981022 29.680000 -0.986397 29.710000 -0.990884 29.740000 -0.994479 29.770000 -0.997179 29.800000 -0.998982 29.830000 -0.999886 29.860000 -0.999889 29.890000 -0.998994 29.920000 -0.997199 29.950000 -0.994506 29.980000 -0.990919 30.010000 -0.986440 30.040000 -0.981073 30.070000 -0.974823 30.100000 -0.967696 30.130000 -0.959698 30.160000 -0.950837 30.190000 -0.941119 30.220000 -0.930555 30.250000 -0.919154 30.280000 -0.906925 30.310000 -0.893880 30.340000 -0.880031 30.370000 -0.865389 30.400000 -0.849969 30.430000 -0.833784 30.460000 -0.816849 30.490000 -0.799178 30.520000 -0.780788 30.550000 -0.761696 30.580000 -0.741918 30.610000 -0.721473 30.640000 -0.700378 30.670000 -0.678653 30.700000 -0.656317 30.730000 -0.633390 30.760000 -0.609894 30.790000 -0.585848 30.820000 -0.561276 30.850000 -0.536198 30.880000 -0.510638 30.910000 -0.484618 30.940000 -0.458162 30.970000 -0.431294 31.000000 -0.404038 31.030000 -0.376418 31.060000 -0.348459 31.090000 -0.320187 31.120000 -0.291626 31.150000 -0.262803 31.180000 -0.233744 31.210000 -0.204474 31.240000 -0.175020 31.270000 -0.145409 31.300000 -0.115667 31.330000 -0.085821 31.360000 -0.055897 31.390000 -0.025924 31.420000 0.004073 31.450000 0.034067 31.480000 0.064030 31.510000 0.093935 31.540000 0.123755 31.570000 0.153465 31.600000 0.183036 31.630000 0.212442 31.660000 0.241657 31.690000 0.270655 31.720000 0.299409 31.750000 0.327894 31.780000 0.356084 31.810000 0.383953 31.840000 0.411476 31.870000 0.438630 31.900000 0.465388 31.930000 0.491728 31.960000 0.517626 31.990000 0.543057 32.020000 0.568000 32.050000 0.592431 32.080000 0.616330 32.110000 0.639674 32.140000 0.662442 32.170000 0.684614 32.200000 0.706169 32.230000 0.727090 32.260000 0.747356 32.290000 0.766949 32.320000 0.785853 32.350000 0.804049 32.380000 0.821521 32.410000 0.838254 32.440000 0.854233 32.470000 0.869443 32.500000 0.883870 32.530000 0.897503 32.560000 0.910327 32.590000 0.922332 32.620000 0.933507 32.650000 0.943842 32.680000 0.953328 32.710000 0.961956 32.740000 0.969718 32.770000 0.976607 32.800000 0.982618 32.830000 0.987744 32.860000 0.991981 32.890000 0.995326 32.920000 0.997775 32.950000 0.999326 32.980000 0.999977 33.010000 0.999729 33.040000 0.998581 33.070000 0.996534 33.100000 0.993591 33.130000 0.989753 33.160000 0.985025 33.190000 0.979410 33.220000 0.972914 33.250000 0.965542 33.280000 0.957302 33.310000 0.948199 33.340000 0.938244 33.370000 0.927444 33.400000 0.915810 33.430000 0.903351 33.460000 0.890079 33.490000 0.876007 33.520000 0.861146 33.550000 0.845510 33.580000 0.829113 33.610000 0.811970 33.640000 0.794096 33.670000 0.775508 33.700000 0.756222 33.730000 0.736255 33.760000 0.715625 33.790000 0.694352 33.820000 0.672454 33.850000 0.649950 33.880000 0.626862 33.910000 0.603210 33.940000 0.579014 33.970000 0.554298 34.000000 0.529083 34.030000 0.503391 34.060000 0.477247 34.090000 0.450673 34.120000 0.423694 34.150000 0.396333 34.180000 0.368615 34.210000 0.340566 34.240000 0.312211 34.270000 0.283574 34.300000 0.254682 34.330000 0.225561 34.360000 0.196237 34.390000 0.166737 34.420000 0.137086 34.450000 0.107312 34.480000 0.077442 34.510000 0.047501 34.540000 0.017518 34.570000 -0.012480 34.600000 -0.042468 34.630000 -0.072417 34.660000 -0.102302 34.690000 -0.132094 34.720000 -0.161767 34.750000 -0.191294 34.780000 -0.220650 34.810000 -0.249807 34.840000 -0.278739 34.870000 -0.307420 34.900000 -0.335825 34.930000 -0.363927 34.960000 -0.391702 34.990000 -0.419124 35.020000 -0.446170 35.050000 -0.472813 35.080000 -0.499032 35.110000 -0.524801 35.140000 -0.550097 35.170000 -0.574899 35.200000 -0.599183 35.230000 -0.622929 35.260000 -0.646113 35.290000 -0.668716 35.320000 -0.690718 35.350000 -0.712097 35.380000 -0.732836 35.410000 -0.752915 35.440000 -0.772317 35.470000 -0.791024 35.500000 -0.809019 35.530000 -0.826286 35.560000 -0.842809 35.590000 -0.858574 35.620000 -0.873566 35.650000 -0.887772 35.680000 -0.901179 35.710000 -0.913775 35.740000 -0.925548 35.770000 -0.936489 35.800000 -0.946587 35.830000 -0.955833 35.860000 -0.964219 35.890000 -0.971737 35.920000 -0.978381 35.950000 -0.984144 35.980000 -0.989021 36.010000 -0.993009 36.040000 -0.996103 36.070000 -0.998300 36.100000 -0.999599 36.130000 -0.999999 36.160000 -0.999498 36.190000 -0.998098 36.220000 -0.995800 36.250000 -0.992606 36.280000 -0.988518 36.310000 -0.983541 36.340000 -0.977678 36.370000 -0.970936 36.400000 -0.963320 36.430000 -0.954837 36.460000 -0.945495 36.490000 -0.935302 36.520000 -0.924267 36.550000 -0.912401 36.580000 -0.899713 36.610000 -0.886216 36.640000 -0.871921 36.670000 -0.856841 36.700000 -0.840991 36.730000 -0.824383 36.760000 -0.807034 36.790000 -0.788958 36.820000 -0.770173 36.850000 -0.750694 36.880000 -0.730540 36.910000 -0.709728 36.940000 -0.688277 36.970000 -0.666208 37.000000 -0.643538 37.030000 -0.620290 37.060000 -0.596483 37.090000 -0.572139 37.120000 -0.547281 37.150000 -0.521930 37.180000 -0.496109 37.210000 -0.469842 37.240000 -0.443152 37.270000 -0.416063 37.300000 -0.388600 37.330000 -0.360787 37.360000 -0.332650 37.390000 -0.304213 37.420000 -0.275502 37.450000 -0.246543 37.480000 -0.217363 37.510000 -0.187987 37.540000 -0.158441 37.570000 -0.128753 37.600000 -0.098950 37.630000 -0.069057 37.660000 -0.039102 37.690000 -0.009112 37.720000 0.020887 37.750000 0.050866 37.780000 0.080800 37.810000 0.110661 37.840000 0.140423 37.870000 0.170058 37.900000 0.199540 37.930000 0.228842 37.960000 0.257939 37.990000 0.286803 38.020000 0.315410 38.050000 0.343732 38.080000 0.371745 38.110000 0.399424 38.140000 0.426743 38.170000 0.453678 38.200000 0.480205 38.230000 0.506299 38.260000 0.531938 38.290000 0.557099 38.320000 0.581758 38.350000 0.605893 38.380000 0.629483 38.410000 0.652507 38.440000 0.674944 38.470000 0.696773 38.500000 0.717975 38.530000 0.738530 38.560000 0.758422 38.590000 0.777630 38.620000 0.796139 38.650000 0.813932 38.680000 0.830992 38.710000 0.847304 38.740000 0.862853 38.770000 0.877627 38.800000 0.891610 38.830000 0.904791 38.860000 0.917157 38.890000 0.928699 38.920000 0.939404 38.950000 0.949264 38.980000 0.958270 39.010000 0.966414 39.040000 0.973687 39.070000 0.980085 39.100000 0.985600 39.130000 0.990229 39.160000 0.993966 39.190000 0.996809 39.220000 0.998755 39.250000 0.999802 39.280000 0.999949 39.310000 0.999196 39.340000 0.997545 39.370000 0.994995 39.400000 0.991550 39.430000 0.987213 39.460000 0.981987 39.490000 0.975877 39.520000 0.968890 39.550000 0.961030 39.580000 0.952306 39.610000 0.942724 39.640000 0.932294 39.670000 0.921025 39.700000 0.908927 39.730000 0.896012 39.760000 0.882290 39.790000 0.867774 39.820000 0.852477 39.850000 0.836412 39.880000 0.819595 39.910000 0.802041 39.940000 0.783765 39.970000 0.764783 40.000000 0.745113 40.030000 0.724773 40.060000 0.703780 40.090000 0.682154 40.120000 0.659914 40.150000 0.637080 40.180000 0.613673 40.210000 0.589714 40.240000 0.565224 40.270000 0.540225 40.300000 0.514740 40.330000 0.488792 40.360000 0.462404 40.390000 0.435600 40.420000 0.408404 40.450000 0.380840 40.480000 0.352933 40.510000 0.324709 40.540000 0.296193 40.570000 0.267410 40.600000 0.238387 40.630000 0.209149 40.660000 0.179723 40.690000 0.150135 40.720000 0.120412 40.750000 0.090580 40.780000 0.060667 40.810000 0.030700 40.840000 0.000704 40.870000 -0.029291 40.900000 -0.059261 40.930000 -0.089177 40.960000 -0.119013 40.990000 -0.148742 41.020000 -0.178336 41.050000 -0.207771 41.080000 -0.237018 41.110000 -0.266052 41.140000 -0.294847 41.170000 -0.323376 41.200000 -0.351615 41.230000 -0.379537 41.260000 -0.407117 41.290000 -0.434331 41.320000 -0.461154 41.350000 -0.487562 41.380000 -0.513532 41.410000 -0.539039 41.440000 -0.564061 41.470000 -0.588575 41.500000 -0.612560 41.530000 -0.635994 41.560000 -0.658855 41.590000 -0.681123 41.620000 -0.702778 41.650000 -0.723801 41.680000 -0.744173 41.710000 -0.763874 41.740000 -0.782889 41.770000 -0.801199 41.800000 -0.818787 41.830000 -0.835639 41.860000 -0.851739 41.890000 -0.867072 41.920000 -0.881626 41.950000 -0.895385 41.980000 -0.908339 42.010000 -0.920476 42.040000 -0.931784 42.070000 -0.942253 42.100000 -0.951875 42.130000 -0.960640 42.160000 -0.968540 42.190000 -0.975569 42.220000 -0.981720 42.250000 -0.986987 42.280000 -0.991366 42.310000 -0.994853 42.340000 -0.997445 42.370000 -0.999139 42.400000 -0.999934 42.430000 -0.999829 42.460000 -0.998824 42.490000 -0.996921 42.520000 -0.994120 42.550000 -0.990424 42.580000 -0.985838 42.610000 -0.980364 42.640000 -0.974007 42.670000 -0.966775 42.700000 -0.958672 42.730000 -0.949706 42.760000 -0.939886 42.790000 -0.929220 42.820000 -0.917718 42.850000 -0.905390 42.880000 -0.892247 42.910000 -0.878301 42.940000 -0.863565 42.970000 -0.848051 43.000000 -0.831775 43.030000 -0.814750 43.060000 -0.796991 43.090000 -0.778516 43.120000 -0.759339 43.150000 -0.739480 43.180000 -0.718955 43.210000 -0.697783 43.240000 -0.675983 43.270000 -0.653574 43.300000 -0.630578 43.330000 -0.607014 43.360000 -0.582903 43.390000 -0.558268 43.420000 -0.533131 43.450000 -0.507514 43.480000 -0.481440 43.510000 -0.454933 43.540000 -0.428017 43.570000 -0.400715 43.600000 -0.373053 43.630000 -0.345055 43.660000 -0.316746 43.690000 -0.288153 43.720000 -0.259300 43.750000 -0.230214 43.780000 -0.200920 43.810000 -0.171446 43.840000 -0.141817 43.870000 -0.112061 43.900000 -0.082204 43.930000 -0.052273 43.960000 -0.022295 43.990000 0.007703 44.020000 0.037694 44.050000 0.067651 44.080000 0.097547 44.110000 0.127356 44.140000 0.157050 44.170000 0.186603 44.200000 0.215987 44.230000 0.245178 44.260000 0.274147 44.290000 0.302870 44.320000 0.331321 44.350000 0.359473 44.380000 0.387302 44.410000 0.414782 44.440000 0.441889 44.470000 0.468598 44.500000 0.494885 44.530000 0.520727 44.560000 0.546101 44.590000 0.570983 44.620000 0.595351 44.650000 0.619184 44.680000 0.642459 44.710000 0.665156 44.740000 0.687255 44.770000 0.708735 44.800000 0.729577 44.830000 0.749762 44.860000 0.769273 44.890000 0.788092 44.920000 0.806201 44.950000 0.823585 44.980000 0.840228 45.010000 0.856114 45.040000 0.871230 45.070000 0.885562 45.100000 0.899097 45.130000 0.911823 45.160000 0.923729 45.190000 0.934803 45.220000 0.945035 45.250000 0.954418 45.280000 0.962941 45.310000 0.970598 45.340000 0.977381 45.370000 0.983285 45.400000 0.988304 45.430000 0.992434 45.460000 0.995670 45.490000 0.998010 45.520000 0.999452 45.550000 0.999995 45.580000 0.999638 45.610000 0.998381 45.640000 0.996226 45.670000 0.993174 45.700000 0.989229 45.730000 0.984393 45.760000 0.978671 45.790000 0.972069 45.820000 0.964591 45.850000 0.956246 45.880000 0.947040 45.910000 0.936982 45.940000 0.926081 45.970000 0.914346 46.000000 0.901788 46.030000 0.888419 46.060000 0.874250 46.090000 0.859295 46.120000 0.843566 46.150000 0.827078 46.180000 0.809846 46.210000 0.791885 46.240000 0.773211 46.270000 0.753842 46.300000 0.733794 46.330000 0.713086 46.360000 0.691736 46.390000 0.669763 46.420000 0.647188 46.450000 0.624030 46.480000 0.600311 46.510000 0.576051 46.540000 0.551273 46.570000 0.525999 46.600000 0.500252 46.630000 0.474054 46.660000 0.447430 46.690000 0.420403 46.720000 0.392998 46.750000 0.365239 46.780000 0.337152 46.810000 0.308761 46.840000 0.280092 46.870000 0.251171 46.900000 0.222024 46.930000 0.192677 46.960000 0.163157 46.990000 0.133490 47.020000 0.103703 47.050000 0.073823 47.080000 0.043876 47.110000 0.013889 47.140000 -0.016109 47.170000 -0.046094 47.200000 -0.076037 47.230000 -0.105911 47.260000 -0.135690 47.290000 -0.165347 47.320000 -0.194856 47.350000 -0.224188 47.380000 -0.253320 47.410000 -0.282223 47.440000 -0.310872 47.470000 -0.339241 47.500000 -0.367305 47.530000 -0.395039 47.560000 -0.422417 47.590000 -0.449415 47.620000 -0.476008 47.650000 -0.502173 47.680000 -0.527887 47.710000 -0.553125 47.740000 -0.577865 47.770000 -0.602085 47.800000 -0.625764 47.830000 -0.648879 47.860000 -0.671410 47.890000 -0.693337 47.920000 -0.714641 47.950000 -0.735301 47.980000 -0.755299 48.010000 -0.774618 48.040000 -0.793239 48.070000 -0.811147 48.100000 -0.828324 48.130000 -0.844757 48.160000 -0.860429 48.190000 -0.875326 48.220000 -0.889436 48.250000 -0.902746 48.280000 -0.915243 48.310000 -0.926916 48.340000 -0.937756 48.370000 -0.947751 48.400000 -0.956893 48.430000 -0.965175 48.460000 -0.972587 48.490000 -0.979125 48.520000 -0.984781 48.550000 -0.989551 48.580000 -0.993431 48.610000 -0.996416 48.640000 -0.998505 48.670000 -0.999695 48.700000 -0.999986 48.730000 -0.999377 48.760000 -0.997868 48.790000 -0.995461 48.820000 -0.992158 48.850000 -0.987963 48.880000 -0.982878 48.910000 -0.976909 48.940000 -0.970061 48.970000 -0.962340 49.000000 -0.953753 49.030000 -0.944307 49.060000 -0.934012 49.090000 -0.922876 49.120000 -0.910909 49.150000 -0.898123 49.180000 -0.884529 49.210000 -0.870138 49.240000 -0.854965 49.270000 -0.839022 49.300000 -0.822324 49.330000 -0.804885 49.360000 -0.786723 49.390000 -0.767853 49.420000 -0.748291 49.450000 -0.728056 49.480000 -0.707166 49.510000 -0.685640 49.540000 -0.663496 49.570000 -0.640756 49.600000 -0.617439 49.630000 -0.593566 49.660000 -0.569159 49.690000 -0.544240 49.720000 -0.518831 49.750000 -0.492955 49.780000 -0.466635 49.810000 -0.439896 49.840000 -0.412760 49.870000 -0.385253 49.900000 -0.357400 49.930000 -0.329225 49.960000 -0.300753 49.990000 -0.272011 50.020000 -0.243024 50.050000 -0.213819 50.080000 -0.184421 50.110000 -0.154857 50.140000 -0.125153 50.170000 -0.095337 50.200000 -0.065436 50.230000 -0.035475 50.260000 -0.005482 50.290000 0.024515 50.320000 0.054491 50.350000 0.084417 50.380000 0.114267 50.410000 0.144015 50.440000 0.173633 50.470000 0.203095 50.500000 0.232374 50.530000 0.261444 50.560000 0.290278 50.590000 0.318852 50.620000 0.347138 50.650000 0.375112 50.680000 0.402748 50.710000 0.430022 50.740000 0.456909 50.770000 0.483385 50.800000 0.509426 50.830000 0.535008 50.860000 0.560109 50.890000 0.584706 50.920000 0.608777 50.950000 0.632299 50.980000 0.655253 51.010000 0.677617 51.040000 0.699371 51.070000 0.720496 51.100000 0.740973 51.130000 0.760782 51.160000 0.779907 51.190000 0.798330 51.220000 0.816035 51.250000 0.833005 51.280000 0.849226 51.310000 0.864682 51.340000 0.879361 51.370000 0.893247 51.400000 0.906330 51.430000 0.918598 51.460000 0.930038 51.490000 0.940642 51.520000 0.950399 51.550000 0.959301 51.580000 0.967340 51.610000 0.974508 51.640000 0.980799 51.670000 0.986208 51.700000 0.990728 51.730000 0.994358 51.760000 0.997092 51.790000 0.998929 51.820000 0.999868 51.850000 0.999906 51.880000 0.999044 51.910000 0.997284 51.940000 0.994626 51.970000 0.991073 52.000000 0.986628 52.030000 0.981295 52.060000 0.975079 52.090000 0.967985 52.120000 0.960020 52.150000 0.951192 52.180000 0.941507 52.210000 0.930975 52.240000 0.919606 52.270000 0.907408 52.300000 0.894394 52.330000 0.880575 52.360000 0.865964 52.390000 0.850574 52.420000 0.834418 52.450000 0.817511 52.480000 0.799868 52.510000 0.781505 52.540000 0.762440 52.570000 0.742688 52.600000 0.722267 52.630000 0.701197 52.660000 0.679496 52.690000 0.657183 52.720000 0.634279 52.750000 0.610804 52.780000 0.586779 52.810000 0.562226 52.840000 0.537167 52.870000 0.511625 52.900000 0.485622 52.930000 0.459183 52.960000 0.432330 52.990000 0.405088 53.020000 0.377482 53.050000 0.349535 53.080000 0.321275 53.110000 0.292725 53.140000 0.263911 53.170000 0.234861 53.200000 0.205598 53.230000 0.176151 53.260000 0.146545 53.290000 0.116808 53.320000 0.086965 53.350000 0.057044 53.380000 0.027072 53.410000 -0.002925 53.440000 -0.032919 53.470000 -0.062883 53.500000 -0.092791 53.530000 -0.122616 53.560000 -0.152330 53.590000 -0.181906 53.620000 -0.211320 53.650000 -0.240543 53.680000 -0.269549 53.710000 -0.298313 53.740000 -0.326809 53.770000 -0.355010 53.800000 -0.382892 53.830000 -0.410429 53.860000 -0.437597 53.890000 -0.464372 53.920000 -0.490728 53.950000 -0.516642 53.980000 -0.542092 54.010000 -0.567054 54.040000 -0.591506 54.070000 -0.615425 54.100000 -0.638790 54.130000 -0.661581 54.160000 -0.683776 54.190000 -0.705356 54.220000 -0.726301 54.250000 -0.746592 54.280000 -0.766212 54.310000 -0.785142 54.340000 -0.803365 54.370000 -0.820866 54.400000 -0.837627 54.430000 -0.853635 54.460000 -0.868875 54.490000 -0.883333 54.520000 -0.896995 54.550000 -0.909851 54.580000 -0.921888 54.610000 -0.933095 54.640000 -0.943462 54.670000 -0.952981 54.700000 -0.961642 54.730000 -0.969437 54.760000 -0.976360 54.790000 -0.982404 54.820000 -0.987564 54.850000 -0.991836 54.880000 -0.995214 54.910000 -0.997698 54.940000 -0.999283 54.970000 -0.999969 55.000000 -0.999755 55.030000 -0.998642 55.060000 -0.996629 55.090000 -0.993720 55.120000 -0.989917 55.150000 -0.985222 55.180000 -0.979641 55.210000 -0.973179 55.240000 -0.965841 55.270000 -0.957633 55.300000 -0.948564 55.330000 -0.938641 55.360000 -0.927873 55.390000 -0.916270 55.420000 -0.903843 55.450000 -0.890602 55.480000 -0.876560 55.510000 -0.861729 55.540000 -0.846123 55.570000 -0.829755 55.600000 -0.812640 55.630000 -0.794794 55.660000 -0.776233 55.690000 -0.756973 55.720000 -0.737032 55.750000 -0.716427 55.780000 -0.695178 55.810000 -0.673303 55.840000 -0.650823 55.870000 -0.627757 55.900000 -0.604125 55.930000 -0.579950 55.960000 -0.555254 55.990000 -0.530057 56.020000 -0.504383 56.050000 -0.478256 56.080000 -0.451698 56.110000 -0.424734 56.140000 -0.397387 56.170000 -0.369683 56.200000 -0.341646 56.230000 -0.313302 56.260000 -0.284675 56.290000 -0.255793 56.320000 -0.226680 56.350000 -0.197363 56.380000 -0.167869 56.410000 -0.138224 56.440000 -0.108454 56.470000 -0.078587 56.500000 -0.048649 56.530000 -0.018667 56.560000 0.011332 56.590000 0.041320 56.620000 0.071272 56.650000 0.101159 56.680000 0.130955 56.710000 0.160633 56.740000 0.190167 56.770000 0.219530 56.800000 0.248695 56.830000 0.277636 56.860000 0.306327 56.890000 0.334743 56.920000 0.362857 56.950000 0.390645 56.980000 0.418081 57.010000 0.445141 57.040000 0.471801 57.070000 0.498036 57.100000 0.523823 57.130000 0.549138 57.160000 0.573959 57.190000 0.598263 57.220000 0.622030 57.250000 0.645236 57.280000 0.667862 57.310000 0.689886 57.340000 0.711290 57.370000 0.732054 57.400000 0.752159 57.430000 0.771587 57.460000 0.790321 57.490000 0.808343 57.520000 0.825638 57.550000 0.842190 57.580000 0.857984 57.610000 0.873006 57.640000 0.887242 57.670000 0.900680 57.700000 0.913307 57.730000 0.925113 57.760000 0.936085 57.790000 0.946216 57.820000 0.955495 57.850000 0.963914 57.880000 0.971465 57.910000 0.978142 57.940000 0.983939 57.970000 0.988851 58.000000 0.992873 58.030000 0.996001 58.060000 0.998233 58.090000 0.999566 58.120000 1.000000 58.150000 0.999534 58.180000 0.998168 58.210000 0.995904 58.240000 0.992744 58.270000 0.988691 58.300000 0.983748 58.330000 0.977919 58.360000 0.971210 58.390000 0.963628 58.420000 0.955178 58.450000 0.945869 58.480000 0.935708 58.510000 0.924705 58.540000 0.912870 58.570000 0.900214 58.600000 0.886747 58.630000 0.872483 58.660000 0.857433 58.690000 0.841612 58.720000 0.825033 58.750000 0.807712 58.780000 0.789664 58.810000 0.770905 58.840000 0.751452 58.870000 0.731323 58.900000 0.710537 58.930000 0.689110 58.960000 0.667064 58.990000 0.644417 59.020000 0.621190 59.050000 0.597404 59.080000 0.573081 59.110000 0.548242 59.140000 0.522909 59.170000 0.497106 59.200000 0.470856 59.230000 0.444181 59.260000 0.417107 59.290000 0.389658 59.320000 0.361858 59.350000 0.333733 59.380000 0.305307 59.410000 0.276606 59.440000 0.247656 59.470000 0.218484 59.500000 0.189115 59.530000 0.159575 59.560000 0.129892 59.590000 0.100093 59.620000 0.070203 59.650000 0.040250 59.680000 0.010260 59.710000 -0.019738 59.740000 -0.049719 59.770000 -0.079655 59.800000 -0.109519 59.830000 -0.139285 59.860000 -0.168926 59.890000 -0.198414 59.920000 -0.227724 59.950000 -0.256829 59.980000 -0.285703 60.010000 -0.314319 60.040000 -0.342653 60.070000 -0.370679 60.100000 -0.398370 60.130000 -0.425704 60.160000 -0.452654 60.190000 -0.479197 60.220000 -0.505309 60.250000 -0.530966 60.280000 -0.556145 60.310000 -0.580823 60.340000 -0.604979 60.370000 -0.628591 60.400000 -0.651636 60.430000 -0.674096 60.460000 -0.695948 60.490000 -0.717175 60.520000 -0.737756 60.550000 -0.757673 60.580000 -0.776908 60.610000 -0.795444 60.640000 -0.813264 60.670000 -0.830352 60.700000 -0.846693 60.730000 -0.862272 60.760000 -0.877075 60.790000 -0.891089 60.820000 -0.904301 60.850000 -0.916699 60.880000 -0.928272 60.910000 -0.939010 60.940000 -0.948902 60.970000 -0.957941 61.000000 -0.966118 61.030000 -0.973425 61.060000 -0.979856 61.090000 -0.985405 61.120000 -0.990068 61.150000 -0.993840 61.180000 -0.996717 61.210000 -0.998697 61.240000 -0.999778 61.270000 -0.999960 61.300000 -0.999242 61.330000 -0.997624 61.360000 -0.995109 61.390000 -0.991698 61.420000 -0.987395 61.450000 -0.982203 61.480000 -0.976128 61.510000 -0.969173 61.540000 -0.961347 61.570000 -0.952655 61.600000 -0.943107 61.630000 -0.932709 61.660000 -0.921472 61.690000 -0.909406 61.720000 -0.896521 61.750000 -0.882830 61.780000 -0.868344 61.810000 -0.853076 61.840000 -0.837041 61.870000 -0.820253 61.900000 -0.802726 61.930000 -0.784477 61.960000 -0.765523 61.990000 -0.745879 62.020000 -0.725564 62.050000 -0.704596 62.080000 -0.682993 62.110000 -0.660777 62.140000 -0.637965 62.170000 -0.614580 62.200000 -0.590641 62.230000 -0.566171 62.260000 -0.541191 62.290000 -0.515725 62.320000 -0.489794 62.350000 -0.463422 62.380000 -0.436633 62.410000 -0.409452 62.440000 -0.381902 62.470000 -0.354008 62.500000 -0.325796 62.530000 -0.297290 62.560000 -0.268517 62.590000 -0.239502 62.620000 -0.210272 62.650000 -0.180852 62.680000 -0.151270 62.710000 -0.121552 62.740000 -0.091724 62.770000 -0.061814 62.800000 -0.031848 62.830000 -0.001853 62.860000 0.028143 62.890000 0.058114 62.920000 0.088033 62.950000 0.117872 62.980000 0.147606 63.010000 0.177206 63.040000 0.206647 63.070000 0.235902 63.100000 0.264945 63.130000 0.293749 63.160000 0.322289 63.190000 0.350539 63.220000 0.378474 63.250000 0.406068 63.280000 0.433296 63.310000 0.460135 63.340000 0.486559 63.370000 0.512546 63.400000 0.538071 63.430000 0.563112 63.460000 0.587646 63.490000 0.611652 63.520000 0.635107 63.550000 0.657990 63.580000 0.680282 63.610000 0.701961 63.640000 0.723008 63.670000 0.743405 63.700000 0.763133 63.730000 0.782174 63.760000 0.800511 63.790000 0.818127 63.820000 0.835008 63.850000 0.851137 63.880000 0.866500 63.910000 0.881083 63.940000 0.894873 63.970000 0.907858 64.000000 0.920026 64.030000 0.931366 64.060000 0.941868 64.090000 0.951522 64.120000 0.960320 64.150000 0.968254 64.180000 0.975316 64.210000 0.981500 64.240000 0.986802 64.270000 0.991215 64.300000 0.994736 64.330000 0.997362 64.360000 0.999091 64.390000 0.999920 64.420000 0.999849 64.450000 0.998879 64.480000 0.997010 64.510000 0.994243 64.540000 0.990582 64.570000 0.986030 64.600000 0.980589 64.630000 0.974267 64.660000 0.967068 64.690000 0.958998 64.720000 0.950065 64.750000 0.940278 64.780000 0.929644 64.810000 0.918174 64.840000 0.905877 64.870000 0.892765 64.900000 0.878850 64.930000 0.864143 64.960000 0.848659 64.990000 0.832412 65.020000 0.815415 65.050000 0.797684 65.080000 0.779236 65.110000 0.760086 65.140000 0.740252 65.170000 0.719752 65.200000 0.698605 65.230000 0.676828 65.260000 0.654443 65.290000 0.631469 65.320000 0.607926 65.350000 0.583836 65.380000 0.559221 65.410000 0.534102 65.440000 0.508503 65.470000 0.482447 65.500000 0.455956 65.530000 0.429054 65.560000 0.401767 65.590000 0.374118 65.620000 0.346133 65.650000 0.317835 65.680000 0.289252 65.710000 0.260409 65.740000 0.231331 65.770000 0.202045 65.800000 0.172577 65.830000 0.142954 65.860000 0.113203 65.890000 0.083349 65.920000 0.053420 65.950000 0.023444 65.980000 -0.006554 66.010000 -0.036546 66.040000 -0.066505 66.070000 -0.096404 66.100000 -0.126217 66.130000 -0.155916 66.160000 -0.185474 66.190000 -0.214866 66.220000 -0.244064 66.250000 -0.273042 66.280000 -0.301775 66.310000 -0.330237 66.340000 -0.358401 66.370000 -0.386242 66.400000 -0.413736 66.430000 -0.440858 66.460000 -0.467583 66.490000 -0.493887 66.520000 -0.519747 66.550000 -0.545138 66.580000 -0.570040 66.610000 -0.594428 66.640000 -0.618281 66.670000 -0.641578 66.700000 -0.664298 66.730000 -0.686420 66.760000 -0.707924 66.790000 -0.728791 66.820000 -0.749002 66.850000 -0.768539 66.880000 -0.787384 66.910000 -0.805521 66.940000 -0.822933 66.970000 -0.839604 67.000000 -0.855520 67.030000 -0.870666 67.060000 -0.885028 67.090000 -0.898594 67.120000 -0.911351 67.150000 -0.923288 67.180000 -0.934394 67.210000 -0.944659 67.240000 -0.954074 67.270000 -0.962631 67.300000 -0.970321 67.330000 -0.977138 67.360000 -0.983075 67.390000 -0.988128 67.420000 -0.992292 67.450000 -0.995563 67.480000 -0.997937 67.510000 -0.999414 67.540000 -0.999991 67.570000 -0.999668 67.600000 -0.998446 67.630000 -0.996325 67.660000 -0.993308 67.690000 -0.989396 67.720000 -0.984594 67.750000 -0.978906 67.780000 -0.972338 67.810000 -0.964894 67.840000 -0.956582 67.870000 -0.947408 67.900000 -0.937383 67.930000 -0.926514 67.960000 -0.914810 67.990000 -0.902284 68.020000 -0.888946 68.050000 -0.874808 68.080000 -0.859882 68.110000 -0.844183 68.140000 -0.827723 68.170000 -0.810519 68.200000 -0.792586 68.230000 -0.773939 68.260000 -0.754596 68.290000 -0.734574 68.320000 -0.713890 68.350000 -0.692565 68.380000 -0.670616 68.410000 -0.648063 68.440000 -0.624927 68.470000 -0.601229 68.500000 -0.576990 68.530000 -0.552231 68.560000 -0.526976 68.590000 -0.501246 68.620000 -0.475065 68.650000 -0.448457 68.680000 -0.421445 68.710000 -0.394054 68.740000 -0.366308 68.770000 -0.338233 68.800000 -0.309853 68.830000 -0.281194 68.860000 -0.252283 68.890000 -0.223144 68.920000 -0.193804 68.950000 -0.164290 68.980000 -0.134628 69.010000 -0.104845 69.040000 -0.074968 69.070000 -0.045023 69.100000 -0.015038 69.130000 0.014961 69.160000 0.044946 69.190000 0.074891 69.220000 0.104769 69.250000 0.134552 69.280000 0.164214 69.310000 0.193729 69.340000 0.223069 69.370000 0.252208 69.400000 0.281121 69.430000 0.309780 69.460000 0.338161 69.490000 0.366237 69.520000 0.393983 69.550000 0.421376 69.580000 0.448388 69.610000 0.474998 69.640000 0.501180 69.670000 0.526911 69.700000 0.552167 69.730000 0.576927 69.760000 0.601168 69.790000 0.624867 69.820000 0.648005 69.850000 0.670559 69.880000 0.692509 69.910000 0.713837 69.940000 0.734522 69.970000 0.754546 70.000000 0.773891 70.030000 0.792539 70.060000 0.810474 70.090000 0.827680 70.120000 0.844141 70.150000 0.859843 70.180000 0.874770 70.210000 0.888911 70.240000 0.902251 70.270000 0.914779 70.300000 0.926485 70.330000 0.937356 70.360000 0.947384 70.390000 0.956559 70.420000 0.964874 70.450000 0.972320 70.480000 0.978891 70.510000 0.984581 70.540000 0.989385 70.570000 0.993299 70.600000 0.996318 70.630000 0.998442 70.660000 0.999666 70.690000 0.999991 70.720000 0.999416 70.750000 0.997942 70.780000 0.995570 70.810000 0.992301 70.840000 0.988140 70.870000 0.983089 70.900000 0.977154 70.930000 0.970339 70.960000 0.962652 70.990000 0.954097 71.020000 0.944684 71.050000 0.934421 71.080000 0.923317 71.110000 0.911383 71.140000 0.898628 71.170000 0.885064 71.200000 0.870704 71.230000 0.855560 71.260000 0.839646 71.290000 0.822977 71.320000 0.805567 71.350000 0.787432 71.380000 0.768588 71.410000 0.749053 71.440000 0.728843 71.470000 0.707978 71.500000 0.686476 71.530000 0.664355 71.560000 0.641637 71.590000 0.618342 71.620000 0.594490 71.650000 0.570103 71.680000 0.545203 71.710000 0.519812 71.740000 0.493954 71.770000 0.467651 71.800000 0.440927 71.830000 0.413806 71.860000 0.386313 71.890000 0.358472 71.920000 0.330309 71.950000 0.301849 71.980000 0.273116 72.010000 0.244138 72.040000 0.214941 72.070000 0.185549 72.100000 0.155991 72.130000 0.126293 72.160000 0.096481 72.190000 0.066582 72.220000 0.036623 72.250000 0.006631 72.280000 -0.023367 72.310000 -0.053344 72.340000 -0.083272 72.370000 -0.113126 72.400000 -0.142878 72.430000 -0.172502 72.460000 -0.201970 72.490000 -0.231256 72.520000 -0.260335 72.550000 -0.289179 72.580000 -0.317763 72.610000 -0.346061 72.640000 -0.374047 72.670000 -0.401697 72.700000 -0.428985 72.730000 -0.455887 72.760000 -0.482379 72.790000 -0.508437 72.820000 -0.534038 72.850000 -0.559157 72.880000 -0.583774 72.910000 -0.607865 72.940000 -0.631409 72.970000 -0.654385 73.000000 -0.676772 73.030000 -0.698550 73.060000 -0.719699 73.090000 -0.740201 73.120000 -0.760036 73.150000 -0.779188 73.180000 -0.797638 73.210000 -0.815371 73.240000 -0.832369 73.270000 -0.848619 73.300000 -0.864105 73.330000 -0.878813 73.360000 -0.892730 73.390000 -0.905844 73.420000 -0.918143 73.450000 -0.929616 73.480000 -0.940252 73.510000 -0.950042 73.540000 -0.958976 73.570000 -0.967048 73.600000 -0.974250 73.630000 -0.980574 73.660000 -0.986017 73.690000 -0.990572 73.720000 -0.994235 73.750000 -0.997004 73.780000 -0.998876 73.810000 -0.999848 73.840000 -0.999921 73.870000 -0.999094 73.900000 -0.997368 73.930000 -0.994744 73.960000 -0.991225 73.990000 -0.986814 74.020000 -0.981515 74.050000 -0.975333 74.080000 -0.968273 74.110000 -0.960341 74.140000 -0.951546 74.170000 -0.941894 74.200000 -0.931394 74.230000 -0.920056 74.260000 -0.907890 74.290000 -0.894907 74.320000 -0.881119 74.350000 -0.866538 74.380000 -0.851177 74.410000 -0.835050 74.440000 -0.818172 74.470000 -0.800557 74.500000 -0.782222 74.530000 -0.763182 74.560000 -0.743456 74.590000 -0.723061 74.620000 -0.702016 74.650000 -0.680338 74.680000 -0.658048 74.710000 -0.635166 74.740000 -0.611713 74.770000 -0.587709 74.800000 -0.563176 74.830000 -0.538136 74.860000 -0.512612 74.890000 -0.486626 74.920000 -0.460203 74.950000 -0.433365 74.980000 -0.406138 75.010000 -0.378545 75.040000 -0.350611 75.070000 -0.322362 75.100000 -0.293823 75.130000 -0.265019 75.160000 -0.235977 75.190000 -0.206722 75.220000 -0.177282 75.250000 -0.147682 75.280000 -0.117948 75.310000 -0.088109 75.340000 -0.058191 75.370000 -0.028220 75.400000 0.001776 75.430000 0.031771 75.460000 0.061737 75.490000 0.091648 75.520000 0.121476 75.550000 0.151194 75.580000 0.180777 75.610000 0.210197 75.640000 0.239428 75.670000 0.268443 75.700000 0.297217 75.730000 0.325723 75.760000 0.353936 75.790000 0.381831 75.820000 0.409382 75.850000 0.436564 75.880000 0.463354 75.910000 0.489727 75.940000 0.515659 75.970000 0.541127 76.000000 0.566108 76.030000 0.590579 76.060000 0.614519 76.090000 0.637906 76.120000 0.660719 76.150000 0.682937 76.180000 0.704541 76.210000 0.725511 76.240000 0.745828 76.270000 0.765473 76.300000 0.784430 76.330000 0.802681 76.360000 0.820209 76.390000 0.836999 76.420000 0.853036 76.450000 0.868306 76.480000 0.882794 76.510000 0.896487 76.540000 0.909374 76.570000 0.921442 76.600000 0.932681 76.630000 0.943081 76.660000 0.952632 76.690000 0.961326 76.720000 0.969154 76.750000 0.976111 76.780000 0.982189 76.810000 0.987383 76.840000 0.991688 76.870000 0.995102 76.900000 0.997619 76.930000 0.999239 76.960000 0.999959 76.990000 0.999780 77.020000 0.998701 77.050000 0.996723 77.080000 0.993848 77.110000 0.990079 77.140000 0.985418 77.170000 0.979871 77.200000 0.973443 77.230000 0.966138 77.260000 0.957963 77.290000 0.948927 77.320000 0.939036 77.350000 0.928301 77.380000 0.916730 77.410000 0.904334 77.440000 0.891124 77.470000 0.877112 77.500000 0.862311 77.530000 0.846734 77.560000 0.830395 77.590000 0.813309 77.620000 0.795490 77.650000 0.776956 77.680000 0.757723 77.710000 0.737807 77.740000 0.717228 77.770000 0.696003 77.800000 0.674152 77.830000 0.651694 77.860000 0.628650 77.890000 0.605040 77.920000 0.580886 77.950000 0.556208 77.980000 0.531031 78.010000 0.505375 78.040000 0.479264 78.070000 0.452723 78.100000 0.425773 78.130000 0.398441 78.160000 0.370750 78.190000 0.342725 78.220000 0.314392 78.250000 0.285776 78.280000 0.256903 78.310000 0.227799 78.340000 0.198489 78.370000 0.169001 78.400000 0.139361 78.430000 0.109596 78.460000 0.079732 78.490000 0.049796 78.520000 0.019815 78.550000 -0.010183 78.580000 -0.040173 78.610000 -0.070126 78.640000 -0.100016 78.670000 -0.129816 78.700000 -0.159500 78.730000 -0.189039 78.760000 -0.218409 78.790000 -0.247582 78.820000 -0.276532 78.850000 -0.305234 78.880000 -0.333660 78.910000 -0.361787 78.940000 -0.389587 78.970000 -0.417038 79.000000 -0.444113 79.030000 -0.470788 79.060000 -0.497040 79.090000 -0.522844 79.120000 -0.548178 79.150000 -0.573018 79.180000 -0.597343 79.210000 -0.621130 79.240000 -0.644358 79.270000 -0.667006 79.300000 -0.689055 79.330000 -0.710483 79.360000 -0.731271 79.390000 -0.751402 79.420000 -0.770856 79.450000 -0.789616 79.480000 -0.807666 79.510000 -0.824990 79.540000 -0.841570 79.570000 -0.857394 79.600000 -0.872445 79.630000 -0.886712 79.660000 -0.900180 79.690000 -0.912839 79.720000 -0.924676 79.750000 -0.935681 79.780000 -0.945844 79.810000 -0.955155 79.840000 -0.963607 79.870000 -0.971192 79.900000 -0.977903 79.930000 -0.983734 79.960000 -0.988679 79.990000 -0.992735 80.020000 -0.995897 80.050000 -0.998164 80.080000 -0.999531 80.110000 -1.000000 80.140000 -0.999568 80.170000 -0.998237 80.200000 -0.996008 80.230000 -0.992882 80.260000 -0.988862 80.290000 -0.983953 80.320000 -0.978158 80.350000 -0.971483 80.380000 -0.963934 80.410000 -0.955517 80.440000 -0.946241 80.470000 -0.936112 80.500000 -0.925142 80.530000 -0.913339 80.560000 -0.900713 80.590000 -0.887278 80.620000 -0.873043 80.650000 -0.858024 80.680000 -0.842231 80.710000 -0.825681 80.740000 -0.808388 80.770000 -0.790368 80.800000 -0.771636 80.830000 -0.752210 80.860000 -0.732106 80.890000 -0.711344 80.920000 -0.689942 80.950000 -0.667919 80.980000 -0.645295 81.010000 -0.622090 81.040000 -0.598325 81.070000 -0.574022 81.100000 -0.549202 81.130000 -0.523888 81.160000 -0.498102 81.190000 -0.471869 81.220000 -0.445210 81.250000 -0.418151 81.280000 -0.390716 81.310000 -0.362929 81.340000 -0.334815 81.370000 -0.306400 81.400000 -0.277709 81.430000 -0.248769 81.460000 -0.219604 81.490000 -0.190242 81.520000 -0.160709 81.550000 -0.131031 81.580000 -0.101235 81.610000 -0.071348 81.640000 -0.041397 81.670000 -0.011409 81.700000 0.018590 81.730000 0.048572 81.760000 0.078510 81.790000 0.108378 81.820000 0.138148 81.850000 0.167793 81.880000 0.197288 81.910000 0.226605 81.940000 0.255719 81.970000 0.284602 82.000000 0.313229 82.030000 0.341574 82.060000 0.369612 82.090000 0.397317 82.120000 0.424664 82.150000 0.451630 82.180000 0.478189 82.210000 0.504317 82.240000 0.529992 82.270000 0.555190 82.300000 0.579888 82.330000 0.604064 82.360000 0.627697 82.390000 0.650765 82.420000 0.673247 82.450000 0.695123 82.480000 0.716374 82.510000 0.736980 82.540000 0.756923 82.570000 0.776184 82.600000 0.794747 82.630000 0.812595 82.660000 0.829712 82.690000 0.846082 82.720000 0.861690 82.750000 0.876523 82.780000 0.890567 82.810000 0.903810 82.840000 0.916240 82.870000 0.927844 82.900000 0.938614 82.930000 0.948539 82.960000 0.957611 82.990000 0.965821 83.020000 0.973161 83.050000 0.979626 83.080000 0.985209 83.110000 0.989906 83.140000 0.993712 83.170000 0.996623 83.200000 0.998638 83.230000 0.999753 83.260000 0.999970 83.290000 0.999286 83.320000 0.997703 83.350000 0.995222 83.380000 0.991845 83.410000 0.987576 83.440000 0.982418 83.470000 0.976376 83.500000 0.969456 83.530000 0.961663 83.560000 0.953004 83.590000 0.943488 83.620000 0.933123 83.650000 0.921918 83.680000 0.909883 83.710000 0.897029 83.740000 0.883369 83.770000 0.868913 83.800000 0.853675 83.830000 0.837669 83.860000 0.820909 83.890000 0.803411 83.920000 0.785189 83.950000 0.766261 83.980000 0.746643 84.010000 0.726354 84.040000 0.705410 84.070000 0.683832 84.100000 0.661638 84.130000 0.638849 84.160000 0.615485 84.190000 0.591568 84.220000 0.567117 84.250000 0.542157 84.280000 0.516708 84.310000 0.490795 84.340000 0.464440 84.370000 0.437666 84.400000 0.410499 84.430000 0.382963 84.460000 0.355082 84.490000 0.326881 84.520000 0.298386 84.550000 0.269623 84.580000 0.240617 84.610000 0.211395 84.640000 0.181982 84.670000 0.152405 84.700000 0.122692 84.730000 0.092868 84.760000 0.062960 84.790000 0.032996 84.820000 0.003002 84.850000 -0.026995 84.880000 -0.056967 84.910000 -0.086889 84.940000 -0.116732 84.970000 -0.146470 85.000000 -0.176076 85.030000 -0.205523 85.060000 -0.234786 85.090000 -0.263837 85.120000 -0.292651 85.150000 -0.321202 85.180000 -0.349463 85.210000 -0.377410 85.240000 -0.405018 85.270000 -0.432261 85.300000 -0.459115 85.330000 -0.485555 85.360000 -0.511559 85.390000 -0.537103 85.420000 -0.562163 85.450000 -0.586717 85.480000 -0.610743 85.510000 -0.634219 85.540000 -0.657125 85.570000 -0.679439 85.600000 -0.701142 85.630000 -0.722214 85.660000 -0.742636 85.690000 -0.762390 85.720000 -0.781458 85.750000 -0.799822 85.780000 -0.817466 85.810000 -0.834375 85.840000 -0.850533 85.870000 -0.865926 85.900000 -0.880539 85.930000 -0.894360 85.960000 -0.907376 85.990000 -0.919575 86.020000 -0.930947 86.050000 -0.941481 86.080000 -0.951168 86.110000 -0.959999 86.140000 -0.967966 86.170000 -0.975062 86.200000 -0.981280 86.230000 -0.986615 86.260000 -0.991062 86.290000 -0.994618 86.320000 -0.997278 86.350000 -0.999041 86.380000 -0.999905 86.410000 -0.999869 86.440000 -0.998933 86.470000 -0.997098 86.500000 -0.994366 86.530000 -0.990739 86.560000 -0.986220 86.590000 -0.980814 86.620000 -0.974525 86.650000 -0.967359 86.680000 -0.959323 86.710000 -0.950423 86.740000 -0.940668 86.770000 -0.930067 86.800000 -0.918628 86.830000 -0.906363 86.860000 -0.893282 86.890000 -0.879397 86.920000 -0.864721 86.950000 -0.849266 86.980000 -0.833048 87.010000 -0.816079 87.040000 -0.798377 87.070000 -0.779955 87.100000 -0.760832 87.130000 -0.741024 87.160000 -0.720549 87.190000 -0.699426 87.220000 -0.677674 87.250000 -0.655311 87.280000 -0.632359 87.310000 -0.608837 87.340000 -0.584768 87.370000 -0.560173 87.400000 -0.535073 87.430000 -0.509492 87.460000 -0.483452 87.490000 -0.456978 87.520000 -0.430092 87.550000 -0.402819 87.580000 -0.375183 87.610000 -0.347210 87.640000 -0.318924 87.670000 -0.290352 87.700000 -0.261518 87.730000 -0.232448 87.760000 -0.203170 87.790000 -0.173709 87.820000 -0.144091 87.850000 -0.114344 87.880000 -0.084493 87.910000 -0.054567 87.940000 -0.024592 87.970000 0.005406 88.000000 0.035398 88.030000 0.065359 88.060000 0.095261 88.090000 0.125077 88.120000 0.154781 88.150000 0.184345 88.180000 0.213744 88.210000 0.242950 88.240000 0.271937 88.270000 0.300680 88.300000 0.329152 88.330000 0.357328 88.360000 0.385183 88.390000 0.412690 88.420000 0.439827 88.450000 0.466567 88.480000 0.492888 88.510000 0.518765 88.540000 0.544175 88.570000 0.569096 88.600000 0.593504 88.630000 0.617378 88.660000 0.640697 88.690000 0.663439 88.720000 0.685584 88.750000 0.707112 88.780000 0.728004 88.810000 0.748240 88.840000 0.767803 88.870000 0.786676 88.900000 0.804840 88.930000 0.822280 88.960000 0.838980 88.990000 0.854925 89.020000 0.870100 89.050000 0.884493 89.080000 0.898089 89.110000 0.910878 89.140000 0.922846 89.170000 0.933984 89.200000 0.944282 89.230000 0.953730 89.260000 0.962319 89.290000 0.970043 89.320000 0.976893 89.350000 0.982864 89.380000 0.987951 89.410000 0.992149 89.440000 0.995454 89.470000 0.997863 89.500000 0.999374 89.530000 0.999985 89.560000 0.999697 89.590000 0.998509 89.620000 0.996423 89.650000 0.993440 89.680000 0.989562 89.710000 0.984794 89.740000 0.979140 89.770000 0.972605 89.800000 0.965195 89.830000 0.956916 89.860000 0.947775 89.890000 0.937782 89.920000 0.926945 89.950000 0.915274 89.980000 0.902779 90.010000 0.889471 90.040000 0.875363 90.070000 0.860468 90.100000 0.844798 90.130000 0.828367 90.160000 0.811192 90.190000 0.793286 90.220000 0.774666 90.250000 0.755349 90.280000 0.735353 90.310000 0.714694 90.340000 0.693393 90.370000 0.671467 90.400000 0.648937 90.430000 0.625824 90.460000 0.602147 90.490000 0.577928 90.520000 0.553189 90.550000 0.527952 90.580000 0.502240 90.610000 0.476076 90.640000 0.449483 90.670000 0.422487 90.700000 0.395109 90.730000 0.367377 90.760000 0.339313 90.790000 0.310945 90.820000 0.282296 90.850000 0.253394 90.880000 0.224263 90.910000 0.194931 90.940000 0.165423 90.970000 0.135766 91.000000 0.105988 91.030000 0.076113 91.060000 0.046171 91.090000 0.016186 91.120000 -0.013813 91.150000 -0.043799 91.180000 -0.073746 91.210000 -0.103627 91.240000 -0.133414 91.270000 -0.163081 91.300000 -0.192602 91.330000 -0.221949 91.360000 -0.251097 91.390000 -0.280018 91.420000 -0.308688 91.450000 -0.337079 91.480000 -0.365168 91.510000 -0.392928 91.540000 -0.420334 91.570000 -0.447362 91.600000 -0.473987 91.630000 -0.500186 91.660000 -0.525934 91.690000 -0.551209 91.720000 -0.575989 91.750000 -0.600250 91.780000 -0.623970 91.810000 -0.647129 91.840000 -0.669706 91.870000 -0.691680 91.900000 -0.713032 91.930000 -0.733742 91.960000 -0.753791 91.990000 -0.773163 92.020000 -0.791838 92.050000 -0.809801 92.080000 -0.827035 92.110000 -0.843525 92.140000 -0.859256 92.170000 -0.874213 92.200000 -0.888384 92.230000 -0.901755 92.260000 -0.914315 92.290000 -0.926052 92.320000 -0.936955 92.350000 -0.947016 92.380000 -0.956224 92.410000 -0.964571 92.440000 -0.972051 92.470000 -0.978655 92.500000 -0.984379 92.530000 -0.989217 92.560000 -0.993165 92.590000 -0.996219 92.620000 -0.998377 92.650000 -0.999636 92.680000 -0.999995 92.710000 -0.999455 92.740000 -0.998015 92.770000 -0.995677 92.800000 -0.992443 92.830000 -0.988316 92.860000 -0.983299 92.890000 -0.977398 92.920000 -0.970616 92.950000 -0.962962 92.980000 -0.954441 93.010000 -0.945060 93.040000 -0.934830 93.070000 -0.923758 93.100000 -0.911855 93.130000 -0.899131 93.160000 -0.885598 93.190000 -0.871268 93.220000 -0.856154 93.250000 -0.840269 93.280000 -0.823628 93.310000 -0.806247 93.340000 -0.788139 93.370000 -0.769322 93.400000 -0.749813 93.430000 -0.729629 93.460000 -0.708789 93.490000 -0.687310 93.520000 -0.665213 93.550000 -0.642518 93.580000 -0.619244 93.610000 -0.595413 93.640000 -0.571046 93.670000 -0.546165 93.700000 -0.520793 93.730000 -0.494952 93.760000 -0.468666 93.790000 -0.441957 93.820000 -0.414852 93.850000 -0.387372 93.880000 -0.359544 93.910000 -0.331393 93.940000 -0.302943 93.970000 -0.274221 94.000000 -0.245252 94.030000 -0.216062 94.060000 -0.186678 94.090000 -0.157126 94.120000 -0.127432 94.150000 -0.097624 94.180000 -0.067728 94.210000 -0.037771 94.240000 -0.007780 94.270000 0.022219 94.300000 0.052197 94.330000 0.082128 94.360000 0.111985 94.390000 0.141741 94.420000 0.171370 94.450000 0.200845 94.480000 0.230139 94.510000 0.259226 94.540000 0.288079 94.570000 0.316673 94.600000 0.344983 94.630000 0.372982 94.660000 0.400645 94.690000 0.427947 94.720000 0.454865 94.750000 0.481373 94.780000 0.507448 94.810000 0.533066 94.840000 0.558205 94.870000 0.582841 94.900000 0.606953 94.930000 0.630518 94.960000 0.653516 94.990000 0.675926 95.020000 0.697728 95.050000 0.718901 95.080000 0.739428 95.110000 0.759289 95.140000 0.778467 95.170000 0.796945 95.200000 0.814705 95.230000 0.831732 95.260000 0.848011 95.290000 0.863526 95.320000 0.878264 95.350000 0.892212 95.380000 0.905357 95.410000 0.917688 95.440000 0.929192 95.470000 0.939860 95.500000 0.949682 95.530000 0.958650 95.560000 0.966755 95.590000 0.973990 95.620000 0.980349 95.650000 0.985825 95.680000 0.990414 95.710000 0.994111 95.740000 0.996914 95.770000 0.998820 95.800000 0.999827 95.830000 0.999935 95.860000 0.999142 95.890000 0.997450 95.920000 0.994861 95.950000 0.991376 95.980000 0.986999 96.010000 0.981734 96.040000 0.975586 96.070000 0.968559 96.100000 0.960661 96.130000 0.951898 96.160000 0.942279 96.190000 0.931811 96.220000 0.920506 96.250000 0.908371 96.280000 0.895419 96.310000 0.881662 96.340000 0.867111 96.370000 0.851779 96.400000 0.835681 96.430000 0.818831 96.460000 0.801244 96.490000 0.782937 96.520000 0.763924 96.550000 0.744224 96.580000 0.723854 96.610000 0.702833 96.640000 0.681179 96.670000 0.658913 96.700000 0.636053 96.730000 0.612621 96.760000 0.588637 96.790000 0.564124 96.820000 0.539103 96.850000 0.513597 96.880000 0.487629 96.910000 0.461222 96.940000 0.434400 96.970000 0.407187 97.000000 0.379608 97.030000 0.351687 97.060000 0.323449 97.090000 0.294920 97.120000 0.266126 97.150000 0.237093 97.180000 0.207846 97.210000 0.178412 97.240000 0.148817 97.270000 0.119089 97.300000 0.089253 97.330000 0.059337 97.360000 0.029368 97.390000 -0.000628 97.420000 -0.030623 97.450000 -0.060591 97.480000 -0.090504 97.510000 -0.120335 97.540000 -0.150059 97.570000 -0.179647 97.600000 -0.209074 97.630000 -0.238312 97.660000 -0.267336 97.690000 -0.296120 97.720000 -0.324637 97.750000 -0.352862 97.780000 -0.380769 97.810000 -0.408334 97.840000 -0.435531 97.870000 -0.462336 97.900000 -0.488725 97.930000 -0.514674 97.960000 -0.540160 97.990000 -0.565160 98.020000 -0.589652 98.050000 -0.613613 98.080000 -0.637021 98.110000 -0.659856 98.140000 -0.682098 98.170000 -0.703726 98.200000 -0.724720 98.230000 -0.745062 98.260000 -0.764734 98.290000 -0.783717 98.320000 -0.801995 98.350000 -0.819551 98.380000 -0.836370 98.410000 -0.852436 98.440000 -0.867735 98.470000 -0.882254 98.500000 -0.895978 98.530000 -0.908895 98.560000 -0.920995 98.590000 -0.932266 98.620000 -0.942698 98.650000 -0.952282 98.680000 -0.961009 98.710000 -0.968871 98.740000 -0.975861 98.770000 -0.981972 98.800000 -0.987200 98.830000 -0.991540 98.860000 -0.994987 98.890000 -0.997539 98.920000 -0.999193 98.950000 -0.999948 98.980000 -0.999803 99.010000 -0.998759 99.040000 -0.996815 99.070000 -0.993975 99.100000 -0.990240 99.130000 -0.985613 99.160000 -0.980100 99.190000 -0.973705 99.220000 -0.966433 99.250000 -0.958292 99.280000 -0.949288 99.310000 -0.939431 99.340000 -0.928727 99.370000 -0.917188 99.400000 -0.904823 99.430000 -0.891645 99.460000 -0.877663 99.490000 -0.862892 99.520000 -0.847345 99.550000 -0.831034 99.580000 -0.813976 99.610000 -0.796186 99.640000 -0.777679 99.670000 -0.758472 99.700000 -0.738582 99.730000 -0.718028 99.760000 -0.696828 99.790000 -0.675000 99.820000 -0.652565 99.850000 -0.629543 99.880000 -0.605954 99.910000 -0.581820 99.940000 -0.557163 99.970000 -0.532003 jgraph/sin3.jgr0000777005471000040510000000116611447702136012547 0ustar plankloci(* This is the same as sin.jgr only a different include file of points is used: This one orders the points by ascending y value instead of ascending x value. The graph looks quite different *) newgraph yaxis min -1 max 1 label : sin(i) xaxis min -10 max 10 label : i (* Plot the sin curve *) curve 1 marktype none linetype solid pts include sin3.pts (* sin.pts was created by the following c program: #include main(); { double x; for (x = -10.0; x < 10.0; x += .03) printf("%f %f\n", x, sin(x)); } * and then the output was piped through sort -n +1 *) jgraph/sin3.pts0000777005471000040510000003060111447702136012567 0ustar plankloci-1.570000 -1.000000 4.700000 -0.999923 -7.840000 -0.999902 -7.870000 -0.999872 4.730000 -0.999845 -1.600000 -0.999574 -1.540000 -0.999526 4.670000 -0.999102 -7.810000 -0.999033 -7.900000 -0.998941 4.760000 -0.998867 -1.630000 -0.998248 -1.510000 -0.998152 4.640000 -0.997381 -7.780000 -0.997265 -7.930000 -0.997112 4.790000 -0.996990 -1.660000 -0.996024 -1.480000 -0.995881 4.610000 -0.994763 -7.750000 -0.994599 -7.960000 -0.994385 4.820000 -0.994216 -1.690000 -0.992904 -1.450000 -0.992713 4.580000 -0.991249 -7.720000 -0.991038 -7.990000 -0.990764 4.850000 -0.990547 -1.720000 -0.988890 -1.420000 -0.988652 4.550000 -0.986844 -7.690000 -0.986585 -8.020000 -0.986251 4.880000 -0.985986 -1.750000 -0.983986 -1.390000 -0.983701 4.520000 -0.981550 -7.660000 -0.981244 -8.050000 -0.980850 4.910000 -0.980538 -1.780000 -0.978197 -1.360000 -0.977865 4.490000 -0.975373 -7.630000 -0.975021 -8.080000 -0.974566 4.940000 -0.974208 -1.810000 -0.971527 -1.330000 -0.971148 4.460000 -0.968319 -7.600000 -0.967920 -8.110000 -0.967406 4.970000 -0.967001 -1.840000 -0.963983 -1.300000 -0.963558 4.430000 -0.960392 -7.570000 -0.959947 -8.140000 -0.959375 5.000000 -0.958924 -1.870000 -0.955572 -1.270000 -0.955101 4.400000 -0.951602 -7.540000 -0.951111 -8.170000 -0.950480 5.030000 -0.949984 -1.900000 -0.946300 -1.240000 -0.945784 4.370000 -0.941955 -7.510000 -0.941419 -8.200000 -0.940731 5.060000 -0.940189 -1.930000 -0.936177 -1.210000 -0.935616 4.340000 -0.931461 -7.480000 -0.930880 -8.230000 -0.930134 5.090000 -0.929548 -1.960000 -0.925212 -1.180000 -0.924606 4.310000 -0.920128 -7.450000 -0.919503 -8.260000 -0.918701 5.120000 -0.918070 -1.990000 -0.913413 -1.150000 -0.912764 4.280000 -0.907967 -7.420000 -0.907299 -8.290000 -0.906440 5.150000 -0.905767 -2.020000 -0.900793 -1.120000 -0.900100 4.250000 -0.894989 -7.390000 -0.894278 -8.320000 -0.893364 5.180000 -0.892648 -2.050000 -0.887362 -1.090000 -0.886627 4.220000 -0.881206 -7.360000 -0.880452 -8.350000 -0.879484 5.210000 -0.878725 -2.080000 -0.873133 -1.060000 -0.872355 4.190000 -0.866630 -7.330000 -0.865834 -8.380000 -0.864813 5.240000 -0.864012 -2.110000 -0.858118 -1.030000 -0.857299 4.160000 -0.851273 -7.300000 -0.850437 -8.410000 -0.849363 5.270000 -0.848522 -2.140000 -0.842330 -1.000000 -0.841471 4.130000 -0.835151 -7.270000 -0.834274 -8.440000 -0.833149 5.300000 -0.832267 -2.170000 -0.825785 -0.970000 -0.824886 4.100000 -0.818277 -7.240000 -0.817361 -8.470000 -0.816185 5.330000 -0.815264 -2.200000 -0.808496 -0.940000 -0.807558 4.070000 -0.800667 -7.210000 -0.799712 -8.500000 -0.798487 5.360000 -0.797527 -2.230000 -0.790480 -0.910000 -0.789504 4.040000 -0.782336 -7.180000 -0.781343 -8.530000 -0.780070 5.390000 -0.779073 -2.260000 -0.771753 -0.880000 -0.770739 4.010000 -0.763301 -7.150000 -0.762271 -8.560000 -0.760951 5.420000 -0.759917 -2.290000 -0.752331 -0.850000 -0.751280 3.980000 -0.743579 -7.120000 -0.742513 -8.590000 -0.741147 5.450000 -0.740077 -2.320000 -0.732231 -0.820000 -0.731146 3.950000 -0.723188 -7.090000 -0.722087 -8.620000 -0.720677 5.480000 -0.719572 -2.350000 -0.711473 -0.790000 -0.710353 3.920000 -0.702146 -7.060000 -0.701011 -8.650000 -0.699557 5.510000 -0.698418 -2.380000 -0.690075 -0.760000 -0.688921 3.890000 -0.680473 -7.030000 -0.679305 -8.680000 -0.677809 5.540000 -0.676637 -2.410000 -0.668056 -0.730000 -0.666870 3.860000 -0.658186 -7.000000 -0.656987 -8.710000 -0.655450 5.570000 -0.654246 -2.440000 -0.645435 -0.700000 -0.644218 3.830000 -0.635308 -6.970000 -0.634077 -8.740000 -0.632501 5.600000 -0.631267 -2.470000 -0.622234 -0.670000 -0.620986 3.800000 -0.611858 -6.940000 -0.610597 -8.770000 -0.608983 5.630000 -0.607719 -2.500000 -0.598472 -0.640000 -0.597195 3.770000 -0.587857 -6.910000 -0.586568 -8.800000 -0.584917 5.660000 -0.583625 -2.530000 -0.574172 -0.610000 -0.572867 3.740000 -0.563327 -6.880000 -0.562011 -8.830000 -0.560325 5.690000 -0.559005 -2.560000 -0.549355 -0.580000 -0.548024 3.710000 -0.538291 -6.850000 -0.536948 -8.860000 -0.535228 5.720000 -0.533882 9.980000 -0.527132 -2.590000 -0.524044 -0.550000 -0.522687 3.680000 -0.512769 -6.820000 -0.511401 -8.890000 -0.509650 5.750000 -0.508279 9.950000 -0.501405 -2.620000 -0.498262 -0.520000 -0.496880 3.650000 -0.486787 -6.790000 -0.485395 -8.920000 -0.483613 5.780000 -0.482218 9.920000 -0.475227 -2.650000 -0.472031 -0.490000 -0.470626 3.620000 -0.460366 -6.760000 -0.458951 -8.950000 -0.457141 5.810000 -0.455724 9.890000 -0.448621 -2.680000 -0.445375 -0.460000 -0.443948 3.590000 -0.433531 -6.730000 -0.432095 -8.980000 -0.430257 5.840000 -0.428819 9.860000 -0.421612 -2.710000 -0.418318 -0.430000 -0.416871 3.560000 -0.406306 -6.700000 -0.404850 -9.010000 -0.402987 5.870000 -0.401529 9.830000 -0.394223 -2.740000 -0.390885 -0.400000 -0.389418 3.530000 -0.378715 -6.670000 -0.377240 -9.040000 -0.375353 5.900000 -0.373877 9.800000 -0.366479 -2.770000 -0.363100 -0.370000 -0.361615 3.500000 -0.350783 -6.640000 -0.349291 -9.070000 -0.347382 5.930000 -0.345888 9.770000 -0.338406 -2.800000 -0.334988 -0.340000 -0.333487 3.470000 -0.322536 -6.610000 -0.321028 -9.100000 -0.319098 5.960000 -0.317589 9.740000 -0.310028 -2.830000 -0.306575 -0.310000 -0.305059 3.440000 -0.293998 -6.580000 -0.292476 -9.130000 -0.290527 5.990000 -0.289003 9.710000 -0.281371 -2.860000 -0.277886 -0.280000 -0.276356 3.410000 -0.265196 -6.550000 -0.263660 -9.160000 -0.261695 6.020000 -0.260157 9.680000 -0.252460 -2.890000 -0.248947 -0.250000 -0.247404 3.380000 -0.236155 -6.520000 -0.234607 -9.190000 -0.232627 6.050000 -0.231078 9.650000 -0.223323 -2.920000 -0.219784 -0.220000 -0.218230 3.350000 -0.206902 -6.490000 -0.205344 -9.220000 -0.203350 6.080000 -0.201790 9.620000 -0.193984 -2.950000 -0.190423 -0.190000 -0.188859 3.320000 -0.177462 -6.460000 -0.175895 -9.250000 -0.173889 6.110000 -0.172321 9.590000 -0.164471 -2.980000 -0.160890 -0.160000 -0.159318 3.290000 -0.147863 -6.430000 -0.146288 -9.280000 -0.144273 6.140000 -0.142697 9.560000 -0.134810 -3.010000 -0.131213 -0.130000 -0.129634 3.260000 -0.118131 -6.400000 -0.116549 -9.310000 -0.114526 6.170000 -0.112944 9.530000 -0.105028 -3.040000 -0.101418 -0.100000 -0.099833 3.230000 -0.088292 -6.370000 -0.086706 -9.340000 -0.084676 6.200000 -0.083089 9.500000 -0.075151 -3.070000 -0.071532 -0.070000 -0.069943 3.200000 -0.058374 -6.340000 -0.056784 -9.370000 -0.054751 6.230000 -0.053160 9.470000 -0.045207 -3.100000 -0.041581 -0.040000 -0.039989 3.170000 -0.028404 -6.310000 -0.026811 -9.400000 -0.024775 6.260000 -0.023183 9.440000 -0.015221 -3.130000 -0.011592 -0.010000 -0.010000 3.140000 0.001593 -6.280000 0.003185 -9.430000 0.005222 6.290000 0.006815 9.410000 0.014777 -3.160000 0.018406 0.020000 0.019999 3.110000 0.031587 -6.250000 0.033179 -9.460000 0.035215 6.320000 0.036806 9.380000 0.044763 -3.190000 0.048388 0.050000 0.049979 3.080000 0.061554 -6.220000 0.063143 -9.490000 0.065176 6.350000 0.066765 9.350000 0.074708 -3.220000 0.078327 0.080000 0.079915 3.050000 0.091465 -6.190000 0.093051 -9.520000 0.095078 6.380000 0.096664 9.320000 0.104586 -3.250000 0.108195 0.110000 0.109778 3.020000 0.121293 -6.160000 0.122874 -9.550000 0.124895 6.410000 0.126475 9.290000 0.134370 -3.280000 0.137966 0.140000 0.139543 2.990000 0.151013 -6.130000 0.152587 -9.580000 0.154599 6.440000 0.156173 9.260000 0.164033 -3.310000 0.167612 0.170000 0.169182 2.960000 0.180596 -6.100000 0.182163 -9.610000 0.184165 6.470000 0.185730 9.230000 0.193549 -3.340000 0.197108 0.200000 0.198669 2.930000 0.210017 -6.070000 0.211574 -9.640000 0.213564 6.500000 0.215120 9.200000 0.222890 -3.370000 0.226427 0.230000 0.227978 2.900000 0.239249 -6.040000 0.240795 -9.670000 0.242772 6.530000 0.244316 9.170000 0.252031 -3.400000 0.255541 0.260000 0.257081 2.870000 0.268266 -6.010000 0.269800 -9.700000 0.271761 6.560000 0.273293 9.140000 0.280944 -3.430000 0.284426 0.290000 0.285952 2.840000 0.297041 -5.980000 0.298562 -9.730000 0.300505 6.590000 0.302024 9.110000 0.309605 -3.460000 0.313054 0.320000 0.314567 2.810000 0.325549 -5.950000 0.327055 -9.760000 0.328979 6.620000 0.330482 9.080000 0.337988 -3.490000 0.341401 0.350000 0.342898 2.780000 0.353764 -5.920000 0.355254 -9.790000 0.357157 6.650000 0.358644 9.050000 0.366066 -3.520000 0.369441 0.380000 0.370920 2.750000 0.381661 -5.890000 0.383133 -9.820000 0.385013 6.680000 0.386483 9.020000 0.393815 -3.550000 0.397148 0.410000 0.398609 2.720000 0.409214 -5.860000 0.410667 -9.850000 0.412523 6.710000 0.413973 8.990000 0.421209 -3.580000 0.424498 0.440000 0.425939 2.690000 0.436399 -5.830000 0.437832 -9.880000 0.439662 6.740000 0.441092 8.960000 0.448224 -3.610000 0.451466 0.470000 0.452886 2.660000 0.463191 -5.800000 0.464602 -9.910000 0.466405 6.770000 0.467813 8.930000 0.474836 -3.640000 0.478027 0.500000 0.479426 2.630000 0.489567 -5.770000 0.490955 -9.940000 0.492728 6.800000 0.494113 8.900000 0.501021 -3.670000 0.504159 0.530000 0.505533 2.600000 0.515501 -5.740000 0.516865 -9.970000 0.518608 6.830000 0.519969 8.870000 0.526755 -3.700000 0.529836 0.560000 0.531186 2.570000 0.540972 -5.710000 0.542311 -10.000000 0.544021 6.860000 0.545357 8.840000 0.552014 -3.730000 0.555037 0.590000 0.556361 2.540000 0.565956 -5.680000 0.567269 6.890000 0.570254 8.810000 0.576777 -3.760000 0.579738 0.620000 0.581035 2.510000 0.590431 -5.650000 0.591716 6.920000 0.594637 8.780000 0.601021 -3.790000 0.603918 0.650000 0.605186 2.480000 0.614374 -5.620000 0.615630 6.950000 0.618486 8.750000 0.624724 -3.820000 0.627554 0.680000 0.628793 2.450000 0.637765 -5.590000 0.638991 6.980000 0.641778 8.720000 0.647865 -3.850000 0.650625 0.710000 0.651834 2.420000 0.660581 -5.560000 0.661776 7.010000 0.664493 8.690000 0.670422 -3.880000 0.673111 0.740000 0.674288 2.390000 0.682803 -5.530000 0.683966 7.040000 0.686609 8.660000 0.692377 -3.910000 0.694991 0.770000 0.696135 2.360000 0.704411 -5.500000 0.705540 7.070000 0.708108 8.630000 0.713708 -3.940000 0.716246 0.800000 0.717356 2.330000 0.725384 -5.470000 0.726480 7.100000 0.728969 8.600000 0.734397 -3.970000 0.736856 0.830000 0.737931 2.300000 0.745705 -5.440000 0.746765 7.130000 0.749174 8.570000 0.754425 -4.000000 0.756802 0.860000 0.757843 2.270000 0.765355 -5.410000 0.766379 7.160000 0.768705 8.540000 0.773774 -4.030000 0.776068 0.890000 0.777072 2.240000 0.784316 -5.380000 0.785303 7.190000 0.787545 8.510000 0.792427 -4.060000 0.794636 0.920000 0.795602 2.210000 0.802571 -5.350000 0.803520 7.220000 0.805675 8.480000 0.810367 -4.090000 0.812488 0.950000 0.813416 2.180000 0.820104 -5.320000 0.821014 7.250000 0.823081 8.450000 0.827577 -4.120000 0.829609 0.980000 0.830497 2.150000 0.836899 -5.290000 0.837769 7.280000 0.839746 8.420000 0.844043 -4.150000 0.845984 1.010000 0.846832 2.120000 0.852940 -5.260000 0.853771 7.310000 0.855655 8.390000 0.859749 -4.180000 0.861597 1.040000 0.862404 2.090000 0.868215 -5.230000 0.869004 7.340000 0.870794 8.360000 0.874681 -4.210000 0.876435 1.070000 0.877201 2.060000 0.882707 -5.200000 0.883455 7.370000 0.885149 8.330000 0.888827 -4.240000 0.890484 1.100000 0.891207 2.030000 0.896406 -5.170000 0.897111 7.400000 0.898708 8.300000 0.902172 -4.270000 0.903732 1.130000 0.904412 2.000000 0.909297 -5.140000 0.909959 7.430000 0.911458 8.270000 0.914705 -4.300000 0.916166 1.160000 0.916803 1.970000 0.921371 -5.110000 0.921989 7.460000 0.923388 8.240000 0.926415 -4.330000 0.927776 1.190000 0.928369 1.940000 0.932615 -5.080000 0.933189 7.490000 0.934487 8.210000 0.937292 -4.360000 0.938551 1.220000 0.939099 1.910000 0.943020 -5.050000 0.943549 7.520000 0.944745 8.180000 0.947325 -4.390000 0.948481 1.250000 0.948985 1.880000 0.952576 -5.020000 0.953060 7.550000 0.954152 8.150000 0.956506 -4.420000 0.957558 1.280000 0.958016 1.850000 0.961275 -4.990000 0.961713 7.580000 0.962701 8.120000 0.964825 -4.450000 0.965773 1.310000 0.966185 1.820000 0.969109 -4.960000 0.969501 7.610000 0.970384 8.090000 0.972277 -4.480000 0.973119 1.340000 0.973485 1.790000 0.976071 -4.930000 0.976416 7.640000 0.977193 8.060000 0.978853 -4.510000 0.979589 1.370000 0.979908 1.760000 0.982154 -4.900000 0.982453 7.670000 0.983123 8.030000 0.984549 -4.540000 0.985178 1.400000 0.985450 1.730000 0.987354 -4.870000 0.987605 7.700000 0.988168 8.000000 0.989358 -4.570000 0.989880 1.430000 0.990105 1.700000 0.991665 -4.840000 0.991869 7.730000 0.992324 7.970000 0.993277 -4.600000 0.993691 1.460000 0.993868 1.670000 0.995083 -4.810000 0.995240 7.760000 0.995587 7.940000 0.996303 -4.630000 0.996608 1.490000 0.996738 1.640000 0.997606 -4.780000 0.997715 7.790000 0.997954 7.910000 0.998431 -4.660000 0.998628 1.520000 0.998710 1.610000 0.999232 -4.750000 0.999293 7.820000 0.999423 7.880000 0.999662 -4.690000 0.999749 1.550000 0.999784 1.580000 0.999958 -4.720000 0.999971 7.850000 0.999992 jgraph/tree.awk0000777005471000040510000000243511447702136012632 0ustar plankloci# This is an nawk script for plotting m-level n-ary trees in jgraph. # For each line of input, it will produce a new jgraph. The line must # contain two numbers: m and n, separated by white-space. # # Two nice outputs of this are: # # ( echo "4 3" | nawk -f tree.awk ; echo "xaxis size 5.4" ) | jgraph -P # # and # ( echo "5 2" | nawk -f tree.awk ; echo "xaxis size 5" ) | jgraph -P # { m = $1 n = $2 printf("newgraph xaxis nodraw yaxis nodraw\n") k = 0 for (j = 0; j < m; j++) { if (j == 0) { numleaves = n ^ (m - 1) for (i = 0; i < numleaves; i++) newleafloc[i] = i } else { numleaves = numleaves / n for (i = 0; i < numleaves; i++) { newleafloc[i] = (oldleafloc[i*n] + oldleafloc[i*n+n-1]) / 2.0 } } for (i = 0; i < numleaves; i++) { printf("newcurve marktype box marksize 0.6 0.4 fill 1 pts %f %f\n", newleafloc[i], j) printf("newstring x %f y %f hjc vjc fontsize 6 : %d\n", newleafloc[i], j, ++k) if (j > 0) { for (l = 0; l < n; l++) { printf("newcurve marktype none linetype solid pts %f %f %f %f\n", newleafloc[i], j-.2, oldleafloc[i*n+l], j-.8) } } } for (i = 0; i < numleaves; i++) { oldleafloc[i] = newleafloc[i] } } } jgraph/wortman.jgr0000777005471000040510000005374711447702134013374 0ustar plankloci(* From dw@dragon.fly.toronto.edu Fri Jul 17 12:02:25 1992 Received: from Princeton.EDU by fs.Princeton.EDU (4.1/1.105) id AA19140; Fri, 17 Jul 92 12:02:22 EDT Received: from dragon.fly.toronto.edu by Princeton.EDU (5.65b/2.93/princeton) id AA18519; Fri, 17 Jul 92 12:01:51 -0400 Received: by dragon.fly.toronto.edu id <39023>; Fri, 17 Jul 1992 12:01:33 -0400 From: Dave Wortman To: jsp@Princeton.EDU Subject: jgraph source for Wortman PLDI92 activity bar figure Cc: dw@dragon.fly.toronto.edu Message-Id: <92Jul17.120133edt.39023@dragon.fly.toronto.edu> Date: Fri, 17 Jul 1992 12:01:32 -0400 Status: R Here is the source for the final version of the figure. FYI it was generated by an awk program that post processed trace data generated by the concurrent compiler. ============================================================================ *) newgraph yaxis size 7.5 min 0 max 8.500000 gray 0.000000 hash 0.0 label fontsize 16 : Processor hash_labels fontsize 18 hash_label at 1.0 : 1 hash_label at 2.0 : 2 hash_label at 3.0 : 3 hash_label at 4.0 : 4 hash_label at 5.0 : 5 hash_label at 6.0 : 6 hash_label at 7.0 : 7 hash_label at 8.0 : 8 xaxis size 7.5 min 0 max 4232 gray 0 label fontsize 16 : Time (clock ticks) legend custom linelength 500.0 newcurve marktype box fill 0.2 marksize 300.0 0.4 label vjt hjl x 500.0 y -1.0 fontsize 12 : Lexical Analysis newcurve marktype box fill 0.5 marksize 300.0 0.4 label vjt hjl x 500.0 y -1.5 fontsize 12 : Import newcurve marktype box fill 0.95 marksize 300.0 0.4 label vjt hjl x 1800.0 y -1.0 fontsize 12 : Splitter newcurve marktype box fill 0.7 marksize 300.0 0.4 label vjt hjl x 1800.0 y -1.5 fontsize 12 : Parse/Dcl Analysis newcurve marktype box fill 0.4 marksize 300.0 0.4 label vjt hjl x 3100.0 y -1.0 fontsize 12 : Stmt Processing newcurve marktype box fill 0.8 marksize 300.0 0.4 label vjt hjl x 3100.0 y -1.5 fontsize 12 : Merge newcurve marktype box fill 0.200000 linethickness 0.0 marksize 1350 0.400000 pts 714 1 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 53 0.400000 pts 1651 1.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 28 0.400000 pts 1693 1.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 183 0.400000 pts 1799 1.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 36 0.400000 pts 1911 1.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 71 0.400000 pts 1966 1.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 30 0.400000 pts 2018 1.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 782 0.400000 pts 2426 1.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 101 0.400000 pts 2868 1.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 63 0.400000 pts 2950 1.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 140 0.400000 pts 3054 1.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 159 0.400000 pts 3204 1.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 99 0.400000 pts 3334 1.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 181 0.400000 pts 3475 1.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 64 0.400000 pts 3599 1.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 135 0.400000 pts 3699 1.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 368 0.400000 pts 3953 1.000000 newcurve marktype box fill 0.800000 linethickness 0.0 marksize 72 0.400000 pts 4174 1.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 114 0.400000 pts 154 2 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 91 0.400000 pts 256 2 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 101 0.400000 pts 354 2 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 8 0.400000 pts 411 2.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 8 0.400000 pts 420 2.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 9 0.400000 pts 429 2.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 25 0.400000 pts 447 2.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 50 0.400000 pts 485 2 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 8 0.400000 pts 515 2.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 6 0.400000 pts 522 2.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 28 0.400000 pts 539 2.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 59 0.400000 pts 583 2 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 70 0.400000 pts 650 2 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 6 0.400000 pts 689 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 82 0.400000 pts 737 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 110 0.400000 pts 835 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 67 0.400000 pts 1249 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 30 0.400000 pts 1655 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 16 0.400000 pts 1679 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 33 0.400000 pts 1704 2.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 80 0.400000 pts 1765 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 16 0.400000 pts 1816 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 10 0.400000 pts 1830 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 6 0.400000 pts 1839 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 7 0.400000 pts 1847 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 9 0.400000 pts 1855 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 33 0.400000 pts 1877 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 15 0.400000 pts 1902 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 18 0.400000 pts 1921 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 31 0.400000 pts 1946 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 54 0.400000 pts 1992 2.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 61 0.400000 pts 2051 2.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 916 0.400000 pts 2542 2.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 144 0.400000 pts 3073 2.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 178 0.400000 pts 3235 2.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 181 0.400000 pts 3415 2.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 147 0.400000 pts 3581 2.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 137 0.400000 pts 3724 2.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 44 0.400000 pts 149 3.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 142 0.400000 pts 243 3 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 5 0.400000 pts 317 3.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 105 0.400000 pts 372 3 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 5 0.400000 pts 428 3.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 67 0.400000 pts 465 3 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 9 0.400000 pts 504 3.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 82 0.400000 pts 550 3 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 74 0.400000 pts 631 3 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 6 0.400000 pts 672 3.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 41 0.400000 pts 696 3 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 28 0.400000 pts 732 3.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 17 0.400000 pts 755 3.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 72 0.400000 pts 802 3.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 25 0.400000 pts 852 3.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 8 0.400000 pts 872 3.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 2 0.400000 pts 1328 3.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 538 0.400000 pts 1792 3.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 840 0.400000 pts 2486 3.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 486 0.400000 pts 3150 3.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 178 0.400000 pts 3484 3.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 54 0.400000 pts 3602 3.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 121 0.400000 pts 3690 3.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 176 0.400000 pts 3840 3.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 174 0.400000 pts 226 4 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 6 0.400000 pts 317 4.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 11 0.400000 pts 327 4.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 42 0.400000 pts 355 4 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 79 0.400000 pts 416 4 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 73 0.400000 pts 494 4 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 73 0.400000 pts 568 4 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 48 0.400000 pts 630 4 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 6 0.400000 pts 658 4.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 16 0.400000 pts 670 4.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 8 0.400000 pts 683 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 35 0.400000 pts 705 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 25 0.400000 pts 736 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 3 0.400000 pts 751 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 15 0.400000 pts 763 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 48 0.400000 pts 798 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 9 0.400000 pts 828 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 27 0.400000 pts 849 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 59 0.400000 pts 893 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 26 0.400000 pts 1645 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 14 0.400000 pts 1667 4.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 120 0.400000 pts 1736 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 12 0.400000 pts 1803 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 21 0.400000 pts 1819 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 6 0.400000 pts 1834 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 7 0.400000 pts 1841 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 9 0.400000 pts 1852 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 6 0.400000 pts 1861 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 12 0.400000 pts 1871 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 22 0.400000 pts 1889 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 16 0.400000 pts 1909 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 8 0.400000 pts 1921 4.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 109 0.400000 pts 1980 4.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 765 0.400000 pts 2419 4.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 283 0.400000 pts 2945 4.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 190 0.400000 pts 3184 4.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 272 0.400000 pts 3417 4.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 55 0.400000 pts 3582 4.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 112 0.400000 pts 3667 4.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 65 0.400000 pts 3757 4.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 448 0.400000 pts 365 5 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 70 0.400000 pts 625 5 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 13 0.400000 pts 669 5.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 6 0.400000 pts 681 5.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 6 0.400000 pts 688 5.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 7 0.400000 pts 695 5.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 10 0.400000 pts 709 5.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 84 0.400000 pts 819 5.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 33 0.400000 pts 879 5.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 18 0.400000 pts 1663 5.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 152 0.400000 pts 1749 5.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 10 0.400000 pts 1831 5.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 9 0.400000 pts 1841 5.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 95 0.400000 pts 1894 5.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 12 0.400000 pts 1948 5.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 15 0.400000 pts 1962 5.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 123 0.400000 pts 2032 5.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 849 0.400000 pts 2519 5.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 544 0.400000 pts 3218 5.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 145 0.400000 pts 3564 5.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 103 0.400000 pts 3689 5.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 119 0.400000 pts 3801 5.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 282 0.400000 pts 287 6 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 5 0.400000 pts 431 6.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 5 0.400000 pts 437 6.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 6 0.400000 pts 444 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 4 0.400000 pts 452 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 9 0.400000 pts 463 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 41 0.400000 pts 491 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 11 0.400000 pts 519 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 12 0.400000 pts 533 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 150 0.400000 pts 616 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 9 0.400000 pts 697 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 54 0.400000 pts 732 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 455 0.400000 pts 988 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 108 0.400000 pts 1273 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 67 0.400000 pts 1362 6.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 270 0.400000 pts 1793 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 18 0.400000 pts 1938 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 46 0.400000 pts 1970 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 20 0.400000 pts 2003 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 8 0.400000 pts 2018 6.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 10 0.400000 pts 2028 6.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 395 0.400000 pts 2231 6.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 514 0.400000 pts 2688 6.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 127 0.400000 pts 3009 6.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 243 0.400000 pts 3196 6.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 64 0.400000 pts 3352 6.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 122 0.400000 pts 3445 6.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 153 0.400000 pts 3583 6.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 99 0.400000 pts 3710 6.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 79 0.400000 pts 3800 6.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 132 0.400000 pts 216 7 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 194 0.400000 pts 380 7 newcurve marktype box fill 0.950000 linethickness 0.0 marksize 913 0.400000 pts 934 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 33 0.400000 pts 1681 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 10 0.400000 pts 1704 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 14 0.400000 pts 1717 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 131 0.400000 pts 1789 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 13 0.400000 pts 1862 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 14 0.400000 pts 1877 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 20 0.400000 pts 1894 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 16 0.400000 pts 1913 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 7 0.400000 pts 1925 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 30 0.400000 pts 1945 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 58 0.400000 pts 1990 7.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 53 0.400000 pts 2049 7.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 898 0.400000 pts 2526 7.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 279 0.400000 pts 3118 7.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 137 0.400000 pts 3327 7.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 148 0.400000 pts 3471 7.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 87 0.400000 pts 3590 7.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 49 0.400000 pts 3659 7.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 102 0.400000 pts 3737 7.000000 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 76 0.400000 pts 192 8 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 163 0.400000 pts 312 8 newcurve marktype box fill 0.200000 linethickness 0.0 marksize 26 0.400000 pts 408 8 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 8 0.400000 pts 426 8.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 5 0.400000 pts 433 8.000000 newcurve marktype box fill 0.500000 linethickness 0.0 marksize 8 0.400000 pts 441 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 13 0.400000 pts 452 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 6 0.400000 pts 464 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 71 0.400000 pts 506 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 18 0.400000 pts 553 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 148 0.400000 pts 641 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 60 0.400000 pts 748 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 75 0.400000 pts 816 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 8 0.400000 pts 860 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 13 0.400000 pts 871 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 7 0.400000 pts 1219 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 128 0.400000 pts 1460 8.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 282 0.400000 pts 1811 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 10 0.400000 pts 1958 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 59 0.400000 pts 1995 8.000000 newcurve marktype box fill 0.700000 linethickness 0.0 marksize 80 0.400000 pts 2066 8.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 517 0.400000 pts 2365 8.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 327 0.400000 pts 2788 8.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 460 0.400000 pts 3183 8.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 192 0.400000 pts 3510 8.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 90 0.400000 pts 3652 8.000000 newcurve marktype box fill 0.400000 linethickness 0.0 marksize 137 0.400000 pts 3767 8.000000 jgraph/token.c0000755005471000040510000002337713207321460012450 0ustar plankloci/* token.c * James S. Plank Jgraph - A program for plotting graphs in postscript. * $Source: /Users/plank/src/jgraph/RCS/token.c,v $ * $Revision: 8.5 $ * $Date: 2017/11/28 17:33:27 $ * $Author: plank $ James S. Plank Department of Electrical Engineering and Computer Science University of Tennessee Knoxville, TN 37996 plank@cs.utk.edu Copyright (c) 2011, James S. Plank All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the University of Tennessee nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #ifdef VMS #include #include #endif /* I'm not sure why I have to do this. */ extern FILE *popen(const char *x, const char *y); #include "list.h" void set_input_file(); void error_header(); void ungettokenchar(); void get_comment(); static void push_iostack(); static void pop_iostack(); static void nexttoken(); void rejecttoken(); #define CNULL ((char *)0) typedef struct iostack { struct iostack *flink; struct iostack *blink; char *filename; FILE *stream; int oldcharvalid; char oldchar; char pipe; int line; } *Iostack; static char INPUT[1000]; static int getnew = 1; static char oldchar = '\0'; static oldcharvalid = 0; static char pipe = 0; static int eof = 0; static int init = 0; static Iostack stack; static char real_eof = EOF; static FILE *IOSTREAM; static char FILENAME[300]; static int line = 1; #ifdef VMS /* On VMS, there are no popen() and pclose(), so we provide dummies here. */ FILE *popen(command, type) char *command, *type; { return(NULL); } int pclose(stream) FILE *stream; { return(-1); } #endif /*VMS*/ void set_input_file(char *s) { FILE *f; Iostack n; if (init == 0) { stack = (Iostack) make_list(sizeof(struct iostack)); if (s == CNULL) { IOSTREAM = stdin; strcpy(FILENAME, ""); } else { IOSTREAM = fopen(s, "r"); if (IOSTREAM == NULL) { fprintf(stderr, "Error: cannot open file \"%s\"\n", s); exit(1); } strcpy(FILENAME, s); } init = 1; } else { n = (Iostack) get_node((List) stack); n->stream = NULL; n->filename = (char *) malloc (sizeof(char)*(strlen(s)+2)); strcpy(n->filename, s); n->oldchar = oldchar; n->oldcharvalid = oldcharvalid; n->pipe = pipe; n->line = line; insert((List) n, (List) stack->flink); } } void error_header() { fprintf(stderr, "%s,%d: ", FILENAME, line); } int gettokenchar() { if (oldcharvalid == 0) oldchar = getc(IOSTREAM); oldcharvalid = 0; if (oldchar == '\n') line++; return oldchar; } void ungettokenchar() { oldcharvalid = 1; if (oldchar == '\n') line--; } int gettoken(s) char *s; { int i; char c; for (c = gettokenchar(); c == ' ' || c == '\t' || c == '\n'; c = gettokenchar()) ; for (i = 0; c != real_eof && c != ' ' && c != '\t' && c != '\n'; c = gettokenchar()) { s[i++] = c; } s[i] = '\0'; ungettokenchar(); return i; } void get_comment() { if (eof) return; while (1) { if (gettoken(INPUT) == 0) return; else if (strcmp(INPUT, "(*") == 0) get_comment(); else if (strcmp(INPUT, "*)") == 0) return; } } static int iostackempty() { return (first(stack) == nil(stack)); } static void push_iostack(p) int p; { Iostack n; n = (Iostack) get_node((List) stack); n->stream = IOSTREAM; n->filename = (char *) malloc (sizeof(char)*(strlen(FILENAME)+2)); n->oldchar = oldchar; n->oldcharvalid = oldcharvalid; n->pipe = pipe; n->line = line; strcpy(n->filename, FILENAME); insert((List) n, (List) stack); if (p) { IOSTREAM = popen(INPUT, "r"); } else { IOSTREAM = fopen(INPUT, "r"); } pipe = p; line = 1; if (IOSTREAM == NULL) { error_header(); fprintf(stderr, "Include file \"%s\" does not exist\n", INPUT); exit(1); } strcpy(FILENAME, INPUT); } static void pop_iostack() { Iostack n; fflush(IOSTREAM); if (pipe) { if (pclose(IOSTREAM)) { /*error_header(); fprintf(stderr, "\n\nPipe returned a non-zero error code.\n"); exit(1); */ } } else { fclose(IOSTREAM); } n = last(stack); if (n->stream == NULL) { n->stream = fopen(n->filename, "r"); if (n->stream == NULL) { fprintf(stderr, "Error: cannot open file \"%s\"\n", n->filename); exit(1); } } IOSTREAM = n->stream; strcpy(FILENAME, n->filename); free(n->filename); pipe = n->pipe; line = n->line; oldchar = n->oldchar; oldcharvalid = n->oldcharvalid; delete_item((List) n); free_node((List) n, (List) stack); } static void nexttoken() { if (eof) return; if (getnew) { while (1) { if (gettoken(INPUT) == 0) { if (iostackempty()) { eof = 1; getnew = 0; return; } else { pop_iostack(); } } else if (strcmp(INPUT, "(*") == 0) { get_comment(); } else if (strcmp(INPUT, "include") == 0) { if (gettoken(INPUT) == 0) { error_header(); fprintf(stderr, "Empty include statement\n"); exit(1); } else { push_iostack(0); } } else if (strcmp(INPUT, "shell") == 0) { #ifdef VMS fprintf(stderr, "No shell option on VMS, sorry.\n"); exit(1); #endif /*VMS*/ if (gettoken(INPUT) == 0 || strcmp(INPUT, ":") != 0) { error_header(); fprintf(stderr, "'shell' must be followed by ':'\n"); exit(1); } if (getsystemstring() == 0) { fprintf(stderr, "Empty shell statement\n"); exit(1); } push_iostack(1); } else { getnew = 1; return; } } } getnew = 1; return; } int getstring(s) char *s; { nexttoken(); if (eof) return 0; strcpy(s, INPUT); return 1; } int getint(i) int *i; { int j; nexttoken(); if (eof) return 0; *i = atoi(INPUT); if (*i == 0) { for (j = 0; INPUT[j] != '\0'; j++) if (INPUT[j] != '0') return 0; } return 1; } int getfloat(f) float *f; { int j; nexttoken(); if (eof) return 0; *f = (float) atof(INPUT); if (*f == 0.0) { for (j = 0; INPUT[j] == '-'; j++); while (INPUT[j] == '0') j++; if (INPUT[j] == '.') j++; while (INPUT[j] == '0') j++; if (INPUT[j] == 'e' || INPUT[j] == 'E') { j++; if (INPUT[j] == '+' || INPUT[j] == '-') j++; while (INPUT[j] == '0') j++; } return (INPUT[j] == '\0'); } else return 1; } static char *new_printable_text(s) char *s; { char *new_s; int to_pad, i, j; to_pad = 0; for (i = 0; s[i] != '\0'; i++) { if (s[i] == '\\' || s[i] == ')' || s[i] == '(') { to_pad++; } } j = sizeof(char) * (i + to_pad + 2); if ((j % 8) != 0) j += 8 - j % 8; new_s = (char *) malloc (j); j = 0; for (i = 0; s[i] != '\0'; i++) { if (s[i] == '\\' || s[i] == ')' || s[i] == '(') { new_s[j++] = '\\'; } new_s[j++] = s[i]; } new_s[j] = '\0'; /* added: tie off -hdd */ return new_s; } char *getmultiline() { char c; int i, j, done, len, started; char *out_str; if (getnew == 0) return CNULL; c = gettokenchar(); if (c == real_eof) { ungettokenchar(); return CNULL; } done = 0; started = 0; while (!done) { i = 0; for (c = gettokenchar(); c != real_eof && c != '\n'; c = gettokenchar()) { INPUT[i++] = c; } INPUT[i] = '\0'; if (!started) { out_str = (char *) malloc (sizeof(char)*(i+1)); strcpy(out_str, INPUT); len = i; started = 1; } else { out_str = (char *) realloc(out_str, (len + i + 3) * sizeof(char)); sprintf(&(out_str[len]), "\n%s", INPUT); len += i+1; } if (c == '\n' && len != 0 && out_str[len-1] == '\\') { len--; } else { done = 1; } } ungettokenchar(); return out_str; } char *getlabel() { char c; char *txt, *new; int i; txt = getmultiline(); if (txt == CNULL) return CNULL; new = new_printable_text(txt); free(txt); return new; } int getsystemstring() { char c; int i; int done; if (getnew == 0) return 0; c = gettokenchar(); if (c == real_eof) { ungettokenchar(); return 0; } i = 0; done = 0; while (!done) { for (c = gettokenchar(); c != real_eof && c != '\n'; c = gettokenchar()) { INPUT[i++] = c; } if (c == '\n' && i > 0 && INPUT[i-1] == '\\') { INPUT[i++] = '\n'; } else { done = 1; } } ungettokenchar(); INPUT[i] = '\0'; return 1; } void rejecttoken() { getnew = 0; } jgraph/jgraph0000755005471000040510000050052013207321461012351 0ustar planklociELF> @@Px@8 @$!@@@@@88@8@@@ff nnana< nnanaTT@T@DDPtdRRARAQtdRtdnnana/lib64/ld-linux-x86-64.so.2GNU GNUlw Gjo)xQ-a$ $%)fUa9E dplu3,' #6 h J @raHraPralibm.so.6_ITM_deregisterTMCloneTable__gmon_start___Jv_RegisterClasses_ITM_registerTMCloneTableexpsinlogatancoslibc.so.6fflushstrcpyexitsprintffopenstrncmpputsputcharreallocstdinpopenfgetsstrlenstdoutfputcfclosemallocsscanfstderrpclosefwriteatofatoifprintf_IO_getcstrcmp__libc_start_mainfreeGLIBC_2.2.5 ui Jyui Joa@ra$Hra%Pra&pa pa(pa0pa8pa@paHpaPpa Xpa `pa hpa ppa xpapapapapapapapapapapapapapapapapaqa qa!qa"HH5d!HtSH5"d!%$d!@%"d!h%d!h%d!h% d!h%d!h%c!h%c!h%c!hp%c!h`%c!h P%c!h @%c!h 0%c!h %c!h %c!h%c!h%c!h%c!h%c!h%c!h%c!h%zc!h%rc!h%jc!hp%bc!h`%Zc!hP%Rc!h@%Jc!h0%Bc!h %:c!h%2c!h%*c!h1I^HHPTI`-AH,AH˞@fDGraUH-@raHHw]øHt]@ra@raUH-@raHHHH?HHu]úHt]Hƿ@ra=c!uUH~]c!@H=X_!tHtUnaH]{sUHHH}ffZEHEW.ErQ\HEtxyEZH c!¾-AHϸnEZAHEH$Z^HEH Z\f(HE@0ZYffZHEHE\HEH0YEEEEUHH}ffZEHEtM'YHE@0YEEEEE]UHffZEMQ'YEEEE]UHH0H}HuHE؋txyE 'џ-AhHE؋-AG2HEHP`HE@lH։ǸhHEHHHE_HE@tIEHUB,ZHUBZHUBZf(f(fWɸ葔HEHHEHEHH;Eu̐HE؋-AlWHEHPpHE@|H։Ǹ荓HEHHHE_HE@uIEHUB,ZHUBZHUBZf(f(fWɸ趓HEHHEHEHH;Eu蝏HEHPPHE@\H։ǸӒHE؋tMEHUBLZHUB,ZHUBLZf(f(f(fW HE؋-A HEHHHEqEHUJDHURHUB<YXZHUBZHUBDZHUBZǸnHEHHEHEHH;EzHE؋ .AOHEHHHErHEH@HUHRHHHE؋tHEHPHEH@@BHEHPHEH@@ B HEH@HǸgHEHHEHEHH;EyHE؋t#.A藖HEHHǸ踍 HUHHH}HEHHu%HEHHǸ?HEHǸ_UHHH}1.A>.AHEH@0@,ZHEH@8@,ZHEH@0@,ZHEH@8@,ZH.Az.AUHH H} YHE@`tHEHǸ8HEH@@HHE#HUHEHHǸ/HEHHEHEH@@H;EuϸW UHH`H}HuHEHPdHEH։ǸHEtHEHǸHEH@8HHEH@8H9uHEH@0HHEH@0H9S.AkHEH@8HHEHEH@0HHEHEZ苙s豙HEH@(HHEHE@/AHǸHL@ HHpHHPHHHyMIHH¾[/A t1HHHN!h/AHǸG9uEԉEEEZX)‰*Z^ffZm)‰* WZ ^*\ffZu싕9uEЉE\EEZX)‰*Z^ffZ})‰* )WZ ^*\ffZmW.Ez-W.Eu$W.EzW.EuEEHHH/AHǸHHǸ߅]ZUZMZEZ/AHEHEE߉mHEHE{K!8Euڿ HHEHnHHHuVW.EzW.EuW.Ez W.EtMZEZ/AlHuHHH HH.AH%HEH}u1HHHK!/AHǸs)HEHEE߉=HEHEKJ!8Euڿ HEH|> MZUWZxfWf(fWɸ~MZUWZyfWf(fWɸ~ MSWZU=WZsMWZEZ莁MZEZtMZUWZLHZHHHHXHZZHΉǸ( MGWZfWɸyM#WZf(fW蔀EZfWɸ~EZf(fWdHZHHHHXHZZHΉǸ@ HH@HHHEHH@HH;Eu HEHHH@HH9u HE@YEZHE@YEZ?HEHHE=HE@YEZHE@YEZCHEHHEHH@HH;EuHZHHHHXHZZHΉǸ EHH@HHHE}u9HE@YEZHE@YEZ0A7HE@YEZHE@YEZ0A[}du"0AHEH@HEEEHEHHEHH@HH;EA}t"0AEEHH@HHHE+}uC}u=HE@YEZHE@YEZ0AEz}t9HE@YEZHE@YEZ)0AM;HE@YEZHE@YEZ00AE}u,}u&?0AHEH@HEEE+EHVUUU)‰ЉEU)ȉEHEHHEHH@HH;E}t ?0A#}t>}u}t2HPH E!H0At0AHǸEEHH@HHHE}uC}u=HE@YEZHE@YEZ0AEv}t9HE@YEZHE@YEZ)0A7HE@YEZHE@YEZ00AVEHVUUU)‰ЉEU)ȉEHEHHEHH@HH;E.AHZHHHHXHZZHΉǸ u"0A+}t2HPH4C!H0At0AHǸ]ZUZMqWZe[WZxxvM6WZUZMZeWZx-vZHZHHHHXH]ZUZZZHΉǸyHZHHHHXH]ZUZZZHΉǸqybMWZEZxEZf(fWExMWZUWZxHZHHHHXHZZHΉǸw~EZfWɸJwMWZfWɸiwHH@0@L\ZUWZ+wHH@0@L\ZEZvHZHHHHXHZZHΉǸvjEZf(fW2vMWZf(fWMvMWZHH@8@L\ZvMZHH@8@L\ZuHZHHHHXHZZHΉǸuQHH@ HǸ7mHH.>!0AHǸ%nUHHPf(f(H}ffZEffZEffZEffZEHEElEHHraHEHHuHEH(raHE؈HEHǸHt EHUЉ !EE!9E|!9EH!HMHU 9AHǸ蕳H!HU9AHǸnE*EHHraH!19AHǸ?E)!9E|Hi!Hƿ ܲҳUHHHHH59AHͲt4H<9AH赲tH@9AH蝲nE4}puWHHǸZH!H9AHǸCHHǸjt0HHǸRtHHǸ:u4NH !Hp9AHǸDZ}HH@(H%FHEHUBHUBHEULjPHHP(HEHHEH@@PHP@}x5HH@8HEHEHUBHUBHH@8H}EHEHUBHUBHHP8HEHHfDHHP8HEHHLD.vEE.vEE.vE.EvEE􋅨EE`}y2HH@0HoDHEHUBHUBHH@0H>DHEHUBHUBHHP0HEHH'CHHP0HEHH C.vEE.vEE.vE.EvEEEE$EE􋅨EEHH@0@.~zR.uuIHHP0EBHHP0EBHHP8EBHHP8EBHHP0HH@0@.EvHH@0@EBHHP0HH@0HE.vHH@0@EBHHP8HH@8@.EvHH@8@EBHHP8HH@8HE.vHH@8@EBHHǸH9AHuHH@HǸH9AHެurHHǸu IHBPHHǸu UHBTD?H9AHTHHǸu;蜿ZH`!9AHǸĬHH@HHl@HEHUBHUBHHPHHEHHU?HHǸFTUH9AHjuJHHǸuHƀgHB|H9AHuwHƀcEUHHǸ.uHƀnHMHcHD E}~dH9AHyuJHHǸu$%HƀgHBXH9AHuwHƀcEUHHǸ=uHƀn HMHcHDE}~s H9AH舩uJHHǸu34 HƀgHBp H9AH&uvHƀcETHHǸLuHƀn HMHcHE}~ H9AH蘨WHHǸuf EE !9E}#EHH`qaHHH:AHNu:HHHHH>:AHǸ HG:AHu:HHHHHG:AHǸR HP:AH誥$HHǸ(ux HY:AHquHƀ01 H^:AHFuHƀs Hd:AHuHƀ.Hk:AHuHƀ-Hr:AHŤuHƀlH{:AH蚤uHƀdZH:AHouHƀD/H:AHDuHƀ2H:AHuHƀgoHA !H:AHǸEH !:A:AHǸH!;A1;AHǸ蘣NHC;AHju?HHǸ觽uHHQ;AHuJHHǸPuHƀgHBdHV;AH豢uwHƀcEUHHǸ׼uEHƀn7HMHcHDE}~ H\;AH"u?HHǸ_uHHd;AHˡHHǸIu2H!h;A;AHǸ蓡IHƀEHHܠHH耡HHHHHHHH?HH;AH蔡HEH}u;fHHH*!;AHǸؠ莡HEH"H;AH虠THHǸugHƀpH7AHRuBHǀ8HEH}uHHUHHǀHHlHHHHHHHHHHϞHH;AH$HEH}u;HHH!;AHǸhHEH貞H;AH)uHǀHu 謼LHHHǸu uHdbHbAHeuAHuHǀ_H(>AHuHǀ1H9>AH赐uHǀHK>AH臐uHǀHZ>AHYuHǀHg>AH+uHǀyHq>AHuHǀKH>AHϏuHǀH>AH衏uHǀH>AHsuHǀH>AHEuHǀH>AHuHǀeH>AHuHǀ7H>AH軎uHǀ HQ;AH荎uGHHǸʨu8H@\gHBPHV;AH.H@\cDž_HHǸPu辭H@\nDHHcH~H>AH茍uGHHǸɧu7H@lgHB`H>AH-H@lcDž_HHǸOu转H@lnCHHcH~H?AH苌uGHHǸȦu6H@|gHBpH ?AH,H@|cDž\HHǸNu輫H@|nEHHcH~ kHHǸ}UHH HUH7AHOuiHHǸ茥uHHPBHH@@$lHH@@%tH@uH7AHΊuiHHǸ uyHHPB HH@@$lHH@@%tH@uSH?AHMtH?AH5uVH@uHHP B HHPBHH@@$lHH@@%cH ?AHljuVH@uHHPB HHPBHH@@$rHH@@%c_H%?AHYuH@n7H)?AH1uVH@uHHPB HHPBHH@@$lHH@@%bH-?AHÈuVH@uHHPB HHPBHH@@$lHH@@%t[H4?AHUuH@c3H;?AH-u;HHǸjuاHHF?AHڇuHY?AH8uHH@HǸ! HHǸ蔠UHHH}HuHxkHEb?AHuHEH@0HǸ<HEh?AH葆uHEH@8HǸb HEn?AHbuzHEHǸ&u2趙H Hx?AUHEH@@HǸHUHHǸ~HE?AHӅHEH@@HHEH@@H9u3HEH@@HǸ HUHHǸHEH@@H@@PHEH@@HǸ HUHHǸDHE?AH-u8HxHMHEHHǸHUHHǸHE?AHHEH@@HHEH@@H9u3HEH@@HǸ[HUHHǸ'HEH@@H@@PHEH@@HǸHUHHǸQHE?AH:uHEH@XHǸ&HE?AH uHEH@HHǸxHE?AH܃u3HEHǸu芣NEHUB$?HE?AH蔃u3HEHǸԝuBEHUB(HE?AHLuHEHǸu2蠖Hr H ?AуUHEH@PHǸHEHEH@HǸӻcHE@AH踂uHEH@PHHEH@PH9u HEH@PHǸHE-HEH@PH@@PHEH@PHǸHEHEH@HǸ?HE @AH$tHE@AHu1HxHMHEHHǸHǸtHE@AHɁu;HxHMHEHHǸRHHEHHǸ6$HE,@AHyu3HEHǸ蹛u'EHUBHE.@AH1u3HEHǸquߠEHUBHE0@AHu HE@drHE7@AHǀu HE@dPHEbBAg}suTBAg\}/u)UZMZEZZBAWg-}eu'UZMZEZrBA(gBAfUHHHuE}gu1HEW.sfHEZBAfG}cuAHEHZHEHZHEZBAfUHH f(f(ˉffZEffZEffZEffZEE}xu1]ZUZMZEZBA f/]ZUZMZEZBAeH H}fUHH f(f(ˉffZEffZEffZEffZEEE]ZUZMZEZǸEEXEZUZE\EZEZǸUHH H}ffZEffZEHEZHEHHEH։ǸMZEZBAdUHHffZEffZEMZEZBADdUHCAcs9H Hd]UHHffZEffZEMZEZCAcUHHffZEffZEMZEZCAycUHHffZEffZEMZEZ!CA6cUHHffZEffZEMZEZBAbUHH f(ىHuf(ffZEffZEMEffZE7CAbUZUEMZEZHMHΉǸCAbH HcUHH0f(f(f(ӉHu؉f(ffZEffZEffZEffZEMEffZEMZEZBCAaUZUEMZEZHMHΉǸCA,aH5 H-bUH}EC ]UHHH}/ tHEHƿUCA=aUHH@f(f(H}ffZEffZEffZEffZEHEH@8EZHǸ#cZmHEH@0EZHǸbZuHEH@8EZHǸbZ}HEH@0EZHǸbZx]UMUHH0H}HEHHu EE0HEHEHH< uHEHEHHEEHEHEHHu*EEHE@ ZHEH@HǸHE@ZHE@ ZHE@Z`CA[_HE@4^CAc]AHEH 0WZ Y ^CA ]HEHHEEHEHƿCA\HE@$[CDA/[QDA [iDA[~DA[DAZDAZDAZDA![HEHHE)HE@ZDAZHEHHEHEH;EuͿDAwZ'UH DAHǸ8[[UHH0H}HuUHEHH;Et6}uHEHPHE@9}}tNHEHPHE@99HEHUHPHEHHEHHEHHUHPHEHUH!}tHEH@PHE@9}}uQHEH@PHE@9;HEHUHHEHPHEHPHEH@HUHHEHUHPHEHHHEHEH;EuHK H!GAZ}uHEPHE@9}}tJHEPHE@98HEHUHHEHPHEHPHEH@HUHHEHUHPHEHHE`UHSH(H}HEH@X@.-z1.$u(HEH@XHUHR0B, ^@;HEHXXHEH@0HUHRXBZHǸZEԋEԉCHEH@X@ .z .t@HEHXXHEH@8HUHRXB ZHǸiZEԋEԉC lbEHEH@0t?HEH@0HHHt,HEH@0H@D.EvEHEH@0H@DEHEH@0t.HEH@0H@@D.EvEHEH@0H@@DEHEH@0tdMZHEH@0@DZ\f.vE/HEH@0@DZ s\ffZ]ԋEԉEHEH@H@HE苀txyH | ¾GAHϸ(>>HEHW.rHE苀tq\QHE苀txyH  ¾GAHϸ=HE@ZH HAHǸ=N>HE@HUBHE@.D{P.7{CHE@.!{.{PHE苀txyHURH=H XHAE؋EHUB,HE苀8HEHW.r\NHE@ZHE苀txyHURH=- HA:;HE@@Z^:ffZHE@$HE@Z9:HEH$Z^ffZHE@ HE@,Z]HE@Z9HEH$Z^HEH Z\]^f(ffZHE@0/HEH,HE@HEP\^(HE@0HE@l<0uDHEP\HEPlE&HEUHcHHUMHcHE}~HE@|<0uDHEPlHEP|E&HEUHcHHUMHcHE}~UHSHxH}HuHEt HEH@8HEH@0HEHE@L.vz2.vu)HE@<W.v HE@,vHUBL/HE@LZHEHǸj:EEHUBLHEH4W.vPHEHǸYEEHUB4HEu>HEHǸEEHUB8HEuHE@HUB8HEyHEHǸHUHEyHEHǸHUHEHHHE:HE@ZHEHǸX9EEHUBHEHHEHEHH;EuHEHHHEyHEHXHEH@@ZHEHǸ8EECHEHXHEH@@ ZHEHǸ8EEC HEHHEHEHH;ErHE@4W.zW.tHEtHEOHE=HEtRtEHEH@E^EHEHE.wHE@@YE\EEHE@8EHEH4E\EHEHE.wHE@4EEZHEHǸ7EEEEZf.sMZHE@,ZsXf.HEHHHEHUEBHUsBHE@HEHHEHHHE_HEHHjHE趺HUHBHEHPEBHEHPEB HEHXP4HHExHEEEW.vE r.s"r.EsW.EzW.Eu E^EW.vEMrWMEEEMqYEE*r.EwHE@}E"HpIAEZHEH@HU̾5IAHǸE4EZHEH@HU̾:IAHǸ4EZHEH@HU̾?IAHǸ3|EZHEH@HU̾DIAHǸ3REZHEH@HU̾IIAHǸ3(H HNIA3}3HEHHEHH?HE*M^(EEEEEXEEEZHEHǸ4EEEEZf.pv|MZHE@,ZspXf.vSHEHHiHEHUEBHUoBHE@HEHHEHHJEHE;E(HEt1HE@@MYEHE@@YE\EEEXEEHE@.EhHE@D.nz.nuHE@LHUBD/HE@DZHEHǸ2EEHUBDHE@H.nz~.nuuHE@DZHE@<Z{nYXHEH<W.v H@ HHEeXffZHE@H/HE@HZHEHǸ1EEHUBHHEttHEHPHE@HB HEH@@$<0u HEH@@$cHEH@@%<0HEHPHE@<W.ttbB%nHEHPHE@HBHEH@@%<0u HEH@@%cHEH@@$<0u0HEHPHE@<W.trlB$HEt HEH@@ lEHEt HEH@@ HE@,EHEu HEH@@lEHEu HEH@@HE@,EHEHHHEHEtHEHPHEH@@BHEHPHEH@@ B HEH@HUHRHHHEH@HMHHǸ:HEH@H<E.v HEH@@<EԉEHEH@HDE.v HEH@@DE܉EHEH@@@.Ev HEH@@@EЉEHEH@@H.Ev HEH@@HE؉EHEHHEHEHH;EHEHPEԉBHE@DZHE@<Z?iYXffZmEEHEHDE.vEHE@DEEZHEHDZHEH<ZhYXf.vE>HE@DZHE@<ZhYXffZuEEHEHHUB<W.ƒtEZ h\EZ hXffZ@ 9HEHHEH@8HUHB ZHǸ+EEC HEH@$<0u HEH@$cHEH@%<0u/HEHHE@<W.ttbB%HEH@.wg.jgtHEH^gB|HEH@ .;gz,.2gu#HEHHUB, g^@ 9HEHHEH@8HUHB ZHǸ*EEC HEH@.f-.f fEHE@,EHEtPHEH@@<.EvE HEH@@HE@DZHE@<ZeYXffZ}EEHEHDE.vEHE@DEEZHEHDZHEH<ZGeYXf.vE>HE@DZHE@<ZeYXffZeEEHEHHUB<W.ƒtEZ [e\EZ EeXffZ@9HEHHEH@0HUHBZHǸY(EECHEH@$<0u HEH@$cHEH@%<0u HEH@%bHEH@.dz:.du1HEHHE@<W.tddBHEHHMHHǸHx[]UHH@H}HuЉUHEHHu}tfHEH@0HUBZHǸV'EEHU؉BHEH@8HUB ZHǸ#'EEHU؉B HE@8. cz.cuHE؋@ HU؉B8HE@LE=HEHEHH< u#HEHEHHHE؋@LPHE؉PLEHEHEHHuHE؋@L*E}bEHEHHEEHE@ Z bY b^EHEH#HxH*HHH H*XYE bYffZ]E.EvEEEHE؋@L;Et,HEHR#EEHcHEH EHHHEEHE؋@L;E'HEH UaXYHE@8YEXZ aY a^ffZeMZEZHEHǸUHH@H}ffZEffZE]Z]HE@Z F Y ja^"YEffZemZmHE@Z 3aX Y a^*"YEffZu}Z}HE@Z Y `^"YEffZ]eZeHE@Z `X M Y q`^h"YEffZmHE؋@EHE؋@ EHE@$QAHE@@uKAHEH@0HǸHEH@8Ht>QAqHE@DuKAWHEH@8HǸWQA3E&HEUHcHƿQAE}~Կ dHEH@HHE9HE@ƿQAHEHǸHEHHEHEH@H;EuHEHHEHEH;E@UHH H}WW 0HFW H}u!HS H9W HH@W \HEQAHHW HW Hu'HR HUQAHǸm#HEHƿvabV HV H证HEHEH@HEHHH,HHEHPHEH@HUHH;V HEP$2V HEP (V HEP%Q HEP(HV HHEHH7UHQ HQ ѺvaRAHǸo]UHU uHU HU U U < uWQ NQ wU ]UHhU ]U < u#Q Q ]UHH H}mE ^E} t} t} tE&EPUHcHEHEEP 8Et} t } t} uEHcHEH5EUHT tKra;u6RArau  RArau]UHHRT HHHT H9]UHH }H+T H.HEH T HEHPvaHHHHEHPS HEP$S HEP S HEP%xO HEP(HEH@vaHDHS HEHH}}tQArayHzS QAraqHbS EAS N HHS Hu2(HN raRAHǸYravaUHHHR HR tHR HǸHR HHR H@HEHEH@HuUHEH@QAHHUHBHEH@Hu+HEHPH,N QAHǸHEH@H9R HEH@HƿvaHEH@H|HE@%Q HE@(M HE@$Q HE@ Q HEH>|HQ HEHH}UHQ tIM ra"u6tZQ  M oUPRArauq.2RArauYrau2HL H:RA8SRAra+ra4tYRArat2jHEEENEUЃHcHEHHbHEEHcHEHкraRAHǸEE} u#}tEHHPHEH<\umE}sHEUHHjHEH}u%HEHǸHEHEH"HEUHHNF u E0F 8EuEE}lE"EPUHUraHEE 8Et} ù} u-}~'EHra<\uEPUHƀra E}y8EHƀraUHQE ]f.DAWAAVIAUIATL%@ UH-@ SL)1HHHtLLDAHH9uH[]A\A]A^A_Ðf.HHValue of %f is at negative infinity with logrhythmic %c axis Drawing AxisDrawing Grid linesDrawing Minor Grid linesDrawing Hash MarksDrawing Hash LabelsDrawing Axis LabelSetting Clipnewpath 0 0 moveto 0 %f lineto %f %f lineto %f 0 lineto closepath clip newpathDrawing EptsDrawing Curvenewpath closepath Drawing Curve points %f %f translate %f rotate rError: eps file %s couldn't be opened %%BoundingBox:no bounding boxError: Eps file '%s' has %s %d %d %d %dError: Eps file '%s': bad bounding box. Including eps file %s%f %f scale %f %f translate %f %f scale Error: postscript file %s couldn't be opened %f %f moveto %f %f lineto stroke%f %f %f %f curveto strokewrong number of points for bezier marktype Error: curve %d, %s newpath %f %f moveto Unknown mark: %c +@4@4@ "@4@*@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@4@1@2@V-@4@4@4@4@4@4@4@p'@&@|(@Y0@4@d)@4@4@4@4@3@4@64@/@%@4@4@4@0@4@4@4@B/@%f %f translate %f %f atan rotate Drawing legend%f %f translate %f rotate Drawing stringsDrawing New Graph%f %f translate %%!PS-Adobe-2.0 EPSF-1.2 %%%%Page: %d %d %%%%BoundingBox: %d %d %d %d %%%%EndComments -90 rotate%f 0 translate 1 setlinecap 1 setlinejoin0.700 setlinewidth0.00 setgray/Jrnd { exch cvi exch cvi dup 3 1 roll idiv mul } def/JDEdict 8 dict defJDEdict /mtrx matrix put/JDE { JDEdict begin /yrad exch def /xrad exch def /savematrix mtrx currentmatrix def xrad yrad scale 0 0 1 0 360 arc savematrix setmatrix end} def/JSTR { gsave 1 eq { gsave 1 setgray fill grestore } if exch neg exch neg translate clip rotate 4 dict begin pathbbox /&top exch def /&right exch def /&bottom exch def &right sub /&width exch def newpath currentlinewidth mul round dup &bottom exch Jrnd exch &top 4 -1 roll currentlinewidth mul setlinewidth { &right exch moveto &width 0 rlineto stroke } for end grestore newpath} bind defTimes-RomanError: preamble file %s couldn't be opened Error: epilogue file %s couldn't be opened showpageB?@@?? @@:xyfontsizelinesephjlhjchjrvjcvjtvjbfontrotatelgraylcolorCannot perform copycurve on first curve copycurve: curve #%d not found Cannot perform copystring on first string copystring: string #%d not found First graph cannot inherit axes Bad %s: %s Valid %ss are: %sy_eptsptsx_eptsReading Points, no y value for x=%f Reading %s, need 4 values per data point labelmarksizegmarksReading GMarks, no y value for x=%f pfillpcfillfillcfillafillacfillmarktypeBad mark: %s Valid marks are:glinespatternapatternppatternlinetypenonesoliddotteddashedlongdashdotdashdotdotdashdotdotdashdashgeneralBad line type: %s solid, dotted, dashed, longdash, dotdash, Valid marks are %s dotdotdash, dotdotdashdash, none %s. linethicknessgraycolormrotateepsencapsulated postscript file eps token must be followed by an %s rcouldn't open eps file '%s' postscriptcouldn't open postscript file '%s' polynopolylarrownolarrowrarrownorarrowlarrowsnolarrowsrarrowsnorarrowsbeziernobezierasizeclipnoclipathash_label either needs "at" or an associated "hash_at" sizemaxminhashshashmhashprecisionhash_formatgGEefInvalid hash_style %s. Must be f, g, G, e or E hash_labelslog_base"log_base %f": log_base must be > 1.0 draw_atloglinearnodrawdrawhash_atmhash_athash_labelhash_scaleauto_hash_marksno_auto_hash_marksauto_hash_labelsno_auto_hash_labelsdraw_hash_labels_atdraw_hash_marks_atno_draw_hash_labelsdraw_hash_labelsno_draw_axis_linedraw_axis_lineno_draw_axisdraw_axisno_draw_hash_marksdraw_hash_marksno_draw_axis_labeldraw_axis_labelno_grid_linesgrid_linesno_mgrid_linesmgrid_linesgrid_graygrid_colormgrid_graymgrid_colorrightonleftofftopbottomcustomlinelengthlinebreakmidspacedefaultsxaxisyaxiscurve"curve" not followed by number newcurvecopycurvenewlinetitlelegendx_translatey_translatestring"string" not followed by number newstringcopystringcopylineinherit_axesYXbordernobordergraph"graph" not followed by number newgraphcopygraphcopygraph: no graph #%d newpagebboxBbox definition must have four integers preambleepilogueBad token: %s h?@@circleboxdiamondtrianglexcrossellipsegeneralgeneral_nfgeneral_bezgeneral_bez_nfpostscriptepsxbarybarnonetextsolidstripeestripeTimes-RomanTimes-Bold-p-comments-P-LAh? A@@@A gsave grestore /%s findfont %f scalefont setfont gsave %f setgray %f %f %f setrgbcolor fill 6.1 10 %f %f %f 1 JSTR 6.1 10 %f %f %f 0 JSTR grestore%f setgray %f %f %f setrgbcolor newpath %f %f moveto %f %f lineto stroke %f %f moveto %f %f lineto stroke %f %f %f %f curveto newpath %f %f movetoclosepath newpath %f %f JDE %% %s gsave %f %f translate %f rotate %f setgray %f %f %f setrgbcolor 0 %f translate (%s) dup stringwidth pop 2 div neg 0 movetoneg 0 movetopop 0 0 movetoshow 0 %f translate showgrestore%f setlinewidth [0 2] setdash [] 0 setdash [1 3.200000] 0 setdash [4.00000] 0 setdash [7 2] 0 setdash [5 3 1 3] 0 setdash [5 3 1 2 1 3] 0 setdash [5 3 5 3 1 2 1 3] 0 setdash [%f ] 0 setdashError: Unknown line type: %c @@@@@Q@@@@@@@@@@@@@@@@@@B@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@3@@@`@@@@@$@@@@@@@@?R@^@@ffffff?inserting into tail did not work Graph %d: %c axis has no minimum, and cannot derive one Use %caxis min Trying to derive %c axis Minimum value %f will be -infinity with log axes Graph %d: %c axis has no maximum, and cannot derive one Use %caxis max Maximum value %f will be -infinity with log axes Graph %d, %c axis: Min value = %f. This is -infinity with logrhythmic axes %.*G%.*g%.*E%.*e%.*fInternal jgraph error: hl_st @+@S@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@+@@@@ Graph %d Curve %d: Curve has %d points Bezier must have 3n + 1 points (n > 0) h@@ A@8@A@@@R@^@pA?@@ @75?? @Bš?f@V@B?: x %f y %f hj%c vj%c rotate %f font %s fontsize %f linesep %f lgray %f lcolor %f %f %f fontsize %f label(* unless , this label's x's and y's will be ignored *)pts %f %f x_epts %f %f %f %f y_epts %f %f %f %f Internal error: p->e == %c eps %s postscript marktype Unknown mark type %c %s marksize %f %f mrotate %f fill %f cfill %f %f %f gmarks %f %f nopoly pfill %fpcfill %f %f %flinetype none solid dotted dashed longdash dotdash dotdotdash dotdotdashdash generalglines %f linethickness %f gray %f color %f %f %f clippattern %s %f ppattern %s %f apattern %s %f rarrow larrow rarrows larrows afill %f acfill %f %f %f bezier asize %f %f size %f loglinearmin %f max %f %s nodrawdraw_at %f no_%sdraw_hash_labels %sdraw_axis_line %sdraw_hash_marks %sgrid_lines %smgrid_lines %sdraw_axis_label gray %f color %f %f %f gr_gray %f mgr_gray %f (* The real settings for generating auto_hash_labels:%sauto_hash_marks %sauto_hash_labels hash %f shash %f mhash %d hash_format %c log_base %f hash_scale %f precision %d The following are explicit and implicit hash marks and labels *)hash 0 draw_hash_marks_at %f draw_hash_labels_at %f hash_labels (* The :, x, and y values are ignored *)hash_atmhash_at%s %f hash_label at %f customofflinelength %f linebreak %f midspace %f defaultsx_translate %f y_translate %f xaxisyaxisclip bordercurve %d legendtitlestring %d newpageX %f Y %f preamble epilogue bbox %dgraph %d B@rError: cannot open file "%s" %s,%d: (**)Include file "%s" does not exist includeEmpty include statement shell:'shell' must be followed by ':' Empty shell statement %s;}D<T AdKս_$Dxdws$hDidAg0o$D deYN .t3$:DI@d@D^DDG H$ HD =Id I J IK /L N XN$ ND Nd OO O O KP lQ R$ iSD )Td T oU U U :V }V$ VD Wd W yX X X Y ]$ ^D H_d ` |c av w nxVz4~{T>tD$Ddz$ Dd$)~$DsdZ*$Dd2=i$D8d5TzRx @*zRx $FJ w?;*3$"Dշ AC  dVAC Q 4AC o  IAC D 2AAC | SAC  AC  $3 AC  D /AC * dAC  AC  \AC W 0AC + AC  sAC  $AC  DAC  d&AC ! AC  dAC  AC  cAC  AC  $ViAC d DAC  dgrAC m AC  AC  bAC  &AC  H+AC  $10AC + D7AC  dY84AC / m;EAC @ ;sAC n ; AC  >AC  S?`AC [ $?^AC Y D?sAC n d$@&AC ! *AsAC n }AAC  CBAC DHAC C ,D/AC j $;DhAC c DD`AC [ dD1AC l DJAC E DAC | _E!AC  `FlAC g GAC  $HAC  DHAC  dXIAC  ICAC ~ IEAC @  JCAC ~ .JCAC ~ QJCAC ~ $tJCAC ~ DJAC  dKAC  KAC M K.AC i KAC  L)AC $  P:AC u $ P)AC $ D QAC  $d nSAC Ex $ UAC E  hAC   iAC   RjAC   l(AC # 4 "mAC  $T r_AC EU | AC   \AC W  YAC T $ AC E  dPAC K $ AC  D 7AC  d #AC   AC   &AC a  4AC o  AC   ZAC U $ xAC s D AC  d AC   }UAC P  < AC 7  έAC   [AC V  AC  $ EAC  D hAC c d O,AC g  [SAC N  *AC e  AC   ]AC X [ AC [ $[EAC @ DFAC A dAC  R?AC z q|AC w @AC ; pAC k =AC  $KAC F DAC  dAC K DeBEE E(H0H8M@l8A0A(B BBB@@y @ d-Ananao@p@@ V pa@X@` o@oo@na @ @ @& @6 @F @V @f @v @ @ @ @ @ @ @ @ @ @ @& @6 @F @V @f @v @ @ @ @ @ @ @ @AA AAAAAA AA"AA(AA0AA8AACAAOAA^AAiAAmAArAAwAA|AAobdtxcegGZBpEXYnlAAAAAAs/eGCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-16),@(7,@F@L,B=@ ,:L@p,nN@,`@,Hc@K,/wX@,ֆA <^n@(788WintJ@ ABCxDyEeFMGbIJKfLMgPOgPxQyR NSTU hjV$vjW%X(7Y4JZ8N[<\@]Dg^Hh_?L  ^` bcdnume?lf g ptsh(i0 j8k?@nlHmPCnXodBppoq|8rMs$t7uvwxymz{l|@}.~(eps?g?4?&? ?&??2?   777num?s7 loc3?H#(0%NnC8 hj(vj)*0"ghlmaxmin. $3(,0d 4J 8(<@.DHLP7\`4lp3|Ý}???k???F?? ? ??K=?З4?,?I-6 Ն֖ז?;ٖ ,ڝlSܑ3 p|||num?< $A("0"89 @ H =P X?`?ddef%h| P   g (bb! 08R?@Z?Di?H ?1  \FF 0  `?Q u( |0 8 s@ H [P X  ; `  A h  ?p S?t _ x C Q "G W &j /u 10u 1u 2u `3- 5? 7] ; ;  A  ?  W  m H@  valIhJ"`@QDN?Z@V val[h\"`De=@48 valfhmq@I an"Hn"@p_hqhsr=`!u?  v? Zy? z? ? @R Zy? z?! ?2 +@Iz}?@ Zy?x z? ? @Iz}?@M z}?1@fz}?@AElh v?7?@|gh v?g‡@gÂXchZy??S@ cgӂpդhpxդ`pyդXi?Tj?P2ז9זזLזHxזDyז@Zy?z? v??@Sf v?!u??#.@PFH?@PH?@s? @h?u@lU?@$?s@}=?@`*?.@o`?@h?'@?m@x?{@`*?H!@/xIwyIwcJwgKwpMhms0NDms1N@scxNdscyN`trxN\tryNXiO?TjO?PfPchQOR?HinpSwbbT! wZy??0 "@- v?Rz}?c?u??*?r?DN?w  'C4@x1(Hy1(@x2(y2(c)dx+hdy+dms0,`-lct-\st-XZy?????O8@2gPHcRhlSXxTdyTTUS v?sZy??8@z??x9@???:<@Oold~R=@\xgXs=h v?uk=@0gh v?=@ z}??@:gs1 Xpp?T!?P1 hg`;@@gs1 Xpp?T!?Pf`coZy? ?E@gs1 Xpp ?Tf"`c#o?3F $qa"#A $^F@L88W\intJii^0(`bQ u( |0 8 s@ H [P X  ``  fh  bp Sbt px F T "l | &{ / 10 1 2 `3- 5b 7 `` f b/ | (  6789@ A B C  xD yE eFG bIRJRKR fL#MRgPO*gP xQ yR NSTU hjV$ vjW%X*(7Y4JZ8N[<\@]Dg^Hh_bL : `Ec bBcBdB numeb lf: g: ptsh(i0 j8kb@nlHmHPCn*Xo*dBp*poq*|8rMs$tX7uvwxymz{l|@}.~( epsbgb4b&b b&bb2HbK X B  numb s:c  loc3b#(0NnC8H hj( vj)*  g: hl: max min. $3(,0d 4J 8(<@.DHL*P7\*`4l*p3•|Õ}bbbkbbbFbb b bbKϤ?4b,bIӔ   b; ,ڕ l:S   p    numb< $A( 0 89 X@  H P :Xb`bd defh   P    g  ( bb 08Rb@ZbDibH b  KF@ lL:~txtN`N fOiPblRb jF@.H Wb: mWbF@.| Wbn mWbF@. Wb mWbBG@. Wb mWbH@. Wb mWb I@6L Wb> mWbkI@? Wbr I@mWbI@ mWb OGI@&.c1XHc2X@fXh XXp`PLN@fl1:hl2:`N@a1ۉ ha2ۉ `DXQ@g gs     Xh X`  X9 PnumbLbJQ@`mWbpD$bS@0D$b<: T@g= gs> ? hAhA`B P9C XnumDbLbL8T@lmWbrD$b=V@0D$b]q V@gr Xgss Pt H v hV@2D$b&>W@iYl1 hl2 `W@g X  PshX@rXkeyPpHa@iblfhRb"X@HhWbHY@ mWbPY@D$bzZ@pcX|g |p}txtx}y}f}e1}e2}xhlyhhxldyl`pPp1p2flXHfi@ib\eRbkZ@iXWbmWbZ@;7D$b[@4D$b&`@hWb~mWb`@WbmWb`@;D$ba@EWb mWbb@Q^Wb>+b@mWbb@EWbmWbc@QWbc@mWb|c@E WbmWbc@PRWb2 d@mWbd@vD$be@hWbmWbh@D$bi@:WbmWbi@E6Wb(mWbjj@Q|Wb\j@mWbj@:WbmWbUk@2D$bl@;D$bwm@;D$bp@nPWbBmWbp@ mWb  ]p@a }atlfLs`p}stPb\Rq@Rb)q@.oWbOq@mWbq@mWb;r@2D$br@a }p}f}ib}hhRb*s@7^WbPmWbms@7WbmWbs@7WbmWbt@7WbmWbit@H.Wb mWbt@:cbUmWb%u@:bmWbv@4D$bw@WbmWbKw@;D$bw@7HWb:mWb pWbbmWb?z@7WbmWbK{@7WbmWb{@7 WbmWbw~@B@Wb2mWb~@PWbf @mWbx@BWbmWb@PWb @mWby@B4Wb&mWb@MzWbZ @mWb\@ mWb-@ l }p}f}Rb@d)WbmWb6@d]WbOmWbׄ@6WbmWb*@7WbmWb~@4WbmWb@ mWb @0"g  ~gs ~ ~ numbshfRb @u b @2D$b(@.,!Wb!mWbp@.`!WbR!mWb@z!b!͉@2D$b@.!Wb!mWbӋ@."Wb"mWb@ mWbnW@0$gsX ~Z hg[ `W[ X\ f]~num^b~i^bTok^bPj^b~Rb"@|8#b#@2D$bA@~#b_#@@#mWb=@0D$bُ@.#Wb#mWb!@. $Wb#mWbi@#/$Rb@[w$bV$Đ@2D$b@1D$b!#f $"#?$ $"#$#2b#z$#=$#yb^@ W\intJ^r678y9@ ABCxDyEeFrGbI9J9K9fL M9gPOgPlxQyR NSTlU hjVr$vjWr%X(7Yr4JZ8N[<\@]Dg^Hh_WL ! e`,J b)c)d)numeWlf! g! ptsh(i0 j8kW@nlHm/PCnXodBppoq|8rMs$t?7urvrwrxryrmz{rl|@}r.~r(rlepslWgW4W&W W&WW2/W2 ? e) numWs!J loc3W#(0sNnC8/l hjr(vjr)r*~pg!hl!maxmin. $3(,0d 4J 8(<@.DHLP7r\`4rlp3r|r}WWWkWWWFWW W WWKϋ?4W,WI{ W; ,rl!S pnumW< $A(p0p89 ?@ H P !XW`Wddefsh Pi i i g (bbo l0l8RW@ZWDiWH W ei N!@ lP!` iQWl b?@4' cc?X numdWTO f?` igWl W e ?@Eq c?X numWTO ?h / ?@s c?X numWTO ?h pm@  4W\ iWl ap` v@1 lh % !@`_ t!h {@^ s Xnum WT h Wٛ@s sXnumWTh4L@&b gs5Xnum6WTg8h W[ Or@s gPXnumQWTU ShRY@ gsZ X \ hz lW˞@ mWL n@gsp PiqWlrWhpprWdsW`tW\9 uWX@ W  W nW  W n W W ӟ@(@ Wl l4 e?A$ `qa rY eEI qa2>W @qa?W Dqa l ezK ra r e=L (rayJW ra0^z @paW\intJ^678s9 JKL3MW N O Q@H? QX QP Sh ]@/k ]h c#@h 3cW\ leh p@` pX lrh s` @1 X P lhc^a @6R7R8R-9R8nWintJ@ ABCxDyEeFGbIJKfLMgPOgPxQyR NSTU hjV$vjW%X(7Y4JZ8N[<\@]Dg^Hh_uL  ^`% bcdnumeulf  g  ptsh(i0 j8ku@nlHmPCnXodBppoq|8rMs$t7uvwxymz{l|@}.~(epsugu4u&u u&uu2u '  mmmnumus 2m loc3u~#(0[NnC8 hj(vj)*fXg hl maxmin. $3(,0d 4J 8(<@.DHLP7\`4lp3|}uuukuuuFuu u uuKs?4u,uIcl ռu; ,l Si p޲߲numu< $A(X0X89 '@ H sP  Xu`uddef[h\||  `uQ u( |0 8 s@ H [P X   `   h  up Sut x   "  & / 10 1 2 `3c 5u 7      u    R. S. T.  UusVfW D X. Z^@Jhf@ lj4 hw@! fxXsyPl{4 `ins|ul*@l8 xhy`tdf8 XplaPt@t tlf8 `z@ x1hy1`x2Xy2PTHŦ@4 x1hy1`x2XmsPTɀ@x x1hy1`c'X @C x1hy1`N@Eᓨ@Cx1hy1`U֨@C9x1hy1`@Cqx1hy1`\@Cx1hy1`@xhy`M dC8 XlmPrA@x hy `S  X<  PM TC 8 H\m @ @cul '@.sh U@fx1hy1`x2Xy2PgH%X@)l& Hf(uXi(ulh(uhfnl)\s*`!i@:3jho@)Pp\[ qPflsh/ Z4 `ra [u ,ra \u hra(  # 0^u @88W\intJii^`bQ u( |0 8 s@ H [P X  U`  [h  bp Sbt px F T "a q &{ / 10 1 2 `3- 5b 7w UU [ b$ q   m 9b ?@A Bb C  I@( JXKP LLpNh#[^ @K,88W\intJii^`bQ u( |0 8 s@ H [P X  U`  [h  bp Sbt px F T "a q &{ / 10 1 2 `3- 5b 7w UU [ b$ q   6789@ ABC xD yE eFGbIGJGKG fLMGgPOgP xQ yR NSTU hjV$ vjW%X(7Y4JZ8N[<\@]Dg^Hh_bL / `:X b7c7d7 numeb lf/ g/ ptsh (i 0 j 8kb@nl Hm=PCnXodBppoq|8rMs$tM7uvwxymz{l|@}.~( epsbgb4b&b b&bb2=b@ M 7  numb s/X  loc3b#(0Nn C8= hj( vj)*~ g/ hl/ max min. $3(,0d 4J 8(<@.DHLP7\`4lp3•|Õ}bbbkbbbFbb b bbKϙ?4b,bIӉ   b; ,ڕ l/S   p    numb< $A(~ 0~ 89 M@  H P /Xb`bd defh   Pw w w  g  ( bb} 08Rb@ZbDibH b w  O@ gP Hx S\ h@ gi lk  lb\ mX mymTxmP(mLU mH mDcnMso@LbT  @ a~ Xshdl: *@5 a+~ Xi-bl 5b @ a6~ Hi8bXb8blb28bh8bdx9`x29T 9\ ab@(ab~ Xddliebh x@ay~ Xgz Ptmp|hi}blp@Db@qDb@Dbw@qDb@\Db @_0a~ g t1\t2Xt3T  tmpPLgHND@ bi1bhs~  |9@l}/Hg~ @ blenl PfbTibhfnl\tmpXs` @\}l/Hlen@  d ` \L Xxlyh <@Yg Xsh @cMXg P@yDb1 ,@PHg XcMh |@g Hc Mhs `xa ~ Xya ~ P 8?@l9/hg: ` C@#gD h S9@gsT V hgW ` XD X\@ XXr XTF XP] YbLiYbHPi? pra3 #[y ^ X@a*88W\intJii^`bQ u( |0 8 s@ H [P X  U`  [h  bp Sbt px F T "a q &{ / 10 1 2 `3- 5b 7w UU [ b$ q   @ ABC xD yE eFGbIJK fLMgPOgP xQ yR NSTU hjV$ vjW%X(7Y4JZ8N[<\@]Dg^Hh_bL  `" bcd numeb lf g ptsh(i0 j8kb@nlHmPCnXodBppoq|8rMs$t7uvwxymz{l|@}.~( epsbgb4b&b b&bb2b    ]]] numb s"]  loc3bn#(0KNnC8 hj( vj)*VH g hl max min. $3(,0d 4J 8(<@.DHLP7\`4lp3•|Õ}bbbkbbbFbb b bbKc?н4b,bIS \ լ b; ,ڕ lSܷ Y  pޢ ߢ   numb< $A(H 0H 89 @  H cP Xb`bd defKh   PA A A  g  ( bbG 08Rb@ZbDibH bW A  BX@& nspCblc H~@4 pIh N@ pOhaPH ` YKAZ0 pZha[H ` dAxf seXigbl rA ssXiublt A lhnspbdg X AU$ lhnspbdg X A<  cnspbg phpx`pyXibTflHMA;Db 4VA;a5H Hnsp6bDg7 9H hh:`s;cX 'A[l hnspbdg Xi Ag XnspbTchsc`n -A=gsW HW hg ` _ibX#[ S?H j_2bzH=_yb$ ^C A G088WintJ\FF^0(`?Q u( |0 8 s@ H [P X  ``  fh  ?p S?t px T b "l | &{ / 10 1 2 `3- 5? 7 `` f ?/ | (  6789" 0L5M5N5 O P; Q?  R$ S%T?( U5 @ sAhssXfu;nvAhDw A, ? AS  A*w ? !A sXi?lck !A] ?#"A  C"AEp?\nAh7 #AFnAh#A ?m $A%A )?8?&A?Ds9hA?&A|iBXjD?l?P?U'A@fQXjS?lZ f(Ap9sgH iX j?lij?hjj?d* *Acoi?h!j? ?dlen?` ?\ PQ +AK!ctxthnew`!i? ?+A]coi?h ?d"m,A #$ Ww ra$ X? 0ra$ Y hva$ Z? lva$ [ pvaeof\? tva$ ]? xva$ ^A va$3_ 4ra$ a; va k#+$ bZ va$c? 8ra%K f%#f% : ; I$ > $ >  : ;  : ; I8  : ; I8  I I !I/  : ;I8 : ; .?: ; I@B: ; I: ; I .?: ; I<.?: ; I@B.?: ; @B4: ; I4: ; I.?: ; I< .?: ;I<.?: ;I<.?: ;@B: ;I4: ;I4: ;I !I/!: ;I"4: ; I?<% : ; I$ > $ >   I : ;  : ; I8 : ;I8 : ; I !I/ : ; I8 .?: ; @B: ; I4: ; I4: ; I.?: ; I< .?: ; I< .?: ; @B.?: ;I@B: ;I: ;I4: ;I4: ;I.?: ;I<.?: ;I<.?: ;@B U!4: ; I?<"!#4: ;I?<% $ > $ >  I : ;  : ; I8 : ; I : ; I8 I !I/ .?: ; I@B 4: ; I : ; I4: ; I.?: ; I<: ; I.?: ;I@B: ;I4: ;I4: ;I.?: ;@B: ;I.?: ;I< .?: ;I<4: ; I?% $ > $ >  : ;  : ; I8  I: ; I.?: ; '@B : ; I 4: ; I .?: ; 'I@B 4: ; I .?: ; '@B%  : ;  : ; I8  I: ; I$ > $ >  : ; I8 I !I/  : ;I8 : ; .?: ; @B.?: ; @B4: ; I: ; I: ; I.?: ;@B: ;I: ;I.?: ;@B4: ;I4: ;I4: ; I4: ; I?<% : ; I$ > $ >   I : ;  : ; I8 : ;I8 : ; I !I/ .?: ; @B: ; I4: ; I4: ; I?<% : ; I$ > $ >   I : ;  : ; I8 : ;I8 : ; I !I/ : ; I8 .?: ; @B: ; I4: ; I4: ; I .?: ; I<.?: ;I@B: ;I4: ;I4: ;I.?: ;@B .?: ;I<: ;I.?: ;@B4: ; I?<% : ; I$ > $ >   I : ;  : ; I8 : ;I8 : ; I !I/ : ; I8 .: ; @B: ; I.?: ; I@B.?: ; I@B4: ; I.?: ; @B .?: ; I<.?: ;@B: ;I4: ;I4: ;I4: ; I?<!4: ;I?<% : ; I$ > $ >   I : ;  : ; I8 : ;I8 : ; I !I/ .?: ; '@B: ; I4: ; I4: ; I.?: ; @B.?: ; I@B.?: ; @B.?: ; I@B.: ; I@B.: ; @B .?: ; I<.: ;@B.?: ;I<.?: ;I@B: ;I4: ;I.: ;I@B 4: ;I!4: ;I".?: ;@B#!I/$4: ; I%4: ; I?<{ /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/includedraw.cjgraph.hstddef.htypes.hstdio.hlibio.h @!JtX#T'K0ZtX=!!"=I!"=I"M!=K#?P!=YvZyJ J>3/=2hggM2sٟ3%u-==//nn//nnr !!uu=fgoH[gjhLup3q+ Qu?gqh!q2vJgQu?//f(Kg1&g1ggp+4 9Y:).Yu'u/sfg,S'g7Lg7L !'?/Y.Y ! XuXu'Y99Y6((gY$(YgY!YfY22gYuig97gvJfXYuuifg7gg97Lfguq+ff(Zuuifg7gg97w+ gg(ZKKZg=8Zg=8Y(6gYY$>0gY(>0g/u/*~. 3H/ h "K&&'#K[ h/!9DQ2YH==%/.+%׭<<PM(5(VJ- 2I2-22TTKC4$S4$g20g"9999g)"u3uf~  /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/includeedit.cstddef.htypes.hstdio.hlibio.hlist.hjgraph.h F@YKJYKJKJKJKJKKKKKKKJY/KJKJ僼KK=EJQ.22=?gmKKK===KK===bnKK=K==KY=Y=======22=============4BYXYtu-ux  s֟ɠu-ןuh[4BYXYtu-x  s֟ɡu-ןZ4@/ןɠy K233xJY!KxJ +'*=!3 Yu;L;Yg't0gɭgggJfJXf=JfXf=gggJfJXf=JfX>$"Z<=%<=<=%<G<<BXuuttYu'gw utLvבugJutLvבugJutLuבugJtY#*&J=Xu/yu:u:u:tYt/t/t/t/t/t/t/t/t0*((utuutLuבugJutvuʠ,u'tYuJYh,u'uYuYuYuYuYuYuYuYuYuYuYuYut/thu/u0}.2'$Xf?uuJYuKvtYʠ!0Y2&ZutJutJutJutJuuZuttuttutYuuuuuuuK'KutJuYuYuYuYu;uYfuz_y`uutJuYuYuYuYutJutJuYuYuYuYuYuYuYuYuYuYuYuYuYuYutLugutLugutLu=П~.2$Yut=ut=u;L===u===uu===u===uut=utKut!uH.;4YKKKK(3u3BK8u3BKKKJKJKK(Ku-KL1K;KJKJKKKKʟD.?2'YK(:u:Iu-K;u/ןyJ fv$KJKJK==KKɠz<J JYK#!ZJYK#!1'\5 jgraph.clist.hjgraph.h @׭ɃgK4!!׭gg!!!K!ggK3K4XuK2!׃gggKKK1׻Ƀ!廻K1ɃK3!K3XuK.gg!!!"K3XuK2!YYK/3 uuuuv((((Ky$J ff. g' list.clist.h @1/!1׭K/K1u0L1M /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/includeprintline.clist.hstddef.hjgraph.htypes.hlibio.hstdio.h @K1g[3gJtX=gwvg/ɟY4EfKg gAgg)g'3g gA3Ig1/3I0@3&(2"1K!=2"2"3"2"4E35g32u2Y3Ht2ZuY!GJ^$<式3MWcAY3nJ2K#3/  /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/includeprio_list.cstddef.htypes.hlibio.hstdio.h @2gJgK[fXgY[f g!x. Y1 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/includeprocess.cstddef.htypes.hlibio.hlist.hjgraph.hstdio.h @(;@ /XX=!fX=!-X/=fX>xϻYYu==u/(X&=(X&/<X=<X>v  &f12f3#9=<3[g[==(fXt< t='+==Y!*=!+=Y'=C.(+[=!*=!+=Y'=C.((x;'+=Y!*=!+=Y'=C.(+!*=!+=Y'=C.((;#Luh==g׻x  %x"ffYf[.YY.YY.YYZuuY<KYyXf uuY<KYyXf 2ן.X.X׻L!-uX.X׻uh3##JtXtXןtX؟##JtXtXןtX؟g$(!hJtX٠%8n/&h&h3Kf/"=/=77O !f/yUf/Y$X-gɭ!g!K"< Xt=u.#--***ɠ"g$ )gɭxJ .gL8./Ke0/!=tXZ!tX?f=t=f=t>gtYYf<=f<=.<=.<y< J!#9&.X=fX>!Xt=<X>=.Xt=<X>>X<9'X='L#9&.X=fX>!Xt=<X>=.Xt=<X>>X<9f>z4Zg33حY!J^wX<=zJ [4&KWKW-/-/X ufut vX ut ufv<X ufut v<X ut ufv23 2'ɠeffveffvff9 f;;xs2!ftu/.$ftu/.$!ftu/.$ftu/.$3Yftuftuftuftu2((2ב=X=X=X=X8'Ku$M0Ku$M1ufttXtggT/ /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/includeshow.cstddef.htypes.hlibio.hjgraph.hstdio.h X@.2A'K0u<JA2<<KJB5/=H96)ɻ<!4/#H96)!45!=AN/N$s v'$I<u-ٟB========/!u>g!vyJ <111<'T43-JtX0KLZDtX!tX!tX!tX!tX!tX!<<<!tX!tX!"gi!!=tXVO=9q4/$$#ٻ3::uu2KfKWLL&guVo3 /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/usr/include/bits/usr/includetoken.cstddef.htypes.hstdio.hlibio.hlist.h Au0u/#g1K&1KK1K2gfhsYf=1K0./////1K2/KYgvZɠ1^KɻY1KY/ןZ///ɠ>k./ɠɠ0Z!2uY2usJY2J.JK..JKK..JYY2u<(HJBu<(Z%JzK1ɻuuYuIig=g$fhmtK1tuKK1ɻuu/Iif>yt Y1K__off_t_IO_read_ptrdraw_strings_shortbufis_lgasizesize_thash_lineslinesepprefileepifileflistnlinespfilldraw_graphborderdonesetgraygs_pcont_linestart_polyxminvalmarksizeapatterncont_polydraw_arrowStringmgrid_lineshash_formatother_vtable_offsetpfilltype_filenoHashdefltpparglarrowmidspaceintoplong intLegendgsave_flagsdraw_curves_IO_buf_end_cur_columnshort intPointyeptsepilogueprint_label_old_offsetdraw_axis_labeldraw_hash_labelsstart_givendraw_legendlogminfontsizexepts_unused2Labellarrowshash_scalemgr_graytypepointauto_hash_labelslong unsigned intpagedraw.c_IO_write_ptrflinkpostfiledraw_axislandscapeshort unsigned intmgr_gray_IO_FILEtheta_IO_save_baseend_polybezier_controlsetfontctoppmax_modepsizedraw_graphssetlinewidthpminreal_eofymaxvalerror_header_IO_read_endsizetyperarrowgeneral_marks_IO_write_endlogfactororientation__off64_tpreamble_IO_lock_tGraphsdraw_attmpmktypedraw_headerlog_basex_axispostscript_IO_marker_posnptsyminval_markersgen_linetype__pad2linethickafillprint_ebardraw_curveGNU C 4.8.5 20150623 (Red Hat 4.8.5-16) -mtune=generic -march=x86-64 -g -ansiset_clipdraw_labelauto_hash_markslinebreak_chain/home/plank/www-home/plank/jgraph/work/jgraph/jgraphdraw_hash_marksrarrowsdraw_hash_marks_aty_translatemrotatebezier_end__pad5ymaxapargprintellipseyminmarktypeCurvedraw_footer_nextsetlinestyle_IO_read_base_IO_save_endhashunsigned charstart_linedraw_mark_lock__pad1__pad3__pad4Defaultblinkxmaxstderrsetfillthis_xthis_yppatternAxisxmin_flags2_IO_backup_basedraw_axis_lineprintlineGraphafilltypeFlistmajorend_linelast_xlast_ydisttopgrestorexmaxvaldraw_hash_labels_atlinelength_IO_write_baseanylines_IO_buf_basex_translate_sbufbezieredit_legendoldgsMARKTYPESTRScopy_labeltmp_glast_graphlastledit_graphsedit_curveedit_axisedit_graphlastccopy_axisgetstringnewcedit_labelListgetfloatoldgall_gsdo_copy_stringgetintinp_stredit.cthe_gnewfnewlinherit_axeslastgcopy_legendNMARKTYPESPTYPESdo_copy_curvenew_graphsedit_hash_labelrejecttokenNPATTERNSgetpatternnewpnew_axisget_stringshownew_curvenew_legendnew_labelcommentsnew_snew_graphjgraph.cnew_stringNORMALMARKTYPESprio_insertnewgset_commentnew_titleget_curvenfilesset_input_filenew_cnew_gget_graphnew_lineshow_graphsmainprocess_graphsargvargcto_returnint_listfree_nodedelete_itemInt_listget_nodelast_nodefree_listmake_listJgraph_commentfontlistJgraph_gsave_levelprintline_cstdoutJgraph_fontsradius2Fontlistftyperadius1glistprintline.cBooleanprio_list.cprio_listPrio_listpriodescadjustprecprocess_stringsprocess_curvediffmaxmarkyprocess_extremafind_reasonable_minor_hashesylenmax_yanythingprocess_label_max_n_minsprocess_curvesmin_ymin_xyheightfind_reasonable_hash_intervalmax_xytitlelocprocess.cprocess_titleprocess_graphhdistprocess_legendtoleranceprocess_labelprocess_axis1process_axis2xheightfind_reasonable_precisionhlocxlenprocess_label_extremadoublefind_reasonable_hash_startmaxmarkdo_bbptoinshow_graphshow_labelspacesstartedptodistshow_legendshow_lmarkshow_curveptocshow_stringshow_axisshow.cshow_mltilinegetsystemstringinitstreampipeto_padiostackemptypush_iostackgetmultilinepop_iostacktoken.cstdingetlabelnew_printable_textnexttokengettokenfilenameIOSTREAMungettokencharget_commentgetnewoldcharvalidINPUToldcharout_strFILENAMEIostackpcloseK3333.symtab.strtab.shstrtab.interp.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_info.debug_abbrev.debug_line.debug_str.debug_ranges8@T@t@@@p@@@ X@ @ @ @ @d-Ap-ARAVAnanananaoapa qa@ra  na @. P@A @WXrafna @na$qa`ra,ra hra&0pra3: X@&A AxOWra]0radhvallvaypva~tvaxvava4ravava,8ra #"A  C"AE #AF $A (ApfAnananana.paD `-ATf &A?p 9@~ VA r@s k=@0 @CDqa @ra  qa! @/ @; -AG[ !Ad @Em @` ?@ @ ?@ Z@raHra @ 9@ F@" ;@@.W@i ٛ@s @_ +AK v@ @  {@^ 'A[ 1 &A|8 8@D U@P`qa] N@Ef #@hp !A]| I@& C4@ @J @) ,@P  @ '@. @2 qa?S @_ |@o f@  r@x-A Ap-A A<  V@ @V Ah ,Ae  @(<R A^ \@Ch p@x @swa @ @0 U'A@ =@\ @ @! N@ R  @ ] @qah y  AU  E@   w A,  L@&  +A  @#  AS (ra  A* ra  @`  q@I  Q@% : L ` @ral  @w  <@Y  @:  A  @  A@  X@r  @l  @  @4  @  @,  *A9 PraM  =@4S  t@crtstuff.c__JCR_LIST__deregister_tm_clonesregister_tm_clones__do_global_dtors_auxcompleted.6345__do_global_dtors_aux_fini_array_entryframe_dummy__frame_dummy_init_array_entrydraw.creal_eofedit.cjgraph.clist.cprintline.cJgraph_fontsJgraph_gsave_levelJgraph_commentprio_list.cprocess.cPishow.cspacesshow_mltilinetoken.cINPUTgetnewoldcharoldcharvalidpipeeofinitstackIOSTREAMFILENAMElineiostackemptypush_iostackpop_iostacknexttokennew_printable_text__FRAME_END____JCR_END____init_array_end_DYNAMIC__init_array_start_GLOBAL_OFFSET_TABLE___libc_csu_finifree@@GLIBC_2.2.5getstringprocess_labelputchar@@GLIBC_2.2.5show_axisget_graphdraw_graphbezier_controlNORMALMARKTYPESstrncmp@@GLIBC_2.2.5_ITM_deregisterTMCloneTablestdout@@GLIBC_2.2.5data_startprocess_titledraw_curvesshow_graphsstrcpy@@GLIBC_2.2.5gettokennew_lineputs@@GLIBC_2.2.5new_titleprocess_label_extremanew_labeldraw_graphsedit_curvePATTERNSstdin@@GLIBC_2.2.5exp@@GLIBC_2.2.5atof@@GLIBC_2.2.5set_clipprocess_graphsedit_labeldraw_header_edataprint_labelatan@@GLIBC_2.2.5set_commentfclose@@GLIBC_2.2.5ptoin_finistrlen@@GLIBC_2.2.5end_polycopy_legendget_stringprocess_axis2printf@@GLIBC_2.2.5getlabelpclose@@GLIBC_2.2.5new_legendedit_legendnew_stringshow_legendlog@@GLIBC_2.2.5getintdraw_legendprintline_cMARKTYPESTRSend_linemake_listget_commentcopy_curvecos@@GLIBC_2.2.5fputc@@GLIBC_2.2.5draw_arrow__libc_start_main@@GLIBC_2.2.5gsavefgets@@GLIBC_2.2.5setlinestyleprocess_curvesptoccommentfind_reasonable_hash_start__data_startstrcmp@@GLIBC_2.2.5prio_insertprocess_extremafprintf@@GLIBC_2.2.5grestore__gmon_start__edit_axis__dso_handleshow_graph_IO_stdin_usedshow_curvelast_graphdisttopset_input_file__libc_csu_initprintlinemalloc@@GLIBC_2.2.5fflush@@GLIBC_2.2.5_IO_getc@@GLIBC_2.2.5show_stringcont_polyedit_hash_labelget_curvesscanf@@GLIBC_2.2.5_end_startedit_graphsgetfloatdraw_stringsprocess_legendrealloc@@GLIBC_2.2.5setfontcopy_axis__bss_startbezier_endfree_nodeMARKTYPESstart_polymaindo_copy_stringctopnew_axisdraw_markprocess_label_max_n_minsrejecttokenfind_reasonable_minor_hashesprocess_curvecont_linedelete_iteminherit_axesinsertedit_graphdraw_labelprocess_axis1print_ebarptodistpopen@@GLIBC_2.2.5copy_labelfopen@@GLIBC_2.2.5_Jv_RegisterClassesdraw_curveNMARKTYPESsin@@GLIBC_2.2.5show_lmarkdraw_footeratoi@@GLIBC_2.2.5error_headernew_graphgetsystemstringprocess_graphgettokencharPTYPESungettokencharNPATTERNSget_nodedraw_axisdo_copy_curvesprintf@@GLIBC_2.2.5exit@@GLIBC_2.2.5fwrite@@GLIBC_2.2.5__TMC_END__start_lineprocess_stringssetlinewidthshow_label_ITM_registerTMCloneTablenew_graphsprintellipsegetpatternsetfill_initnew_curvefind_reasonable_hash_intervalfind_reasonable_precisiongetmultilinestderr@@GLIBC_2.2.5intopsetgray8@8#T@T 1t@t$Do@0N @Vp@pV^o@Nko@@zX@X`B@  @  @  @ rd-Ad- p-Ap-,%RARVAVnannannannanoaopap qa q @ra