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

Diff for /OpenXM_contrib2/asir2000/parse/quote.c between version 1.2 and 1.27

version 1.2, 2001/09/04 02:45:33 version 1.27, 2018/03/29 01:32:54
Line 1 
Line 1 
   /* $OpenXM: OpenXM_contrib2/asir2000/parse/quote.c,v 1.26 2005/12/10 14:14:16 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
   
 void addquote(vl,a,b,c)  void addquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 VL vl;  
 QUOTE a,b;  
 QUOTE *c;  
 {  {
         FNODE fn;    FNODE fn;
     QUOTE t;
   
         fn = mkfnode(3,I_BOP,addfs,BDY(a),BDY(b));    objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         MKQUOTE(*c,fn);    fn = mkfnode(3,I_BOP,addfs,BDY(a),BDY(b));
     MKQUOTE(*c,fn);
 }  }
   
 void subquote(vl,a,b,c)  void subquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 VL vl;  
 QUOTE a,b;  
 QUOTE *c;  
 {  {
         FNODE fn;    FNODE fn;
     QUOTE t;
   
         fn = mkfnode(3,I_BOP,subfs,BDY(a),BDY(b));    objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         MKQUOTE(*c,fn);    fn = mkfnode(3,I_BOP,subfs,BDY(a),BDY(b));
     MKQUOTE(*c,fn);
 }  }
   
 void mulquote(vl,a,b,c)  void mulquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 VL vl;  
 QUOTE a,b;  
 QUOTE *c;  
 {  {
         FNODE fn;    FNODE fn;
     QUOTE t;
   
         fn = mkfnode(3,I_BOP,mulfs,BDY(a),BDY(b));    objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         MKQUOTE(*c,fn);    fn = mkfnode(3,I_BOP,mulfs,BDY(a),BDY(b));
     MKQUOTE(*c,fn);
 }  }
   
 void divquote(vl,a,b,c)  void divquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 VL vl;  
 QUOTE a,b;  
 QUOTE *c;  
 {  {
         FNODE fn;    FNODE fn;
     QUOTE t;
   
         fn = mkfnode(3,I_BOP,divfs,BDY(a),BDY(b));    objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
         MKQUOTE(*c,fn);    fn = mkfnode(3,I_BOP,divfs,BDY(a),BDY(b));
     MKQUOTE(*c,fn);
 }  }
   
 void pwrquote(vl,a,b,c)  void pwrquote(VL vl,QUOTE a,QUOTE b,QUOTE *c)
 VL vl;  
 QUOTE a,b;  
 QUOTE *c;  
 {  {
         FNODE fn;    FNODE fn;
     QUOTE t;
   
         if ( !b || OID(b) != O_QUOTE )    objtoquote((Obj)a,&t); a = t; objtoquote((Obj)b,&t); b = t;
                 error("pwrquote : invalid argument");    fn = mkfnode(3,I_BOP,pwrfs,BDY(a),BDY(b));
         fn = mkfnode(3,I_BOP,pwrfs,BDY(a),BDY(b));    MKQUOTE(*c,fn);
         MKQUOTE(*c,fn);  
 }  }
   
 void chsgnquote(a,c)  void chsgnquote(QUOTE a,QUOTE *c)
 QUOTE a;  
 QUOTE *c;  
 {  {
         FNODE fn;    FNODE fn;
     QUOTE t;
   
         fn = mkfnode(3,I_BOP,subfs,0,BDY(a));    objtoquote((Obj)a,&t); a = t;
         MKQUOTE(*c,fn);    fn = mkfnode(1,I_MINUS,BDY(a));
     MKQUOTE(*c,fn);
 }  }
   
 void polytoquote(), dctoquote(), vartoquote();  void objtoquote(Obj a,QUOTE *c)
   {
     QUOTE nm,dn;
     NODE arg,t0,t,t1,t2,t3;
     FNODE fn;
     Obj obj;
     Obj *b;
     Obj **m;
     int i,j,len,row,col;
     Q q,qrow,qcol;
     FUNC f;
   
 void objtoquote(a,c)    if ( !a ) {
 Obj a;      MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
 QUOTE *c;      return;
     }
     switch ( OID(a) ) {
       case O_N:
         if ( negative_number((Num)a) ) {
           arf_chsgn(a,&obj);
           MKQUOTE(*c,mkfnode(1,I_MINUS,
             mkfnode(1,I_FORMULA,(pointer)obj)));
         } else {
           MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
         }
         break;
       case O_STR:
         MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
         break;
       case O_P:
         polytoquote((P)a,c);
         break;
       case O_R:
         polytoquote(NM((R)a),&nm);
         polytoquote(DN((R)a),&dn);
         divquote(CO,nm,dn,c);
         break;
       case O_LIST:
         t0 = 0;
         for ( arg = BDY((LIST)a); arg; arg = NEXT(arg) ) {
           NEXTNODE(t0,t);
           objtoquote(BDY(arg),&nm);
           BDY(t) = BDY(nm);
         }
         if ( t0 )
           NEXT(t) = 0;
         MKQUOTE(*c,mkfnode(1,I_LIST,t0));
         break;
       case O_VECT:
         len = ((VECT)a)->len;
         b = (Obj *)BDY(((VECT)a));
         t = 0;
         for ( i = len-1; i >= 0; i-- ) {
           objtoquote(b[i],&nm);
           MKNODE(t1,BDY(nm),t);
           t = t1;
         }
         STOQ(len,q);
         t = mknode(2,mkfnode(1,I_FORMULA,q),mkfnode(1,I_LIST,t));
         gen_searchf("vector",&f);
         MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
         break;
       case O_MAT:
         row = ((MAT)a)->row;
         col = ((MAT)a)->row;
         m = (Obj **)BDY(((MAT)a));
         t2 = 0;
         for ( i = row-1; i >= 0; i-- ) {
           t = 0;
           for ( j = col-1; j >= 0; j-- ) {
             objtoquote(m[i][j],&nm);
             MKNODE(t1,BDY(nm),t);
             t = t1;
           }
           fn = mkfnode(1,I_LIST,t);
           MKNODE(t3,fn,t2);
           t2 = t3;
         }
         fn = mkfnode(1,I_LIST,t2);
   
         STOQ(row,qrow);
         STOQ(col,qcol);
         t = mknode(3,
           mkfnode(1,I_FORMULA,qrow),mkfnode(1,I_FORMULA,qcol),fn);
         gen_searchf("matrix",&f);
         MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
         break;
       case O_DP:
         dptoquote((DP)a,c);
         break;
       case O_QUOTE:
         *c = (QUOTE)a;
         break;
       default:
         error("objtoquote : not implemented");
     }
   }
   
   void polytoquote(P a,QUOTE *c)
 {  {
         QUOTE nm,dn;    DCP dc,t;
     DCP *dca;
     int n,i,sgn;
     QUOTE v,r,s,u;
   
         if ( !a ) {    if ( !a ) {
                 MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));      MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                 return;      return;
         }    } else if ( OID(a) == O_N ) {
         switch ( OID(a) ) {      MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                 case O_N:      return;
                         MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));    }
                         break;    vartoquote(VR((P)a),&v);
                 case O_P:    dc = DC((P)a);
                         polytoquote((P)a,c);    dctoquote(dc,v,&r,&sgn);
                         break;    if ( sgn == -1 ) {
                 case O_R:      MKQUOTE(u,mkfnode(1,I_MINUS,BDY(r)));
                         polytoquote(NM((R)a),&nm);      r = u;
                         polytoquote(DN((R)a),&dn);    }
                         divquote(CO,nm,dn,c);    for (dc = NEXT(dc); dc; dc = NEXT(dc) ) {
                         break;      dctoquote(dc,v,&s,&sgn);
                 case O_QUOTE:      if ( sgn == -1 )
                         *c = (QUOTE)a;        subquote(CO,r,s,&u);
                         break;      else
                 default:        addquote(CO,r,s,&u);
                         error("objtoquote : not implemented");      r = u;
         }    }
     *c = r;
 }  }
   
 void polytoquote(a,c)  void dptoquote(DP a,QUOTE *c)
 P a;  
 QUOTE *c;  
 {  {
         DCP dc,t;    MP t;
         DCP *dca;    MP m;
         int n,i;    int i,n,nv,sgn;
         QUOTE v,r,s,u;    QUOTE s,r,u;
   
         if ( !a || (OID(a) == O_N) ) {    if ( !a ) {
                 MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));      MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)a));
                 return;      return;
         }    }
         dc = DC((P)a);    nv = NV(a);
         vartoquote(VR((P)a),&v);    m = BDY(a);
         for ( t = dc, n = 0; t; t = NEXT(t), n++ );    mptoquote(m,nv,&r,&sgn);
         dca = (DCP *)ALLOCA(n*sizeof(DCP));    if ( sgn == -1 ) {
         for ( t = dc, i = 0; t; t = NEXT(t), i++ )      MKQUOTE(u,mkfnode(1,I_MINUS,BDY(r)));
                 dca[i] = t;      r = u;
         dctoquote(dca[n-1],v,&r);    }
         for ( i = n-2; i >= 0; i-- ) {    for ( m = NEXT(m); m; m = NEXT(m) ) {
                 dctoquote(dca[i],v,&s);      mptoquote(m,nv,&s,&sgn);
                 addquote(CO,s,r,&u);      if ( sgn < 0 )
                 r = u;        subquote(CO,r,s,&u);
         }      else
         *c = r;        addquote(CO,r,s,&u);
       r = u;
     }
     *c = r;
 }  }
   
 void dctoquote(dc,v,c)  void dctoquote(DCP dc,QUOTE v,QUOTE *q,int *sgn)
 DCP dc;  
 QUOTE v;  
 QUOTE *c;  
 {  {
         QUOTE r,d,s,u;    QUOTE t,s,u,r;
     P c;
     Q d;
   
         objtoquote(COEF(dc),&r);    if ( mmono(COEF(dc)) ) {
         if ( DEG(dc) ) {      /* -xyz... */
                 objtoquote(DEG(dc),&d);      chsgnp(COEF(dc),&c);
                 pwrquote(CO,v,d,&s);      *sgn = -1;
                 mulquote(CO,r,s,&u);    } else {
                 r = u;      c = COEF(dc);
         }      *sgn = 1;
         *c = r;    }
     d = DEG(dc);
     if ( UNIQ(c) ) {
       if ( d ) {
         if ( UNIQ(d) )
           r = v;
         else {
           objtoquote((Obj)d,&t);
           pwrquote(CO,v,t,&r);
         }
       } else
         objtoquote((Obj)ONE,&r);
     } else {
       objtoquote((Obj)c,&u);
       if ( !NUM(c) && NEXT(DC(c)) && d ) {
         MKQUOTE(t,mkfnode(1,I_PAREN,BDY(u)));
         u = t;
       }
       if ( d ) {
         if ( UNIQ(d) )
           s = v;
         else {
           objtoquote((Obj)d,&t);
           pwrquote(CO,v,t,&s);
         }
         mulquote(CO,u,s,&r);
       } else
         r = u;
     }
     *q = r;
 }  }
   
 void vartoquote(v,c)  void mptoquote(MP m,int n,QUOTE *r,int *sgn)
 V v;  
 QUOTE *c;  
 {  {
         P x;    QUOTE s,u;
         PF pf;    P c;
         PFAD ad;    NODE t,t1;
         QUOTE a,b;    FNODE f;
         int i;    Q q;
         FUNC f;    DL dl;
         NODE t,t1;    int i;
   
         if ( NAME(v) ) {    if ( mmono(C(m)) ) {
                 MKV(v,x);      chsgnp(C(m),&c);
                 MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)x));      *sgn = -1;
         } else if ( (vid)v->attr == V_PF ) {    } else {
                 /* pure function */      c = C(m);
                 pf = ((PFINS)v->priv)->pf;      *sgn = 1;
                 ad = ((PFINS)v->priv)->ad;    }
                 if ( !strcmp(NAME(pf),"pow") ) {    objtoquote((Obj)c,&s);
                         /* pow(a,b) = a^b */    if ( !NUM(c) && NEXT(DC(c)) ) {
                         objtoquote(ad[0].arg,&a); objtoquote(ad[1].arg,&b);      MKQUOTE(u,mkfnode(1,I_PAREN,BDY(s)));
                         pwrquote(CO,a,b,c);      s = u;
                 } else {    }
                         for ( i = 0; i < pf->argc; i++ )    dl = m->dl;
                                 if ( ad[i].d )    for ( i = n-1, t = 0; i >= 0; i-- ) {
                                         break;      STOQ(dl->d[i],q);
                         if ( i < pf->argc )      f = mkfnode(1,I_FORMULA,q);
                                 error("vartoquote : not implemented");      MKNODE(t1,f,t);
                         gen_searchf(NAME(pf),&f);      t = t1;
                         t = 0;    }
                         for ( i = pf->argc-1; i >= 0; i-- ) {    MKQUOTE(u,mkfnode(1,I_EV,t));
                                 objtoquote(ad[i].arg,&a);    if ( UNIQ(c) )
                                 MKNODE(t1,BDY(a),t);      *r = u;
                                 t = t1;    else
                         }      mulquote(CO,s,u,r);
                         MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));  }
                 }  
         }  void vartoquote(V v,QUOTE *c)
   {
     P x;
     PF pf;
     PFAD ad;
     QUOTE a,b,u;
     int i;
     FUNC f;
     NODE t,t1;
   
     if ( NAME(v) ) {
       MKV(v,x);
       MKQUOTE(*c,mkfnode(1,I_FORMULA,(pointer)x));
     } else if ( (vid)v->attr == V_PF ) {
       /* pure function */
       pf = ((PFINS)v->priv)->pf;
       ad = ((PFINS)v->priv)->ad;
       if ( !strcmp(NAME(pf),"pow") ) {
         /* pow(a,b) = a^b */
         objtoquote(ad[0].arg,&a);
         x = (P)ad[0].arg;
         /* check whether x is a variable */
         if ( x && OID(x)==O_P && !NEXT(DC(x))
           && UNIQ(DEG(DC(x))) && UNIQ(COEF(DC(x))) ) {
           /* use a as is */
         } else {
           /* a => (a) */
           MKQUOTE(u,mkfnode(1,I_PAREN,BDY(a))); a = u;
         }
         objtoquote(ad[1].arg,&b);
         pwrquote(CO,a,b,c);
       } else {
         for ( i = 0; i < pf->argc; i++ )
           if ( ad[i].d )
             break;
         if ( i < pf->argc )
           error("vartoquote : not implemented");
         gen_searchf(NAME(pf),&f);
         t = 0;
         for ( i = pf->argc-1; i >= 0; i-- ) {
           objtoquote(ad[i].arg,&a);
           MKNODE(t1,BDY(a),t);
           t = t1;
         }
         MKQUOTE(*c,mkfnode(2,I_FUNC,f,mkfnode(1,I_LIST,t)));
       }
     }
   }
   
   /*
    * A_arf : arithmetic function
    * A_int : machine integer
    * A_fnode : FNODE
    * A_node : NODE with FNODE bodies
    * A_internal : internal object
    * A_str : string
    * A_end : terminal
    * A_func : FUNC
    * A_notimpl : not implemented
    */
   
   struct fid_spec fid_spec_tab[] = {
     {I_BOP,A_arf,A_fnode,A_fnode,A_end},
     {I_COP,A_int,A_fnode,A_fnode,A_end},
     {I_AND,A_fnode,A_fnode,A_end},
     {I_OR,A_fnode,A_fnode,A_end},
     {I_NOT,A_fnode,A_end},
     {I_CE,A_fnode,A_fnode,A_end},
     {I_PRESELF,A_arf,A_fnode,A_end},
     {I_POSTSELF,A_arf,A_fnode,A_end},
     {I_FUNC,A_func,A_fnode,A_end},
     {I_FUNC_OPT,A_func,A_fnode,A_fnode,A_end},
     {I_IFUNC,A_fnode,A_fnode,A_end},
     {I_MAP,A_func,A_fnode,A_end},
     {I_RECMAP,A_func,A_fnode,A_end},
     {I_PFDERIV,A_notimpl,A_end},
     {I_ANS,A_int,A_end},
     {I_PVAR,A_int,A_node,A_end},
     {I_ASSPVAR,A_fnode,A_fnode,A_end},
     {I_FORMULA,A_internal,A_end},
     {I_LIST,A_node,A_end},
     {I_STR,A_str,A_end},
     {I_NEWCOMP,A_int,A_end},
     {I_CAR,A_fnode,A_end},
     {I_CDR,A_fnode,A_end},
     {I_CAST,A_notimpl,A_end},
     {I_INDEX,A_fnode,A_node,A_end},
     {I_EV,A_node,A_end},
     {I_TIMER,A_fnode,A_fnode,A_fnode,A_end},
     {I_GF2NGEN,A_end},
     {I_GFPNGEN,A_end},
     {I_GFSNGEN,A_end},
     {I_LOP,A_int,A_fnode,A_fnode,A_end},
     {I_OPT,A_str,A_fnode,A_end},
     {I_GETOPT,A_str,A_end},
     {I_POINT,A_fnode,A_str,A_end},
     {I_PAREN,A_fnode,A_end},
     {I_MINUS,A_fnode,A_end},
     {I_NARYOP,A_arf,A_node,A_end},
     {I_CONS,A_node,A_fnode,A_end},
     {I_FUNC_QARG,A_func,A_fnode,A_end},
     {I_FUNC_HEAD,A_func,A_end},
   };
   
   #define N_FID_SPEC (sizeof(fid_spec_tab)/sizeof(struct fid_spec))
   
   void get_fid_spec(fid id,fid_spec_p *spec)
   {
     int i;
   
     for ( i = 0; i < N_FID_SPEC; i++ )
       if ( fid_spec_tab[i].id == id ) {
         *spec = &fid_spec_tab[i];
         return;
       }
     *spec = 0;
   }
   
   FNODE strip_paren(FNODE f)
   {
     if ( !f || f->id != I_PAREN ) return f;
     else {
       return strip_paren((FNODE)FA0(f));
     }
   }
   
   NODE flatten_fnodenode(NODE n,char *opname);
   FNODE flatten_fnode(FNODE f,char *opname);
   
   NODE flatten_fnodenode(NODE n,char *opname)
   {
     NODE r0,r,t;
   
     r0 = 0;
     for ( t = n; t; t = NEXT(t) ) {
       NEXTNODE(r0,r);
       BDY(r) = (pointer)flatten_fnode((FNODE)BDY(t),opname);
     }
     if ( r0 ) NEXT(r) = 0;
     return r0;
   }
   
   FNODE flatten_fnode(FNODE f,char *opname)
   {
     fid_spec_p spec;
     farg_type *type;
     fid id;
     FNODE f1,f2,r;
     int i;
   
     if ( !f ) return f;
     id = f->id;
     get_fid_spec(id,&spec);
     /* unknown fid */
     if ( !spec ) return f;
     if ( id == I_BOP && !strcmp(((ARF)FA0(f))->name,opname) ) {
       f1 = (pointer)flatten_fnode(FA1(f),opname);
       f1 = strip_paren(f1);
       f2 = (pointer)flatten_fnode(FA2(f),opname);
       f2 = strip_paren(f2);
       if ( f1->id == I_BOP && !strcmp(((ARF)FA0(f1))->name,opname) ) {
         /* [op [op A B] C] => [op A [op B C]] */
         f2 = flatten_fnode(mkfnode(3,I_BOP,(ARF)FA0(f),FA2(f1),f2),opname);
         return mkfnode(3,I_BOP,(ARF)FA0(f),FA1(f1),f2);
       } else
         return mkfnode(3,I_BOP,(ARF)FA0(f),f1,f2);
     } else {
       type = spec->type;
       for ( i = 0; type[i] != A_end; i++ );
       NEWFNODE(r,i); ID(r) = f->id;
       for ( i = 0; type[i] != A_end; i++ ) {
         if ( type[i] == A_fnode )
           r->arg[i] = (pointer)flatten_fnode(f->arg[i],opname);
         else if ( type[i] == A_node )
           r->arg[i] = (pointer)flatten_fnodenode(f->arg[i],opname);
         else
           r->arg[i] = f->arg[i];
       }
       return r;
     }
   }
   
   /* comparison of QUOTE */
   
   int compquote(VL vl,QUOTE q1,QUOTE q2)
   {
     return compfnode(BDY(q1),BDY(q2));
   }
   
   /* comparison of QUOTEARG */
   /* XXX : executes a non-sense comparison for bodies */
   
   int compqa(VL vl,QUOTEARG q1,QUOTEARG q2)
   {
     if ( !q1 ) return q2?-1:0;
     else if ( !q2 ) return 1;
     else if ( OID(q1) > OID(q2) ) return 1;
     else if ( OID(q1) < OID(q2) ) return -1;
     else if ( q1->type > q2->type ) return 1;
     else if ( q1->type < q2->type ) return -1;
     else switch ( q1->type ) {
       case A_func:
         return strcmp(((FUNC)q1->body)->name,((FUNC)q2->body)->name);
       case A_arf:
         return strcmp(((ARF)q1->body)->name,((ARF)q2->body)->name);
       default:
         if ( (unsigned)q1->body  > (unsigned)q2->body ) return 1;
         else if ( (unsigned)q1->body  < (unsigned)q2->body ) return -1;
         else return 0;
     }
   }
   
   int compfnode(FNODE f1,FNODE f2)
   {
     fid_spec_p spec;
     int t,s1,s2,i;
     NODE n1,n2;
   
     if ( !f1 ) return f2 ? -1 : 1;
     else if ( !f2 ) return 1;
       else if ( f1->id > f2->id ) return 1;
     else if ( f1->id < f2->id ) return -1;
     spec = fid_spec_tab+f1->id;
     for ( i = 0; spec->type[i] != A_end; i++ ) {
       switch ( spec->type[i] ) {
         case A_fnode:
           t = compfnode((FNODE)f1->arg[i],(FNODE)f2->arg[i]);
           if ( t ) return t;
           break;
         case A_int:
           s1 = (int)f1->arg[i];
           s2 = (int)f2->arg[i];
           if ( s1 > s2 ) return 1;
           else if ( s1 < s2 ) return -1;
           break;
         case A_str:
           t = strcmp((char *)f1->arg[i],(char *)f2->arg[i]);
           if ( t ) return t;
           break;
         case A_internal:
           t = arf_comp(CO,(Obj)f1->arg[i],(Obj)f2->arg[i]);
           if ( t ) return t;
           break;
         case A_node:
           n1 = (NODE)f1->arg[i];
           n2 = (NODE)f2->arg[i];
           for ( ; n1 && n2; n1 = NEXT(n1), n2 = NEXT(n2) ) {
             t = compfnode(BDY(n1),BDY(n2));
             if ( t ) return t;
           }
           if ( n1 ) return 1;
           else if ( n2 ) return -1;
           break;
         case A_arf:
            t = strcmp(((ARF)f1->arg[i])->name,((ARF)f2->arg[i])->name);
           if ( t ) return t;
           break;
         case A_func:
            t = strcmp(((FUNC)f1->arg[i])->name,((FUNC)f2->arg[i])->name);
           if ( t ) return t;
           break;
         case A_notimpl:
         default:
           error("compfnode : not implemented");
           break;
       }
     }
     return 0;
 }  }

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.27

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