[BACK]Return to cpexpr.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / io

Diff for /OpenXM_contrib2/asir2000/io/cpexpr.c between version 1.1 and 1.18

version 1.1, 1999/12/03 07:39:11 version 1.18, 2004/03/03 09:25:30
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/asir99/io/cpexpr.c,v 1.1.1.1 1999/11/10 08:12:30 noro Exp $ */  /*
    * Copyright (c) 1994-2000 FUJITSU LABORATORIES LIMITED
    * All rights reserved.
    *
    * FUJITSU LABORATORIES LIMITED ("FLL") hereby grants you a limited,
    * non-exclusive and royalty-free license to use, copy, modify and
    * redistribute, solely for non-commercial and non-profit purposes, the
    * computer program, "Risa/Asir" ("SOFTWARE"), subject to the terms and
    * conditions of this Agreement. For the avoidance of doubt, you acquire
    * only a limited right to use the SOFTWARE hereunder, and FLL or any
    * third party developer retains all rights, including but not limited to
    * copyrights, in and to the SOFTWARE.
    *
    * (1) FLL does not grant you a license in any way for commercial
    * purposes. You may use the SOFTWARE only for non-commercial and
    * non-profit purposes only, such as academic, research and internal
    * business use.
    * (2) The SOFTWARE is protected by the Copyright Law of Japan and
    * international copyright treaties. If you make copies of the SOFTWARE,
    * with or without modification, as permitted hereunder, you shall affix
    * to all such copies of the SOFTWARE the above copyright notice.
    * (3) An explicit reference to this SOFTWARE and its copyright owner
    * shall be made on your publication or presentation in any form of the
    * results obtained by use of the SOFTWARE.
    * (4) In the event that you modify the SOFTWARE, you shall notify FLL by
    * e-mail at risa-admin@sec.flab.fujitsu.co.jp of the detailed specification
    * for such modification or the source code of the modified part of the
    * SOFTWARE.
    *
    * THE SOFTWARE IS PROVIDED AS IS WITHOUT ANY WARRANTY OF ANY KIND. FLL
    * MAKES ABSOLUTELY NO WARRANTIES, EXPRESSED, IMPLIED OR STATUTORY, AND
    * EXPRESSLY DISCLAIMS ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS
    * FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT OF THIRD PARTIES'
    * RIGHTS. NO FLL DEALER, AGENT, EMPLOYEES IS AUTHORIZED TO MAKE ANY
    * MODIFICATIONS, EXTENSIONS, OR ADDITIONS TO THIS WARRANTY.
    * UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, TORT, CONTRACT,
    * OR OTHERWISE, SHALL FLL BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
    * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, PUNITIVE OR CONSEQUENTIAL
    * DAMAGES OF ANY CHARACTER, INCLUDING, WITHOUT LIMITATION, DAMAGES
    * ARISING OUT OF OR RELATING TO THE SOFTWARE OR THIS AGREEMENT, DAMAGES
    * FOR LOSS OF GOODWILL, WORK STOPPAGE, OR LOSS OF DATA, OR FOR ANY
    * DAMAGES, EVEN IF FLL SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF
    * SUCH DAMAGES, OR FOR ANY CLAIM BY ANY OTHER PARTY. EVEN IF A PART
    * OF THE SOFTWARE HAS BEEN DEVELOPED BY A THIRD PARTY, THE THIRD PARTY
    * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
    * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
    * $OpenXM: OpenXM_contrib2/asir2000/io/cpexpr.c,v 1.17 2004/02/09 08:23:30 noro Exp $
   */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
   #include "al.h"
 #include "base.h"  #include "base.h"
   #if PARI
   #include "genpari.h"
   #endif
   
   extern int hex_output,fortran_output,double_output,real_digit;
   
   #define PRINTHAT (fortran_output?PUTS("**"):PUTS("^"))
   
 #define TAIL  #define TAIL
 #define PUTS(s) (total_length+=strlen(s))  #define PUTS(s) (total_length+=strlen(s))
 #define PRINTN length_n  #define PRINTN length_n
 /* #define PRINTBF length_bf */  #define PRINTBF length_bf
 #define PRINTBF  
 #define PRINTCPLX length_cplx  #define PRINTCPLX length_cplx
   #define PRINTLM length_lm
   #define PRINTUP2 length_up2
 #define PRINTV length_v  #define PRINTV length_v
 #define PRINTEXPR length_expr  #define PRINTEXPR length_expr
 #define PRINTNUM length_num  #define PRINTNUM length_num
