=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/io/cpexpr.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -p -r1.1 -r1.2 --- OpenXM_contrib2/asir2000/io/cpexpr.c 1999/12/03 07:39:11 1.1 +++ OpenXM_contrib2/asir2000/io/cpexpr.c 2000/02/07 03:14:39 1.2 @@ -1,14 +1,20 @@ -/* $OpenXM: OpenXM/src/asir99/io/cpexpr.c,v 1.1.1.1 1999/11/10 08:12:30 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/io/cpexpr.c,v 1.1.1.1 1999/12/03 07:39:11 noro Exp $ */ #include "ca.h" #include "parse.h" +#include "al.h" #include "base.h" +extern int hex_output,fortran_output; + +#define PRINTHAT (fortran_output?PUTS("**"):PUTS("^")) + #define TAIL #define PUTS(s) (total_length+=strlen(s)) #define PRINTN length_n -/* #define PRINTBF length_bf */ -#define PRINTBF +#define PRINTBF length_bf #define PRINTCPLX length_cplx +#define PRINTLM length_lm +#define PRINTUP2 length_up2 #define PRINTV length_v #define PRINTEXPR length_expr #define PRINTNUM length_num @@ -20,26 +26,21 @@ #define PRINTSTR length_str #define PRINTCOMP length_comp #define PRINTDP length_dp +#define PRINTUI length_ui +#define PRINTGF2MAT length_gf2mat +#define PRINTGFMMAT length_gfmmat +#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 -#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 PRINTNUM(); -void PRINTV(); void PRINTN(); +void PRINTV(); void PRINTP(); void PRINTR(); void PRINTLIST(); @@ -48,8 +49,14 @@ void PRINTMAT(); void PRINTSTR(); void PRINTCOMP(); void PRINTDP(); +void PRINTUI(); +void PRINTGF2MAT(); +void PRINTGFMMAT(); +void PRINTERR(); void PRINTCPLX(); -#endif +void PRINTLM(); +void PRINTLF(); +void PRINTUP2(); static int total_length; @@ -62,6 +69,19 @@ pointer p; return total_length; } +#if PARI +void PRINTBF(a) +BF a; +{ + char *str; + char *GENtostr(); + + str = GENtostr(a->body); + total_length += strlen(str); + free(str); +} +#endif + void PRINTEXPR(vl,p) VL vl; pointer p; @@ -90,6 +110,18 @@ pointer p; PRINTCOMP(vl,(COMP)p); break; case O_DP: 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; default: break; } @@ -102,6 +134,8 @@ N n; if ( !n ) PUTS("0"); + else if ( hex_output ) + total_length += 2+(int)(PL(n)*8); else total_length += (int)(ceil(0.31*((double)(BSH*PL(n))))+1); } @@ -135,8 +169,21 @@ Num q; case N_C: PRINTCPLX((C)q); break; case N_M: - total_length += 10; /* XXX */ + total_length += 11; /* XXX */ 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; + default: + break; } } @@ -182,7 +229,7 @@ P p; } PRINTV(vl,v); if ( cmpq(DEG(dc),ONE) ) { - PUTS("^"); + PRINTHAT; if ( INT(DEG(dc)) && SGN(DEG(dc))>0 ) PRINTNUM((Num)DEG(dc)); else { @@ -210,6 +257,8 @@ P p; } } +extern int hideargs; + void PRINTV(vl,v) VL vl; V v; @@ -223,30 +272,47 @@ 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(")^("); + 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 { - for ( i = 0; i < pf->argc; i++ ) - if ( ad[i].d ) - break; - if ( i < pf->argc ) { - PUTS(NAME(pf)); - total_length += 11; /* XXX */ - for ( i = 1; i < pf->argc; i++ ) { + if ( hideargs ) { + for ( i = 0; i < pf->argc; i++ ) + 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 */ } - PUTS(")("); } else { - PUTS(NAME(pf)); - total_length += 1; /* XXX */ + for ( i = 0; i < pf->argc; i++ ) + 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(")"); } } } @@ -360,5 +426,241 @@ DP d; PUTS(">>"); if ( NEXT(m) ) PUTS("+"); + } +} + +void PRINTUI(vl,u) +VL vl; +USINT u; +{ + total_length += 10; +} + +void PRINTGF2MAT(vl,mat) +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<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 PRINTERR(vl,e) +VL vl; +ERR e; +{ + PUTS("error("); PRINTEXPR(vl,e->body); PUTS(")"); +} + +void PRINTUP2(p) +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,f) +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; + } +} + +PRINTFOP(vl,f) +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(")"); + } +} + +PRINTEOP(vl,f) +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(")"); +} + +PRINTLOP(vl,f) +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"); +} + +PRINTQOP(vl,f) +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(")"); +} + +PRINTUP(n) +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(")"); } }