/[radius]/radius/radiusd/rewrite.y
ViewVC logotype

Diff of /radius/radiusd/rewrite.y

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.76 by gray, Mon Nov 24 15:29:26 2003 UTC revision 1.77 by gray, Wed Nov 26 21:14:53 2003 UTC
# Line 5415  rw_mach_destroy() Line 5415  rw_mach_destroy()
5415  {  {
5416  }  }
5417    
5418  int  FUNCTION *
5419  rewrite_check_function(char *name, Datatype rettype, char *typestr)  rewrite_check_function(char *name, Datatype rettype, char *typestr)
5420  {  {
5421          int i;          int i;
# Line 5424  rewrite_check_function(char *name, Datat Line 5424  rewrite_check_function(char *name, Datat
5424          FUNCTION *fun = (FUNCTION*) sym_lookup(rewrite_tab, name);          FUNCTION *fun = (FUNCTION*) sym_lookup(rewrite_tab, name);
5425          if (!fun) {          if (!fun) {
5426                  radlog(L_ERR, _("function %s not defined"), name);                  radlog(L_ERR, _("function %s not defined"), name);
5427                  return -1;                  return NULL;
5428          }          }
5429          if (fun->rettype) {          if (fun->rettype != rettype) {
5430                  radlog(L_ERR, _("function %s returns wrong data type"), name);                  radlog(L_ERR, _("function %s returns wrong data type"), name);
5431                  return -1;                  return NULL;
5432          }          }
5433    
5434          for (i = 0, p = fun->parm; i < fun->nparm; i++, p++) {          for (i = 0, p = fun->parm; i < fun->nparm; i++, p = p->next) {
5435                  switch (typestr[i]) {                  switch (typestr[i]) {
5436                  case 0:                  case 0:
5437                          radlog(L_ERR,                          radlog(L_ERR,
5438                                 _("function %s takes too few arguments"),                                 _("function %s takes too many arguments"),
5439                                 name);                                 name);
5440                          return -1;                          return NULL;
5441                                                    
5442                  case 'i':                  case 'i':
5443                          if (p->datatype != Integer) {                          if (p->datatype != Integer) {
5444                                  radlog(L_ERR,                                  radlog(L_ERR,
5445                                         _("function %s: argument %d must be integer"),                                         _("function %s: argument %d must be integer"),
5446                                         name, i+1);                                         name, i+1);
5447                                  return -1;                                  return NULL;
5448                          }                          }
5449                          break;                          break;
5450                                                    
# Line 5453  rewrite_check_function(char *name, Datat Line 5453  rewrite_check_function(char *name, Datat
5453                                  radlog(L_ERR,                                  radlog(L_ERR,
5454                                         _("function %s: argument %d must be string"),                                         _("function %s: argument %d must be string"),
5455                                         name, i+1);                                         name, i+1);
5456                                  return -1;                                  return NULL;
5457                          }                          }
5458                          break;                          break;
5459                                                    
# Line 5464  rewrite_check_function(char *name, Datat Line 5464  rewrite_check_function(char *name, Datat
5464    
5465          if (typestr[i]) {          if (typestr[i]) {
5466                  radlog(L_ERR,                  radlog(L_ERR,
5467                         _("function %s takes too many arguments"),                         _("function %s takes too few arguments"),
5468                         name);                         name);
5469                  return -1;                  return NULL;
5470          }          }
5471    
5472          return 0;          return fun;
5473  }  }
5474            
5475  int  int
5476  run_init(pctr_t pc, RADIUS_REQ *request)  run_init(pctr_t pc, RADIUS_REQ *request)
5477  {  {
# Line 5527  evaluate(pctr_t pc, RADIUS_REQ *req, Dat Line 5527  evaluate(pctr_t pc, RADIUS_REQ *req, Dat
5527  }  }
5528    
5529  int  int
5530  rewrite_invoke(char *name, RADIUS_REQ *request, char *typestr, ...)  rewrite_invoke(Datatype rettype, void *ret,
5531                   char *name, RADIUS_REQ *request, char *typestr, ...)
5532  {  {
5533          FILE *fp;          FILE *fp;
5534          va_list ap;          va_list ap;
5535          FUNCTION *fun;          FUNCTION *fun;
5536          int nargs;          int nargs;
5537          char *s;          char *s;
         RWSTYPE ret;  
5538    
5539          fun = (FUNCTION*) sym_lookup(rewrite_tab, name);          fun = rewrite_check_function(name, rettype, typestr);
5540          if (!fun) {          if (!fun)
5541                  radlog(L_ERR, _("function %s not defined"), name);                  return -1;
5542                  return -1;  
         }  
           
5543          rw_mach_init();          rw_mach_init();
5544          if (setjmp(mach.jmp)) {          if (setjmp(mach.jmp)) {
5545                  rw_mach_destroy();                  rw_mach_destroy();
# Line 5576  rewrite_invoke(char *name, RADIUS_REQ *r Line 5574  rewrite_invoke(char *name, RADIUS_REQ *r
5574          }          }
5575          va_end(ap);          va_end(ap);
5576    
         if (fun->nparm != nargs) {  
                 radlog(L_ERR,  
                        _("%s(): wrong number of arguments (should be %d, passed %d)"),  
                        name, fun->nparm, nargs);  
                 rw_mach_destroy();  
                 return -1;  
         }  
   
5577          /* Imitate a function call */          /* Imitate a function call */
5578          pushn(0);                  /* Return address */          pushn(0);                  /* Return address */
5579          run(fun->entry);           /* call function */          run(fun->entry);           /* call function */
# Line 5593  rewrite_invoke(char *name, RADIUS_REQ *r Line 5583  rewrite_invoke(char *name, RADIUS_REQ *r
5583                  avl_fprint(fp, pair_print_prefix, 1, AVPLIST(&mach));                  avl_fprint(fp, pair_print_prefix, 1, AVPLIST(&mach));
5584                  fclose(fp);                  fclose(fp);
5585          }          }
5586          ret = mach.rA;  
5587            switch (rettype) {
5588            case String:
5589                    /* FIXME: constant return. It may not be safe if
5590                       rw_mach_destroy() actually does something */
5591                    *(char**)ret = (char *)mach.rA;
5592                    break;
5593    
5594            case Integer:
5595                    *(UINT4*)ret = mach.rA;
5596            }
5597          rw_mach_destroy();          rw_mach_destroy();
5598          return ret;          return 0;
5599  }  }
5600    
5601  char *  char *

Legend:
Removed from v.1.76  
changed lines
  Added in v.1.77

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26