Line 20 
Line 76 
 #define PRINTSTR length_str  #define PRINTSTR length_str
 #define PRINTCOMP length_comp  #define PRINTCOMP length_comp
 #define PRINTDP length_dp  #define PRINTDP length_dp
   #define PRINTUI length_ui
   #define PRINTGF2MAT length_gf2mat
   #define PRINTGFMMAT length_gfmmat
   #define PRINTBYTEARRAY length_bytearray
   #define PRINTQUOTE length_QUOTE
   #define PRINTSYMBOL length_SYMBOL
   #define PRINTRANGE length_RANGE
   #define PRINTTB length_TB
   #define PRINTERR length_err
   #define PRINTLF length_lf
   #define PRINTLOP length_lop
   #define PRINTFOP length_fop
   #define PRINTEOP length_eop
   #define PRINTQOP length_qop
   #define PRINTUP length_up
   #define PRINTUM length_um
   #define PRINTSF length_sf
   
 #if defined(THINK_C)  
 void PRINTEXPR(VL,pointer);  
 void PRINTNUM(Num);  
 void PRINTV(VL,V);  
 void PRINTN(N);  
 void PRINTP(VL,P);  
 void PRINTR(VL,R);  
 void PRINTLIST(VL,LIST);  
 void PRINTVECT(VL,VECT);  
 void PRINTMAT(VL,MAT);  
 void PRINTSTR(STRING);  
 void PRINTCOMP(VL,COMP);  
 void PRINTDP(VL,DP);  
 void PRINTCPLX(C);  
 #else  
 void PRINTEXPR();  void PRINTEXPR();
 void PRINTNUM();  void PRINTNUM();
 void PRINTV();  
 void PRINTN();  void PRINTN();
   void PRINTV();
 void PRINTP();  void PRINTP();
 void PRINTR();  void PRINTR();
 void PRINTLIST();  void PRINTLIST();
