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

Diff for /OpenXM_contrib2/asir2000/io/spexpr.c between version 1.1.1.1 and 1.34

version 1.1.1.1, 1999/12/03 07:39:11 version 1.34, 2004/07/13 07:59:54
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/asir99/io/spexpr.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/spexpr.c,v 1.33 2004/05/14 06:02:54 noro Exp $
   */
 #include "ca.h"  #include "ca.h"
   #include "al.h"
 #include "parse.h"  #include "parse.h"
 #include "comp.h"  #include "comp.h"
 #include "base.h"  #include "base.h"
Line 8 
Line 56 
 #define SPRINT  #define SPRINT
 #endif  #endif
   
 #ifdef FPRINT  #if defined(PARI)
 FILE *asir_out;  #include "genpari.h"
 #define OUT asir_out  
 char DFORMAT[BUFSIZ];  
   
 #define TAIL  
 #define PUTS(s) fputs(s,OUT)  
 #define PRINTF fprintf  
 #define PRINTN printn  
 #define PRINTBF printbf  
 #define PRINTCPLX printcplx  
 #define PRINTV printv  
 #define PRINTEXPR printexpr  
 #define PRINTNUM printnum  
 #define PRINTP printp  
 #define PRINTR printr  
 #define PRINTLIST printlist  
 #define PRINTVECT printvect  
 #define PRINTMAT printmat  
 #define PRINTSTR printstr  
 #define PRINTCOMP printcomp  
 #define PRINTDP printdp  
 #endif  #endif
   
 #ifdef SPRINT  extern int outputstyle;
   
 static char *buf;  static char *buf;
 #define OUT buf  #define OUT buf
 extern char DFORMAT[BUFSIZ];  extern char DFORMAT[BUFSIZ];
   extern int hex_output;
   extern int fortran_output;
   extern int double_output;
   extern int real_digit;
   extern int real_binary;
   extern int print_quote;
   extern int printmode;
   extern int hideargs;
   
 #define TAIL while ( *OUT ) OUT++;  #define TAIL while ( *OUT ) OUT++;
 #define PUTS(s) strcat(OUT,s)  #define PUTS(s) strcat(OUT,s)
Line 43  extern char DFORMAT[BUFSIZ];
Line 80  extern char DFORMAT[BUFSIZ];
 #define PRINTN sprintn  #define PRINTN sprintn
 #define PRINTBF sprintbf  #define PRINTBF sprintbf
 #define PRINTCPLX sprintcplx  #define PRINTCPLX sprintcplx
   #define PRINTLM sprintlm
   #define PRINTUP2 sprintup2
 #define PRINTV sprintv  #define PRINTV sprintv
 #define PRINTEXPR sprintexpr  #define PRINTEXPR sprintexpr
 #define PRINTNUM sprintnum  #define PRINTNUM sprintnum
 #define PRINTP sprintp  #define PRINTP asir_sprintp
 #define PRINTR sprintr  #define PRINTR sprintr
 #define PRINTLIST sprintlist  #define PRINTLIST sprintlist
 #define PRINTVECT sprintvect  #define PRINTVECT sprintvect
