Ilya Zakharevich on Sun, 8 Nov 1998 03:05:45 -0500 (EST)


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

2.0.12: patch for plotting


What:

a) New function plotfile() to reset output file for plotting (void 
   without gnuplot);
b) New function plotpointsize() to scale symbols plotted for points (void 
   without gnuplot);
c) plotpointtype()/plotlinetype() allow rect==-1 for highlevel plotting (void 
   without gnuplot);
d) Allow plotting with both lines and points printed (since point size
   is customizable, it may be made good both visibly and clutter-wise)
   (bit 128 of flags is used for this).
e) Rename outfile to pari_outfile (conflict with gnuplot);

I did not update master docs, only online docs.  Tested with gnuplot
terminals only.

Say, with gnuplot output one can do things like this:

plotpointtype(-1,1)
plotlinetype(-1,5)
plotpointsize(-1,0.4)
plotfile("out.latex")
plotterm("emtex")
ploth(x=1,4,sin(x),128+2)
\\ close the plotfile
plotfile("-")
plotterm("dumb")
ploth(x=1,4,sin(x),128+2)

Enjoy,
Ilya

diff -pru pari-2.0.12.alpha.ini/src/gp/gp.c pari-2.0.12.alpha/src/gp/gp.c
--- pari-2.0.12.alpha.ini/src/gp/gp.c	Fri Nov  6 10:08:32 1998
+++ pari-2.0.12.alpha/src/gp/gp.c	Sat Nov  7 17:55:06 1998
@@ -2591,7 +2591,7 @@ read_opt(long argc, char **argv)
   char *b=NULL, *p=NULL, *s=NULL, **pre=(char**)1;
   int i=1;
 
-  outfile=stderr;
+  pari_outfile=stderr;
   while (i<argc)
   {
     char *t = argv[i++];
@@ -2624,7 +2624,7 @@ read_opt(long argc, char **argv)
   testint(p, &primelimit);
   testint(s, &parisize);
   if (under_emacs) disable_color=1;
-  outfile=stdout; return pre;
+  pari_outfile=stdout; return pre;
 }
 
 int
diff -pru pari-2.0.12.alpha.ini/src/gp/gp_rl.c pari-2.0.12.alpha/src/gp/gp_rl.c
--- pari-2.0.12.alpha.ini/src/gp/gp_rl.c	Fri Nov  6 10:08:30 1998
+++ pari-2.0.12.alpha/src/gp/gp_rl.c	Sat Nov  7 17:55:08 1998
@@ -511,17 +522,17 @@ static int
 rl_short_help(int count, int key)
 {
   int p=rl_point, off=p, e = rl_end;
-  FILE *save = outfile;
+  FILE *save = pari_outfile;
   long flag = h_RL;
 
   while (off && is_keyword_char(rl_line_buffer[off-1])) off--;
-  rl_point = 0; rl_end = 0; outfile = rl_outstream;
+  rl_point = 0; rl_end = 0; pari_outfile = rl_outstream;
   if (count < 0) flag |= h_LONG; /* long help */
   _rl_save_prompt();
   rl_message("",0,0);
   aide(rl_line_buffer + off, flag);
   _rl_restore_prompt();
-  rl_point = p; rl_end = e; outfile = save;
+  rl_point = p; rl_end = e; pari_outfile = save;
   rl_clear_message();
   rl_refresh_line(); return 0;
 }
diff -pru pari-2.0.12.alpha.ini/src/graph/Gnuplot.h pari-2.0.12.alpha/src/graph/Gnuplot.h
--- pari-2.0.12.alpha.ini/src/graph/Gnuplot.h	Wed Sep 16 07:07:10 1998
+++ pari-2.0.12.alpha/src/graph/Gnuplot.h	Sun Nov  8 02:46:20 1998
@@ -48,9 +48,7 @@
 #ifndef NO_JUNK_SMALL
 
 extern  FILE *outfile;
