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

Diff for /OpenXM_contrib2/asir2000/builtin/var.c between version 1.1 and 1.10

version 1.1, 1999/12/03 07:39:07 version 1.10, 2018/03/29 01:32:50
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/asir99/builtin/var.c,v 1.1.1.1 1999/11/10 08:12:26 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/builtin/var.c,v 1.9 2018/03/27 06:29:19 noro Exp $
   */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
   
 void Pvar(), Pvars(), Puc(), Pvars_recursive();  void Pvar(), Pvars(), Puc(), Pvars_recursive(),Psimple_is_eq();
 void get_vars(Obj,VL *);  void Pdelete_uc();
 void get_vars_recursive(Obj,VL *);  
   
 struct ftab var_tab[] = {  struct ftab var_tab[] = {
         {"var",Pvar,1},    {"var",Pvar,1},
         {"vars",Pvars,1},    {"vars",Pvars,1},
         {"vars_recursive",Pvars_recursive,1},    {"vars_recursive",Pvars_recursive,1},
         {"uc",Puc,0},    {"uc",Puc,0},
         {0,0,0},    {"delete_uc",Pdelete_uc,-1},
     {"simple_is_eq",Psimple_is_eq,2},
     {0,0,0},
 };  };
   
 void Pvar(arg,rp)  void Psimple_is_eq(NODE arg,Q *rp)
 NODE arg;  
 Obj *rp;  
 {  {
         Obj t;    int ret;
         P p;  
         V vn,vd,v;  
         VL vl;  
   
         if ( !(t = (Obj)ARG0(arg)) )    ret = is_eq(ARG0(arg),ARG1(arg));
                 v = 0;    STOQ(ret,*rp);
         else  
                 switch ( OID(t) ) {  
                         case O_P:  
                                 v = VR((P)t); break;  
                         case O_R:  
                                 vn = VR(NM((R)t)); vd = VR(DN((R)t));  
                                 for ( vl = CO; (vl->v != vn) && (vl->v != vd); vl = NEXT(vl) );  
                                 v = vl->v; break;  
                         default:  
                                 v = 0; break;  
                 }  
         if ( v ) {  
                 MKV(v,p); *rp = (Obj)p;  
         } else  
                 *rp = 0;  
 }  }
   
 void Pvars(arg,rp)  int is_eq(Obj a0,Obj a1)
 NODE arg;  
 LIST *rp;  
 {  {
         VL vl;    P p0,p1;
         NODE n,n0;    DCP dc0,dc1;
         P p;  
   
         get_vars((Obj)ARG0(arg),&vl);    if ( !a0 ) return a1?0:1;
         for ( n0 = 0; vl; vl = NEXT(vl) ) {    else if ( !a1 ) return 0;
                 NEXTNODE(n0,n); MKV(vl->v,p); BDY(n) = (pointer)p;    else if ( OID(a0) != OID(a1) ) return 0;
         }    else {
         if ( n0 )      switch ( OID(a0) ) {
                 NEXT(n) = 0;        case O_P:
         MKLIST(*rp,n0);          p0 = (P)a0; p1 = (P)a1;
           if ( VR(p0) == VR(p1) ) {
             for ( dc0 = DC(p0), dc1 = DC(p1); dc0 && dc1; dc0 = NEXT(dc0), dc1 = NEXT(dc1) ) {
               if ( cmpq(DEG(dc0),DEG(dc1)) ) return 0;
               if ( !is_eq((Obj)COEF(dc0),(Obj)COEF(dc1)) ) return 0;
             }
             return (dc0||dc1)?0:1;
           } else return 0;
           break;
         default:
           return !arf_comp(CO,a0,a1);
           break;
       }
     }
 }  }
   
 void Pvars_recursive(arg,rp)  void Pvar(NODE arg,Obj *rp)
 NODE arg;  
 LIST *rp;  
 {  {
         VL vl;    Obj t;
         NODE n,n0;    P p;
         P p;    V vn,vd,v;
     VL vl;
   
         get_vars_recursive((Obj)ARG0(arg),&vl);    if ( !(t = (Obj)ARG0(arg)) )
         for ( n0 = 0; vl; vl = NEXT(vl) ) {      v = 0;
                 NEXTNODE(n0,n); MKV(vl->v,p); BDY(n) = (pointer)p;    else
         }      switch ( OID(t) ) {
         if ( n0 )        case O_P:
                 NEXT(n) = 0;          v = VR((P)t); break;
         MKLIST(*rp,n0);        case O_R:
           vn = VR(NM((R)t)); vd = VR(DN((R)t));
           for ( vl = CO; (vl->v != vn) && (vl->v != vd); vl = NEXT(vl) );
           v = vl->v; break;
         default:
           v = 0; break;
       }
     if ( v ) {
       MKV(v,p); *rp = (Obj)p;
     } else
       *rp = 0;
 }  }
   
 void get_vars_recursive(obj,vlp)  void Pvars(NODE arg,LIST *rp)
 Obj obj;  
 VL *vlp;  
 {  {
         VL vl,vl0,vl1,vl2,t;    VL vl;
         PFINS ins;    NODE n,n0;
         int argc,i;    P p;
         PFAD ad;  
   
         get_vars(obj,&vl);    get_vars((Obj)ARG0(arg),&vl);
         vl0 = 0;    for ( n0 = 0; vl; vl = NEXT(vl) ) {
         for ( t = vl; t; t = NEXT(t) )      NEXTNODE(n0,n); MKV(vl->v,p); BDY(n) = (pointer)p;
                 if ( t->v->attr == (pointer)V_PF ) {    }
                         ins = (PFINS)t->v->priv;    if ( n0 )
                         argc = ins->pf->argc;      NEXT(n) = 0;
                         ad = ins->ad;    MKLIST(*rp,n0);
                         for ( i = 0; i < argc; i++ ) {  
                                 get_vars_recursive(ad[i].arg,&vl1);  
                                 mergev(CO,vl0,vl1,&vl2); vl0 = vl2;  
                         }  
                 }  
         mergev(CO,vl,vl0,vlp);  
 }  }
   
 void get_vars(t,vlp)  void Pvars_recursive(NODE arg,LIST *rp)
 Obj t;  
 VL *vlp;  
 {  {
         pointer *vb;    VL vl;
         pointer **mb;    NODE n,n0;
         VL vl,vl1,vl2;    P p;
         NODE n;  
         MP mp;  
         int i,j,row,col,len;  
   
         if ( !t )    get_vars_recursive((Obj)ARG0(arg),&vl);
                 vl = 0;    for ( n0 = 0; vl; vl = NEXT(vl) ) {
         else      NEXTNODE(n0,n); MKV(vl->v,p); BDY(n) = (pointer)p;
                 switch ( OID(t) ) {    }
                         case O_P: case O_R:    if ( n0 )
                                 clctvr(CO,t,&vl); break;      NEXT(n) = 0;
                         case O_VECT:    MKLIST(*rp,n0);
                                 len = ((VECT)t)->len; vb = BDY((VECT)t);  
                                 for ( i = 0, vl = 0; i < len; i++ ) {  
                                         get_vars((Obj)vb[i],&vl1); mergev(CO,vl,vl1,&vl2);  
                                         vl = vl2;  
                                 }  
                                 break;  
                         case O_MAT:  
                                 row = ((MAT)t)->row; col = ((MAT)t)->col; mb = BDY((MAT)t);  
                                 for ( i = 0, vl = 0; i < row; i++ )  
                                         for ( j = 0; j < col; j++ ) {  
                                                 get_vars((Obj)mb[i][j],&vl1); mergev(CO,vl,vl1,&vl2);  
                                                 vl = vl2;  
                                         }  
                                 break;  
                         case O_LIST:  
                                 n = BDY((LIST)t);  
                                 for ( vl = 0; n; n = NEXT(n) ) {  
                                         get_vars((Obj)BDY(n),&vl1); mergev(CO,vl,vl1,&vl2);  
                                         vl = vl2;  
                                 }  
                                 break;  
                         case O_DP:  
                                 mp = ((DP)t)->body;  
                                 for ( vl = 0; mp; mp = NEXT(mp) ) {  
                                         get_vars((Obj)mp->c,&vl1); mergev(CO,vl,vl1,&vl2);  
                                         vl = vl2;  
                                 }  
                                 break;  
                         default:  
                                 vl = 0; break;  
                 }  
         *vlp = vl;  
 }  }
   
 void Puc(p)  void get_vars_recursive(Obj obj,VL *vlp)
 Obj *p;  
 {  {
         VL vl;    VL vl,vl0,vl1,vl2,t;
         V v;    PFINS ins;
         P t;    int argc,i;
         char buf[BUFSIZ];    PFAD ad;
         static int UCN;  
   
         NEWV(v); v->attr = (pointer)V_UC;    get_vars(obj,&vl);
         sprintf(buf,"_%d",UCN++);    vl0 = 0;
         NAME(v) = (char *)CALLOC(strlen(buf)+1,sizeof(char));    for ( t = vl; t; t = NEXT(t) )
         strcpy(NAME(v),buf);      if ( t->v->attr == (pointer)V_PF ) {
         for ( vl = CO; NEXT(vl); vl = NEXT(vl) );        ins = (PFINS)t->v->priv;
         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;        argc = ins->pf->argc;
         MKV(v,t); *p = (Obj)t;        ad = ins->ad;
         for ( i = 0; i < argc; i++ ) {
           get_vars_recursive(ad[i].arg,&vl1);
           mergev(CO,vl0,vl1,&vl2); vl0 = vl2;
         }
       }
     mergev(CO,vl,vl0,vlp);
   }
   
   void get_vars(Obj t,VL *vlp)
   {
     pointer *vb;
     pointer **mb;
     VL vl,vl1,vl2;
     NODE n;
     MP mp;
     int i,j,row,col,len;
   
     if ( !t )
       vl = 0;
     else
       switch ( OID(t) ) {
         case O_P: case O_R:
           clctvr(CO,t,&vl); break;
         case O_VECT:
           len = ((VECT)t)->len; vb = BDY((VECT)t);
           for ( i = 0, vl = 0; i < len; i++ ) {
             get_vars((Obj)vb[i],&vl1); mergev(CO,vl,vl1,&vl2);
             vl = vl2;
           }
           break;
         case O_MAT:
           row = ((MAT)t)->row; col = ((MAT)t)->col; mb = BDY((MAT)t);
           for ( i = 0, vl = 0; i < row; i++ )
             for ( j = 0; j < col; j++ ) {
               get_vars((Obj)mb[i][j],&vl1); mergev(CO,vl,vl1,&vl2);
               vl = vl2;
             }
           break;
         case O_LIST:
           n = BDY((LIST)t);
           for ( vl = 0; n; n = NEXT(n) ) {
             get_vars((Obj)BDY(n),&vl1); mergev(CO,vl,vl1,&vl2);
             vl = vl2;
           }
           break;
         case O_DP:
           mp = ((DP)t)->body;
           for ( vl = 0; mp; mp = NEXT(mp) ) {
             get_vars((Obj)mp->c,&vl1); mergev(CO,vl,vl1,&vl2);
             vl = vl2;
           }
           break;
         case O_NBP:
           n = BDY((NBP)t);
           for ( vl = 0; n; n = NEXT(n) ) {
             get_vars((Obj)(((NBM)BDY(n))->c),&vl1);
             mergev(CO,vl,vl1,&vl2);
             vl = vl2;
           }
           break;
         default:
           vl = 0; break;
       }
     *vlp = vl;
   }
   
   void Puc(Obj *p)
   {
     VL vl;
     V v;
     P t;
     char buf[BUFSIZ];
     char *n,*nv;
     static int UCN;
   
     NEWV(v); v->attr = (pointer)V_UC;
     sprintf(buf,"_%d",UCN++);
     nv = NAME(v) = (char *)CALLOC(strlen(buf)+1,sizeof(char));
     strcpy(NAME(v),buf);
     for ( vl = CO; vl; vl = NEXT(vl) )
       if ( (n=NAME(VR(vl))) && !strcmp(n,nv) ) break;
       else if ( !NEXT(vl) ) {
         NEWVL(NEXT(vl)); VR(NEXT(vl)) = v; NEXT(NEXT(vl)) = 0;
         LASTCO = NEXT(vl);
         break;
       }
     MKV(v,t); *p = (Obj)t;
   }
   
   void Pdelete_uc(NODE arg,Obj *p)
   {
     VL vl,prev;
     V v;
   
     if ( argc(arg) == 1 ) {
       asir_assert(ARG0(arg),O_P,"delete_uc");
       v = VR((P)ARG0(arg));
     } else
       v = 0;
   
     for ( prev = 0, vl = CO; vl; vl = NEXT(vl) ) {
       if ( (!v || v == vl->v) && vl->v->attr == (pointer)V_UC ) {
         if ( prev == 0 )
           CO = NEXT(vl);
         else
           NEXT(prev) = NEXT(vl);
       } else
         prev = vl;
     }
     update_LASTCO();
     *p = 0;
 }  }

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

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