Line 54  extern char DFORMAT[BUFSIZ];
Line 93  extern char DFORMAT[BUFSIZ];
 #define PRINTSTR sprintstr  #define PRINTSTR sprintstr
 #define PRINTCOMP sprintcomp  #define PRINTCOMP sprintcomp
 #define PRINTDP sprintdp  #define PRINTDP sprintdp
 #endif  #define PRINTUI sprintui
   #define PRINTGF2MAT sprintgf2mat
   #define PRINTGFMMAT sprintgfmmat
   #define PRINTBYTEARRAY sprintbytearray
   #define PRINTQUOTE sprintquote
   #define PRINTQUOTEARG sprintquotearg
   #define PRINTERR sprinterr
   #define PRINTLF sprintlf
   #define PRINTLOP sprintlop
   #define PRINTFOP sprintfop
   #define PRINTEOP sprinteop
   #define PRINTQOP sprintqop
   #define PRINTUP sprintup
   #define PRINTUM sprintum
   #define PRINTSF sprintsf
   #define PRINTSYMBOL sprintsymbol
   #define PRINTRANGE sprintrange
   #define PRINTTB sprinttb
   #define PRINTDPV sprintdpv
   #define PRINTFNODE sprintfnode
   #define PRINTFNODENODE sprintfnodenode
   #define PRINTFARGS sprintfargs
   
 #if defined(THINK_C)  #include "pexpr_body.c"
 void PRINTEXPR(VL,Obj);  
 void PRINTNUM(Num);  
 void PRINTN(N);  
 void PRINTV(VL,V);  
 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 PRINTN();  
 void PRINTV();  
 void PRINTP();  
 void PRINTR();  
 void PRINTLIST();  
 void PRINTVECT();  
 void PRINTMAT();  
 void PRINTSTR();  
 void PRINTCOMP();  
 void PRINTDP();  
 void PRINTCPLX();  
 #endif  
   
 #ifdef FPRINT  /* special functions for string output */
 void output_init() {  
         OUT = stdout;  
         sprintf(DFORMAT,"%%0%dd",DLENGTH);  
 }  
   
 int mmono(p)  
 P p;  
 {  
         if ( NUM(p) )  
                 if ( compnum(CO,(Num)p,0) < 0 )  
                         return ( 1 );  
                 else  
                         return ( 0 );  
         else if ( NEXT(DC(p)) )  
                 return ( 0 );  
         else  
                 return (mmono(COEF(DC(p))));  
 }  
   
 #if PARI  
 printbf(a)  
 BF a;  
 {  
         sor(a->body,'g',-1,0);  
 }  
 #endif  
 #endif  
   
 #ifdef SPRINT  
 void soutput_init(s)  void soutput_init(s)
 char *s;  char *s;
 {  {
         s[0] = 0; buf = s;          s[0] = 0; buf = s;
 }  }
   
 #if PARI  #if defined(PARI)
 void sprintbf(a)  void myoutbrute(g)
 BF a;  GEN g;
 {  {
         char *str;  # if PARI_VERSION_CODE > 131588
         char *GENtostr();          brute(g, 'f', -1);
   # else
         str = GENtostr(a->body);          bruteall(g,'f',-1,1);
         TAIL PRINTF(OUT,"%s",str);  # endif
         free(str);  
 }  }
 #endif  
 #endif  
   
 void PRINTEXPR(vl,p)  void sprintbf(BF a)
 VL vl;  
 Obj p;  
 {  {
         if ( !p ) {          char *str;
                 PRINTR(vl,(R)p);          char *GENtostr0();
                 return;  
         }  
   
         switch ( OID(p) ) {          if ( double_output ) {
                 case O_N:                  str = GENtostr0(a->body,myoutbrute);
                         PRINTNUM((Num)p); break;          } else {
                 case O_P:                  str = GENtostr(a->body);
                         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;  
                 default:  
                         break;  
         }          }
           TAIL PRINTF(OUT,"%s",str);
           free(str);
 }  }
   
 void PRINTN(n)  
 N n;  
 {  
         register int i,*ptr;  
         N tn;  
   
         if ( !n ) {  
                 PUTS("0");  
                 return;  
         }  
         ntobn(DBASE,n,&tn);  
         ptr = BD(tn);  
         TAIL PRINTF(OUT,"%d",ptr[PL(tn) - 1]);  
         for ( i = PL(tn) - 2; i >= 0; i-- ) {  
                 TAIL PRINTF(OUT,DFORMAT,ptr[i]);  
         }  
 }  
   
 void PRINTNUM(q)  
 Num q;  
 {  
         if ( !q ) {  
                 PUTS("0");  
                 return;  
         }  
         switch ( NID(q) ) {  
                 case N_Q:  
                         if ( SGN((Q)q) == -1 )  
                                 PUTS("-");  
                         PRINTN(NM((Q)q));  
                         if ( !INT((Q)q) ) {  
                                 PUTS("/"); PRINTN(DN((Q)q));  
                         }  
                         break;  
                 case N_R:  
                         TAIL PRINTF(OUT,"%g",BDY((Real)q));  
                         break;  
                 case N_A:  
                         PUTS("("); PRINTR(ALG,(R)BDY((Alg)q)); PUTS(")");  
                         break;  
 #if PARI  
                 case N_B:  
                         PRINTBF((BF)q); break;  
 #endif  #endif
                 case N_C:  
                         PRINTCPLX((C)q); break;  
                 case N_M:  
                         TAIL PRINTF(OUT,"%d",CONT((MQ)q));  
                         break;  
         }  
 }  
   
 void PRINTCPLX(a)  
 C a;  
 {  
         PUTS("(");  
         if ( a->r )  
                 PRINTNUM(a->r);  
         if ( a->i ) {  
                 if ( a->r && (compnum(0,a->i,0) > 0) )  
                         PUTS("+");  
                 PRINTNUM(a->i); PUTS("*@i");  
         }  
         PUTS(")");  
 }  
   
 void PRINTP(vl,p)  
 VL vl;  
 P p;  
 {  
         V v;  
         DCP dc;  
   
         if ( !p )  
                 PUTS("0");  
         else if ( NUM(p) )  
                 PRINTNUM((Num)p);  
         else  
                 for ( dc = DC(p), v = VR(p); dc; dc = NEXT(dc) ) {  
                         if ( !DEG(dc) )  
                                 PRINTP(vl,COEF(dc));  
                         else {  
                                 if ( NUM(COEF(dc)) && UNIQ((Q)COEF(dc)) ) {  
                                         ;  
                                 } else if ( NUM(COEF(dc)) && MUNIQ((Q)COEF(dc)) )  
                                         PUTS("-");  
                                 else if ( NUM(COEF(dc)) || !NEXT(DC(COEF(dc)))) {  
                                         PRINTP(vl,COEF(dc)); PUTS("*");  
                                 } else {  
                                         PUTS("("); PRINTP(vl,COEF(dc)); PUTS(")*");  
                                 }  
                                 PRINTV(vl,v);  
                                 if ( cmpq(DEG(dc),ONE) ) {  
                                         PUTS("^");  
                                         if ( INT(DEG(dc)) && SGN(DEG(dc))>0 )  
                                                 PRINTNUM((Num)DEG(dc));  
                                         else {  
                                                 PUTS("("); PRINTNUM((Num)DEG(dc)); PUTS(")");  
                                         }  
                                 }  
                         }  
                         if ( NEXT(dc) ) {  
                                 P t;  
   
                                 t = COEF(NEXT(dc));  
                                 if (!DEG(NEXT(dc))) {  
                                         if ( NUM(t) ) {  
                                                 if ( !mmono(t) )  
                                                         PUTS("+");  
                                         } else {  
                                                 if (!mmono(COEF(DC(t))))  
                                                         PUTS("+");  
                                         }  
                                 } else {  
                                         if ( !mmono(t) )  
                                                 PUTS("+");  
                                 }  
                         }  
                 }  
 }  
   
 void PRINTV(vl,v)  
 VL vl;  
 V v;  
 {  
         PF pf;  
         PFAD ad;  
         int i;  
   
         if ( NAME(v) )  
                 PUTS(NAME(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(")^(");  
                         PRINTR(vl,(R)ad[1].arg); PUTS(")");  
                 } else if ( !pf->argc ) {  
                         TAIL PRINTF(OUT,"%s",NAME(pf));  
                 } else {  
                         for ( i = 0; i < pf->argc; i++ )  
                                 if ( ad[i].d )  
                                         break;  
                         if ( i < pf->argc ) {  
                                 TAIL PRINTF(OUT,"%s(%d",NAME(pf),ad[0].d);  
                                 for ( i = 1; i < pf->argc; i++ ) {  
                                         TAIL PRINTF(OUT,",%d",ad[i].d);  
                                 }  
                                 PUTS(")(");  
                         } else {  
                                 TAIL PRINTF(OUT,"%s(",NAME(pf));  
                         }  
                         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)  
 VL vl;  
 R a;  
 {  
         if ( !a )  
                 PUTS("0");  
         else  
                 switch (OID(a)) {  
                         case O_N: case O_P:  
                                 PRINTP(vl,(P)a); break;  
                         default:  
                                 PUTS("("); PRINTP(vl,NM((R)a)); PUTS(")/("); PRINTP(vl,DN((R)a)); PUTS(")");  
                                 break;  
                 }  
 }  
   
 void PRINTVECT(vl,vect)  
 VL vl;  
 VECT vect;  
 {  
         int i;  
         pointer *ptr;  
   
         PUTS("[ ");  
         for ( i = 0, ptr = BDY(vect); i < vect->len; i++ ) {  
                 PRINTEXPR(vl,ptr[i]); PUTS(" ");  
         }  
         PUTS("]");  
 }  
   
 void PRINTMAT(vl,mat)  
 VL vl;  
 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");  
         }  
 }  
   
 void PRINTLIST(vl,list)  
 VL vl;  
 LIST list;  
 {  
         NODE tnode;  
   
         PUTS("[");  
         for ( tnode = (NODE)list->body; tnode; tnode = NEXT(tnode) ) {  
                 PRINTEXPR(vl,tnode->body);  
                 if ( NEXT(tnode) )  
                         PUTS(",");  
         }  
         PUTS("]");  
 }  
   
 void PRINTSTR(str)  
 STRING str;  
 {  
         char *p;  
   
         for ( p = BDY(str); *p; p++ )  
                 if ( *p == '"' )  
                         PUTS("\"");  
                 else {  
                         TAIL PRINTF(OUT,"%c",*p);  
                 }  
 }  
   
 void PRINTCOMP(vl,c)  
 VL vl;  
 COMP c;  
 {  
         int n,i;  
   
         n = getcompsize((int)c->type);  
         PUTS("{");  
         for ( i = 0; i < n; i++ ) {  
                 PRINTEXPR(vl,(pointer)c->member[i]);  
                 if ( i < n-1 )  
                         PUTS(",");  
         }  
         PUTS("}");  
 }  
   
 void PRINTDP(vl,d)  
 VL vl;  
 DP d;  
 {  
         int n,i;  
         MP m;  
         DL dl;  
   
         for ( n = d->nv, m = BDY(d); m; m = NEXT(m) ) {  
                 PUTS("("); PRINTEXPR(vl,(pointer)m->c); PUTS(")*<<");  
                 for ( i = 0, dl = m->dl; i < n-1; i++ ) {  
                         TAIL PRINTF(OUT,"%d,",dl->d[i]);  
                 }  
                 TAIL PRINTF(OUT,"%d",dl->d[i]);  
                 PUTS(">>");  
                 if ( NEXT(m) )  
                         PUTS("+");  
         }  
 }  

Legend:
Removed from v.1.1.1.1  
changed lines
  Added in v.1.34

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