-#ifndef BITS_IN_HALFULONG /* In pari it is already defined. */
 FILE *outfile = stdout;
-#endif
 
 extern int encoding;
 int        encoding = 0;
@@ -71,7 +69,8 @@ double        ticscale = 1.0; /* scale f
 char *input_line = NULL;
 int inline_num;          /* from command.c */
 
-float xsize=1.0, ysize=1.0, pointsize=1.0;		/* During test! */
+float xsize=1.0, ysize=1.0;
+double pointsize=1.0;		/* During test! */
 
 int interactive;    /* from plot.c */
 char *infile_name;       /* from plot.c */
@@ -143,7 +142,7 @@ bail_to_command_line()
   croak("panic: gnuplot");
 }
 
-#endif
+#endif	/* NO_JUNK_SMALL */ 
 
 /* Cannot pull the whole plot.h, too many contradictions. */
 
@@ -238,7 +237,7 @@ struct termentry *term;
 #define point(x,y,p)	CALL_G_METH3(point,x,y,p)
 #define arrow(sx,sy,ex,ey,head)	CALL_G_METH5(arrow,sx,sy,ex,ey,head)
 #define set_font(font)	CALL_G_METH1IP(set_font,font)
-#define pointsize(size)	CALL_G_METH1D(pointsize,size)
+#define setpointsize(size)	CALL_G_METH1D(pointsize,size)
 #define suspend()	CALL_G_METH0(suspend)
 #define resume()	CALL_G_METH0(resume)
 #define fillbox(sx,sy,ex,ey,head)	CALL_G_METH5(fillbox,sx,sy,ex,ey,head)
