| Ilya Zakharevich on Sat, 27 May 2006 01:16:47 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Extra files for lowlevel-Gnuplot plotting terminals |
Some files needed for Gnuplot output were removed some time ago. They
can be fetched from
ilyaz.org/software/tmp/gp-pari-gnuplot-restore.zip
FYI, below are the patches WRT the latest versions I could find.
Enjoy,
Ilya
--- ./src/functions/graphic/plotterm-ini Thu Jun 26 11:49:38 2003
+++ ./src/functions/graphic/plotterm Sun Mar 19 16:41:06 2006
@@ -3,10 +3,7 @@ Class: highlevel
Section: graphic
C-Name: term_set
Prototype: ls
-Help: plotterm(\"termname\"): set terminal to plot in high resolution to.
- Ignored by some drivers. In gnuplot driver possible terminals are the same
- as in gnuplot, terminal options can be put after the terminal name and
- space; terminal size can be put immediately after the name, as in
- \"gif=300,200\". If term is \"?\", lists possible values. Positive return
- value means success
+Help: plotterm("modename"): set plotting mode of high resolution plots.
+ Ignored by some drivers. If modename is "?", emits documentation of this
+ function for the current driver. Positive return value means success
--- ./src/graph/Gnuplot.h-ini Wed Mar 15 00:29:30 2006
+++ ./src/graph/Gnuplot.h Fri May 26 01:21:38 2006
@@ -1,6 +1,6 @@
-/* $Id: Gnuplot.h,v 1.13 2004/09/23 14:49:14 kb Exp $
+/* $Id: Gnuplot.h,v 1.13 + edits $
-Copyright (C) 2000 The PARI group.
+Copyright (C) 2006 The PARI group.
This file is part of the PARI/GP package.
@@ -64,49 +64,22 @@ Foundation, Inc., 59 Temple Place - Suit
/* Compatibility with the old gnuplot: */
extern FILE *outfile;
-FILE *outfile = NULL;
-
extern FILE *gpoutfile;
-FILE *gpoutfile = NULL;
-
-static int outfile_set;
-static void
-set_gpoutfile(void)
-{
- outfile = stdout;
- gpoutfile = stdout;
-}
-
-#define SET_OUTFILE (outfile_set++ ? 1 : (set_gpoutfile(), 1))
-
extern int encoding;
-int encoding = 0;
+
extern float xoffset; /* x origin */
extern float yoffset; /* y origin */
-float xoffset = 0.0; /* x origin */
-float yoffset = 0.0; /* y origin */
extern int multiplot;
-int multiplot = 0;
+
+#define SET_OUTFILE (outfile_set++ ? 1 : (set_gpoutfile(), 1))
extern char *outstr;
#define MAX_ID_LEN 50
/* char outstr[MAX_ID_LEN+1] = "STDOUT"; */
-char *outstr = NULL;
+/* char *outstr = NULL; */
extern double ticscale; /* scale factor for tic marks (was (0..1])*/
-double ticscale = 1.0; /* scale factor for tic mark */
-
-char *input_line = NULL;
-int inline_num; /* from command.c */
-
-float xsize=1.0, ysize=1.0;
-double pointsize=1.0; /* During test! */
-
-int interactive; /* from plot.c */
-char *infile_name; /* from plot.c */
-extern char default_font[];
-char default_font[MAX_ID_LEN+1] = "\0"; /* Entry added by DJL */
-
typedef int TBOOLEAN;
+extern char default_font[];
enum DATA_TYPES {
INTGR, CMPLX
@@ -136,11 +109,10 @@ struct lexical_unit { /* produced by sca
/* char *token; */
#define MAX_TOKENS 20
extern struct lexical_unit *token;
-struct lexical_unit tokens[MAX_TOKENS]; /* We only process options,
- there should not be many */
-struct lexical_unit *token = tokens;
-long c_token = 0, num_tokens = 0;
-char term_options[200] = "";
+extern long c_token;
+extern long num_tokens;
+extern char *input_line;
+/* char term_options[200] = ""; */
/* New with 3.7.1: */
@@ -165,11 +137,7 @@ extern double base_array[], log_base_arr
extern TBOOLEAN log_array[];
/* graphics.c */
extern TBOOLEAN is_3d_plot;
-
-double min_array[AXIS_ARRAY_SIZE], max_array[AXIS_ARRAY_SIZE], base_array[AXIS_ARRAY_SIZE], log_base_array[AXIS_ARRAY_SIZE];
-TBOOLEAN log_array[AXIS_ARRAY_SIZE];
-int xleft, xright, ybot, ytop;
-TBOOLEAN is_3d_plot;
+extern float xsize, ysize;
/* End of 3.7.1 additions */
@@ -183,6 +151,53 @@ extern double log_base_log_x2, log_bas
extern double base_z;
extern TBOOLEAN screen_ok;
+/* End of 3.7.0-devel additions */
+
+#ifndef GNUPLOT_NO_CODE_EMIT
+FILE *outfile = NULL;
+FILE *gpoutfile = NULL;
+static int outfile_set;
+static void
+set_gpoutfile(void)
+{
+ outfile = stdout;
+ gpoutfile = stdout;
+}
+
+int encoding = 0;
+float xoffset = 0.0; /* x origin */
+float yoffset = 0.0; /* y origin */
+/* int multiplot = 0; */
+
+double ticscale = 1.0; /* scale factor for tic mark */
+
+char *input_line = NULL;
+int inline_num; /* from command.c */
+
+float xsize=1.0, ysize=1.0;
+double pointsize=1.0; /* During test! */
+
+int interactive; /* from plot.c */
+char *infile_name; /* from plot.c */
+char default_font[MAX_ID_LEN+1] = "\0"; /* Entry added by DJL */
+
+struct lexical_unit tokens[MAX_TOKENS]; /* We only process options,
+ there should not be many */
+struct lexical_unit *token = tokens;
+long c_token = 0, num_tokens = 0;
+/* char term_options[200] = ""; */
+
+/* New with 3.7.1: */
+
+double min_array[AXIS_ARRAY_SIZE], max_array[AXIS_ARRAY_SIZE], base_array[AXIS_ARRAY_SIZE], log_base_array[AXIS_ARRAY_SIZE];
+TBOOLEAN log_array[AXIS_ARRAY_SIZE];
+int xleft, xright, ybot, ytop;
+TBOOLEAN is_3d_plot;
+
+/* End of 3.7.1 additions */
+
+/* 3.7.0-devel additions */
+
float surface_rot_z = 30.0;
TBOOLEAN polar = 0;
TBOOLEAN is_log_x = 0;
@@ -200,7 +215,7 @@ TBOOLEAN screen_ok;
void map3d_xy (double x, double y, double z, unsigned int *xt, unsigned int *yt)
{
(void)x; (void)y; (void)z; (void)xt; (void)yt;
- croak("Unsupported function map3d_xy called");
+ croak("Unsupported function map3d_xy called");
}
/* End of 3.7.0-devel additions */
@@ -210,12 +225,15 @@ void map3d_xy (double x, double y, doubl
struct value*
const_express(struct value*v)
{
- if (token[c_token].is_token)
- croak("Expect a number, got a string");
- *v = token[c_token++].l_val;
- return v;
+ if (token[c_token].is_token)
+ croak("Expect a number, got a string");
+ *v = token[c_token++].l_val;
+ return v;
}
+void
+df_showdata(void) {}
+
void*
gp_alloc(unsigned long size, char *usage)
{
@@ -236,6 +254,8 @@ bail_to_command_line()
croak("panic: gnuplot");
}
+#endif /* !GNUPLOT_NO_CODE_EMIT */
+
#endif /* NO_JUNK_SMALL */
/* Cannot pull the whole plot.h, too many contradictions. */
@@ -246,6 +266,205 @@ typedef int (*FUNC_PTR)(...);
typedef int (*FUNC_PTR)();
#endif
+#ifndef __PROTO
+# define __PROTO(proto) proto
+#endif
+
+#if 1
+/* this order means we can use x-(just*strlen(text)*t->h_char)/2 if
+ * term cannot justify
+ */
+typedef enum JUSTIFY {
+ LEFT,
+ CENTRE,
+ RIGHT
+} JUSTIFY;
+
+/*
+ * color modes
+ */
+typedef enum {
+ SMPAL_COLOR_MODE_NONE = '0',
+ SMPAL_COLOR_MODE_GRAY = 'g', /* grayscale only */
+ SMPAL_COLOR_MODE_RGB = 'r', /* one of several fixed transforms */
+ SMPAL_COLOR_MODE_FUNCTIONS = 'f', /* user definded transforms */
+ SMPAL_COLOR_MODE_GRADIENT = 'd' /* interpolated table:
+ * explicitly defined or read from file */
+} palette_color_mode;
+
+/* Contains a colour in RGB scheme.
+ Values of r, g and b are all in range [0;1] */
+typedef struct {
+ double r, g, b;
+} rgb_color;
+
+/* to build up gradients: whether it is really red, green and blue or maybe
+ * hue saturation and value in col depends on cmodel */
+typedef struct {
+ double pos;
+ rgb_color col;
+} gradient_struct;
+
+typedef struct value t_value;
+
+# define MAX_NUM_VAR 5
+
+/* user-defined function table entry */
+typedef struct udft_entry {
+ struct udft_entry *next_udf; /* pointer to next udf in linked list */
+ char *udf_name; /* name of this function entry */
+ struct at_type *at; /* pointer to action table to execute */
+ char *definition; /* definition of function as typed */
+ t_value dummy_values[MAX_NUM_VAR]; /* current value of dummy variables */
+} udft_entry;
+
+typedef struct {
+ /** Constants: **/
+
+ /* (Fixed) number of formulae implemented for gray index to RGB
+ * mapping in color.c. Usage: somewhere in `set' command to check
+ * that each of the below-given formula R,G,B are lower than this
+ * value. */
+ int colorFormulae;
+
+ /** Values that can be changed by `set' and shown by `show' commands: **/
+
+ /* can be SMPAL_COLOR_MODE_GRAY or SMPAL_COLOR_MODE_RGB */
+ palette_color_mode colorMode;
+ /* mapping formulae for SMPAL_COLOR_MODE_RGB */
+ int formulaR, formulaG, formulaB;
+ char positive; /* positive or negative figure */
+
+ /* Now the variables that contain the discrete approximation of the
+ * desired palette of smooth colours as created by make_palette in
+ * pm3d.c. This is then passed into terminal's make_palette, who
+ * transforms this [0;1] into whatever it supports. */
+
+ /* Only this number of colour positions will be used even though
+ * there are some more available in the discrete palette of the
+ * terminal. Useful for multiplot. Max. number of colours is taken
+ * if this value equals 0. Unused by: PostScript */
+ int use_maxcolors;
+ /* Number of colours used for the discrete palette. Equals to the
+ * result from term->make_palette(NULL), or restricted by
+ * use_maxcolor. Used by: pm, gif. Unused by: PostScript */
+ int colors;
+ /* Table of RGB triplets resulted from applying the formulae. Used
+ * in the 2nd call to term->make_palette for a terminal with
+ * discrete colours. Unused by PostScript which has calculates them
+ * analytically. */
+ rgb_color *color;
+
+ /** Variables used by some terminals **/
+
+ /* Option unique for output to PostScript file. By default,
+ * ps_allcF=0 and only the 3 selected rgb color formulae are written
+ * into the header preceding pm3d map in the file. If ps_allcF is
+ * non-zero, then print there all color formulae, so that it is easy
+ * to play with choosing manually any color scheme in the PS file
+ * (see the definition of "/g"). Like that you can get the
+ * Rosenbrock multiplot figure on my gnuplot.html#pm3d demo page.
+ * Note: this option is used by all terminals of the postscript
+ * family, i.e. postscript, pslatex, epslatex, so it will not be
+ * comfortable to move it to the particular .trm files. */
+ char ps_allcF;
+
+ /* These variables are used to define interpolated color palettes:
+ * gradient is an array if (gray,color) pairs. This array is
+ * gradient_num entries big.
+ * Interpolated tables are used if colorMode==SMPAL_COLOR_MODE_GRADIENT */
+ int gradient_num;
+ gradient_struct *gradient;
+
+ /* the used color model: RGB, HSV, XYZ, etc. */
+ int cmodel;
+
+ /* Three mapping function for gray->RGB/HSV/XYZ/etc. mapping
+ * used if colorMode == SMPAL_COLOR_MODE_FUNCTIONS */
+ struct udft_entry Afunc; /* R for RGB, H for HSV, C for CMY, ... */
+ struct udft_entry Bfunc; /* G for RGB, S for HSV, M for CMY, ... */
+ struct udft_entry Cfunc; /* B for RGB, V for HSV, Y for CMY, ... */
+
+ /* gamma for gray scale palettes only */
+ double gamma;
+} t_sm_palette;
+
+/* a point (with integer coordinates) for use in polygon drawing */
+typedef struct {
+ unsigned int x, y;
+#ifdef EXTENDED_COLOR_SPECS
+ double z;
+ colorspec_t spec;
+#endif
+} gpiPoint;
+
+typedef struct TERMENTRY {
+ const char *name;
+#ifdef WIN16
+ const char GPFAR description[80]; /* to make text go in FAR segment */
+#else
+ const char *description;
+#endif
+ unsigned int xmax,ymax,v_char,h_char,v_tic,h_tic;
+
+ void (*options) __PROTO((void));
+ void (*init) __PROTO((void));
+ void (*reset) __PROTO((void));
+ void (*text) __PROTO((void));
+ int (*scale) __PROTO((double, double));
+ void (*graphics) __PROTO((void));
+ void (*move) __PROTO((unsigned int, unsigned int));
+ void (*vector) __PROTO((unsigned int, unsigned int));
+ void (*linetype) __PROTO((int));
+ void (*put_text) __PROTO((unsigned int, unsigned int, const char*));
+ /* the following are optional. set term ensures they are not NULL */
+ int (*text_angle) __PROTO((int));
+ int (*justify_text) __PROTO((enum JUSTIFY));
+ void (*point) __PROTO((unsigned int, unsigned int,int));
+ void (*arrow) __PROTO((unsigned int, unsigned int, unsigned int, unsigned int, TBOOLEAN));
+ int (*set_font) __PROTO((const char *font));
+ void (*pointsize) __PROTO((double)); /* change pointsize */
+ int flags;
+ void (*suspend) __PROTO((void)); /* called after one plot of multiplot */
+ void (*resume) __PROTO((void)); /* called before plots of multiplot */
+ void (*fillbox) __PROTO((int, unsigned int, unsigned int, unsigned int, unsigned int)); /* clear in multiplot mode */
+ void (*linewidth) __PROTO((double linewidth));
+#ifdef USE_MOUSE
+ int (*waitforinput) __PROTO((void)); /* used for mouse input */
+ void (*put_tmptext) __PROTO((int, const char [])); /* draws temporary text; int determines where: 0=statusline, 1,2: at corners of zoom box, with \r separating text above and below the point */
+ void (*set_ruler) __PROTO((int, int)); /* set ruler location; x<0 switches ruler off */
+ void (*set_cursor) __PROTO((int, int, int)); /* set cursor style and corner of rubber band */
+ void (*set_clipboard) __PROTO((const char[])); /* write text into cut&paste buffer (clipboard) */
+#endif
+#ifdef PM3D
+ int (*make_palette) __PROTO((t_sm_palette *palette));
+ /* 1. if palette==NULL, then return nice/suitable
+ maximal number of colours supported by this terminal.
+ Returns 0 if it can make colours without palette (like
+ postscript).
+ 2. if palette!=NULL, then allocate its own palette
+ return value is undefined
+ 3. available: some negative values of max_colors for whatever
+ can be useful
+ */
+ void (*previous_palette) __PROTO((void));
+ /* release the palette that the above routine allocated and get
+ back the palette that was active before.
+ Some terminals, like displays, may draw parts of the figure
+ using their own palette. Those terminals that possess only
+ one palette for the whole plot don't need this routine.
+ */
+
+ void (*set_color) __PROTO((double gray));
+ /* gray is from [0;1], terminal uses its palette or another way
+ to transform in into gray or r,g,b
+ This routine (for each terminal separately) remembers or not
+ this colour so that it can apply it for the subsequent drawings
+ */
+ void (*filled_polygon) __PROTO((int points, gpiPoint *corners));
+#endif
+} TERMENTRY;
+#else
struct TERMENTRY {
char *name;
#if defined(_Windows) && !defined(WIN32)
@@ -260,6 +479,7 @@ struct TERMENTRY {
int flags;
FUNC_PTR suspend,resume,fillbox,linewidth;
};
+#endif
#ifdef _Windows
# define termentry TERMENTRY far
@@ -268,7 +488,10 @@ struct TERMENTRY {
#endif
extern struct termentry *term;
+
+#ifndef GNUPLOT_NO_CODE_EMIT
struct termentry *term;
+#endif /* !GNUPLOT_NO_CODE_EMIT */
#define RETVOID
#define RETINT , 1
@@ -278,8 +501,10 @@ struct termentry *term;
#define F_1I int(*)(int)
#define F_1D void(*)(double)
#define F_1IP int(*)(char*)
+#define F_1IV int(*)(void*)
#define F_2 void(*)(unsigned int,unsigned int)
#define F_2D int(*)(double,double)
+#define F_2T void(*)(int,void*)
#define F_3 void(*)(unsigned int,unsigned int,int)
#define F_3T void(*)(int,int,char*)
#define F_4 void(*)(int,int,int,int)
@@ -290,10 +515,13 @@ struct termentry *term;
#define CALL_G_METH1I(method,arg1) CALL_G_METH(method,1I,(arg1),RETINT)
#define CALL_G_METH1D(method,arg1) CALL_G_METH(method,1D,(arg1),RETVOID)
#define CALL_G_METH1IP(method,arg1) CALL_G_METH(method,1IP,(arg1),RETINT)
+#define CALL_G_METH1IV(method,arg1) CALL_G_METH(method,1IV,(arg1),RETINT)
#define CALL_G_METH2(method,arg1,arg2) \
CALL_G_METH(method,2,((arg1),(arg2)),RETVOID)
#define CALL_G_METH2D(method,arg1,arg2) \
CALL_G_METH(method,2D,((arg1),(arg2)),RETINT)
+#define CALL_G_METH2T(method,arg1,arg2) \
+ CALL_G_METH(method,2T,((arg1),(arg2)),RETVOID)
#define CALL_G_METH3(method,arg1,arg2,arg3) \
CALL_G_METH(method,3,((arg1),(arg2),(arg3)),RETVOID)
#define CALL_G_METH3T(method,arg1,arg2,arg3) \
@@ -307,12 +535,15 @@ struct termentry *term;
(term==0) ? ( \
croak("No terminal specified") returnval \
) : \
- (*(CAT2(F_,mult))term->method)args \
- )
+ ((term->method==0) ? ( \
+ croak("Terminal does not define " STRINGIFY(method)) returnval \
+ ) : \
+ (*(CAT2(F_,mult))term->method)args \
+ ))
-#define GET_G_FLAG(mask) ( \
+#define GET_G_FLAG(mask) ( \
(term==0) ? ( \
- croak("No terminal specified") RETINT \
+ croak("No terminal specified") RETINT \
) : \
(term->flags & (mask)))
@@ -324,7 +555,7 @@ struct termentry *term;
#endif
#define reset() CALL_G_METH0(reset)
#define text() CALL_G_METH0(text)
-#define options() CALL_G_METH0(options)
+#define t_options() CALL_G_METH0(options)
#define graphics() CALL_G_METH0(graphics)
#define linetype(lt) CALL_G_METH1(linetype,lt)
#define justify_text(mode) CALL_G_METH1I(justify_text,mode)
@@ -345,6 +576,38 @@ struct termentry *term;
#define cannot_multiplot() GET_G_FLAG(TERgM_CANNOT_MULTIPLOT)
#define is_binary() GET_G_FLAG(TERgM_BINARY)
+#ifdef PM3D
+#define term_make_palette(palette) CALL_G_METH1IV(make_palette,palette)
+ /* 1. if palette==NULL, then return nice/suitable
+ maximal number of colours supported by this terminal.
+ Returns 0 if it can make colours without palette (like
+ postscript).
+ 2. if palette!=NULL, then allocate its own palette
+ return value is undefined
+ 3. available: some negative values of max_colors for whatever
+ can be useful
+ */
+#define previous_palette() CALL_G_METH0(previous_palette)
+ /* release the palette that the above routine allocated and get
+ back the palette that was active before.
+ Some terminals, like displays, may draw parts of the figure
+ using their own palette. Those terminals that possess only
+ one palette for the whole plot don't need this routine.
+ */
+
+#define set_color(size) CALL_G_METH1D(set_color,size)
+ /* gray is from [0;1], terminal uses its palette or another way
+ to transform in into gray or r,g,b
+ This routine (for each terminal separately) remembers or not
+ this colour so that it can apply it for the subsequent drawings
+ */
+#define filled_polygon(num,corners) CALL_G_METH2T(filled_polygon,num,corners)
+
+extern t_sm_palette sm_palette;
+
+#endif
+
+
#define termprop(prop) (term->prop)
#define termset(term) my_change_term(term,strlen(term))
@@ -366,6 +629,20 @@ typedef void (*SET_MOUSE_FEEDBACK_RECTAG
int term_ymin, int term_ymax,
double plot_xmin, double plot_xmax,
double plot_ymin, double plot_ymax);
+typedef void (*SET_TOKENS_t)(struct lexical_unit *toks, int ntoks, char *s);
+
+typedef int (*START_END_OUTPUT_t)(void);
+typedef int (*DO_OUTPUT_LINE_t)(char *s);
+typedef struct {
+ START_END_OUTPUT_t start_output_fun, end_output_fun;
+ DO_OUTPUT_LINE_t output_line_fun;
+} OUTPUT_FUNC_t;
+#define HAVE_SET_OUTPUT_FUNCS
+
+typedef int (set_output_routines_t)(OUTPUT_FUNC_t *funcs);
+typedef OUTPUT_FUNC_t * (get_output_routines_t)(void);
+
+typedef int (*GET_TERMS_t)(int n, const char **namep, const char **descrp);
struct t_ftable {
int loaded;
@@ -375,8 +652,15 @@ struct t_ftable {
GET_SIZES_t get_sizesp;
TST_END_FP term_funcs[TTABLE_COUNT];
SET_MOUSE_FEEDBACK_RECTAGLE_t mouse_feedback_func;
+ TSET_FP setup_exe_path_func;
+ SET_TOKENS_t set_tokens_func;
+ set_output_routines_t *set_output_routines_func;
+ get_output_routines_t *get_output_routines_func;
+ GET_TERMS_t get_terms_func;
};
+#define HAVE_SETUP_EXE_PATH_FUNC
+
#ifdef DYNAMIC_PLOTTING /* Can load plotting DLL later */
int
@@ -395,6 +679,7 @@ static void myterm_table_not_loaded_v4i4
int term_ymin, int term_ymax,
double plot_xmin, double plot_xmax,
double plot_ymin, double plot_ymax);
+static void myterm_table_not_loaded_v1t1i1p(struct lexical_unit *toks, int ntoks, char *s);
#if 0
static int ftable_warned;
static void
@@ -414,7 +699,8 @@ static struct t_ftable my_term_ftable =
{&myterm_table_not_loaded_v, &myterm_table_not_loaded_v,
&myterm_table_not_loaded_v, &myterm_table_not_loaded_v,
&myterm_table_not_loaded_v, &myterm_table_not_loaded_v},
- myterm_table_not_loaded_v4i4d
+ myterm_table_not_loaded_v4i4d, &myterm_table_not_loaded,
+ myterm_table_not_loaded_v1t1i1p
};
static struct t_ftable *my_term_ftablep = &my_term_ftable;
@@ -468,6 +754,13 @@ static void myterm_table_not_loaded_v4i4
myterm_table_not_loaded_v();
}
+static void myterm_table_not_loaded_v1t1i1p(struct lexical_unit *toks, int ntoks, char *s)
+{
+ (void)toks; (void)ntoks; (void)s;
+ myterm_table_not_loaded_v();
+}
+
+
# define change_term (*my_term_ftablep->change_term_p)
# define term_set_output (*my_term_ftablep->term_set_outputp)
# define term_start_plot (*my_term_ftablep->term_funcs[TTABLE_STARTPLOT])
@@ -488,6 +781,30 @@ static void myterm_table_not_loaded_v4i4
((*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 my_setup_exe_path(dir) \
+ ((my_term_ftablep->loaded & 4) ? \
+ ((*my_term_ftablep->setup_exe_path_func)(dir), 0) : 0)
+
+#define run_do_options() \
+ ((my_term_ftablep->loaded & 8) ? \
+ ((*my_term_ftablep->set_tokens_func)(tokens,num_tokens,input_line), 0) : \
+ (t_options(), 0))
+
+#define set_output_routines(f) \
+ ((my_term_ftablep->loaded & 8) ? \
+ ((*my_term_ftablep->set_output_routines_func)(f)) : \
+ (0))
+
+#define get_output_routines() \
+ ((my_term_ftablep->loaded & 8) ? \
+ ((*my_term_ftablep->get_output_routines_func)()) : \
+ ((OUTPUT_FUNC_t*)0))
+
+#define get_terms(n,p1,p2) \
+ ((my_term_ftablep->loaded & 8) ? \
+ ((*my_term_ftablep->get_terms_func)(n,p1,p2)) : \
+ (0))
+
# define scaled_xmax() ((int)(termprop(xmax)*plotsizes_scale_get(0)))
# define scaled_ymax() ((int)(termprop(ymax)*plotsizes_scale_get(1)))
@@ -547,26 +864,57 @@ set_term_ftable(struct t_ftable *p)
extern struct t_ftable *get_term_ftable();
+#define options() run_do_options()
+
#else /* !DYNAMIC_PLOTTING */
+
#define set_mouse_feedback_rectangle mys_mouse_feedback_rectangle
+#define my_setup_exe_path setup_exe_paths
+extern void setup_exe_paths(char *path);
+
+#define options() t_options()
+
+extern int my_set_output_routines(OUTPUT_FUNC_t *func);
+extern OUTPUT_FUNC_t * my_get_output_routines(void);
+#define set_output_routines my_set_output_routines
+#define get_output_routines my_get_output_routines
+#define get_terms my_get_terms
+
+extern int my_get_terms(int n, const char **namep, const char **descrp);
extern struct termentry term_tbl[];
extern double min_array[], max_array[];
extern int xleft, xright, ybot, ytop;
+extern void mys_mouse_feedback_rectangle(int term_xmin, int term_xmax,
+ int term_ymin, int term_ymax,
+ double plot_xmin, double plot_xmax,
+ double plot_ymin, double plot_ymax);
+
+#ifndef GNUPLOT_NO_CODE_EMIT
void
mys_mouse_feedback_rectangle(int term_xmin, int term_xmax,
int term_ymin, int term_ymax,
double plot_xmin, double plot_xmax,
double plot_ymin, double plot_ymax)
{
- xleft = term_xmin, xright = term_xmax;
- ybot = term_ymin, ytop = term_ymax;
- min_array[FIRST_X_AXIS] = min_array[SECOND_X_AXIS] = plot_xmin;
- max_array[FIRST_X_AXIS] = max_array[SECOND_X_AXIS] = plot_xmax;
- min_array[FIRST_Y_AXIS] = min_array[SECOND_Y_AXIS] = plot_ymin;
- max_array[FIRST_Y_AXIS] = max_array[SECOND_Y_AXIS] = plot_ymax;
+#ifdef DEFINE_GP4MOUSE
+ gp4mouse.xleft = term_xmin;
+ gp4mouse.xright = term_xmax;
+ gp4mouse.ybot = term_ymin;
+ gp4mouse.ytop = term_ymax;
+ gp4mouse.xmin = plot_xmin;
+ gp4mouse.xmax = plot_xmax;
+ gp4mouse.ymin = plot_ymin;
+ gp4mouse.ymax = plot_ymax;
+ gp4mouse.is_log_x = 0;
+ gp4mouse.is_log_y = 0;
+ gp4mouse.log_base_log_x = 10;
+ gp4mouse.log_base_log_y = 10;
+ gp4mouse.graph = graph2d;
+#endif
}
+#endif /* !GNUPLOT_NO_CODE_EMIT */
# define my_change_term change_term
# define my_term_tbl term_tbl
@@ -578,23 +926,85 @@ extern void term_start_multiplot(void);
extern void term_end_multiplot(void);
extern void term_init(void);
extern void list_terms(void);
+extern int term_count(void);
-static void
+extern void plotsizes_scale(double x, double y);
+extern double plotsizes_get(int flag);
+
+extern DO_OUTPUT_LINE_t output_line_p;
+
+#ifndef GNUPLOT_NO_CODE_EMIT
+void
plotsizes_scale(double x, double y) { xsize=x; ysize=y; }
-static double
+double
plotsizes_get(int flag) { return (flag ? ysize : xsize); }
+static void
+my_do_options(struct lexical_unit *toks, int ntoks, char *s)
+{
+ int i = -1;
+ char *ol = input_line;
+
+ num_tokens = ntoks;
+ while (++i < MAX_TOKENS)
+ tokens[i] = toks[i];
+ c_token = 0;
+ input_line = s;
+ options();
+ input_line = ol;
+}
+
+OUTPUT_FUNC_t output_functions;
+
+#define OUTPUT_FUNCTIONS(field) (output_functions.field)
+
+int
+my_set_output_routines(OUTPUT_FUNC_t *f)
+{
+ if (f->start_output_fun)
+ output_functions.start_output_fun = f->start_output_fun;
+ if (f->end_output_fun)
+ output_functions.end_output_fun = f->end_output_fun;
+ if (f->output_line_fun)
+ output_functions.output_line_fun = f->output_line_fun;
+ return 1;
+}
+
+OUTPUT_FUNC_t *
+my_get_output_routines(void)
+{
+ return(&output_functions);
+}
+
struct t_ftable my_term_ftable =
{
- 2, /* bit 2 means it has mys_mouse_feedback_rectangle */
+ /* bits 0x2: has mys_mouse_feedback_rectangle;
+ 0x4: setup_exe_path
+ 0x8: do_options & [gs]et_output_routines & get_terms */
+ 0x2 | 0x4 | 0x08,
(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},
- &mys_mouse_feedback_rectangle
+ &mys_mouse_feedback_rectangle, &setup_exe_paths,
+ &my_do_options, &my_set_output_routines, &my_get_output_routines,
+ &my_get_terms
};
+int
+my_get_terms(int n, const char **namep, const char **descrp)
+{
+ int termc;
+
+ if (n < 0) return 0;
+ termc = term_count();
+ if (n >= termc) return 0;
+ *namep = term_tbl[n].name;
+ *descrp = term_tbl[n].description;
+ return 1;
+}
+
struct t_ftable *get_term_ftable() { SET_OUTFILE; return &my_term_ftable; }
void set_term_ftable() { SET_OUTFILE; }
@@ -609,6 +1019,7 @@ set_term_funcp3(FUNC_PTR change_p, void
my_term_ftable.term_set_outputp = tchange;
}
}
+#endif /* !GNUPLOT_NO_CODE_EMIT */
#define scaled_xmax() ((int)termprop(xmax)*xsize)
#define scaled_ymax() ((int)termprop(ymax)*ysize)
@@ -618,14 +1029,18 @@ set_term_funcp3(FUNC_PTR change_p, void
#define int_get_term_ftable() ((IV)get_term_ftable())
#define int_set_term_ftable(a) (v_set_term_ftable((void*)a))
+#ifndef GNUPLOT_NO_CODE_EMIT
void
v_set_term_ftable(void *a) { set_term_ftable((struct t_ftable*)a); }
+#endif /* !GNUPLOT_NO_CODE_EMIT */
+
typedef void (*set_term_ftable_t)(struct t_ftable *p);
typedef struct t_ftable *(get_term_ftable_t)(void);
extern get_term_ftable_t *get_term_ftable_get(void);
+#ifndef GNUPLOT_NO_CODE_EMIT
static int shim_set;
void
@@ -650,6 +1065,7 @@ setup_gpshim(void) {
}
SET_OUTFILE;
}
+#endif /* !GNUPLOT_NO_CODE_EMIT */
#ifdef SET_OPTIONS_FROM_STRING
/* This sets the tokens for the options */
@@ -658,7 +1074,7 @@ set_tokens_string(char *start)
{
char *s = start;
char *tstart;
- int is_real, is_integer, has_exp;
+ int is_real, is_integer, is_string, has_exp;
num_tokens = 0;
while (num_tokens < MAX_TOKENS) {
@@ -672,12 +1088,19 @@ set_tokens_string(char *start)
is_integer = is_real = 0;
goto process;
}
- is_integer = is_real = ((*s) != 0);
- if (*s == '+' || *s == '-')
+ is_string = ((*tstart == '"') || (*tstart == '\''));
+ is_integer = is_real = (((*s) != 0) && !is_string);
+ if (is_string)
+ s += 2;
+ else if (*s == '+' || *s == '-')
s++;
has_exp = 0;
- while (*s && !(*s == ' ' || *s == '\t' || *s == '\n')) {
- if (!(*s <= '9' && *s >= '0')) {
+ while ( *s &&
+ (is_string
+ ? (s[-1] != *tstart)
+ : !(*s == ' ' || *s == '\t' || *s == '\n')) ) {
+ if (is_string) /* DO NOTHING */;
+ else if (!(*s <= '9' && *s >= '0')) {
if (*s == '.') {
if (!is_integer)
is_real = 0;
@@ -712,6 +1135,7 @@ set_tokens_string(char *start)
token[num_tokens].l_val.v.cmplx_val.imag = 0;
} else {
token[num_tokens].is_token = 1;
+/* printf("Token `%.*s'\n", token[num_tokens].length, input_line + token[num_tokens].start_index); */
}
num_tokens++;
}
@@ -736,15 +1160,32 @@ set_options_from(char *s)
#endif
#ifdef GNUPLOT_OUTLINE_STDOUT
+
int
-StartOutput() { return 0; }
+StartOutput() {
+#ifdef OUTPUT_FUNCTIONS
+ if (output_functions.start_output_fun)
+ return( (output_functions.start_output_fun)() );
+#endif
+ return 0;
+}
int
-EndOutput() { return 0; }
+EndOutput() {
+#ifdef OUTPUT_FUNCTIONS
+ if (output_functions.end_output_fun)
+ return( (output_functions.end_output_fun)() );
+#endif
+ return 0;
+}
int
OutLine(char *s)
{
+#ifdef OUTPUT_FUNCTIONS
+ if (output_functions.output_line_fun)
+ return( (output_functions.output_line_fun)(s) );
+#endif
return fprintf(stdout, "%s", s);
}
#endif
--- ./src/graph/plotgnuplot.c-ini Sun Dec 19 04:52:22 2004
+++ ./src/graph/plotgnuplot.c Fri May 26 15:41:14 2006
@@ -21,9 +21,9 @@ Foundation, Inc., 59 Temple Place - Suit
/*******************************************************************/
# include "pari.h"
#include "rect.h"
-#define croak(str) err(talker,str)
+#define croak(str) err(talker,str)
+#define croak2(fmt, str) err(talker,fmt,str)
#define SET_OPTIONS_FROM_STRING
-#define GNUPLOT_OUTLINE_STDOUT
#define DONT_POLLUTE_INIT
/* The gnuplot library may reference a function with *this* name */
@@ -44,32 +44,32 @@ Foundation, Inc., 59 Temple Place - Suit
# endif
int X11_init, is_builtin = DEFAULT_IS_BUILTIN;
extern void X11_PARI_get_plot(long fatal);
-extern void X11_rectdraw0(long *w, long *x, long *y, long lw, long do_free);
-extern void X11_set_pointsize(double d);
-extern long X11_term_set(char *s);
-static void my_rectdraw0(long *w, long *x, long *y, long lw, long do_free);
+extern void X11_rectdraw0(long *w, long *x, long *y, long lw);
+static void my_rectdraw0(long *w, long *x, long *y, long lw);
#else
# define X11_PARI_get_plot PARI_get_plot
# define X11_rectdraw0 rectdraw0
-# define X11_set_pointsize set_pointsize
-# define X11_term_set term_set
#endif
+#define X11_set_pointsize(d) 1
+#define X11_term_set(s) 1
+
+static char *exe_dir = 0;
void
-rectdraw0(long *w, long *x, long *y, long lw, long do_free)
+rectdraw0(long *w, long *x, long *y, long lw)
# ifdef BOTH_GNUPLOT_AND_X11
{
if (is_builtin) {
- X11_rectdraw0(w, x, y, lw, do_free);
+ X11_rectdraw0(w, x, y, lw);
return;
}
- my_rectdraw0(w, x, y, lw, do_free);
+ my_rectdraw0(w, x, y, lw);
return;
}
static void
-my_rectdraw0(long *w, long *x, long *y, long lw, long do_free)
+my_rectdraw0(long *w, long *x, long *y, long lw)
# endif /* defined BOTH_GNUPLOT_AND_X11 */
{
double *ptx,*pty;
@@ -80,7 +80,6 @@ my_rectdraw0(long *w, long *x, long *y,
RectObj *p1;
int strdir = RoSTdirLEFT, can_justify = 1, shift = 0, xstart, xend;
- (void)do_free;
PARI_get_plot(0);
hgapsize = h_unit; vgapsize = v_unit;
@@ -237,11 +236,13 @@ PARI_get_plot(long fatal)
if (X11_init)
return;
if (getenv("DISPLAY")) {
+ pari_plot.init = 0;
X11_PARI_get_plot(fatal);
X11_init = 1;
return;
}
is_builtin = 0; /* Don't defaut to X11 if no DISPLAY */
+ pari_plot.init = 0;
}
#endif /* defined BOTH_GNUPLOT_AND_X11 */
if (pari_plot.init)
@@ -250,22 +251,31 @@ PARI_get_plot(long fatal)
(void)fatal;
}
+#ifdef HAVE_SET_OUTPUT_FUNCS
+static int no_start_end_out(void) {return 1;}
+static int tmp_output_line(char *s) { pariputs(s); return 1;}
+
+static OUTPUT_FUNC_t tmp_output_f
+ = {&no_start_end_out, &no_start_end_out, &tmp_output_line};
+#endif
long
term_set(char *s)
{
char *t, *size = NULL;
double x, y;
- static int had_error;
+ static int had_error, exe_path;
-#ifdef BOTH_GNUPLOT_AND_X11
+#ifdef BOTH_GNUPLOT_AND_X11
if (is_builtin) {
if (!strcmp(s,"builtin")) {
if (!getenv("DISPLAY"))
goto complain;
- return X11_term_set(s);
+ return 1; /* Nothing to do */
}
is_builtin = 0;
+ pari_plot.init = 0;
+ X11_init = 0; /* Need to reset stuff */
/* The following line may switch on Gnuplot's X11 term first: */
/* PARI_get_plot(1); */
} else if (!strcmp(s,"builtin")) {
@@ -278,19 +288,50 @@ term_set(char *s)
if (pari_plot.init && strcmp(pari_plot.name, "dumb"))
term_set("dumb");
is_builtin = 1;
+ pari_plot.init = 0;
X11_PARI_get_plot(1);
X11_init = 1;
/* }*/
- return X11_term_set(s);
+ return 1;
}
#endif /* defined BOTH_GNUPLOT_AND_X11 */
setup_gpshim();
+
+#ifdef HAVE_SETUP_EXE_PATH_FUNC
+ if (exe_dir && !exe_path++)
+ my_setup_exe_path(exe_dir);
+#endif
if (*s == 0)
s = pari_plot.name;
t = s;
- if (t[1] == '\0' && t[0] == '?') {
- list_terms();
+ if (t[0] == '?') {
+ if (t[1] == '?' && t[2] == '\0') {
+#ifdef HAVE_SET_OUTPUT_FUNCS
+ OUTPUT_FUNC_t old;
+ OUTPUT_FUNC_t *oldp = get_output_routines();
+
+ old = *oldp;
+ if (!set_output_routines(&tmp_output_f))
+ croak("Cannot reset output routines to copy term list to a variable");
+ list_terms();
+ if (!set_output_routines(&old))
+ croak("Cannot reset output routines back...");
+#else
+ list_terms();
+#endif
+#ifdef BOTH_GNUPLOT_AND_X11
+ pariputs("\tbuiltin\t\tThe GP/PARI builtin X11 plotting device (no options)\n");
+#endif
+ return 1;
+ } else if (t[1] == '\0') {
+ pariputs("Low-level terminals of Gnuplot. Query available terminals via\n"
+ "\tplotterm(\"??\")\n"
+ "Specify size (if it changable via scaling) as in \"termname=300,200\".\n"
+ "Add terminal options (if applicable) after the name and SPACE char.\n"
+ "See documentation of options in gnuplot, or, if via Term::Gnuplot, via\n"
+ " perldoc GnuplotTerminals\n");
return 1;
+ }
}
while (*t && !(*t == ' ' || *t == '\t' || *t == '\n' || *t == '='))
t++;
@@ -374,7 +415,7 @@ set_pointsize(double d)
{
#ifdef BOTH_GNUPLOT_AND_X11
if (is_builtin) {
- X11_set_pointsize(d);
+ (void)X11_set_pointsize(d);
return;
}
#endif /* defined BOTH_GNUPLOT_AND_X11 */
@@ -386,6 +427,12 @@ set_pointsize(double d)
#ifdef HAS_DLOPEN
#include <dlfcn.h>
+/* Satisfy DLL dependencies: dummy only */
+# define EXTERN_DLL_DPES *PL_markstack_ptr, PL_stack_max, *PL_Sv, *PL_stack_sp, \
+ *PL_tmps_floor, *PL_tmps_ix, *PL_markstack_max, *PL_stack_base, *PL_na, \
+ *PL_sv_yes, *PL_sv_no, *PL_curpad, *PL_op
+int EXTERN_DLL_DPES;
+
get_term_ftable_t *
get_term_ftable_get(void) /* Establish runtime link with gnuplot engine */
{
@@ -408,26 +455,42 @@ get_term_ftable_get(void) /* Establish r
char cmdbuf[256];
FILE *p;
char ext[256];
- char *sub;
+ char *sub, *sub1;
char name[256];
char *n = "Gnuplot";
+ int len;
/* 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"
+ sprintf(cmdbuf, "perl -MConfig -wle %cuse Term::Gnuplot;"
"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 EXE files (as Gnuplot.pm: strip .pm) */
+ len = strlen(fbuf);
+ if (len > 4 && 0 == strcmp(".pm\n", fbuf + len - 4)) {
+ fbuf[len - 4] = 0;
+ exe_dir = strdup(fbuf);
+ } else
+ croak2("filename of Term::Gnuplot does not end in `.pm': `%s'", fbuf);
/* Find the directory of the DLL file */
- sub = strrchr(fbuf,'/');
+ sub = strrchr(fbuf,'/');
+ sub1 = strrchr(fbuf,'\\');
+ if (sub1 && (!sub || sub < sub1))
+ sub = sub1;
if (!sub)
goto end_find;
/* Do as XSLoader */
sub[0] = 0;
- sub = strrchr(fbuf,'/');
+ sub = strrchr(fbuf,'/');
+ sub1 = strrchr(fbuf,'\\');
+ if (sub1 && (!sub || sub < sub1))
+ sub = sub1;
+ if (!sub)
+ goto end_find;
if (!sub)
goto end_find;
if (sub - fbuf >= 9 && !strncmp(sub - 9, "/blib/lib",9)) {
@@ -461,7 +524,13 @@ get_term_ftable_get(void) /* Establish r
"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");
+ "perl -MCPAN -e \"install Term::Gnuplot\"\n\t"
+ "With Term::Gnuplot, if you don't have root access, consult\n\t\t"
+ "perldoc -q \"my own\"\n\t"
+ "alternatively, you can use an uninstalled version of Term::Gnuplot\n\t"
+ "by running GP/PARI as\n\t\t"
+ "env PERL5OPT=-Mblib=/directory/of/build/of/Term-Gnuplot gp\n"
+ );
h = dlopen(s, mode);
if (!h) {
sprintf(buf,"Can't load Gnuplot drawing engine from '%s': %s", s, dlerror());
@@ -469,8 +538,11 @@ get_term_ftable_get(void) /* Establish r
return 0;
}
f = dlsym(h, "get_term_ftable");
- if (f)
- return (get_term_ftable_t *)f;
+ if (f) {
+ get_term_ftable_t *ff = (get_term_ftable_t *)f;
+
+ return ff;
+ }
sprintf(buf, "Can't resolve 'get_term_ftable' function from Gnuplot drawing engine '%s': %s", s, dlerror());
croak(buf);
return 0;