/* rawfunc.c by Michael Thorpe 2009-05-19 */ #include #include "lisp.h" obj *applyrawfunc(obj *func,obj *args) { int i,numargs; obj *p; obj *arg[4]; union rawfuncptr rfp; for(i=0,p=args;i<4 && p->type==&cons_objtype;p=p->value.c.d) arg[i++]=p->value.c.a; numargs=i; if(&nilobj != p || numargs != func->value.rawfunc.numargs) { p=new_object(&cons_objtype); if(!p) { DECREF(func); DECREF(args); return(0); } p->value.c.a=func; p->value.c.d=args; return(throwargumenterror(p)); } for(i=0;ivalue.rawfunc.rawfuncptr; DECREF(func); switch(func->value.rawfunc.numargs) { case 0: return((rfp.ns0)()); case 1: return((rfp.ns1)(arg[0])); case 2: return((rfp.ns2)(arg[0],arg[1])); case 3: return((rfp.ns3)(arg[0],arg[1],arg[2])); } return(0); } static obj *rawfunc_tostring(obj *in) { obj *out; char buf[27]; int i; i=snprintf(buf,sizeof(buf),"rawfunc-%p",in->value.rawfunc.rawfuncptr.ns0); if(i==-1 || i>sizeof(buf)) return(throwrangecheck(in)); DECREF(in); out=new_string(buf,i); return(out); } objtype rawfunc_objtype={ name: "rawfunc", tostring: rawfunc_tostring, };