Ilya Zakharevich on Tue, 29 Feb 2000 13:08:02 -0500


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

[PATCH 2.0.18] pretty printing results


I beafed up my tex2mail converter.  See
  ftp://ftp.math.ohio-state.edu/pub/users/ilya/tex/tex2mail

With the enclosed patch one can do this and a lot of other stuff:

? default(prettyprinter,"tex2mail -TeX -noindent -ragged -by_par")
   prettyprinter = "tex2mail -TeX -noindent -ragged -by_par"
? sin(x+x*tan(x))
          2   1 3   1 4   59  5   19  6   1261 7   421  8   6955  9
%2 = x + x  - -x  - -x  - ---x  - ---x  - ----x  - ----x  - -----x  -
              6     6     120     120     5040     5040     72576
13607  10   119743  11    538121  12    36391213  13    4067263   14
------x   - -------x   - --------x   + ----------x   - ----------x   +
362880      5702400      39916800      6227020800      1245404160
 14328323099  15     24080089   16    1
-------------x   + ------------x  +O(x 7)
1307674368000      118879488000

Enjoy,
Ilya

--- ./src/gp/gp.c.orig	Mon Dec 20 13:40:00 1999
+++ ./src/gp/gp.c	Tue Feb 29 12:59:39 2000
@@ -16,6 +16,7 @@
 #endif
 #include "../language/anal.h"
 #include "gp.h"
+#include "errno.h"
 
 #ifdef READLINE
   void init_readline();
@@ -57,6 +58,8 @@ static GEN *hist;
 static char *help_prg,*path;
 static char prompt[MAX_PROMPT_LEN];
 static char thestring[256];
+static char *prettyprinter;
+static FILE *prettyprinter_file;
 static long prettyp, test_mode, quiet_mode, gpsilent, simplifyflag;
 static long chrono, pariecho, primelimit, parisize, strictmatch;
 static long tglobal, histsize, paribufsize, lim_lines;
@@ -133,6 +136,8 @@ gp_preinit(int force)
   tglobal = 0;
   bufstack = NULL;
   secure = test_mode = under_emacs = chrono = pariecho = 0;
+  prettyprinter = 0;
+  prettyprinter_file = 0;
   fmt.format = 'g'; fmt.field = 0;
 #ifdef LONG_IS_64BIT
   fmt.nb = 38;
@@ -754,6 +759,27 @@ sd_path(char *v, int flag)
 }
 
 static GEN
+sd_prettyprinter(char *v, int flag)
+{
+  if (*v || flag == d_ACKNOWLEDGE || flag == d_SILENT)
+  {
+    char *old = prettyprinter;
+
+    if (old && strcmp(old,v) != 0 && prettyprinter_file) {
+      if (fclose(prettyprinter_file) != 0)
+	fprintferr("Could not close pipe to '%s': %s\n", old, strerror(errno));
+      prettyprinter_file = 0;
+    }
+    prettyprinter = pari_strdup(v); free(old);
+    if (flag == d_INITRC) return gnil;
+  }
+  if (flag == d_RETURN) return strtoGEN(prettyprinter ? prettyprinter : "");
+  if (flag == d_ACKNOWLEDGE)
+    pariputsf("   prettyprinter = \"%s\"\n",prettyprinter ? prettyprinter : "");
+  return gnil;
+}
+
+static GEN
 sd_prompt(char *v, int flag)
 {
   if (*v)
@@ -788,6 +814,7 @@ default_type gp_default_list[] =
   {"parisize",(void*)sd_parisize},
   {"path",(void*)sd_path},
   {"primelimit",(void*)sd_primelimit},
+  {"prettyprinter",(void*)sd_prettyprinter},
   {"prompt",(void*)sd_prompt},
   {"psfile",(void*)sd_psfile},
   {"realprecision",(void*)sd_realprecision},
@@ -2112,16 +2139,53 @@ gp_main_loop(int ismain)
     else
     {
       PariOUT *old = pariOut;
+      FILE *o_out = pari_outfile;
+      int o_prettyp = prettyp;
+
       if (DEBUGLEVEL > 4) fprintferr("prec = [%ld, %ld]\n", prec,precdl);
-      term_color(c_HIST);
+      if (prettyprinter && prettyprinter[0]) {
+	if (!prettyprinter_file)
+	  prettyprinter_file = popen(prettyprinter, "w");
+	if (!prettyprinter_file) {
+	  fprintferr("Could not open pipe to '%s': %s\n", prettyprinter, strerror(errno));
+	  prettyprinter = 0;
+	} else {
+	  pariflush();
+	  pari_outfile = prettyprinter_file;
+	  prettyp = f_TEX;
+	  pariputs("\\");		/* Protect %12= */
+        }
+      }
+      if (!prettyprinter || prettyprinter[0] == 0)
+	term_color(c_HIST);
       sprintf(thestring, "%%%ld = ",tglobal);
       pariputs_opt(thestring);
-      term_color(c_OUTPUT);
-      init_lim_lines(thestring,lim_lines);
-      gp_output(z); pariOut=old;
+      if (!prettyprinter || prettyprinter[0] == 0) {
+	term_color(c_OUTPUT);
+        init_lim_lines(thestring,lim_lines);
+      }
+      gp_output(z);
+      if (prettyprinter && prettyprinter[0]) {
+	pariputs("\n\n"); pariflush();
+	{  /* Wait until the program finish.  Otherwise prompt can overwrite
+	      the output.  Fill the output buffer, wait until it is read. */
+	   char *s = "                                                     \n";
+	   int i = 400;
+
+	   while (--i)
+	     pariputs(s);
+	   pariputs("\n");
+	   pariflush();
+	} /* better than sleep(2); Give possibility to print */
+      }
+      pariOut=old;
+      pari_outfile = o_out;
+      prettyp = o_prettyp;
       term_color(c_NONE);
     }
-    pariputc('\n'); pariflush();
+    if (!prettyprinter || prettyprinter[0] == 0)
+      pariputc('\n');
+    pariflush();
   }
   pop_buffer();
 }