Ilya Zakharevich on Sat, 4 May 2002 05:21:09 -0400 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
[PATCH 2.2.2] mneumonics for flags |
This patch improves support of DYNAMIC_PLOTTING with gnuplot: now it a) always allows specification of the DLL name via $GNUPLOT_DRAW_DLL; b) If DYNAMIC_PLOTTING_RUNTIME_LINK is not specified at compile time, and $GNUPLOT_DRAW_DLL is not set, gp will try to locate Term::Gnuplot Perl module, and use its DLL (at compile time this behaviour may be switched off by -DDYNAMIC_PLOTTING_RUNTIME_LINK_NO_PERL, at runtime by setting $GNUPLOT_DRAW_DLL_NO_PERL); c) Supports --graphic=gnuplot-dynamic; Now on most systems Gnuplot-enabled GP can be made by sh Configure --graphic=gnuplot-dynamic make gp make install perl -MCPAN -e "install Term::Gnuplot" (tested on OS/2 only as of today). Note that the last step may be postponed arbitrary late; until done, ploth() and friends will emit a message with an advice on installation of Term::Gnuplot. Enjoy, Ilya --- ./Configure-pre Wed Dec 19 08:37:50 2001 +++ ./Configure Sat May 4 01:38:18 2002 @@ -122,7 +122,8 @@ Options: some names can be abbreviated t -v, --verbhelp a longer help message Build Options: --host=<arch-osname> target achitecture - --graphic=<gr> graphic library used (default X11) (none X11 gnuplot) + --graphic=<gr> graphic library used (default X11) (none X11 gnuplot + gnuplot-dynamic) Additional developer options: -g creates debugging version (in Oxxx.dbg) -pg creates profiling version (in Oxxx.prf) @@ -445,6 +446,12 @@ if test "$optimization" != profiling; th # We want these libraries: # echo Checking for optional libraries and headers... + +# ======== GRAPHICS environment search ============== + +# At this moment $which_graphic_lib is either none, or the argument to +# --graphic option; $graph_cmd is "" unless --graphic option was specified. + # LIB: X11 pth=$x11pth lib=X11; . ./locatelib @@ -456,6 +463,8 @@ if test "$optimization" != profiling; th pth=$libpth # LIB: gnuplot +# Look for it unconditionally, without read/write of +# $which_graphic_lib or $graph_cmd opth="$pth" pth="$TOP/gnuplot-$osname-$arch $TOP/gnuplot $TOP/../gnuplot-$osname-$arch $TOP/../gnuplot $TOP/../../gnuplot-$osname-$arch $TOP/../../gnuplot $pth" gpth="$pth" @@ -505,6 +514,8 @@ if test "$optimization" != profiling; th ;; esac +# ======== END of GRAPHICS environment search ============== + # LIB: GNU ReadLine readline_add="$GP_READLINE $TOP/readline-$osname-$arch $TOP/readline" pth="$readline_add $pth" @@ -645,10 +656,10 @@ EOM cat << EOT ========================================================================== GP contains high resolution plotting functions. Choose among - none $addX11 $addgnuplot + none $addX11 $addgnuplot gnuplot-dynamic EOT echo $n ..."Use which graphic library (\"none\" means no hi-res plot) ? $c" - rep="none $addX11 $addgnuplot"; + rep="none $addX11 $addgnuplot gnuplot-dynamic"; dflt=$which_graphic_lib; . ./myread which_graphic_lib=$ans @@ -702,14 +713,15 @@ EOT pth=$x11pth; lib=X11; . ./locatelib fi ;; - gnuplot);; + gnuplot*) ;; *)gnuplot=;; esac else # fastread = yes + # TEST: --graphic was not given, X11 not found, and gnuplot library found if test "$which_graphic_lib" = none -a -z "$graph_cmd" -a -n "$gnuplot"; then which_graphic_lib=gnuplot fi - if test -z "$X11" -a -z "$gnuplot" -a -z "$readline"; then + if test -z "$X11" -a -z "$gnuplot" -a -z "$readline" -a "X$which_graphic_lib" != Xgnuplot-dynamic; then echo ...none fi fi --- ./config/Makefile.SH-pre Fri Jan 11 01:12:12 2002 +++ ./config/Makefile.SH Sat May 4 01:39:12 2002 @@ -88,6 +88,12 @@ gnuplot) *) libgnuplot=$gnuplot/libgnuplot.a;; esac ;; +gnuplot-dynamic) + PLOTFILE=plotgnuplot.c + PLOTCFLAGS="-DDYNAMIC_PLOTTING -DDYNAMIC_PLOTTING_RUNTIME_LINK=NULL" + PLOTLIBS= + plotrunpath= + ;; X11) PLOTFILE=plotX.c PLOTCFLAGS=-I$Xincroot --- ./src/graph/plotgnuplot.c-pre Tue Mar 13 09:56:52 2001 +++ ./src/graph/plotgnuplot.c Sat May 4 02:01:44 2002 @@ -25,6 +25,9 @@ Foundation, Inc., 59 Temple Place - Suit #define SET_OPTIONS_FROM_STRING #define GNUPLOT_OUTLINE_STDOUT #define DONT_POLLUTE_INIT + +/* The gnuplot library may reference a function with *this* name */ +#define mys_mouse_feedback_rectangle set_mouse_feedback_rectangle #include "Gnuplot.h" #ifdef __EMX__ @@ -300,22 +303,85 @@ set_pointsize(double d) setpointsize(d); } -#ifdef DYNAMIC_PLOTTING_RUNTIME_LINK +#ifdef HAS_DLOPEN #include <dlfcn.h> get_term_ftable_t * get_term_ftable_get(void) /* Establish runtime link with gnuplot engine */ { - char *s = getenv("GNUPLOT_DRAW_DLL"), buf[4096]; + char *s = getenv("GNUPLOT_DRAW_DLL"), *s1, buf[4096]; void *h, *f; int mode = RTLD_LAZY; + char fbuf[2048]; #ifdef RTLD_GLOBAL mode |= RTLD_GLOBAL; #endif +#ifdef DYNAMIC_PLOTTING_RUNTIME_LINK if (!s) s = DYNAMIC_PLOTTING_RUNTIME_LINK; +#endif +#ifndef DYNAMIC_PLOTTING_RUNTIME_LINK_NO_PERL + /* Allow user disabling by setting GNUPLOT_DRAW_DLL_NO_PERL=1 */ + if (!s && (!(s1 = getenv("GNUPLOT_DRAW_DLL_NO_PERL")) || !atoi(s1))) { + char cmdbuf[256]; + FILE *p; + char ext[256]; + char *sub; + char name[256]; + char *n = "Gnuplot"; + + /* Make 2 runs of Perl to shorten the command length */ + /* Find the directory of the Term::Gnuplot's PM and DLL extension */ + sprintf(cmdbuf, "perl -MTerm::Gnuplot -MConfig -wle %c" + "print $INC{qq(Term/Gnuplot.pm)};print $Config{dlext}%c", + SHELL_Q, SHELL_Q); + p = popen(cmdbuf, "r"); + if (!p || !fgets(fbuf, sizeof(fbuf), p) || !fgets(ext, sizeof(ext), p)) + goto end_find; + pclose(p); + /* Find the directory of the DLL file */ + sub = strrchr(fbuf,'/'); + if (!sub) + goto end_find; + /* Do as XSLoader */ + sub[0] = 0; + sub = strrchr(fbuf,'/'); + if (!sub) + goto end_find; + if (sub - fbuf >= 9 && !strncmp(sub - 9, "/blib/lib",9)) { + strcpy(sub - 3,"arch/"); /* Uninstalled module */ + sub++; + } + strcpy(sub + 1,"auto/Term/Gnuplot/"); + /* Find the name of the DLL file */ + sprintf(cmdbuf, "perl -MDynaLoader -we %c" + "package DynaLoader; " + "print mod2fname[qw(Term Gnuplot)] if defined &mod2fname%c", + SHELL_Q, SHELL_Q); + p = popen(cmdbuf, "r"); + if (p) { + if (fgets(name, sizeof(name), p)) + n = name; + pclose(p); + } + if (strlen(fbuf) + 10 + strlen(n) + strlen(ext) > sizeof(fbuf)) + croak("Buffer overflow finding gnuplot DLL"); + strcpy(sub + strlen(sub), n); + strcpy(sub + strlen(sub), "."); + strcpy(sub + strlen(sub), ext); + sub[strlen(sub)-1] = 0; /* Trailing \n of ext */ + s = fbuf; + } + end_find: +#endif + if (!s) /* The trailing \n is important: one may put . to the command */ + croak("Can't find Gnuplot drawing engine DLL,\n\t" + "set GNUPLOT_DRAW_DLL environment variable" + " to the name of the DLL,\n\t" + "or install Perl module Term::Gnuplot, e.g., by running\n\t\t" + "perl -MCPAN -e \"install Term::Gnuplot\"\n"); h = dlopen(s, mode); if (!h) { sprintf(buf,"Can't load Gnuplot drawing engine from '%s': %s", s, dlerror()); --- ./src/graph/Gnuplot.h-pre Tue Mar 13 09:56:52 2001 +++ ./src/graph/Gnuplot.h Fri May 3 20:50:48 2002 @@ -472,7 +472,15 @@ void myterm_table_not_loaded_v4i4d(int t # define list_terms (*my_term_ftablep->term_funcs[TTABLE_LIST]) # define plotsizes_scale (*my_term_ftablep->set_sizesp) # define plotsizes_scale_get (*my_term_ftablep->get_sizesp) + +#ifdef USE_SET_FEEDBACK_RECTANGLE +/* If DLL has it, but was compiled with older Gnuplot.h */ # define set_mouse_feedback_rectangle (*my_term_ftablep->mouse_feedback_func) +#else +# define set_mouse_feedback_rectangle(term_xmin, term_xmax, term_ymin, term_ymax, plot_xmin, plot_xmax, plot_ymin, plot_ymax) \ + ((my_term_ftablep->loaded & 2) ? \ + ((*my_term_ftablep->mouse_feedback_func)(term_xmin, term_xmax, term_ymin, term_ymax, plot_xmin, plot_xmax, plot_ymin, plot_ymax), 0) : 0) +#endif /* defined USE_SET_FEEDBACK_RECTANGLE */ # define scaled_xmax() ((int)termprop(xmax)*plotsizes_scale_get(0)) # define scaled_ymax() ((int)termprop(ymax)*plotsizes_scale_get(1)) @@ -571,7 +579,8 @@ plotsizes_get(int flag) { return (flag ? struct t_ftable my_term_ftable = { - 1, (FUNC_PTR)&change_term, &term_set_output, + 2, /* bit 2 means it has mys_mouse_feedback_rectangle */ + (FUNC_PTR)&change_term, &term_set_output, &plotsizes_scale, &plotsizes_get, {&term_start_plot, &term_end_plot, &term_start_multiplot, &term_end_multiplot, &term_init, &list_terms},