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

Diff for /OpenXM_contrib2/asir2000/parse/eval.c between version 1.24 and 1.25

version 1.24, 2003/05/16 07:56:16 version 1.25, 2003/05/16 09:34:49
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/parse/eval.c,v 1.23 2003/05/14 09:18:38 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/parse/eval.c,v 1.24 2003/05/16 07:56:16 noro Exp $
 */  */
 #include <ctype.h>  #include <ctype.h>
 #include "ca.h"  #include "ca.h"
Line 827  void searchuf(char *name,FUNC *r)
Line 827  void searchuf(char *name,FUNC *r)
                 searchf(usrf,name,r);                  searchf(usrf,name,r);
 }  }
   
 /*  
  * xxx.yyy() is searched in the flist  
  * of the module xxx.  
  * yyy() is searched in the current flist  
  * and proto list.  
  */  
   
 void searchuf_proto(char *name,FUNC *r)  
 {  
         MODULE mod;  
         char *name0,*dot;  
   
         if ( dot = strchr(name,'.') ) {  
                 name0 = (char *)ALLOCA(strlen(name)+1);  
                 strcpy(name0,name);  
                 dot = strchr(name0,'.');  
                 *dot = 0;  
                 mod = searchmodule(name0);  
                 if ( mod )  
                         searchf(mod->usrf_list,dot+1,r);  
         } else if ( CUR_MODULE )  
                 searchf(CUR_MODULE->proto_list,name,r);  
 }  
   
 void gen_searchf(char *name,FUNC *r)  void gen_searchf(char *name,FUNC *r)
 {  {
         FUNC val = 0;          FUNC val = 0;
   
         if ( CUR_MODULE ) {          if ( CUR_MODULE )
                 searchf(CUR_MODULE->usrf_list,name,&val);                  searchf(CUR_MODULE->usrf_list,name,&val);
                 if ( !val )          if ( !val )
                         searchf(sysf,name,&val);                  searchf(sysf,name,&val);
                 if ( !val )          if ( !val )
                         searchf(ubinf,name,&val);                  searchf(ubinf,name,&val);
                 if ( !val )          if ( !val )
                         searchpf(name,&val);                  searchpf(name,&val);
                 if ( !val )          if ( !val )
                         searchuf_proto(name,&val);                  searchuf(name,&val);
                 if ( !val )          if ( !val )
                         appenduf(name,&val);                  appenduf(name,&val);
         } else {  
                 if ( !val )  
                         searchf(sysf,name,&val);  
                 if ( !val )  
                         searchf(ubinf,name,&val);  
                 if ( !val )  
                         searchpf(name,&val);  
                 if ( !val )  
                         searchuf(name,&val);  
                 if ( !val )  
                         appenduf(name,&val);  
         }  
         *r = val;          *r = val;
 }  }
   
