Ilya Zakharevich on Thu, 20 May 1999 01:51:41 -0400 (EDT)


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

[PATCH 2.0.14] Gnuplot plotting enhancement


The following patch:

    a) Updates gnuplot support to compatibility with version 3.7;
    b) Adds option processing to plotterm(), so that plotterm("dumb 79 33")
       is possible;
    c) Fixes a bug that plotpointsize() was setting plotpointtype();
    d) Makes --graphic=gnuplot ./Configure option selfdocumenting:
       if it fails, it reports what needs to be done.

Enjoy,
Ilya

--- ./src/graph/plotgnuplot.c.orig	Fri Mar  5 02:52:21 1999
+++ ./src/graph/plotgnuplot.c	Thu May 20 01:28:00 1999
@@ -12,6 +12,8 @@
 # include "pari.h"
 #include "rect.h"
 #define croak(str) err(talker,str)
+#define SET_OPTIONS_FROM_STRING
+#define GNUPLOT_OUTLINE_STDOUT
 #include "Gnuplot.h"
 
 #ifdef __EMX__
@@ -132,15 +134,27 @@ PARI_get_plot(long fatal)
 long
 term_set(char *s)
 {
+  char *t;
+
   if (*s == 0)
       s = pari_plot.name;
-  if (strlen(s) > PLOT_NAME_LEN)
+  t = s;
+  while (*t && !(*t == ' ' || *t == '\t' || *s == '\t'))
+	t++;
+  if ((t-s) > PLOT_NAME_LEN)
       err(talker,"too long name \"%s\"for terminal", s);
-  if (*pari_plot.name && (strcmp(pari_plot.name,s) != 0))
+  if (*pari_plot.name
+      && (strlen(pari_plot.name) != t - s	/* Why this? */
+	  || (strncmp(pari_plot.name, s, t-s) != 0)) )
 	reset();
-  strcpy(pari_plot.name,s);
-  if (!termset( s ))
-      err(talker,"error setting terminal \"%s\"", s);
+  strncpy(pari_plot.name,s,t-s);
+  pari_plot.name[t-s] = '\0';
+  if (!termset( pari_plot.name ))
+      err(talker,"error setting terminal \"\%s\"", pari_plot.name);
+
+  /* *Needed*, say, by gif output: */
+  set_options_from(t);
+
   do_init();				/* Init terminal. */
   setpointsize(pointsize);
 
--- ./src/graph/plotport.c.orig	Fri Mar  5 02:52:20 1999
+++ ./src/graph/plotport.c	Thu May 20 01:23:15 1999
@@ -624,7 +624,7 @@ rectpointsize(long ne, GEN size) /* code
      PariRect *e = check_rect_init(ne);
      RectObj *z = (RectObj*) gpmalloc(sizeof(RectObjPS));
 
-     RoNext(z) = 0; RoType(z) = ROt_PTT;
+     RoNext(z) = 0; RoType(z) = ROt_PTS;
      RoPTSsize(z) = gtodouble(size);
      if (!RHead(e)) RHead(e)=RTail(e)=z;
      else { RoNext(RTail(e))=z; RTail(e)=z; }
--- ./src/graph/Gnuplot.h.orig	Fri Jan 15 08:02:45 1999
+++ ./src/graph/Gnuplot.h	Thu May 20 01:31:04 1999
@@ -47,9 +47,13 @@
 
 #ifndef NO_JUNK_SMALL
 
+/* Compatibility with the old gnuplot: */
 extern  FILE *outfile;
 FILE *outfile = stdout;
 
+extern  FILE *gpoutfile;
+FILE *gpoutfile = stdout;
+
 extern int encoding;
 int        encoding = 0;
 extern float                   xoffset;  /* x origin */
@@ -319,7 +323,91 @@ extern struct termentry term_tbl[];
 
 #endif /* DYNAMIC_PLOTTING */
 
+#ifdef SET_OPTIONS_FROM_STRING
+/* This sets the tokens for the options */
+void
+set_tokens_string(char *start)
+{
+    char *s = start;
+    char *tstart;
+    int is_real, is_integer, has_exp;
+    
+    num_tokens = 0;
+    while (num_tokens < MAX_TOKENS) {
+	while (*s == ' ' || *s == '\t' || *s == '\n')
+	    s++;
+	if (!*s)
+	    return;
+	tstart = s;
+	is_integer = is_real = ((*s) != 0);
+	if (*s == '+' || *s == '-')
+	    s++;
+	has_exp = 0;
+	while (*s && !(*s == ' ' || *s == '\t' || *s == '\n')) {
+	    if (!(*s <= '9' && *s >= '0')) {
+		if (*s == '.') {		
+		    if (!is_integer)
+			is_real = 0;
+		    else if (is_integer == 1 && !(s[1] <= '9' && s[1] >= '0'))
+			is_real = 0;
+		} else if (*s != 'e' || *s == 'E') {
+		    if (has_exp)
+			is_real = 0;
+		    has_exp = 1;
+		    if (s[1] == '+' || s[1] == '-')
+			s++;
+		} else
+		    is_real = 0;
+		is_integer = 0;
+	    } else if (is_integer)
+		is_integer++;
+	    s++;	    
+	}
+	if (is_integer) {
+	    token[num_tokens].is_token = 0;
+	    token[num_tokens].l_val.type = INTGR;
+	    token[num_tokens].l_val.v.int_val = atoi(tstart);
+	} else if (is_real) {
+	    token[num_tokens].is_token = 0;
+	    token[num_tokens].l_val.type = CMPLX;
+	    token[num_tokens].l_val.v.cmplx_val.real = atof(tstart);
+	    token[num_tokens].l_val.v.cmplx_val.imag = 0;
+	} else {
+	    token[num_tokens].is_token = 1;
+	    token[num_tokens].start_index = tstart - input_line;
+	    token[num_tokens].length = s - tstart;
+	}
+	num_tokens++;
+    }
+    if (num_tokens >= MAX_TOKENS) {
+	char buf[80];
+	sprintf(buf, "panic: more than %d tokens for options", MAX_TOKENS);
+	croak(buf);    
+    }
+}
+
+void
+set_options_from(char *s)
+{
+    set_tokens_string(s);
+    options();
+    c_token = num_tokens = 0;
+}
+#endif
+
+#ifdef GNUPLOT_OUTLINE_STDOUT
+int
+StartOutput() {}
 
+int
+EndOutput() {}
+
+int
+OutLine(char *s)
+{
+   return fprintf(stdout, "%s", s);
+}
+#endif
 
 #ifdef __cplusplus
   }
