=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/io/pexpr.c,v retrieving revision 1.20 retrieving revision 1.33 diff -u -p -r1.20 -r1.33 --- OpenXM_contrib2/asir2000/io/pexpr.c 2002/09/11 07:23:27 1.20 +++ OpenXM_contrib2/asir2000/io/pexpr.c 2004/03/17 02:10:31 1.33 @@ -44,7 +44,7 @@ * 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/pexpr.c,v 1.19 2002/09/02 05:16:07 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/io/pexpr.c,v 1.32 2004/03/03 09:25:30 noro Exp $ */ #include "ca.h" #include "al.h" @@ -52,11 +52,16 @@ #include "comp.h" #include "base.h" +#if defined(PARI) +#include "genpari.h" +#endif + #ifndef FPRINT #define FPRINT #endif #define PRINTHAT (fortran_output?PUTS("**"):PUTS("^")) +extern int outputstyle; #ifdef FPRINT FILE *asir_out; @@ -66,7 +71,9 @@ int hex_output; int fortran_output; int double_output; int real_digit; +int real_binary; int print_quote; +extern int asir_texmacs; #define TAIL #define PUTS(s) fputs(s,OUT) @@ -101,6 +108,12 @@ int print_quote; #define PRINTUP printup #define PRINTUM printum #define PRINTSF printsf +#define PRINTSYMBOL printsymbol +#define PRINTRANGE printrange +#define PRINTTB printtb +#define PRINTFNODE printfnode +#define PRINTFNODENODE printfnodenode +#define PRINTFARGS printfargs #endif #ifdef SPRINT @@ -111,8 +124,10 @@ extern int hex_output; extern int fortran_output; extern int double_output; extern int real_digit; +extern int real_binary; extern int print_quote; + #define TAIL while ( *OUT ) OUT++; #define PUTS(s) strcat(OUT,s) #define PRINTF sprintf @@ -146,6 +161,12 @@ extern int print_quote; #define PRINTUP sprintup #define PRINTUM sprintum #define PRINTSF sprintsf +#define PRINTSYMBOL sprintsymbol +#define PRINTRANGE sprintrange +#define PRINTTB sprinttb +#define PRINTFNODE sprintfnode +#define PRINTFNODENODE sprintfnodenode +#define PRINTFARGS sprintfargs #endif void PRINTEXPR(); @@ -177,6 +198,10 @@ void PRINTEOP(); void PRINTLOP(); void PRINTQOP(); void PRINTSF(); +void PRINTSYMBOL(); +void PRINTRANGE(); +void PRINTTB(); +void PRINTFNODE(); #ifdef FPRINT void output_init() { @@ -203,12 +228,10 @@ P p; return (mmono(COEF(DC(p)))); } -#if PARI +#if defined(PARI) void printbf(a) BF a; { - void sor(); - sor(a->body,double_output ? 'f' : 'g',-1,0); } #endif @@ -221,20 +244,21 @@ char *s; s[0] = 0; buf = s; } -#if PARI -#include "genpari.h" - +#if defined(PARI) void myoutbrute(g) GEN g; { +# if PARI_VERSION_CODE > 131588 + brute(g, 'f',-1); +# else bruteall(g,'f',-1,1); +# endif } void sprintbf(a) BF a; { char *str; - char *GENtostr(); char *GENtostr0(); if ( double_output ) { @@ -248,53 +272,64 @@ BF a; #endif #endif +#define DATA_BEGIN 2 +#define DATA_END 5 + +extern FUNC user_print_function; + void PRINTEXPR(vl,p) VL vl; Obj p; { + if ( asir_texmacs && !user_print_function ) printf("\2verbatim:"); if ( !p ) { PRINTR(vl,(R)p); - return; - } - - switch ( OID(p) ) { - case O_N: - PRINTNUM((Num)p); break; - case O_P: - PRINTP(vl,(P)p); break; - case O_R: - PRINTR(vl,(R)p); break; - case O_LIST: - PRINTLIST(vl,(LIST)p); break; - case O_VECT: - PRINTVECT(vl,(VECT)p); break; - case O_MAT: - PRINTMAT(vl,(MAT)p); break; - case O_STR: - PRINTSTR((STRING)p); break; - case O_COMP: - 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: + } else + switch ( OID(p) ) { + case O_N: + PRINTNUM((Num)p); break; + case O_P: + PRINTP(vl,(P)p); break; + case O_R: + PRINTR(vl,(R)p); break; + case O_LIST: + PRINTLIST(vl,(LIST)p); break; + case O_VECT: + PRINTVECT(vl,(VECT)p); break; + case O_MAT: + PRINTMAT(vl,(MAT)p); break; + case O_STR: + PRINTSTR((STRING)p); break; + case O_COMP: + 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; - case O_BYTEARRAY: - PRINTBYTEARRAY(vl,(BYTEARRAY)p); break; - case O_QUOTE: - PRINTQUOTE(vl,(QUOTE)p); break; - default: - 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: + break; + } + if ( asir_texmacs && !user_print_function ) { putchar('\5'); fflush(stdout); } } void PRINTN(n) @@ -393,7 +428,76 @@ Num q; case MID_PRINTF_G: #endif default: - if ( real_digit ) { + if ( real_binary ) { + unsigned int *m; + unsigned int u,l,mask; + int i,expo; + + m = (unsigned int *)&BDY((Real)q); +#if defined(__i386__) || defined(MIPSEL) || defined(VISUAL) || defined(__alpha) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__x86_64) + u = m[1]; l = m[0]; +#else + u = m[0]; l = m[1]; +#endif + if (u&0x80000000) { + TAIL PRINTF(OUT,"-"); + } + u &= 0x7fffffff; + expo = ((int)(u>>20)); + u &= 0xfffff; + if ( expo == 2047 ) { + if ( u || l ) { + TAIL PRINTF(OUT,"NaN"); + } else { + TAIL PRINTF(OUT,"Inf"); + } + } else if ( expo == 0 ) { + if ( u || l ) { + TAIL PRINTF(OUT,"0b0."); + for ( i = 0, mask = 0x80000; i < 20; + i++, mask >>= 1) { + TAIL + if ( u&mask ) + PRINTF(OUT,"1"); + else + PRINTF(OUT,"0"); + } + for ( i = 0, mask = 0x80000000; i < 32; + i++, mask >>= 1) { + TAIL + if ( l&mask ) + PRINTF(OUT,"1"); + else + PRINTF(OUT,"0"); + } + TAIL PRINTF(OUT,"*2^%d",-1022); + } else { + TAIL PRINTF(OUT,"0"); + } + } else { + expo -= 1023; + TAIL PRINTF(OUT,"0b1."); + for ( i = 0, mask = 0x80000; i < 20; + i++, mask >>= 1) { + TAIL + if ( u&mask ) + PRINTF(OUT,"1"); + else + PRINTF(OUT,"0"); + } + for ( i = 0, mask = 0x80000000; i < 32; + i++, mask >>= 1) { + TAIL + if ( l&mask ) + PRINTF(OUT,"1"); + else + PRINTF(OUT,"0"); + } + if ( expo ) { + TAIL PRINTF(OUT,"*2^%d",expo); + } + } + } else if ( real_digit ) { sprintf(real_format, double_output?"%%.%df":"%%.%dg",real_digit); TAIL PRINTF(OUT,real_format,BDY((Real)q)); @@ -406,37 +510,93 @@ Num q; 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 #if defined(INTERVAL) case N_IP: case N_IntervalBigFloat: - PUTS("["); - PRINTNUM(INF((Itv)q)); - PUTS(","); - PRINTNUM(SUP((Itv)q)); - PUTS("]"); + switch ( outputstyle ) { + case 1: + PUTS("intval("); + PRINTNUM(INF((Itv)q)); + PUTS(","); + PRINTNUM(SUP((Itv)q)); + PUTS(")"); + break; + case 0: + default: + PUTS("["); + PRINTNUM(INF((Itv)q)); + PUTS(","); + PRINTNUM(SUP((Itv)q)); + PUTS("]"); + break; + } break; case N_IntervalDouble: switch (printmode) { case PRINTF_E: - TAIL PRINTF(OUT, "[%.16e,%.16e]",INF((IntervalDouble)q),SUP((IntervalDouble)q)); + switch ( outputstyle ) { + case 1: + TAIL PRINTF(OUT, "intval(%.16e,%.16e)", + INF((IntervalDouble)q),SUP((IntervalDouble)q)); + break; + case 0: + default: + TAIL PRINTF(OUT, "[%.16e,%.16e]", + INF((IntervalDouble)q),SUP((IntervalDouble)q)); + break; + } #if defined(ITVDEBUG) printbin(INF((IntervalDouble)q)); printbin(SUP((IntervalDouble)q)); #endif break; case MID_PRINTF_G: - TAIL PRINTF(OUT, "<%g,%g>", (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,(SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5); + switch ( outputstyle ) { + case 1: + TAIL PRINTF(OUT, "intvalm(%g,%g)", + (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5, + (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5); + break; + case 0: + default: + TAIL PRINTF(OUT, "<%g,%g>", + (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5, + (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5); + break; + } break; case MID_PRINTF_E: - TAIL PRINTF(OUT, "<%.16e,%.16e>", (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5,(SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5); + switch ( outputstyle ) { + case 1: + TAIL PRINTF(OUT, "intvalm(%.16e,%.16e)", + (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5, + (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5); + break; + case 0: + default: + TAIL PRINTF(OUT, "<%.16e,%.16e>", + (SUP((IntervalDouble)q)+INF((IntervalDouble)q))*0.5, + (SUP((IntervalDouble)q)-INF((IntervalDouble)q))*0.5); + break; + } break; case PRINTF_G: default: - TAIL PRINTF(OUT, "[%g,%g]",INF((IntervalDouble)q),SUP((IntervalDouble)q)); + switch ( outputstyle ) { + case 1: + TAIL PRINTF(OUT, "intval(%g,%g)", + INF((IntervalDouble)q),SUP((IntervalDouble)q)); + break; + case 0: + default: + TAIL PRINTF(OUT, "[%g,%g]", + INF((IntervalDouble)q),SUP((IntervalDouble)q)); + break; + } break; } break; @@ -619,11 +779,24 @@ VECT vect; int i; pointer *ptr; - PUTS("[ "); - for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) { - PRINTEXPR(vl,ptr[i]); PUTS(" "); + switch ( outputstyle ) { + case 1: + PUTS("vect("); + for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) { + if ( i != 0 ) PUTS(","); + PRINTEXPR(vl,ptr[i]); + } + PUTS(")"); + break; + case 0: + default: + PUTS("[ "); + for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) { + PRINTEXPR(vl,ptr[i]); PUTS(" "); + } + PUTS("]"); + break; } - PUTS("]"); } void PRINTMAT(vl,mat) @@ -633,14 +806,32 @@ MAT mat; int i,j,r,c; pointer *ptr; - for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) { - PUTS("[ "); - for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) { - PRINTEXPR(vl,ptr[j]); PUTS(" "); - } - PUTS("]"); - if ( i < r - 1 ) - PUTS("\n"); + switch ( outputstyle ) { + case 1: + PUTS("mat(\n"); + for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) { + if ( i != 0 ) PUTS(",\n"); + PUTS("[ "); + for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) { + if ( j != 0 ) PUTS(","); + PRINTEXPR(vl,ptr[j]); + } + PUTS(" ]"); + } + PUTS(")"); + break; + case 0: + default: + for ( i = 0, r = mat->row, c = mat->col; i < r; i++ ) { + PUTS("[ "); + for ( j = 0, ptr = BDY(mat)[i]; j < c; j++ ) { + PRINTEXPR(vl,ptr[j]); PUTS(" "); + } + PUTS("]"); + if ( i < r - 1 ) + PUTS("\n"); + } + break; } } @@ -782,9 +973,11 @@ QUOTE quote; { LIST list; - if ( print_quote ) { + if ( print_quote == 1 ) { fnodetotree(BDY(quote),&list); PRINTEXPR(vl,(Obj)list); + } else if ( print_quote == 2 ) { + PRINTFNODE(BDY(quote),0); } else { PUTS("<...quoted...>"); } @@ -1011,4 +1204,156 @@ unsigned int i; } else { TAIL PRINTF(OUT,"@_%d",IFTOF(i)); } +} + +void PRINTSYMBOL(SYMBOL sym) +{ + PUTS(sym->name); +} + +void PRINTRANGE(VL vl,RANGE p) +{ + PUTS("range("); + PRINTEXPR(vl,p->start); + PUTS(","); + PRINTEXPR(vl,p->end); + PUTS(")"); +} + +void PRINTTB(VL vl,TB p) +{ + int i; + + for ( i = 0; i < p->next; i++ ) { + PUTS(p->body[i]); + } +} + +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: 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("printfnode : not implemented yet"); + GETPVNAME(FA0(f),opname); + PUTS(opname); + break; + default: error("printfnode : not implemented yet"); + } + if ( paren ) PUTS(")"); }