eicmod.c
来自「guide and some example with visualC++」· C语言 代码 · 共 1,537 行 · 第 1/3 页
C
1,537 行
type->alias = 1; type = nextType(type); }}static long getmitem(val_t *v, int t){ switch(t) { case INT: return v->ival; case UINT: return v->uival; case LONG: return v->lval; case ULONG: return v->ulval; } return -1; }static int rm(void){ unsigned long mitem; int t, h = EiC_work_tab; EiC_work_tab = stand_tab; do { switch(EiC_lexan()) { case ID: case TYPENAME: t = EiC_gettype(token->Val.sym->type); if (t == ID) { EiC_remsym(token->Val.sym); /* * check for a tag name. */ if((token->Val.sym = EiC_lookup(tag_tab,EiC_LEXEM)) == NULL) { EiC_error("Unknown identifier %s",EiC_LEXEM); }else { checktype(token->Val.sym->type); EiC_remsym(token->Val.sym); } } else if (t == t_builtin) { EiC_error("Cannot remove builtin functions"); } else { checktype(token->Val.sym->type); EiC_remsym(token->Val.sym); } break; case INT: case UINT: case LONG: case ULONG: mitem = getmitem(&token->Val,token->Tok); if(EiC_getMemMark(mitem) == MEM_LEAK) EiC_freeMemItem(mitem); else EiC_error("Memory item %ld is not a leak\n", mitem); break; default: EiC_error("UnExpected input to rm"); break; } } while (EiC_lexan() == ','); retractlexan(); EiC_work_tab = h; return 1;}static int showhashtab(void){ int tab; token_t e1; EiC_work_tab = tab = stand_tab; /* standard name space */ EiC_inittoken(&e1); switch(EiC_lexan()) { TYPESPEC: TYPEQUAL: retractlexan(); EiC_type_name(&e1); break; case ID: if(strcmp(EiC_LEXEM,"tags") == 0) tab = tag_tab; else if(strcmp(EiC_LEXEM,"builtin") == 0) e1.Type = EiC_addtype(t_builtin,0); else retractlexan(); break; default: retractlexan(); } if(e1.Type) { showtab(tab, 0,&e1,NULL,NULL); EiC_freetype(e1.Type); } else { showtab(tab,0,NULL,NULL,IsObject); showtab(tab,0,NULL,NULL,EiC_IsFunc); } return 1;}static int extra_option(char * option){ EiC_work_tab = stand_tab; /* standard name space */ if (EiC_lexan() == ID) { if(strcmp(EiC_LEXEM,option) == 0) return 1; else retractlexan(); } else retractlexan(); return 0;}int EiC_exit_EiC(){ extern FILE *EiChist; fflush(NULL); if(EiC_verboseON) fputs("EiC Bye\n", stdout); if(EiChist) fclose(EiChist); exit(1); return 1;}static int toggle_verbose(){ EiC_verboseON = !EiC_verboseON; return EiC_verboseON;}static int toggle_interface(){ interfaceON = !interfaceON; return interfaceON;}static int toggle_memdump(){ EiC_memdumpON = !EiC_memdumpON; return EiC_memdumpON;}static int toggle_memtrace(){ EiC_memtraceON = !EiC_memtraceON; return EiC_memtraceON;}static int toggle_showline(){ EiC_SHOWLINE = !EiC_SHOWLINE; return EiC_SHOWLINE;}static int toggle_timer(){ EiC_TIMER = !EiC_TIMER; return EiC_TIMER;}static int toggle_interp(){ EiC_interpON = !EiC_interpON; return EiC_interpON;}static int toggle_includes(){ EiC_showIncludes= !EiC_showIncludes; return EiC_showIncludes;}static int toggle_trace(){ if(extra_option("funcs")) EiC_traceFunc = !EiC_traceFunc; else EiC_traceFunc = 0; if(EiC_traceFunc) EiC_traceON = 1; else EiC_traceON = !EiC_traceON; return EiC_traceON;}static int toggle_listcode(){ if(extra_option("linenums")) EiC_lineNums = !EiC_lineNums; else EiC_lineNums = 0; if(EiC_lineNums) EiC_listcodeON = 1; else EiC_listcodeON = !EiC_listcodeON; return EiC_listcodeON;}static int showhistory(){ #ifndef NO_HISTORY void EiC_show_history(FILE *fp); EiC_show_history(stdout); #endif return 1;}static int showHelp(){puts("-----------------------------------------------------------------------------\n" "EiC-COMMAND SUMMARY DESCRIPTION\n" "-----------------------------------------------------------------------------\n" ":-I path Append path to the include-file search list.\n" ":-L List search paths.\n" ":-R path Remove path from the include-file search list.\n" ":clear fname Removes the contents of file fname from EiC.\n" ":exit Terminates an EiC session.\n" ":files Display the names of all included files.\n" ":files fname Summarize the contents of the included file `fname'.\n" ":gen fname Generates EiC interface of the included file `fname'.\n" ":gen fname [<\"outfile\">] Places the interface in outfile\n" ":gen fname 4 Generates EiC interface with 4 levels of multiplexing.\n" ":help Display summary of EiC commands.\n" ":history List the history of all input commands.\n" ":includes Display path of include files when loaded.\n" ":interpreter Execute input commands. By default it is on.\n" ":listcode List stack code.\n" ":listcode linenums List stack code with associated line numbers.\n" ":memdump Show potential memory leaks.\n" ":reset Reset EiC back to its start state.\n" ":reset here Set the `reset' state to EiC's current state.\n" ":rm dddd Remove memory item dddd, which is a constant integer value.\n" ":rm f Removes f's definition from the symbol tables.\n" ":show f Shows type or macro definition of `f'.\n" ":showline Show input line after macro expansion.\n" ":status Display the status of the toggle switches.\n" ":timer Time in seconds of execution.\n" ":trace Trace function calls and line numbers during code execution.\n" ":trace funcs Trace function calls only during code execution.\n" ":variables Display declared variables and interpreter-ed function names.\n" ":variables tags Display the tag identifiers.\n" ":variables type-name Display variables of type `type-name'.\n" ":verbose Suppresses EiC's copyright and warning messages on start up.\n" "------------------------------------------------------------------------------\n" ); return 0;}static int EiCstatus(){ struct toggle { char * name; int *val; } toggles[] = { {"includes",&EiC_showIncludes}, {"interpreter", &EiC_interpON}, {"listcode",&EiC_listcodeON}, {"memdump", &EiC_memdumpON}, {"showline",&EiC_SHOWLINE}, {"timer",&EiC_TIMER}, {"trace",&EiC_traceON}, {"verbose",&EiC_verboseON}, }; int n = sizeof(toggles)/sizeof(struct toggle); while(n--) printf("\t%-15s %d\n",toggles[n].name, *toggles[n].val); return 0;}static symentry_t *add_eicfunc(char *name, int (*func) ()){ symentry_t *sym; sym = EiC_insertLUT(eic_tab, name, t_eic); sym->level = 1; sym->val.func = func; return sym;}symentry_t *EiC_add_builtinfunc(char *name, val_t(*vfunc) ()){ symentry_t *sym; sym = EiC_insertLUT(stand_tab, name, ID); EiC_freetype(sym->type); sym->level = 1; sym->val.vfunc = vfunc; sym->type = EiC_addtype(t_builtin,NULL); return sym;}void EiC_comm_switch(void){ int EiC_insertpath(char *); int EiC_removepath(char *); void EiC_listpath(void); char EiC_nextchar(void); char *buf; if (EiC_lexan() == ID) { if(EiC_gettype(token->Val.sym->type) == ID) { EiC_remsym(token->Val.sym); } buf = getNextInput(); switch(EiC_LEXEM[0]) { case 'I': if(!*buf || !EiC_insertpath(buf)) EiC_warningerror("Failed to add path"); break; case 'R': if(!*buf || !EiC_removepath(buf)) EiC_warningerror("Failed to remove path"); break; case 'L': EiC_listpath();break; default: EiC_error("Unknown command switch"); } } else EiC_error("Expected command switch");}/* *//* Jean-Bruno Richard personal Modification inside eicmod.c *//* *//* Semi-automatic module code generation *//* functions. Thanks to the function prototype, it's possible to *//* generate it's interfacing function to EiC. *//* Few manual modification of the generated code are sometimes needed, *//* but it helps a lot.... *//* How to use it : *//* Launch EiC, #include the desired header file *//* (Example #include "gl.h") *//* and use the new EiC command :gen with the name of the header file *//* (In the example :gen gl.h) EiC will output the interface to stdout *//* Hope it helps..... : *//* jean-bruno.richard@mg2.com */#ifndef NO_AUTOGENstatic int callBack=0;static int * callNo =NULL;static int *callpos = NULL;static int Ncalls = 0;static char *callName="EiC_Cfunc_";static char *middleName="MiddleOne_";static int MULTIPLEX = 1;static void EiC__generateType(type_expr *t, char *id,FILE *fp, int level){ struct_t *S; char tmp[100]; char out[100]; strcpy(out,id); do { switch(EiC_gettype(t)) { case t_pointer: /* pointer */ sprintf(tmp,"*%s",out); strcpy(out,tmp); break; case t_char: sprintf(tmp,"%s %s", "char", out); strcpy(out,tmp); break; case t_uchar: sprintf(tmp,"%s %s", "unsigned char",out);strcpy(out,tmp); break; case t_short: sprintf(tmp,"%s %s", "short",out);strcpy(out,tmp);break; case t_ushort: sprintf(tmp,"%s %s", "unsigned short",out);strcpy(out,tmp);break; case t_int: sprintf(tmp,"%s %s", "int",out);strcpy(out,tmp);break; case t_uint: sprintf(tmp,"%s %s", "unsigned",out);strcpy(out,tmp);break; case t_long: sprintf(tmp,"%s %s", "long",out);strcpy(out,tmp);break; case t_ulong: sprintf(tmp,"%s %s", "unsigned long",out);strcpy(out,tmp);break; case t_float: sprintf(tmp,"%s %s", "float",out);strcpy(out,tmp);break; case t_double: sprintf(tmp,"%s %s", "double",out);strcpy(out,tmp);break; case t_void: sprintf(tmp,"%s %s", "void",out);strcpy(out,tmp);break; case t_struct: case t_union: if(EiC_gettype(t) == t_union) fputs("union {",fp); else fputs("struct {",fp); S = EiC_getInf(t); if(!S) { fputs("Incomplete", fp); break; } level++; if (level <= 2) { int i; for (i = 0; i < S->n; i++) { EiC__generateType(S->type[i], S->id[i], fp,level); fputs(";",fp); } } sprintf(tmp,"} %s ",out); strcpy(out,tmp); level--; break; case t_array: /* array */ if(out[0] == '*') { sprintf(tmp,"(%s)%s",out,"[]"); strcpy(out,tmp); } else { sprintf(tmp,"[%d]",(int)EiC_getInf(t)); strcat(out, tmp); } break; } } while ( (t=nextType(t))); fprintf(fp,"%s",out);}static int DoCallBackNames(func_t *F, FILE *fp){ int x = 0; if (F) { int i; callpos = realloc(callpos,sizeof(int)*getFNp(F)); for (i = 0; i < getFNp(F); i++) { type_expr *t = getFPty(F,i); if(EiC_gettype(t) == t_pointer && EiC_IsFunc(EiC_gettype(nextType(t)))) { callNo = realloc(callNo, sizeof(*callNo) * (x+1)); callpos[x] = i; callNo[x] = callBack++; fprintf(fp,"static void * %s%d = NULL;\n",callName,callNo[x]); x++; } } } return (Ncalls = x);}static void genCallBackFunc(type_expr *ty, int p, FILE *fp){ char buff[10]; func_t *F, *F2; int i,v, var=0; type_expr *t; F = EiC_getInf(ty); t = getFPty(F,callpos[p]); t = nextType(t); F2 = EiC_getInf(t); fprintf(fp,"static "); EiC_showdectype(nextType(t),0,fp); fprintf(fp," %s%d(",middleName,callNo[p]); /* check 4 varadic function calls */ for(i=0;i<getFNp(F2);i++) if(EiC_gettype(getFPty(F2,i)) == t_var) { var = 1; break; } if(!var) { for(i=0;i<getFNp(F2)-1;i++) { if((v=EiC_gettype(getFPty(F2,i))) == t_void) continue; sprintf(buff,"x%d, ",i); EiC__generateType(getFPty(F2,i),buff,fp,1); } if((v=EiC_gettype(getFPty(F2,i))) != t_void) { sprintf(buff,"x%d ",i); EiC__generateType(getFPty(F2,i),buff,fp,1); } fprintf(fp,")\n{\n"); for (i = 0; i < getFNp(F2); i++) { if(EiC_gettype(getFPty(F2,i)) == t_void) continue; fprintf(fp," setArg(%d, %s%d, ",i,callName,callNo[p]); EiC__generateType(getFPty(F2,i),"",fp,1); fprintf(fp,",x%d);\n",i); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?