Line 916  void appenduf(char *name,FUNC *r)
Line 880  void appenduf(char *name,FUNC *r)
                 fname = (char *)MALLOC_ATOMIC(strlen(name)-len+1);                  fname = (char *)MALLOC_ATOMIC(strlen(name)-len+1);
                 strcpy(fname,dot+1);                  strcpy(fname,dot+1);
                 f->name = fname;                  f->name = fname;
                   f->fullname = name;
                 MKNODE(mod->usrf_list,f,0);                  MKNODE(mod->usrf_list,f,0);
         } else {          } else {
                 f->name = name;                  f->name = name;
   #if 0
                 if ( CUR_MODULE ) {                  if ( CUR_MODULE ) {
                           f->fullname =
                                   (char *)MALLOC_ATOMIC(strlen(CUR_MODULE->name)+strlen(name)+1);
                           sprintf(f->fullname,"%s.%s",CUR_MODULE->name,name);
                         MKNODE(tn,f,CUR_MODULE->usrf_list); CUR_MODULE->usrf_list = tn;                          MKNODE(tn,f,CUR_MODULE->usrf_list); CUR_MODULE->usrf_list = tn;
                 } else {                  } else {
                           f->fullname = name;
                         MKNODE(tn,f,usrf); usrf = tn;                          MKNODE(tn,f,usrf); usrf = tn;
                 }                  }
   #else
                   f->fullname = name;
                   MKNODE(tn,f,usrf); usrf = tn;
   #endif
         }          }
         *r = f;          *r = f;
 }  }
   
 void appenduf_global(char *name,FUNC *r)  void appenduf_local(char *name,FUNC *r)
 {  {
         NODE tn;          NODE tn;
         FUNC f;          FUNC f;
           MODULE mod;
   
         f=(FUNC)MALLOC(sizeof(struct oFUNC));          f=(FUNC)MALLOC(sizeof(struct oFUNC));
         f->id = A_UNDEF; f->argc = 0; f->f.binf = 0;          f->id = A_UNDEF; f->argc = 0; f->f.binf = 0;
         f->name = name;          f->name = name;
         MKNODE(tn,f,usrf); usrf = tn;          f->fullname =
                   (char *)MALLOC_ATOMIC(strlen(CUR_MODULE->name)+strlen(name)+1);
           sprintf(f->fullname,"%s.%s",CUR_MODULE->name,name);
           MKNODE(tn,f,CUR_MODULE->usrf_list); CUR_MODULE->usrf_list = tn;
         *r = f;          *r = f;
 }  }
   
   void appenduflist(NODE n)
   {
           NODE tn;
           FUNC f;
   
           for ( tn = n; tn; tn = NEXT(tn) )
                   appenduf_local((char *)BDY(tn),&f);
   }
   
 void mkparif(char *name,FUNC *r)  void mkparif(char *name,FUNC *r)
 {  {
         FUNC f;          FUNC f;
Line 979  void mkuf(char *name,char *fname,NODE args,SNODE body,
Line 966  void mkuf(char *name,char *fname,NODE args,SNODE body,
                 f=(FUNC)MALLOC(sizeof(struct oFUNC));                  f=(FUNC)MALLOC(sizeof(struct oFUNC));
                 f->name = name;                  f->name = name;
                 MKNODE(tn,f,usrf_list); usrf_list = tn;                  MKNODE(tn,f,usrf_list); usrf_list = tn;
                 if ( module )                  if ( module ) {
                           f->fullname =
                                   (char *)MALLOC_ATOMIC(strlen(f->name)+strlen(module->name)+1);
                           sprintf(f->fullname,"%s.%s",module->name,f->name);
                         module->usrf_list = usrf_list;                          module->usrf_list = usrf_list;
                 else                  } else {
                           f->fullname = f->name;
                         usrf = usrf_list;                          usrf = usrf_list;
                   }
         }          }
         if ( Verbose && f->id != A_UNDEF ) {          if ( Verbose && f->id != A_UNDEF ) {
                 if ( module )                  if ( module )
Line 1057  MODULE mkmodule(char *name)
Line 1049  MODULE mkmodule(char *name)
         }          }
 }  }
   
 /* register function names to the proto list of a module */  
   
 void register_proto(NODE n)  
 {  
         NODE tn,flist;  
         char *name;  
         FUNC val;  
   
         if ( !CUR_MODULE )  
                 error("globalf : must be declared in a module.");  
         for ( tn = n; tn; tn = NEXT(tn) ) {  
                 name = (char *)BDY(tn);  
                 searchf(sysf,name,&val);  
                 if ( val ) {  
                         fprintf(stderr,"globalf : `%s' is a builtin function.",name);  
                         error("");  
                 }  
                 searchf(ubinf,name,&val);  
                 if ( val ) {  
                         fprintf(stderr,  
                                 "globalf : `%s' is a user-defined builtin function.",name);  
                         error("");  
                 }  
                 searchpf(name,&val);  
                 if ( val ) {  
                         fprintf(stderr,"globalf : `%s' is a pure function.",name);  
                         error("");  
                 }  
                 searchf(usrf,name,&val);  
                 if ( !val )  
                         appenduf_global(name,&val);  
                 MKNODE(flist,val,CUR_MODULE->proto_list);  
                 CUR_MODULE->proto_list = flist;  
         }  
 }  
   
 void print_crossref(FUNC f)  void print_crossref(FUNC f)
 {  {
         if ( show_crossref && CUR_FUNC )          if ( show_crossref && CUR_FUNC )
                 fprintf(asir_out,"%s() at line %d in %s()\n",                  fprintf(asir_out,"%s() at line %d in %s()\n",
                         f->name, asir_infile->ln, CUR_FUNC);                          f->fullname, asir_infile->ln, CUR_FUNC);
 }  }

Legend:
Removed from v.1.24  
changed lines
  Added in v.1.25

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