Line 48  void PRINTMAT();
Line 106  void PRINTMAT();
 void PRINTSTR();  void PRINTSTR();
 void PRINTCOMP();  void PRINTCOMP();
 void PRINTDP();  void PRINTDP();
   void PRINTUI();
   void PRINTGF2MAT();
   void PRINTGFMMAT();
   void PRINTBYTEARRAY();
   void PRINTQUOTE();
   void PRINTSYMBOL();
   void PRINTRANGE();
   void PRINTTB();
   void PRINTERR();
 void PRINTCPLX();  void PRINTCPLX();
 #endif  void PRINTLM();
   void PRINTLF();
   void PRINTUP();
   void PRINTUM();
   void PRINTUP2();
   void PRINTFOP();
   void PRINTEOP();
   void PRINTLOP();
   void PRINTQOP();
   void PRINTSF();
   
 static int total_length;  static int total_length;
   
 int estimate_length(vl,p)  int estimate_length(VL vl,pointer p)
 VL vl;  
 pointer p;  
 {  {
         total_length = 0;          total_length = 0;
         PRINTEXPR(vl,p);          PRINTEXPR(vl,p);
         return total_length;          return total_length;
 }  }
   
 void PRINTEXPR(vl,p)  #if defined(PARI)
 VL vl;  void PRINTBF(BF a)
 pointer p;  
 {  {
           char *str;
           char *GENtostr0();
           void myoutbrute();
   
           if ( double_output ) {
                   str = GENtostr0(a->body,myoutbrute);
           } else {
                   str = GENtostr(a->body);
           }
           total_length += strlen(str);
           free(str);
   }
   #endif
   
   void PRINTEXPR(VL vl,pointer p)
   {
         if ( !p ) {          if ( !p ) {
                 total_length++;                  total_length++;
                 return;                  return;
Line 90  pointer p;
Line 179  pointer p;
                         PRINTCOMP(vl,(COMP)p); break;                          PRINTCOMP(vl,(COMP)p); break;
                 case O_DP:                  case O_DP:
                         PRINTDP(vl,(DP)p); break;                          PRINTDP(vl,(DP)p); break;
                   case O_USINT:
                           PRINTUI(vl,(USINT)p); break;
                   case O_GF2MAT:
                           PRINTGF2MAT(vl,(GF2MAT)p); break;
                   case O_ERR:
                           PRINTERR(vl,(ERR)p); break;
                   case O_MATHCAP:
                           PRINTLIST(vl,((MATHCAP)p)->body); break;
                   case O_F:
                           PRINTLF(vl,(F)p); break;
                   case O_GFMMAT:
                           PRINTGFMMAT(vl,(GFMMAT)p); break;
                   case O_BYTEARRAY:
                           PRINTBYTEARRAY(vl,(BYTEARRAY)p); break;
                   case O_QUOTE:
                           PRINTQUOTE(vl,(QUOTE)p); break;
                   case O_SYMBOL:
                           PRINTSYMBOL((SYMBOL)p); break;
                   case O_RANGE:
                           PRINTRANGE(vl,(RANGE)p); break;
                   case O_TB:
                           PRINTTB(vl,(TB)p); break;
                 default:                  default:
                         break;                          break;
         }          }
 }  }
   
 void PRINTN(n)  void PRINTN(N n)
 N n;  
 {  {
         double ceil();          double ceil();
   
         if ( !n )          if ( !n )
                 PUTS("0");                  PUTS("0");
           else if ( hex_output )
                   total_length += 2+(int)(PL(n)*8);
         else          else
                 total_length += (int)(ceil(0.31*((double)(BSH*PL(n))))+1);                  total_length += (int)(ceil(0.31*((double)(BSH*PL(n))))+1);
 }  }
   
 void PRINTNUM(q)  void PRINTNUM(Num q)
 Num q;  
 {  {
         if ( !q ) {          if ( !q ) {
                 PUTS("0");                  PUTS("0");
Line 123  Num q;
Line 234  Num q;
                         }                          }
                         break;                          break;
                 case N_R:                  case N_R:
                         total_length += 20; /* XXX */                          if ( double_output )
                                   total_length += 400+real_digit; /* XXX */
                           else
                                   total_length += 20+real_digit; /* XXX */
                         break;                          break;
                 case N_A:                  case N_A:
                         PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");                          PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");
                         break;                          break;
 #if PARI  #if defined(PARI)
                 case N_B:                  case N_B:
                         PRINTBF((BF)q); break;                          PRINTBF((BF)q); break;
 #endif  #endif
                 case N_C:                  case N_C:
                         PRINTCPLX((C)q); break;                          PRINTCPLX((C)q); break;
                 case N_M:                  case N_M:
                         total_length += 10; /* XXX */                          total_length += 11; /* XXX */
                         break;                          break;
                   case N_LM:
                           PRINTN(((LM)q)->body); break;
                   case N_GF2N:
                           if ( hex_output )
                                   PRINTN((N)(((GF2N)q)->body));
                           else
                                   PRINTUP2(((GF2N)q)->body);
                           break;
                   case N_GFPN:
                           PRINTUP((UP)(((GFPN)q)->body));
                           break;
                   case N_GFS:
                           total_length += 13; /* XXX */
                           break;
                   case N_GFSN:
                           PRINTUM(BDY((GFSN)q));
                           break;
                   default:
                           break;
         }          }
 }  }
   
 void PRINTCPLX(a)  void PRINTCPLX(C a)
 C a;  
 {  {
         PUTS("(");          PUTS("(");
         if ( a->r )          if ( a->r )
Line 154  C a;
Line 286  C a;
         PUTS(")");          PUTS(")");
 }  }
   
 void PRINTP(vl,p)  void PRINTP(VL vl,P p)
 VL vl;  
 P p;  
 {  {
         V v;          V v;
         DCP dc;          DCP dc;
         int t;  
   
         if ( !p )          if ( !p )
                 PUTS("0");                  PUTS("0");
Line 182  P p;
Line 311  P p;
                                 }                                  }
                                 PRINTV(vl,v);                                  PRINTV(vl,v);
                                 if ( cmpq(DEG(dc),ONE) ) {                                  if ( cmpq(DEG(dc),ONE) ) {
                                         PUTS("^");                                          PRINTHAT;
                                         if ( INT(DEG(dc)) && SGN(DEG(dc))>0 )                                          if ( INT(DEG(dc)) && SGN(DEG(dc))>0 )
                                                 PRINTNUM((Num)DEG(dc));                                                  PRINTNUM((Num)DEG(dc));
                                         else {                                          else {
Line 210  P p;
Line 339  P p;
                 }                  }
 }  }
   
 void PRINTV(vl,v)  extern int hideargs;
 VL vl;  
 V v;  void PRINTV(VL vl,V v)
 {  {
         PF pf;          PF pf;
         PFAD ad;          PFAD ad;
Line 223  V v;
Line 352  V v;
         else if ( (vid)v->attr == V_PF ) {          else if ( (vid)v->attr == V_PF ) {
                 pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;                  pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad;
                 if ( !strcmp(NAME(pf),"pow") ) {                  if ( !strcmp(NAME(pf),"pow") ) {
                         PUTS("("); PRINTR(vl,(R)ad[0].arg); PUTS(")^(");                          PUTS("(("); PRINTR(vl,(R)ad[0].arg); PUTS(")"); PRINTHAT; PUTS("(");
                         PRINTR(vl,(R)ad[1].arg); PUTS(")");                          PRINTR(vl,(R)ad[1].arg); PUTS("))");
                 } else if ( !pf->argc )                  } else if ( !pf->argc )
                         PUTS(NAME(pf));                          PUTS(NAME(pf));
                 else {                  else {
                         for ( i = 0; i < pf->argc; i++ )                          if ( hideargs ) {
                                 if ( ad[i].d )                                  for ( i = 0; i < pf->argc; i++ )
                                         break;                                          if ( ad[i].d )
                         if ( i < pf->argc ) {                                                  break;
                                 PUTS(NAME(pf));                                  if ( i < pf->argc ) {
                                 total_length += 11; /* XXX */                                          PUTS(NAME(pf));
                                 for ( i = 1; i < pf->argc; i++ ) {  
                                         total_length += 11; /* XXX */                                          total_length += 11; /* XXX */
                                           for ( i = 1; i < pf->argc; i++ ) {
                                                   total_length += 11; /* XXX */
                                           }
                                           PUTS("}");
                                   } else {
                                           PUTS(NAME(pf));
                                           total_length += 1; /* XXX */
                                 }                                  }
                                 PUTS(")(");  
                         } else {                          } else {
                                 PUTS(NAME(pf));                                  for ( i = 0; i < pf->argc; i++ )
                                 total_length += 1; /* XXX */                                          if ( ad[i].d )
                                                   break;
                                   if ( i < pf->argc ) {
                                           PUTS(NAME(pf));
                                           total_length += 11; /* XXX */
                                           for ( i = 1; i < pf->argc; i++ ) {
                                                   total_length += 11; /* XXX */
                                           }
                                           PUTS(")(");
                                   } else {
                                           PUTS(NAME(pf));
                                           total_length += 1; /* XXX */
                                   }
                                   PRINTR(vl,(R)ad[0].arg);
                                   for ( i = 1; i < pf->argc; i++ ) {
                                           PUTS(","); PRINTR(vl,(R)ad[i].arg);
                                   }
                                   PUTS(")");
                         }                          }
                         PRINTR(vl,(R)ad[0].arg);  
                         for ( i = 1; i < pf->argc; i++ ) {  
                                 PUTS(","); PRINTR(vl,(R)ad[i].arg);  
                         }  
                         PUTS(")");  
                 }                  }
         }          }
 }  }
   
 void PRINTR(vl,a)  void PRINTR(VL vl,R a)
 VL vl;  
 R a;  
 {  {
         if ( !a )          if ( !a )
                 PUTS("0");                  PUTS("0");
Line 267  R a;
Line 411  R a;
                 }                  }
 }  }
   
 void PRINTVECT(vl,vect)  void PRINTVECT(VL vl,VECT vect)
 VL vl;  
 VECT vect;  
 {  {
         int i;          int i;
         pointer *ptr;          pointer *ptr;
Line 281  VECT vect;
Line 423  VECT vect;
         PUTS("]");          PUTS("]");
 }  }
   
 void PRINTMAT(vl,mat)  void PRINTMAT(VL vl,MAT mat)
 VL vl;  
 MAT mat;  
 {  {
         int i,j,r,c;          int i,j,r,c;
         pointer *ptr;          pointer *ptr;
Line 299  MAT mat;
Line 439  MAT mat;
         }          }
 }  }
   
 void PRINTLIST(vl,list)  void PRINTLIST(VL vl,LIST list)
 VL vl;  
 LIST list;  
 {  {
         NODE tnode;          NODE tnode;
   
Line 314  LIST list;
Line 452  LIST list;
         PUTS("]");          PUTS("]");
 }  }
   
 void PRINTSTR(str)  void PRINTSTR(STRING str)
 STRING str;  
 {  {
         char *p;          char *p;
   
Line 327  STRING str;
Line 464  STRING str;
                 }                  }
 }  }
   
 void PRINTCOMP(vl,c)  void PRINTCOMP(VL vl,COMP c)
 VL vl;  
 COMP c;  
 {  {
         int n,i;          int n,i;
   
Line 343  COMP c;
Line 478  COMP c;
         PUTS("}");          PUTS("}");
 }  }
   
 void PRINTDP(vl,d)  void PRINTDP(VL vl,DP d)
 VL vl;  
 DP d;  
 {  {
         int n,i;          int n,i;
         MP m;          MP m;
Line 361  DP d;
Line 494  DP d;
                 if ( NEXT(m) )                  if ( NEXT(m) )
                         PUTS("+");                          PUTS("+");
         }          }
   }
   
   void PRINTUI(VL vl,USINT u)
   {
           total_length += 10;
   }
   
   void PRINTGF2MAT(VL vl,GF2MAT mat)
   {
           int row,col,w,i,j,k,m;
           unsigned int t;
           unsigned int **b;
   
           row = mat->row;
           col = mat->col;
           w = (col+BSH-1)/BSH;
           b = mat->body;
           for ( i = 0; i < row; i++ ) {
                   for ( j = 0, m = 0; j < w; j++ ) {
                           t = b[i][j];
                           for ( k = 0; m < col && k < BSH; k++, m++ )
                                   if ( t & (1<<k) )
                                           PUTS("1");
                                   else
                                           PUTS("0");
                   }
                   PUTS("\n");
           }
   }
   
   void PRINTGFMMAT(VL vl,GFMMAT mat)
   {
           int row,col,i,j;
           unsigned int **b;
   
           row = mat->row;
           col = mat->col;
           b = mat->body;
           for ( i = 0; i < row; i++ ) {
                   PUTS("[");
                   for ( j = 0; j < col; j++ ) {
                           total_length += 10; /* XXX */
                   }
                   PUTS("]\n");
           }
   }
   
   void PRINTBYTEARRAY(VL vl,BYTEARRAY array)
   {
           /* |xx xx ... xx| */
           total_length += 1+3*array->len;
   }
   
   void PRINTQUOTE(VL vl,QUOTE quote)
   {
           /* <...quoted...> */
           total_length += 20;
   }
   
   void PRINTSYMBOL(SYMBOL sym)
   {
           total_length += strlen(sym->name);
   }
   
   void PRINTRANGE(VL vl,RANGE r)
   {
           PUTS("range("); PRINTEXPR(vl,r->start);
           PUTS(","); PRINTEXPR(vl,r->end); PUTS(")");
   }
   
   void PRINTTB(VL vl,TB p)
   {
           int i;
   
           for ( i = 0; i < p->next; i++ ) {
                   total_length += strlen(p->body[i]);
           }
   }
   
   void PRINTERR(VL vl,ERR e)
   {
           PUTS("error("); PRINTEXPR(vl,e->body); PUTS(")");
   }
   
   void PRINTUP2(UP2 p)
   {
           int d,i;
   
           if ( !p ) {
                   PUTS("0");
           } else {
                   d = degup2(p);
                   PUTS("(");
                   if ( !d ) {
                           PUTS("1");
                   } else if ( d == 1 ) {
                           PUTS("@");
                   } else {
                           PRINTHAT;
                           total_length += 11;
                   }
                   for ( i = d-1; i >= 0; i-- ) {
                           if ( p->b[i/BSH] & (1<<(i%BSH)) )
                                   if ( !i ) {
                                           PUTS("+1");
                                   } else if ( i == 1 ) {
                                           PUTS("+@");
                                   } else {
                                           PRINTHAT;
                                           total_length += 12;
                                   }
                   }
                   PUTS(")");
           }
   }
   
   void PRINTLF(VL vl,F f)
   {
           switch ( FOP(f) ) {
                   case AL_TRUE:
                           PUTS("@true");
                           break;
                   case AL_FALSE:
                           PUTS("@false");
                           break;
   
                   case AL_OR: case AL_AND:
                           PRINTFOP(vl,f); break;
                   case AL_NOT: case AL_IMPL: case AL_REPL: case AL_EQUIV:
                           PRINTEOP(vl,f); break;
   
                   case AL_EQUAL: case AL_NEQ: case AL_LESSP:
                   case AL_GREATERP: case AL_LEQ: case AL_GEQ:
                           PRINTLOP(vl,f); break;
   
                   case AL_EX: case AL_ALL:
                           PRINTQOP(vl,f); break;
                   default:
                           break;
           }
   }
   
   void PRINTFOP(VL vl,F f)
   {
           char *op;
           NODE n;
   
           op = FOP(f)==AL_OR?" @|| ":" @&& ";
           n = FJARG(f);
           PUTS("("); PRINTEXPR(vl,BDY(n)); PUTS(")");
           for ( n = NEXT(n); n; n = NEXT(n) ) {
                   PUTS(op); PUTS("("); PRINTEXPR(vl,BDY(n)); PUTS(")");
           }
   }
   
   void PRINTEOP(VL vl,F f)
   {
           oFOP op;
           char *sop;
   
           if ( (op = FOP(f)) == AL_NOT ) {
                   PUTS("(@! "); PRINTEXPR(vl,(Obj)FARG(f)); PUTS(")"); return;
           }
           switch ( op ) {
                   case AL_IMPL:
                           sop = " @impl "; break;
                   case AL_REPL:
                           sop = " @repl "; break;
                   case AL_EQUIV:
                           sop = " @equiv "; break;
                   default:
                           break;
           }
           PUTS("(");
           PRINTEXPR(vl,(Obj)FLHS(f));
           PUTS(sop);
           PRINTEXPR(vl,(Obj)FRHS(f));
           PUTS(")");
   }
   
   void PRINTLOP(VL vl,F f)
   {
           char *op;
   
           switch ( FOP(f) ) {
                   case AL_EQUAL:
                           op = " @== "; break;
                   case AL_NEQ:
                           op = " @!= "; break;
                   case AL_LESSP:
                           op = " @< "; break;
                   case AL_GREATERP:
                           op = " @> "; break;
                   case AL_LEQ:
                           op = " @<= "; break;
                   case AL_GEQ:
                           op = " @>= "; break;
                   default:
                           error("PRINTLOP : invalid operator");
                           break;
           }
           PRINTEXPR(vl,(Obj)FPL(f)); PUTS(op); PUTS("0");
   }
   
   void PRINTQOP(VL vl,F f)
   {
           char *op;
   
           op = FOP(f)==AL_EX?"ex":"all";
           PUTS(op); PUTS(NAME(FQVR(f)));
           total_length += 2;
           PRINTEXPR(vl,(Obj)FQMAT(f)); PUTS(")");
   }
   
   void PRINTUP(UP n)
   {
           int i,d;
   
           if ( !n )
                   PUTS("0");
           else if ( !n->d )
                   PRINTNUM(n->c[0]);
           else {
                   d = n->d;
                   PUTS("(");
                   if ( !d ) {
                           PRINTNUM(n->c[d]);
                   } else if ( d == 1 ) {
                           PRINTNUM(n->c[d]);
                           PUTS("*@p");
                   } else {
                           PRINTNUM(n->c[d]);
                           PRINTHAT;
                           total_length += 13;
                   }
                   for ( i = d-1; i >= 0; i-- ) {
                           if ( n->c[i] ) {
                                   PUTS("+("); PRINTNUM(n->c[i]); PUTS(")");
                                   if ( i >= 2 ) {
                                           PRINTHAT;
                                           total_length += 13;
                                   } else if ( i == 1 )
                                           PUTS("*@p");
                           }
                   }
                   PUTS(")");
           }
   }
   
   void PRINTUM(UM n)
   {
           int i,d;
   
           if ( !n )
                   PUTS("0");
           else if ( !n->d )
                   PRINTSF(n->c[0]);
           else {
                   d = n->d;
                   PUTS("(");
                   if ( !d ) {
                           PRINTSF(n->c[d]);
                   } else if ( d == 1 ) {
                           PRINTSF(n->c[d]);
                           PUTS("*@s");
                   } else {
                           PRINTSF(n->c[d]);
                           PUTS("*@s"); PRINTHAT; total_length += 13;
                   }
                   for ( i = d-1; i >= 0; i-- ) {
                           if ( n->c[i] ) {
                                   PUTS("+("); PRINTSF(n->c[i]); PUTS(")");
                                   if ( i >= 2 ) {
                                           PUTS("*@s"); PRINTHAT; total_length += 13;
                                   } else if ( i == 1 )
                                           PUTS("*@s");
                           }
                   }
                   PUTS(")");
           }
   }
   
   void PRINTSF(unsigned int i)
   {
           if ( !i ) {
                   PUTS("0");
           } else
                   total_length += 15;
 }  }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.18

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>