--- ./Configure~	Fri Mar  5 12:24:26 1999
+++ ./Configure	Wed May 19 17:25:20 1999
@@ -416,37 +416,49 @@ if test "$optimization" != profiling; th
 
   pth=$libpth
 #   LIB: gnuplot
+  opth="$pth"
+  pth="$TOP/gnuplot-$osname-$arch $TOP/gnuplot $pth"
+  gpth="$pth"
   lib=gnuplot; . ./locatelib
+  pth="$opth"
   gnuplot_libs=
   case $gnuplot in
     /*|[c-z]:/*)
         addgnuplot=gnuplot
-	lib=png; . ./locatelib
-	case $png in
-	  /*|[c-z]:/*)
-		gnuplot_libs="$gnuplot_libs -lpng"
-		lib=z; . ./locatelib
-		case $z in
-		  /*|[c-z]:/*)
-			gnuplot_libs="$gnuplot_libs -lz";;
-		esac;;
-	esac
-	lib=gd; . ./locatelib
-	case $gd in
-	  /*|[c-z]:/*) gnuplot_libs="$gnuplot_libs -lgd";;
-	esac
-	case "$osname" in
-	    os2)
-		lib=jmgraph; . ./locatelib
-		lib=vesa; . ./locatelib
-		case $jmgraph in
-		  /*|[c-z]:/*)
-			case $vesa in
-			  /*|[c-z]:/*)
-				gnuplot_libs="$gnuplot_libs -ljmgraph -lvesa";;
-			esac;;
-		esac;;
-	esac;;
+	for lib in vga vesa jmgraph linuxvga gd png z
+	do
+	    . ./locatelib
+	    eval "elib=\$$lib"
+	    case $elib in
+	      /*|[c-z]:/*) gnuplot_libs="$gnuplot_libs -l$lib";;
+	    esac
+	done
+	if test "$which_graphic_lib" = gnuplot; then
+	    if test -z "$gnuplot_libs"; then
+		echo "...I expect that no libraries are needed for gnuplot"
+	    else
+		echo "...I expect that libraries $gnuplot_libs are needed for gnuplot"
+	    fi
+	fi
+	;;
+    *)
+	if test "$which_graphic_lib" = gnuplot; then
+	    echo "###"
+	    echo "### Could not find gnuplot library in:"
+	    echo "###   ./gnuplot-$osname-$arch ./gnuplot"
+	    echo "###   $pth"
+	    echo "###"
+	    case "$osname" in
+		os2) tlib=gnuplot.a ;;
+		*)   tlib=libgnuplot.a ;;
+	    esac
+	    echo "### You may need to execute"
+	    echo "###   ar cr $tlib version.o util.o term.o bitmap.o stdfn.o"
+	    echo "### In the build directory of gnuplot-3.7, and move"
+	    echo "### $tlib to ./gnuplot-$osname-$arch or ./gnuplot subdirs"
+	    echo "###"
+	fi
+	;;
   esac
 
 #   LIB: GNU ReadLine
@@ -1074,8 +1086,8 @@ EOT
   fi
 fi
 case "$static" in
-  y) echo "Default is static executable and archive library" ;;
-  n) echo "Default is dynamic executable and shared library" ;;
+  y) echo "Default is static executable and archive library, graphic=$which_graphic_lib" ;;
+  n) echo "Default is dynamic executable and shared library, graphic=$which_graphic_lib" ;;
 esac
 
 #
--- ./config/Makefile.SH~	Tue Mar  2 06:34:21 1999
+++ ./config/Makefile.SH	Wed May 19 17:25:01 1999
@@ -73,7 +73,7 @@ none)
 gnuplot)
   PLOTFILE=plotgnuplot.c
   PLOTCFLAGS=
-  GNUPLOT_OBJS="bitmap.o term.o util.o version.o"
+  GNUPLOT_OBJS="bitmap.o term.o util.o version.o stdfn.o"
   PLOTLIBS="$gnuplot_libs"
   plotrunpath=
   case "$osname" in