Ilya Zakharevich on Thu, 17 Dec 1998 04:31:32 -0500 (EST) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
2.0.13: dynamic linking with gnuplot |
Math::Pari Perl module uses a specific way to allow plotting: instead of compiling plotnull.c (sp?) it compiles plotgnuplot.c with a special flag -DDYNAMIC_PLOTTING. When this flag is present, no external plotting functions are mentioned in plotgnuplot.c (thus the effect is the same as for plotnull.c - no external libraries are needed). However, there is a function which may be called to initialize 2 variables (sic, only two) with addresses of a change-terminal function, and the GNUPLOT's table of dispatch. Thus the linking with high-resolution plotting is delayed until runtime, when an external DLL may load GNUPLOT library, then call the mentioned function in plotgnuplot.c with (now known) addresses. This is the way Math::Pari module works: it may load the Term::Gnuplot low-level plotting Perl module, and initialize the variables with the data taken from the Term::Gnuplot. Unfortunately, the gnuplot-output-file setting I added breaks this harmony, since set_output_file() is called directly, without redirection. The following patch fixes this. Note that currently it is not possible to use the PARI function plotfile() from Math::Pari. An extra change to Term::Gnuplot is needed - it needs to export the address of term_set_output(). However, Term::Gnuplot has an independent way to set the output file. Enjoy, Ilya --- pari-2.0.13.alpha/src/graph/plotgnuplot.c~ Tue Dec 15 10:30:11 1998 +++ pari-2.0.13.alpha/src/graph/plotgnuplot.c Thu Dec 17 02:28:56 1998 @@ -140,7 +140,7 @@ term_set(char *s) reset(); strcpy(pari_plot.name,s); if (!termset( s )) - err(talker,"error setting terminal \"\%s\"", s); + err(talker,"error setting terminal \"%s\"", s); do_init(); /* Init terminal. */ setpointsize(pointsize); --- pari-2.0.13.alpha/src/graph/Gnuplot.h~ Wed Dec 9 11:23:02 1998 +++ pari-2.0.13.alpha/src/graph/Gnuplot.h Thu Dec 17 02:57:31 1998 @@ -281,11 +281,33 @@ static struct termentry dummy_term_tbl[] }; static struct termentry *my_term_tbl = dummy_term_tbl; +# define term_set_output (*term_set_outputp) +static void +myterm_set_output(char *s) +{ + croak("Change terminal not implemented yet with dynamic gnuplot"); +} + +typedef void (*TSET_FP)(char *s); +TSET_FP term_set_outputp = &myterm_set_output; + /* This function should be called before any graphic code can be used... */ set_term_funcp(FUNC_PTR change_p, struct termentry *term_p) { my_term_tbl = term_p; change_term_p = change_p; + /* XXXX Need to set term_set_outputp as well */ +} + +/* This function should be called before any graphic code can be used... */ +set_term_funcp3(FUNC_PTR change_p, struct termentry *term_p, TSET_FP tchange) +{ + my_term_tbl = term_p; + change_term_p = change_p; + if (tchange) { + term_set_outputp = tchange; + } + /* XXXX Need to set term_set_outputp as well */ } #else /* !DYNAMIC_PLOTTING */