int doEntry() { func_t *F; symentry_t *sym; sym = EiC_lookup(stand_tab,"main"); if(!sym) { if(!ScriptMode) EiC_messageDisplay("Error: Missing `main'\n"); return 0; } if(sym) { if(EiC_gettype(sym->type) != t_func) { EiC_messageDisplay("Error: `main' NOT DECLARED as a function\n"); return 0; } /* check return type of main */ if(EiC_gettype(nextType(sym->type)) != t_int) { EiC_messageDisplay("Error: function `main' MUST return an `int' type\n"); return 0; } /* get number of arguments */ F = EiC_getInf(sym->type); if(getFNp(F) <= 1) /* allow for void argument */ EiC_prolineString(FORMAT1); else if(getFNp(F) <= 2) EiC_prolineString(FORMAT2); else EiC_messageDisplay("Error: too many arguments being " "passed to `main'\n"); /*EiC_prolineString(FORMAT3);*/ } return 1; }
static void genCall(type_expr *t, char *fname, FILE *fp) { static int level = 0; func_t *F; int i; F = (func_t *) EiC_getInf(t); level++; fputs("\n", fp); if(Ncalls) { int k; for(k=0;k<Ncalls;++k) fprintf(fp,"\t%s%d = arg(%d,getargs(),ptr_t).p;\n", callName,callNo[k],callpos[k]); } if(nextType(t)) { t = nextType(t); genAffect(t,0,fp); if(t) while(nextType(t)) t = nextType(t); } fputs(fname,fp); fputs("(", fp); if (F && getFNp(F)) { for (i = 0; i < getFNp(F); i++) { genArg(getFPty(F,i), i, fp); if(i < getFNp(F)-1) { fputs(",\n", fp); fputs("\t\t", fp); } } fputs(");\n", fp); } else fputs(");\n", fp); level--; }
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 showFunc(type_expr **t, FILE *fp) { static int level = 0; func_t *F; int i,k; fputs("Func (", fp); F = (func_t *) EiC_getInf(*t); level++; if (F && getFNp(F)) { for (i = 0; i < getFNp(F); i++) { fputc('\n',fp); for(k=0;k<level;k++) fputc('\t',fp); if(getFPname(F,i)) printf("%s: ",getFPname(F,i)); EiC_showdectype(getFPty(F,i), 0,fp); if(i < getFNp(F)-1) fputs(",", fp); } } fputc('\n',fp); for(k=0;k<level;k++) fputc('\t',fp); fputs(") returning ", fp); if(nextType(*t)) { *t = nextType(*t); EiC_showdectype(*t,0,fp); if(*t) while(nextType(*t)) *t = nextType(*t); } if(F && getFComm(F)) fprintf(fp,"\n\n /* %s/\n", getFComm(F)); /**/ level--; }
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); } } else { fprintf(fp," va_alist ) va_dcl\n{\n"); fprintf(fp," void Auto_EiC_CallBack(code_t *callback, va_list ap);\n"); fprintf(fp," va_list ap; va_start(ap);\n"); fprintf(fp," Auto_EiC_CallBack(%s%d,ap);\n",callName,callNo[p]); } fprintf(fp,"\n EiC_callBack(%s%d);\n",callName,callNo[p]); if(EiC_gettype(nextType(t)) != t_void) { fputs(" return EiC_ReturnValue( ",fp); /*EiC_showdectype(nextType(t),0,fp);*/ EiC__generateType(nextType(t),"",fp,1); fputs(");\n",fp); } if(var) fputs(" va_end(ap);\n",fp); fputs("}\n\n",fp); }
static void genMultiCall(type_expr *t, char *fname, FILE *fp) { static int level = 0; func_t *F; int i,n; type_expr *T; F = (func_t *) EiC_getInf(t); level++; fputs("\tstatic int nb = 0;\n\n",fp); fprintf(fp,"\tswitch(nb)\n"); fprintf(fp,"\t{\n"); for (n = 0;n < MULTIPLEX;++n) { adjustNum = n+1-MULTIPLEX; fprintf(fp,"\tcase %d :\n",n); if(Ncalls) { int k; for(k=0;k<Ncalls;++k) fprintf(fp,"\t%s%d = arg(%d,getargs(),ptr_t).p;\n", callName,callNo[k]+adjustNum,callpos[k]); } if (n == 0) { T = t; } else { t = T; } if(nextType(t)) { t = nextType(t); genAffect(t,0,fp); if(t) while(nextType(t)) t = nextType(t); } fputs(fname,fp); fputs("(", fp); if (F && getFNp(F)) { for (i = 0; i < getFNp(F); i++) { genArg(getFPty(F,i), i, fp); if(i < getFNp(F)-1) { fputs(",\n", fp); fputs("\t\t", fp); } } fputs(");\n", fp); } else fputs(");\n", fp); level--; fprintf(fp,"\tbreak;\n"); } fprintf(fp,"\t}\n"); fprintf(fp,"\t++nb;\n"); fprintf(fp,"\tnb %%= %d;\n",MULTIPLEX); adjustNum = 0; }