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

Diff for /OpenXM_contrib2/asir2000/builtin/strobj.c between version 1.50 and 1.56

version 1.50, 2004/07/13 10:57:26 version 1.56, 2005/09/13 06:40:45
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.49 2004/07/13 09:10:38 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/strobj.c,v 1.55 2005/07/26 01:33:46 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 77  void Pquotetotex_tb();
Line 77  void Pquotetotex_tb();
 void Pquotetotex();  void Pquotetotex();
 void Pquotetotex_env();  void Pquotetotex_env();
 void Pflatten_quote();  void Pflatten_quote();
 void Pquote_to_funargs(),Pfunargs_to_quote();  void Pquote_to_funargs(),Pfunargs_to_quote(),Pget_function_name();
   void Pquote_unify();
 void fnodetotex_tb(FNODE f,TB tb);  void fnodetotex_tb(FNODE f,TB tb);
 char *symbol_name(char *name);  char *symbol_name(char *name);
 char *conv_rule(char *name);  char *conv_rule(char *name);
Line 87  void tb_to_string(TB tb,STRING *rp);
Line 88  void tb_to_string(TB tb,STRING *rp);
 void fnodenodetotex_tb(NODE n,TB tb);  void fnodenodetotex_tb(NODE n,TB tb);
 void fargstotex_tb(char *opname,FNODE f,TB tb);  void fargstotex_tb(char *opname,FNODE f,TB tb);
 int top_is_minus(FNODE f);  int top_is_minus(FNODE f);
   int quote_unify(Obj f,Obj pat,NODE *rp);
   
 struct ftab str_tab[] = {  struct ftab str_tab[] = {
         {"sprintf",Psprintf,-99999999},          {"sprintf",Psprintf,-99999999},
Line 107  struct ftab str_tab[] = {
Line 109  struct ftab str_tab[] = {
         {"quotetotex_env",Pquotetotex_env,-99999999},          {"quotetotex_env",Pquotetotex_env,-99999999},
         {"flatten_quote",Pflatten_quote,2},          {"flatten_quote",Pflatten_quote,2},
         {"quote_to_funargs",Pquote_to_funargs,1},          {"quote_to_funargs",Pquote_to_funargs,1},
           {"quote_unify",Pquote_unify,2},
         {"funargs_to_quote",Pfunargs_to_quote,1},          {"funargs_to_quote",Pfunargs_to_quote,1},
           {"get_function_name",Pget_function_name,1},
         {0,0,0},          {0,0,0},
 };  };
   
Line 503  void Pwrite_to_tb(NODE arg,Q *rp)
Line 507  void Pwrite_to_tb(NODE arg,Q *rp)
         *rp = 0;          *rp = 0;
 }  }
   
   void Pquote_unify(NODE arg,LIST *rp)
   {
           NODE r;
           int ret;
   
           ret = quote_unify((Obj)ARG0(arg),(Obj)ARG1(arg),&r);
           if ( ret )
                   MKLIST(*rp,r);
           else
                   *rp = 0;
   }
   
   void do_assign(NODE arg)
   {
           NODE t,pair;
           int pv;
   
           QUOTE value;
   
           for ( t = arg; t; t = NEXT(t) ) {
                   pair = BDY((LIST)BDY(t));
                   pv = (int)FA0((FNODE)BDY((QUOTE)BDY(pair)));
                   value = (QUOTE)(BDY(NEXT(pair)));
                   ASSPV(pv,value);
           }
   }
   
   /*
   /* consistency check and merge
    */
   
   int merge_matching_node(NODE n,NODE a,NODE *rp)
   {
           NODE ta,ba,tn,bn;
           QUOTE pa,va,pn,vn;
   
           if ( !n ) {
                   *rp = a;
                   return 1;
           }
           for ( ta = a; ta; ta = NEXT(ta) ) {
                   ba = BDY((LIST)BDY(ta));
                   if ( !ba ) continue;
                   pa = (QUOTE)BDY(ba); va = (QUOTE)BDY(NEXT(ba));
                   for ( tn = n; tn; tn = NEXT(tn) ) {
                           bn = BDY((LIST)BDY(tn));
                           if ( !bn ) continue;
                           pn = (QUOTE)BDY(bn); vn = (QUOTE)BDY(NEXT(bn));
                           if ( !compquote(CO,pa,pn) ) {
                                   if ( !compquote(CO,va,vn) ) break;
                                   else return 0;
                           }
                   }
                   if ( !tn ) {
                           MKNODE(tn,(pointer)BDY(ta),n);
                           n = tn;
                   }
           }
           *rp = n;
           return 1;
   }
   
   int quote_unify_node(NODE f,NODE pat,NODE *rp) {
           NODE r,a,tf,tp,r1;
           int ret;
   
           if ( length(f) != length(pat) ) return 0;
           r = 0;
           for ( tf = f, tp = pat; tf; tf = NEXT(tf), tp = NEXT(tp) ) {
                   ret = quote_unify((Obj)BDY(tf),(Obj)BDY(tp),&a);
                   if ( !ret ) return 0;
                   ret = merge_matching_node(r,a,&r1);
                   if ( !ret ) return 0;
                   else r = r1;
           }
           *rp = r;
           return 1;
   }
   
   void get_quote_id_arg(QUOTE f,int *id,NODE *r)
   {
           LIST fa;
           NODE arg,fab;
   
           arg = mknode(1,f); Pquote_to_funargs(arg,&fa); fab = BDY((LIST)fa);
           *id = QTOS((Q)BDY(fab)); *r = NEXT(fab);
   }
   
   /* *rp : [[quote(A),quote(1)],...] */
   
   int quote_unify(Obj f, Obj pat, NODE *rp)
   {
           NODE tf,tp,head,body;
           NODE parg,farg,r;
           LIST fa,l;
           int pid,id;
           FUNC ff,pf;
           int ret;
   
           if ( OID(pat) == O_LIST ) {
                   if ( OID(f) == O_LIST )
                           return quote_unify_node(BDY((LIST)f),BDY((LIST)pat),rp);
                   else
                           return 0;
           } else if ( OID(pat) == O_QUOTE ) {
                   if ( OID(f) != O_QUOTE ) return 0;
                   get_quote_id_arg((QUOTE)pat,&pid,&parg);
                   get_quote_id_arg((QUOTE)f,&id,&farg);
                   switch ( pid ) {
                           case I_FORMULA:
                                   if ( compquote(CO,f,pat) )
                                           return 0;
                                   else {
                                           *rp = 0;
                                           return 1;
                                   }
                                   break;
                           case I_LIST:
                                   return quote_unify_node(BDY((LIST)BDY(farg)),
                                                           BDY((LIST)BDY(parg)),rp);
                           case I_PVAR:
                                   /* [[pat,f]] */
                                   r = mknode(2,pat,f); MKLIST(l,r);
                                   *rp =  mknode(1,l);
                                   return 1;
                           case I_IFUNC:
                                   /* F(X,Y,...) = ... */
                                   if ( id == I_FUNC ) {
                                           r = mknode(2,BDY(parg),BDY(farg)); MKLIST(l,r);
                                           head = mknode(1,l);
                                           ret = quote_unify(BDY(NEXT(farg)),
                                                                   BDY(NEXT(parg)),&body);
                                           if ( !ret ) return 0;
                                           else return merge_matching_node(head,body,rp);
                                   } else
                                           return 0;
                           case I_BOP:
                           case I_FUNC:
                                   /* X+Y = ... */
                                   /* f(...) = ... */
                                   if ( compqa(CO,BDY(farg),BDY(parg)) ) return 0;
                                   return quote_unify_node(NEXT(farg),NEXT(parg),rp);
                                   break;
                           default:
                                   if ( pid == id )
                                           return quote_unify_node(farg,parg,rp);
                                   else
                                           return 0;
                   }
           }
   }
   
 void Pquotetotex(NODE arg,STRING *rp)  void Pquotetotex(NODE arg,STRING *rp)
 {  {
         TB tb;          TB tb;
Line 844  char *symbol_name(char *name)
Line 1000  char *symbol_name(char *name)
         return 0;          return 0;
 }  }
   
   void Pget_function_name(NODE arg,STRING *rp)
   {
                   QUOTEARG qa;
                   ARF f;
                   char *opname;
   
                   qa = (QUOTEARG)BDY(arg);
                   if ( !qa || OID(qa) != O_QUOTEARG || qa->type != A_arf )
                           *rp = 0;
                   else {
                           f = (ARF)BDY(qa);
                           opname = f->name;
                           MKSTR(*rp,opname);
                   }
   }
   
   FNODE strip_paren(FNODE);
   
 void fnodetotex_tb(FNODE f,TB tb)  void fnodetotex_tb(FNODE f,TB tb)
 {  {
         NODE n,t,t0;          NODE n,t,t0;
Line 916  void fnodetotex_tb(FNODE f,TB tb)
Line 1090  void fnodetotex_tb(FNODE f,TB tb)
                         } else if ( !strcmp(opname,"^") ) {                          } else if ( !strcmp(opname,"^") ) {
                                 fnodetotex_tb((FNODE)FA1(f),tb);                                  fnodetotex_tb((FNODE)FA1(f),tb);
                                 write_tb("^{",tb);                                  write_tb("^{",tb);
                                 fnodetotex_tb((FNODE)FA2(f),tb);                                  fnodetotex_tb(strip_paren((FNODE)FA2(f)),tb);
                                 write_tb("} ",tb);                                  write_tb("} ",tb);
                         } else if ( !strcmp(opname,"%") ) {                          } else if ( !strcmp(opname,"%") ) {
                                 fnodetotex_tb((FNODE)FA1(f),tb);                                  fnodetotex_tb((FNODE)FA1(f),tb);

Legend:
Removed from v.1.50  
changed lines
  Added in v.1.56

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