diff -pru pari-2.0.12.alpha.ini/src/graph/plotgnuplot.c pari-2.0.12.alpha/src/graph/plotgnuplot.c
--- pari-2.0.12.alpha.ini/src/graph/plotgnuplot.c	Fri Nov  6 10:08:46 1998
+++ pari-2.0.12.alpha/src/graph/plotgnuplot.c	Sun Nov  8 02:53:04 1998
@@ -34,6 +34,7 @@ rectdraw0(long *w, long *x, long *y, lon
 
   graphics();				/* Switch on terminal. */
   linetype(line_type);			/* X does not work otherwise. */
+  setpointsize(pointsize);
   for(i=0;i<lw;i++)
   {
     e=rectgraph[w[i]]; p1=RHead(e); x0=x[i]; y0=y[i];
@@ -103,6 +104,10 @@ rectdraw0(long *w, long *x, long *y, lon
 	case ROt_PTT:
 	  point_type = RoPTTpen(p1);
 	  break;
+	case ROt_PTS:
+	  pointsize = RoPTSsize(p1);
+	  setpointsize(pointsize);
+	  break;
 	case ROt_LNT:
 	  linetype(RoLNTpen(p1));
 	  break;
@@ -127,13 +132,17 @@ PARI_get_plot(long fatal)
 long
 term_set(char *s)
 {
-  if (strlen(s) > PLOT_NAME_LEN) err(talker,"too long name for terminal");
-  if (*pari_plot.name && (strcmp(pari_plot.name,s) != 0)) {
+  if (*s == 0)
+      s = pari_plot.name;
+  if (strlen(s) > PLOT_NAME_LEN)
+      err(talker,"too long name \"%s\"for terminal", s);
+  if (*pari_plot.name && (strcmp(pari_plot.name,s) != 0))
 	reset();
-  }
   strcpy(pari_plot.name,s);
-  if (!termset( s )) err(talker,"unknown terminal name");
+  if (!termset( s ))
+      err(talker,"error setting terminal \"\%s\"", s);
   do_init();				/* Init terminal. */
+  setpointsize(pointsize);
 
   w_width = termprop(xmax);
   w_height = termprop(ymax);
@@ -142,5 +151,32 @@ term_set(char *s)
   h_unit = termprop(h_tic);
   v_unit = termprop(v_tic);
   pari_plot.init = 1;
+
   return 1;
+}
+
+long
+plot_outfile_set(char *s) { 
+    int normal = (strcmp(s,"-") == 0);
+
+    /* Delegate all the hard work to term_set_output() */
+
+    if (normal) 
+	term_set_output(NULL);
+    else {				/* term_set_output() needs
+					   a malloced string */
+	char *s1 = (char*) malloc(strlen(s) + 1);
+
+	strcpy(s1,s);
+	term_set_output(s1);
+    }
+    return 1; 
+}
+
+void
+set_pointsize(double d) 
+{
+    pointsize = d;
+    if (pari_plot.init)
+	setpointsize(d);
 }
diff -pru pari-2.0.12.alpha.ini/src/graph/plotport.c pari-2.0.12.alpha/src/graph/plotport.c
--- pari-2.0.12.alpha.ini/src/graph/plotport.c	Fri Nov  6 10:08:44 1998
+++ pari-2.0.12.alpha/src/graph/plotport.c	Sat Nov  7 19:04:42 1998
@@ -18,6 +18,8 @@ static void PARI_get_psplot();
 static long current_color[NUMRECT];
 PariRect **rectgraph = NULL;
 PARI_plot pari_plot, pari_psplot;
+long  rectpoint_itype = 0;
+long  rectline_itype  = 0;
 
 #define STRINGRECT (NUMRECT-2)
 #define DRAWRECT (NUMRECT-1)
@@ -595,6 +597,9 @@ rectstring(long ne, char *str) /* code =
 void
 rectpointtype(long ne, long type) /* code = 0 */
 {
+ if (ne == -1) {
+     rectpoint_itype = type;
+ } else {
   PariRect *e = check_rect_init(ne);
   RectObj *z = (RectObj*) gpmalloc(sizeof(RectObjPN));
 
@@ -602,11 +607,31 @@ rectpointtype(long ne, long type) /* cod
   RoPTTpen(z) = type;
   if (!RHead(e)) RHead(e)=RTail(e)=z;
   else { RoNext(RTail(e))=z; RTail(e)=z; }
+ }
+}
+
+void
+rectpointsize(long ne, GEN size) /* code = 0 */
+{
+ if (ne == -1) {
+     set_pointsize(gtodouble(size));	/* Immediate set */
+ } else {
+     PariRect *e = check_rect_init(ne);
+     RectObj *z = (RectObj*) gpmalloc(sizeof(RectObjPS));
+
+     RoNext(z) = 0; RoType(z) = ROt_PTT;
+     RoPTSsize(z) = gtodouble(size);
+     if (!RHead(e)) RHead(e)=RTail(e)=z;
+     else { RoNext(RTail(e))=z; RTail(e)=z; }
+ }
 }
 
 void
 rectlinetype(long ne, long type)
 {
+ if (ne == -1) {
+     rectline_itype = type;
+ } else {
   PariRect *e = check_rect_init(ne);
   RectObj *z = (RectObj*) gpmalloc(sizeof(RectObjPN));
 
@@ -614,6 +639,7 @@ rectlinetype(long ne, long type)
   RoLNTpen(z) = type;
   if (!RHead(e)) RHead(e)=RTail(e)=z;
   else { RoNext(RTail(e))=z; RTail(e)=z; }
+ }
 }
 
 void
@@ -663,7 +689,7 @@ rectcopy(long source, long dest, long xo
 	RoSTx(next) += xoff; RoSTy(next) += yoff;
 	RoNext(tail) = next; tail = next;
 	break;
-      case ROt_PTT: case ROt_LNT:
+      case ROt_PTT: case ROt_LNT: case ROt_PTS:
 	next = (RectObj*) gpmalloc(sizeof(RectObjPN));
 	memcpy(next,p1,sizeof(RectObjPN));
 	RoNext(tail) = next; tail = next;
@@ -1112,20 +1138,24 @@ rectplothrawin(long stringrect, long dra
   current_color[drawrect]=RED;
   for (; ltype < nc; )
   {
-    rectpointtype(drawrect,ltype); 	/* Graphs. */
-    rectlinetype(drawrect,ltype++); 	/* Graphs. */
     if (nc>1)
     {
-      if (ltype & 1) current_color[drawrect]=SIENNA;
-      else current_color[drawrect]=RED;
+      if (ltype & 1) current_color[drawrect]=RED;
+      else current_color[drawrect]=SIENNA;
     }
     if (flags & PLOT_PARAMETRIC) x=data[i++];
 
     y=data[i++]; nbpoints=y.nb;
-    if (flags & PLOT_POINTS)
-      rectpoints0(drawrect,x.d,y.d,nbpoints);
-    else
-      rectlines0(drawrect,x.d,y.d,nbpoints,0);
+    if ((flags & PLOT_POINTS_LINES) || (flags & PLOT_POINTS)) {
+	rectlinetype(drawrect, rectpoint_itype + ltype); 	/* Graphs. */
+	rectpointtype(drawrect, rectpoint_itype + ltype); 	/* Graphs. */
+	rectpoints0(drawrect,x.d,y.d,nbpoints);
+    }
+    if ((flags & PLOT_POINTS_LINES) || !(flags & PLOT_POINTS)) {
+	rectlinetype(drawrect, rectline_itype + ltype); 	/* Graphs. */
+	rectlines0(drawrect,x.d,y.d,nbpoints,0);
+    }
+    ltype++;				/* Graphs. */
   }
   for (i--; i>=0; i--) free(data[i].d);
   free(data);
diff -pru pari-2.0.12.alpha.ini/src/graph/plotsun.c pari-2.0.12.alpha/src/graph/plotsun.c
--- pari-2.0.12.alpha.ini/src/graph/plotsun.c	Fri Nov  6 10:08:44 1998
+++ pari-2.0.12.alpha/src/graph/plotsun.c	Sun Nov  8 02:06:56 1998
@@ -172,3 +172,11 @@ term_set(char *s)
 {
   return 1;
 }
+
+long
+plot_outfile_set(char *s) { return 1; }
+
+void
+set_pointsize(double d) 
+{
+}
diff -pru pari-2.0.12.alpha.ini/src/graph/plotX.c pari-2.0.12.alpha/src/graph/plotX.c
--- pari-2.0.12.alpha.ini/src/graph/plotX.c	Fri Nov  6 10:08:46 1998
+++ pari-2.0.12.alpha/src/graph/plotX.c	Sun Nov  8 02:07:02 1998
@@ -159,7 +159,7 @@ rectdraw0(long *w, long *x, long *y, lon
   {
     rcolcnt[col][ROt_MV]=rcolcnt[col][ROt_PT]=rcolcnt[col][ROt_LN]=0;
     rcolcnt[col][ROt_BX]=rcolcnt[col][ROt_MP]=rcolcnt[col][ROt_ML]=0;
-    rcolcnt[col][ROt_ST]=rcolcnt[col][ROt_PTT]=rcolcnt[col][ROt_LNT]=0;
+    rcolcnt[col][ROt_ST]=rcolcnt[col][ROt_PTT]=rcolcnt[col][ROt_PTS]=rcolcnt[col][ROt_LNT]=0;
   }
 
   for(i=0;i<lw;i++)
@@ -179,6 +179,7 @@ rectdraw0(long *w, long *x, long *y, lon
 	              break;                 /* String */
 	case ROt_MV :                        /* Move */
 	case ROt_PTT:                        /* Point type change */
+	case ROt_PTS:                        /* Point size change */
 	case ROt_LNT: rcnt[RoType(p1)]++;    /* Line type change */
       }
       p1=RoNext(p1);
@@ -369,3 +370,11 @@ PARI_get_plot(long fatal)
 
 long
 term_set(char *s) { return 1; }
+
+long
+plot_outfile_set(char *s) { return 1; }
+
+void
+set_pointsize(double d) 
+{
+}
diff -pru pari-2.0.12.alpha.ini/src/graph/rect.h pari-2.0.12.alpha/src/graph/rect.h
--- pari-2.0.12.alpha.ini/src/graph/rect.h	Fri Nov  6 10:08:44 1998
+++ pari-2.0.12.alpha/src/graph/rect.h	Sat Nov  7 19:03:34 1998
@@ -82,6 +82,12 @@ typedef struct RectObjPN {
   long pen;
 } RectObjPN;
 
+typedef struct RectObjPS {
+  struct RectObj *next;
+  long code,color;
+  double size;
+} RectObjPS;
+
 #define BLACK      1 /* Default */
 #define BLUE       2 /* Axes */
 #define SIENNA     3 /* Odd numbered curves in ploth */
@@ -102,9 +108,10 @@ typedef struct RectObjPN {
 #define ROt_ST 6			/* String */
 #define ROt_PTT 7			/* Point type change */
 #define ROt_LNT 8			/* Line type change */
-#define ROt_NULL 9		/* To be the start of the chain */
+#define ROt_PTS 9			/* Point size change */
+#define ROt_NULL 10		/* To be the start of the chain */
 
-#define ROt_MAX 9		/* Maximal type */
+#define ROt_MAX 10		/* Maximal type */
 
 /* Pointer conversion. */
 
@@ -116,6 +123,7 @@ typedef struct RectObjPN {
 #define RoML(rop) ((RectObjMP*)rop)
 #define RoST(rop) ((RectObjST*)rop)
 #define RoPTT(rop) ((RectObjPN*)rop)
+#define RoPTS(rop) ((RectObjPS*)rop)
 #define RoLNT(rop) ((RectObjPN*)rop)
 #define RoNULL(rop) ((RectObj*)rop)
 
@@ -163,21 +171,27 @@ typedef struct RectObjPN {
 
 #define RoPTTpen(rop) (RoPTT(rop)->pen)
 #define RoLNTpen(rop) (RoLNT(rop)->pen)
+#define RoPTSsize(rop) (RoPTS(rop)->size)
 
 #define PL_POINTS 1
 #define GOODRECT(r) (0 <= r && r < NUMRECT)
 #define GOODCOLOR(c) (1 <= c && c < MAX_COLORS)
 
-#define PLOT_PARAMETRIC   1
-#define PLOT_RECURSIVE    2
-#define PLOT_NO_RESCALE   4
-#define PLOT_NO_AXE_X     8
-#define PLOT_NO_AXE_Y    16
-#define PLOT_NO_FRAME    32
-#define PLOT_POINTS      64
-#define PLOT_POSTSCRIPT 128
+#define PLOT_PARAMETRIC   0x00001
+#define PLOT_RECURSIVE    0x00002
+#define PLOT_NO_RESCALE   0x00004
+#define PLOT_NO_AXE_X     0x00008
+#define PLOT_NO_AXE_Y     0x00010
+#define PLOT_NO_FRAME     0x00020
+#define PLOT_POINTS       0x00040
+#define PLOT_POINTS_LINES 0x00080
+#define PLOT_SPLINES      0x00100
+
+#define PLOT_POSTSCRIPT   0x80000
 
 extern PariRect  **rectgraph;
+extern long  rectpoint_itype;
+extern long  rectline_itype;
 
 /* plotport.c */
 
@@ -207,6 +221,7 @@ GEN     rectplothraw(long drawrect, GEN 
 void    rectpoint(long ne, GEN x, GEN y);
 void    rectpoints(long ne, GEN listx, GEN listy);
 void    rectpointtype(long ne, long t);
+void	rectpointsize(long ne, GEN size);
 void    rectrbox(long ne, GEN gx2, GEN gy2);
 void    rectrline(long ne, GEN gx2, GEN gy2);
 void    rectrmove(long ne, GEN x, GEN y);
@@ -218,3 +233,5 @@ void    rectstring(long ne, char *x);
 
 void    PARI_get_plot(long fatal);
 long    term_set(char *s);
+long    plot_outfile_set(char *s);
+void	set_pointsize(double d);
diff -pru pari-2.0.12.alpha.ini/src/headers/paricom.h pari-2.0.12.alpha/src/headers/paricom.h
--- pari-2.0.12.alpha.ini/src/headers/paricom.h	Fri Nov  6 10:08:46 1998
+++ pari-2.0.12.alpha/src/headers/paricom.h	Sat Nov  7 17:55:08 1998
@@ -32,7 +32,7 @@
 /* Common global variables: */
 
 extern PariOUT *pariOut, *pariErr;
-extern FILE    *outfile, *logfile, *infile, *errfile;
+extern FILE    *pari_outfile, *logfile, *infile, *errfile;
 
 extern long  DEBUGFILES, DEBUGLEVEL, DEBUGMEM, precdl;
 extern long  *ordvar;
diff -pru pari-2.0.12.alpha.ini/src/headers/paristio.h pari-2.0.12.alpha/src/headers/paristio.h
--- pari-2.0.12.alpha.ini/src/headers/paristio.h	Fri Nov  6 10:08:48 1998
+++ pari-2.0.12.alpha/src/headers/paristio.h	Sat Nov  7 17:55:08 1998
@@ -37,7 +37,7 @@ typedef struct pariFILE {
 /* Common global variables: */
 
 extern PariOUT *pariOut, *pariErr;
-extern FILE    *outfile, *logfile, *infile, *errfile;
+extern FILE    *pari_outfile, *logfile, *infile, *errfile;
 
 extern ulong avma,bot,top,memused;
 extern byteptr diffptr;
diff -pru pari-2.0.12.alpha.ini/src/language/es.c pari-2.0.12.alpha/src/language/es.c
--- pari-2.0.12.alpha.ini/src/language/es.c	Fri Nov  6 10:08:52 1998
+++ pari-2.0.12.alpha/src/language/es.c	Sat Nov  7 17:55:08 1998
@@ -137,19 +137,19 @@ PariOUT *pariOut, *pariErr;
 static void
 normalOutC(char c)
 {
-  putc(c, outfile);
+  putc(c, pari_outfile);
   if (logfile) putc(c, logfile);
 }
 static void
 normalOutS(char *s)
 {
-  fputs(s, outfile);
+  fputs(s, pari_outfile);
   if (logfile) fputs(s, logfile);
 }
 static void
 normalOutF(void)
 {
-  fflush(outfile);
+  fflush(pari_outfile);
   if (logfile) fflush(logfile);
 }
 PariOUT defaultOut = {normalOutC, normalOutS, normalOutF, NULL};
@@ -341,8 +341,8 @@ putc80(char c)
 {
   if (c == '\n') col_index = -1;
   else if (col_index == MAX_WIDTH)
-    { putc('\n',outfile); col_index = 0; }
-  putc(c, outfile); col_index++;
+    { putc('\n',pari_outfile); col_index = 0; }
+  putc(c, pari_outfile); col_index++;
 }
 #undef MAX_WIDTH
 static void
@@ -2078,12 +2078,12 @@ switchout(char *name)
   {
     FILE *f = fopen(name, "a");
     if (!f) err(openfiler,"output",name);
-    outfile = f;
+    pari_outfile = f;
   }
-  else if (outfile != stdout)
+  else if (pari_outfile != stdout)
   {
-    fclose(outfile);
-    outfile = stdout;
+    fclose(pari_outfile);
+    pari_outfile = stdout;
   }
 }
 
diff -pru pari-2.0.12.alpha.ini/src/language/highlvl.c pari-2.0.12.alpha/src/language/highlvl.c
--- pari-2.0.12.alpha.ini/src/language/highlvl.c	Fri Nov  6 10:08:56 1998
+++ pari-2.0.12.alpha/src/language/highlvl.c	Sat Nov  7 19:34:36 1998
@@ -135,6 +135,7 @@ entree functions_highlevel[]={
 {"plotcopy",44,(void*)rectcopy,10,"vLLLL"},
 {"plotcursor",11,(void*)rectcursor,10,"L"},
 {"plotdraw",99,(void*)rectdraw,10,"vG"},
+{"plotfile",16,(void*)plot_outfile_set,10,"ls"},
 {"ploth",99,(void*)ploth,10,"V=GGIpD0,L,D0,L,"},
 {"plothraw",25,(void*)plothraw,10,"GGD0,L,"},
 {"plothsizes",0,(void*)plothsizes,10,""},
@@ -144,6 +145,7 @@ entree functions_highlevel[]={
 {"plotlinetype",19,(void*)rectlinetype,10,"vLL"},
 {"plotmove",35,(void*)rectmove,10,"vLGG"},
 {"plotpoints",35,(void*)rectpoints,10,"vLGG"},
+{"plotpointsize",99,(void*)rectpointsize,10,"vLG"},
 {"plotpointtype",19,(void*)rectpointtype,10,"vLL"},
 {"plotrbox",35,(void*)rectrbox,10,"vLGG"},
 {"plotrecth",73,(void*)rectploth,10,"LV=GGIpD0,L,D0,L,"},
@@ -172,18 +174,20 @@ char *helpmessages_highlevel[]={
   "plotcopy(sourcew,destw,dx,dy): copy the contents of rectwindow sourcew to rectwindow destw with offset (dx,dy)",
   "plotcursor(w): current position of cursor in rectwindow w",
   "plotdraw(list): draw vector of rectwindows list at indicated x,y positions; list is a vector w1,x1,y1,w2,x2,y2,etc. . ",
-  "ploth(X=a,b,expr,{flags=0},{n=0}): plot of expression expr, X goes from a to b in high resolution. Both flags and n are optional. Binary digits of flags mean : 1 parametric plot, 2 recursive plot, 8 omit x-axis, 16 omit y-axis, 32 omit frame, 64 do not join points. n specifies number of reference points on the graph (0=use default value). Returns a vector for the bounding box",
+  "plotfile(filename): set the output file for plotting output. \"-\" redirects to the same place as PARI output",
+  "ploth(X=a,b,expr,{flags=0},{n=0}): plot of expression expr, X goes from a to b in high resolution. Both flags and n are optional. Binary digits of flags mean : 1 parametric plot, 2 recursive plot, 8 omit x-axis, 16 omit y-axis, 32 omit frame, 64 do not join points, 128 plot both lines and points. n specifies number of reference points on the graph (0=use default value). Returns a vector for the bounding box",
   "plothraw(listx,listy,{flag=0}): plot in high resolution points whose x (resp. y) coordinates are in listx (resp. listy). If flag is non zero, join points",
   "plothsizes(): returns array of 6 elements: terminal width and height, sizes for ticks in horizontal and vertical directions (in pixels), width and height of characters",
   "plotinit(w,x,y): initialize rectwindow w to size x,y",
   "plotkill(w): erase the rectwindow w",
   "plotlines(w,listx,listy,{flag=0}): draws an open polygon in rectwindow w where listx and listy contain the x (resp. y) coordinates of the vertices. If listx and listy are both single values (i.e not vectors), draw the corresponding line (and move cursor). If (optional) flag is non-zero, close the polygon",
-  "plotlinetype(w,type): change the type of following lines in rectwindow w. -2 corresponds to frames, -1 to axes, larger values may correspond to something else",
+  "plotlinetype(w,type): change the type of following lines in rectwindow w. type -2 corresponds to frames, -1 to axes, larger values may correspond to something else. w=-1 changes highlevel plotting",
   "plotmove(w,x,y): move cursor to position x,y in rectwindow w",
   "plotpoints(w,listx,listy): draws in rectwindow w the points whose x (resp y) coordinates are in listx (resp listy). If listx and listy are both single values (i.e not vectors), draw the corresponding point (and move cursor)",
-  "plotpointtype(w,type): change the type of following points in rectwindow w. -1 corresponds to a dot, larger values may correspond to something else",
+  "plotpointsize(w,size): change the \"size\" of following points in rectwindow w. w=-1 changes global value",
+  "plotpointtype(w,type): change the type of following points in rectwindow w. type -1 corresponds to a dot, larger values may correspond to something else. w=-1 changes highlevel plotting",
   "plotrbox(w,dx,dy): if the cursor is at (x1,y1), draw a box with diagonal (x1,y1)-(x1+dx,y1+dy) in rectwindow w (cursor does not move)",
-  "plotrecth(w,X=xmin,xmax,expr,{flags=0},{n=0}): plot graph(s) for expr in rectwindow w, where expr is scalar for a single non-parametric plot, and a vector otherwise. If plotting is parametric, its length should be even and pairs of entries give points coordinates. If not, all entries but the first are y-coordinates. Both flags and n are optional. Binary digits of flags mean: 1 parametric plot, 2 recursive plot, 4 do not rescale w, 8 omit x-axis, 16 omit y-axis, 32 omit frame, 64 do not join points. n specifies the number of reference points on the graph (0=use default value). Returns a vector for the bounding box",
+  "plotrecth(w,X=xmin,xmax,expr,{flags=0},{n=0}): plot graph(s) for expr in rectwindow w, where expr is scalar for a single non-parametric plot, and a vector otherwise. If plotting is parametric, its length should be even and pairs of entries give points coordinates. If not, all entries but the first are y-coordinates. Both flags and n are optional. Binary digits of flags mean: 1 parametric plot, 2 recursive plot, 4 do not rescale w, 8 omit x-axis, 16 omit y-axis, 32 omit frame, 64 do not join points, 128 plot both lines and points. n specifies the number of reference points on the graph (0=use default value). Returns a vector for the bounding box",
   "plotrecthraw(w,data,{flags=0}): plot graph(s) for data in rectwindow w, where data is a vector of vectors. If plot is parametric, length of data should be even, and pairs of entries give curves to plot. If not, first entry gives x-coordinate, and the other ones y-coordinates. Admits the same optional flags as plotrecth, save that recursive plot is meaningless",
   "plotrline(w,dx,dy): if the cursor is at (x1,y1), draw a line from (x1,y1) to (x1+dx,y1+dy) (and move the cursor) in the rectwindow w",
   "plotrmove(w,dx,dy): move cursor to position (dx,dy) relative to the present position in the rectwindow w",
diff -pru pari-2.0.12.alpha.ini/src/language/init.c pari-2.0.12.alpha/src/language/init.c
--- pari-2.0.12.alpha.ini/src/language/init.c	Fri Nov  6 10:08:56 1998
+++ pari-2.0.12.alpha/src/language/init.c	Sat Nov  7 17:55:08 1998
@@ -14,7 +14,7 @@
 #endif
 
 /*      Variables statiques communes :         */
-FILE    *outfile, *errfile, *logfile, *infile;
+FILE    *pari_outfile, *errfile, *logfile, *infile;
 GEN     *polun, *polx;
 GEN     gnil, gzero, gun, gdeux, ghalf, polvar, gi;
 GEN     gpi=NULL, geuler=NULL, bernzone=NULL;
@@ -161,7 +161,7 @@ init_defaults(int force)
   current_psfile = pari_strdup("pari.ps");
   current_logfile= pari_strdup("pari.log");
   logfile = NULL;
-  infile = stdin; outfile = stdout; errfile = stderr;
+  infile = stdin; pari_outfile = stdout; errfile = stderr;
   initout(); next_bloc=0;
 }
 
@@ -605,7 +605,7 @@ recover(int flag)
 void
 err_recover(long numerr)
 {
-  outfile=stdout; errfile=stderr;
+  pari_outfile=stdout; errfile=stderr;
   fprintferr("\n");
   if (pariErr->die) pariErr->die();
   flusherr();