⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 callback.c

📁 guide and some example with visualC++
💻 C
字号:
/* this code is for the automatic genteration   of call back parameters   */#include <stdlib.h>#include <varargs.h>#include "MachSet.h"#include "global.h"#include "func.h"#include "xalloc.h"#include "typesets.h"#include "error.h"#include "symbol.h"#include "preproc.h"#include "eic.h"#include "emitter.h"#define getop(x,C)    (C->inst[C->nextinst - 5 - 2 * x].opcode)void Auto_EiC_CallBack(code_t *callback, va_list ap){    val_t v;   int i,N = callback->inst[callback->nextinst-3].val.ival;   for(i=0;i<N;i++) {       switch(getop(i,callback)) {	   case pushdouble:	       setArg(i,callback, double, va_arg(ap,double));	       break;	   case pushint:	   case pushuint:	       setArg(i,callback, int, va_arg(ap,int));	       break;	   case pushlong:	   case pushulong:	       setArg(i,callback, long, va_arg(ap,long));	       break;	   case pushptr:	       v.p.ep = v.p.sp = v.p.p = va_arg(ap,void *);	       setArg(i,callback, val_t , v);	       break;       }   }#if 0       EiC_listcode(callback);#endif}#if 1 int EiC_genCallBackCode(token_t * e1){    void EiC_listcode(code_t *);    int EiC_IsFunc(int t);    func_t *f;    int i, lineno = CurrentLineNo();    type_expr * Type;    if(EiC_gettype(e1->Type) == t_pointer) 	Type = nextType(e1->Type);    else	Type = e1->Type;	    f = (func_t *) EiC_getInf(Type);    if (f && getFNp(f) && !getFcallBack(f)) {	token_t e2;	EiC_inittoken(&e2);	if(EiC_gettype(Type) == t_builtin)	    e2.Val.vfunc = e1->Sym->val.vfunc;	else    	    e2.Val.p.p = e1->Sym;		EiC_generate(&e2.Code,pushptr,&e2.Val,0);	setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);	e2.Val.ival = 1;	EiC_generate(&e2.Code,bump,&e2.Val,0);	setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);	/* watch for the void argument */	if(EiC_gettype(getFPty(f,0)) != t_void) {	    e2.Val.ival = getFNp(f);	    EiC_generate(&e2.Code,checkar,&e2.Val,1);	    setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);    	    for (i = 0; i < getFNp(f); i++) {		e2.Pflag = 0;		e2.Type = getFPty(f,i);		if(EiC_gettype(e2.Type) == t_var) 		    EiC_error("\n Sorry, you can't pass a variadic function through EiC's callBack interface");		setConst(e2.Type);		EiC_output(&e2);		EiC_generate(&e2.Code, stoval, &e2.Val, 0);		setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);		unsetConst(e2.Type);	    }	} else 	    e2.Val.ival = 0;	EiC_generate(&e2.Code, pushint, &e2.Val, 0);	setCodeLineNo(&e2.Code,e2.Code.nextinst-1,lineno);	if(EiC_gettype(Type) == t_builtin) 	    EiC_generate(&e2.Code,call,&e2.Val,0);	else	    EiC_generate(&e2.Code,eiccall,&e2.Val,0);	setCodeLineNo(&e2.Code,e2.Code.nextinst-1,0);	e2.Val.p.p = NULL;	EiC_generate(&e2.Code,halt,&e2.Val,0);	setCodeLineNo(&e2.Code,e2.Code.nextinst-1,0);	if(!EiC_ParseError) {	    code_t *code = xcalloc(1,sizeof(*code));	    *code = e2.Code;	    code->Filename=e1->Sym->fname;	    code->prev=NULL;	    if(EiC_gettype(Type) == t_builtin)		code->parent = e1->Sym->val.vfunc;	    else		code->parent=e1->Sym;	    setFcallBack(f,code);	}	e2.Type = NULL;	EiC_freetoken(&e2);    }    return 1;}    #endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -