=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/io/cpexpr.c,v retrieving revision 1.6 retrieving revision 1.20 diff -u -p -r1.6 -r1.20 --- OpenXM_contrib2/asir2000/io/cpexpr.c 2000/11/10 08:28:53 1.6 +++ OpenXM_contrib2/asir2000/io/cpexpr.c 2004/03/17 02:23:45 1.20 @@ -44,14 +44,17 @@ * 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.5 2000/11/08 08:02:51 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/io/cpexpr.c,v 1.19 2004/03/17 02:10:31 noro Exp $ */ #include "ca.h" #include "parse.h" #include "al.h" #include "base.h" +#if PARI +#include "genpari.h" +#endif -extern int hex_output,fortran_output; +extern int hex_output,fortran_output,double_output,real_digit; #define PRINTHAT (fortran_output?PUTS("**"):PUTS("^")) @@ -77,6 +80,10 @@ extern int hex_output,fortran_output; #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 @@ -84,6 +91,11 @@ extern int hex_output,fortran_output; #define PRINTEOP length_eop #define PRINTQOP length_qop #define PRINTUP length_up +#define PRINTUM length_um +#define PRINTSF length_sf +#define PRINTFARGS length_fargs +#define PRINTFNODENODE length_fnodenode +#define PRINTFNODE length_fnode void PRINTEXPR(); void PRINTNUM(); @@ -101,39 +113,51 @@ void PRINTUI(); void PRINTGF2MAT(); void PRINTGFMMAT(); void PRINTBYTEARRAY(); +void PRINTQUOTE(); +void PRINTSYMBOL(); +void PRINTRANGE(); +void PRINTTB(); void PRINTERR(); void PRINTCPLX(); void PRINTLM(); void PRINTLF(); +void PRINTUP(); +void PRINTUM(); void PRINTUP2(); +void PRINTFOP(); +void PRINTEOP(); +void PRINTLOP(); +void PRINTQOP(); +void PRINTSF(); +void PRINTFNODE(); static int total_length; -int estimate_length(vl,p) -VL vl; -pointer p; +int estimate_length(VL vl,pointer p) { total_length = 0; PRINTEXPR(vl,p); return total_length; } -#if PARI -void PRINTBF(a) -BF a; +#if defined(PARI) +void PRINTBF(BF a) { char *str; - char *GENtostr(); + char *GENtostr0(); + void myoutbrute(); - str = GENtostr(a->body); + if ( double_output ) { + str = GENtostr0(a->body,myoutbrute); + } else { + str = GENtostr(a->body); + } total_length += strlen(str); free(str); } #endif -void PRINTEXPR(vl,p) -VL vl; -pointer p; +void PRINTEXPR(VL vl,pointer p) { if ( !p ) { total_length++; @@ -173,13 +197,20 @@ pointer p; 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: break; } } -void PRINTN(n) -N n; +void PRINTN(N n) { double ceil(); @@ -191,8 +222,7 @@ N n; total_length += (int)(ceil(0.31*((double)(BSH*PL(n))))+1); } -void PRINTNUM(q) -Num q; +void PRINTNUM(Num q) { if ( !q ) { PUTS("0"); @@ -208,12 +238,15 @@ Num q; } break; case N_R: - total_length += 20; /* XXX */ + if ( double_output ) + total_length += 400+real_digit; /* XXX */ + else + total_length += 20+real_digit; /* XXX */ break; case N_A: PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")"); break; -#if PARI +#if defined(PARI) case N_B: PRINTBF((BF)q); break; #endif @@ -233,13 +266,18 @@ Num q; 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) -C a; +void PRINTCPLX(C a) { PUTS("("); if ( a->r ) @@ -252,13 +290,10 @@ C a; PUTS(")"); } -void PRINTP(vl,p) -VL vl; -P p; +void PRINTP(VL vl,P p) { V v; DCP dc; - int t; if ( !p ) PUTS("0"); @@ -310,9 +345,7 @@ P p; extern int hideargs; -void PRINTV(vl,v) -VL vl; -V v; +void PRINTV(VL vl,V v) { PF pf; PFAD ad; @@ -323,8 +356,8 @@ V v; else if ( (vid)v->attr == V_PF ) { pf = ((PFINS)v->priv)->pf; ad = ((PFINS)v->priv)->ad; if ( !strcmp(NAME(pf),"pow") ) { - PUTS("("); PRINTR(vl,(R)ad[0].arg); PUTS(")"); PRINTHAT; PUTS("("); - PRINTR(vl,(R)ad[1].arg); PUTS(")"); + PUTS("(("); PRINTR(vl,(R)ad[0].arg); PUTS(")"); PRINTHAT; PUTS("("); + PRINTR(vl,(R)ad[1].arg); PUTS("))"); } else if ( !pf->argc ) PUTS(NAME(pf)); else { @@ -368,9 +401,7 @@ V v; } } -void PRINTR(vl,a) -VL vl; -R a; +void PRINTR(VL vl,R a) { if ( !a ) PUTS("0"); @@ -384,9 +415,7 @@ R a; } } -void PRINTVECT(vl,vect) -VL vl; -VECT vect; +void PRINTVECT(VL vl,VECT vect) { int i; pointer *ptr; @@ -398,9 +427,7 @@ VECT vect; PUTS("]"); } -void PRINTMAT(vl,mat) -VL vl; -MAT mat; +void PRINTMAT(VL vl,MAT mat) { int i,j,r,c; pointer *ptr; @@ -416,9 +443,7 @@ MAT mat; } } -void PRINTLIST(vl,list) -VL vl; -LIST list; +void PRINTLIST(VL vl,LIST list) { NODE tnode; @@ -431,8 +456,7 @@ LIST list; PUTS("]"); } -void PRINTSTR(str) -STRING str; +void PRINTSTR(STRING str) { char *p; @@ -444,9 +468,7 @@ STRING str; } } -void PRINTCOMP(vl,c) -VL vl; -COMP c; +void PRINTCOMP(VL vl,COMP c) { int n,i; @@ -460,9 +482,7 @@ COMP c; PUTS("}"); } -void PRINTDP(vl,d) -VL vl; -DP d; +void PRINTDP(VL vl,DP d) { int n,i; MP m; @@ -480,16 +500,12 @@ DP d; } } -void PRINTUI(vl,u) -VL vl; -USINT u; +void PRINTUI(VL vl,USINT u) { total_length += 10; } -void PRINTGF2MAT(vl,mat) -VL vl; -GF2MAT mat; +void PRINTGF2MAT(VL vl,GF2MAT mat) { int row,col,w,i,j,k,m; unsigned int t; @@ -512,12 +528,9 @@ GF2MAT mat; } } -void PRINTGFMMAT(vl,mat) -VL vl; -GFMMAT mat; +void PRINTGFMMAT(VL vl,GFMMAT mat) { int row,col,i,j; - unsigned int t; unsigned int **b; row = mat->row; @@ -532,23 +545,56 @@ GFMMAT mat; } } -void PRINTBYTEARRAY(vl,array) -VL vl; -BYTEARRAY array; +void PRINTBYTEARRAY(VL vl,BYTEARRAY array) { /* |xx xx ... xx| */ total_length += 1+3*array->len; } -void PRINTERR(vl,e) -VL vl; -ERR e; +extern int print_quote; + +void PRINTQUOTE(VL vl,QUOTE quote) { + LIST list; + + if ( print_quote == 2 ) { + PRINTFNODE(BDY(quote)); + } else if ( print_quote == 1 ) { + /* XXX */ + fnodetotree(BDY(quote),&list); + PRINTEXPR(vl,(Obj)list); + } else { + /* <...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(p) -UP2 p; +void PRINTUP2(UP2 p) { int d,i; @@ -580,9 +626,7 @@ UP2 p; } } -void PRINTLF(vl,f) -VL vl; -F f; +void PRINTLF(VL vl,F f) { switch ( FOP(f) ) { case AL_TRUE: @@ -608,9 +652,7 @@ F f; } } -PRINTFOP(vl,f) -VL vl; -F f; +void PRINTFOP(VL vl,F f) { char *op; NODE n; @@ -623,9 +665,7 @@ F f; } } -PRINTEOP(vl,f) -VL vl; -F f; +void PRINTEOP(VL vl,F f) { oFOP op; char *sop; @@ -650,9 +690,7 @@ F f; PUTS(")"); } -PRINTLOP(vl,f) -VL vl; -F f; +void PRINTLOP(VL vl,F f) { char *op; @@ -676,9 +714,7 @@ F f; PRINTEXPR(vl,(Obj)FPL(f)); PUTS(op); PUTS("0"); } -PRINTQOP(vl,f) -VL vl; -F f; +void PRINTQOP(VL vl,F f) { char *op; @@ -688,8 +724,7 @@ F f; PRINTEXPR(vl,(Obj)FQMAT(f)); PUTS(")"); } -PRINTUP(n) -UP n; +void PRINTUP(UP n) { int i,d; @@ -722,4 +757,175 @@ UP n; } 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; +} + + +void PRINTFNODENODE(NODE n) +{ + for ( ; n; n = NEXT(n) ) { + PRINTFNODE((FNODE)BDY(n),0); + if ( NEXT(n) ) PUTS(","); + } +} + +void PRINTFARGS(FNODE f) +{ + NODE n; + + if ( f->id == I_LIST ) { + n = (NODE)FA0(f); + PRINTFNODENODE(n); + } else + PRINTFNODE(f,0); +} + +void PRINTFNODE(FNODE f,int paren) +{ + NODE n,t,t0; + char vname[BUFSIZ],prefix[BUFSIZ]; + char *opname,*vname_conv,*prefix_conv; + Obj obj; + int i,len,allzero,elen,elen2; + C cplx; + char *r; + FNODE fi,f2; + + if ( !f ) { + PUTS("(0)"); + return; + } + if ( paren ) PUTS("("); + switch ( f->id ) { + /* unary operators */ + case I_NOT: PUTS("!"); PRINTFNODE((FNODE)FA0(f),1); break; + case I_PAREN: PRINTFNODE((FNODE)FA0(f),0); break; + case I_MINUS: PUTS("-"); PRINTFNODE((FNODE)FA0(f),1); break; + /* binary operators */ + /* arg list */ + /* I_AND, I_OR => FA0(f), FA1(f) */ + /* otherwise => FA1(f), FA2(f) */ + case I_BOP: + PRINTFNODE((FNODE)FA1(f),1); + PUTS(((ARF)FA0(f))->name); + PRINTFNODE((FNODE)FA2(f),1); + break; + case I_COP: + switch( (cid)FA0(f) ) { + case C_EQ: opname = ("=="); break; + case C_NE: opname = ("!="); break; + case C_GT: opname = (">"); break; + case C_LT: opname = ("<"); break; + case C_GE: opname = (">="); break; + case C_LE: opname = ("<="); break; + } + PRINTFNODE((FNODE)FA1(f),1); + PUTS(opname); + PRINTFNODE((FNODE)FA2(f),1); + break; + case I_LOP: + switch( (lid)FA0(f) ) { + case L_EQ: opname = ("@=="); break; + case L_NE: opname = ("@!="); break; + case L_GT: opname = ("@>"); break; + case L_LT: opname = ("@<"); break; + case L_GE: opname = ("@>="); break; + case L_LE: opname = ("@<="); break; + case L_AND: opname = ("@&&"); break; + case L_OR: opname = ("@||"); break; + case L_NOT: opname = ("@!"); break; + } + if ( (lid)FA0(f)==L_NOT ) { + PUTS(opname); PRINTFNODE((FNODE)FA1(f),1); + } else { + PRINTFNODE((FNODE)FA1(f),1); + PUTS(opname); + PRINTFNODE((FNODE)FA2(f),1); + } + break; + case I_AND: + PRINTFNODE((FNODE)FA0(f),1); + PUTS("&&"); + PRINTFNODE((FNODE)FA1(f),1); + break; + case I_OR: + PRINTFNODE((FNODE)FA0(f),1); + PUTS("!!"); + PRINTFNODE((FNODE)FA1(f),1); + break; + /* ternary operators */ + case I_CE: + PRINTFNODE((FNODE)FA0(f),1); PUTS("?"); PRINTFNODE((FNODE)FA1(f),1); + PUTS(":"); PRINTFNODE((FNODE)FA2(f),1); + break; + /* lists */ + case I_LIST: PUTS("["); PRINTFNODENODE((NODE)FA0(f)); PUTS("]"); break; + /* function */ + case I_FUNC: + if ( !strcmp(((FUNC)FA0(f))->name,"@pi") ) PUTS("@pi"); + else if ( !strcmp(((FUNC)FA0(f))->name,"@e") ) PUTS("@e"); + else { + PUTS(((FUNC)FA0(f))->name); + PUTS("("); PRINTFARGS(FA1(f)); PUTS(")"); + } + break; + /* XXX */ + case I_CAR: PUTS("car("); PRINTFNODE(FA0(f),0); PUTS(")"); break; + case I_CDR: PUTS("cdr("); PRINTFNODE(FA0(f),0); PUTS(")"); break; + /* exponent vector */ + case I_EV: PUTS("<<"); PRINTFNODENODE((NODE)FA0(f)); PUTS(">>"); break; + /* string */ + case I_STR: PUTS((char *)FA0(f)); break; + /* internal object */ + case I_FORMULA: obj = (Obj)FA0(f); PRINTEXPR(CO,obj); break; + /* program variable */ + case I_PVAR: + if ( FA1(f) ) + error("length_fnode : not implemented yet"); + GETPVNAME(FA0(f),opname); + PUTS(opname); + break; + default: error("length_fnode : not implemented yet"); + } + if ( paren ) PUTS(")"); }