void AVS_EEL_IF_init() { InitializeCriticalSection(&g_eval_cs); NSEEL_init(); // todo: check to see that parameter orders are correct NSEEL_addfunctionex("getosc",3,(char *)_asm_generic3parm_retd,(char *)_asm_generic3parm_retd_end-(char *)_asm_generic3parm_retd,NSEEL_PProc_THIS,(void*)getosc_); NSEEL_addfunctionex("getspec",3,(char *)_asm_generic3parm_retd,(char *)_asm_generic3parm_retd_end-(char *)_asm_generic3parm_retd,NSEEL_PProc_THIS,(void*)getspec_); NSEEL_addfunctionex("gettime",1,(char *)_asm_generic1parm_retd,(char *)_asm_generic1parm_retd_end-(char *)_asm_generic1parm_retd,NSEEL_PProc_THIS,(void*)gettime_); NSEEL_addfunctionex("getkbmouse",1,(char *)_asm_generic1parm_retd,(char *)_asm_generic1parm_retd_end-(char *)_asm_generic1parm_retd,NSEEL_PProc_THIS,(void*)getmouse_); NSEEL_addfunctionex("setmousepos",2,(char *)_asm_generic2parm_retd,(char *)_asm_generic2parm_retd_end-(char *)_asm_generic2parm_retd,NSEEL_PProc_THIS,(void*)setmousepos_); }
int main(int argc, char **argv) { FILE *fp = stdin; int argpos = 1; while (argpos < argc && argv[argpos][0] == '-' && argv[argpos][1]) { if (!strcmp(argv[argpos],"-v")) g_verbose++; else if (!strcmp(argv[argpos],"-i")) g_interactive++; else { printf("Usage: %s [-v] [-i | scriptfile | -]\n",argv[0]); return -1; } argpos++; } if (argpos < argc && !g_interactive) { fp = strcmp(argv[argpos],"-") ? fopen(argv[argpos],"r") : stdin; if (!fp) { printf("Error opening %s\n",argv[argpos]); return -1; } argpos++; } else { #ifndef _WIN32 if (!g_interactive && isatty(0)) #else if (1) #endif g_interactive=1; } if (NSEEL_init()) { printf("NSEEL_init(): error initializing\n"); return -1; } EEL_string_register(); EEL_file_register(); WDL_FastString code,t; sInst inst; { const int argv_offs = 1<<22; code.SetFormatted(64,"argc=0; argv=%d;\n",argv_offs); int x; for (x=0;x<argc;x++) { if (x==0 || x >= argpos) { t.Set(argv[x]); code.AppendFormatted(64,"argv[argc]=%d; argc+=1;\n",inst.AddString(t)); } } inst.runcode(code.Get(),true,true); } if (g_interactive) { printf("EEL interactive mode, type quit to quit, abort to abort multiline entry\n"); EEL_F *resultVar = NSEEL_VM_regvar(inst.m_vm,"__result"); code.Set(""); char line[4096]; for (;;) { if (!code.Get()[0]) printf("EEL> "); else printf("> "); fflush(stdout); line[0]=0; fgets(line,sizeof(line),fp); if (!line[0]) break; code.Append(line); while (line[0] && ( line[strlen(line)-1] == '\r' || line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\t' || line[strlen(line)-1] == ' ' )) line[strlen(line)-1]=0; if (!strcmp(line,"quit")) break; if (!strcmp(line,"abort")) code.Set(""); t.Set("__result = ("); t.Append(code.Get()); t.Append(");"); int res=inst.runcode(t.Get(),false,true); if (!res) { if (resultVar) printf("=%g ",*resultVar); code.Set(""); } else { res=inst.runcode(code.Get(),true, false); if (res<=0) code.Set(""); // res>0 means need more lines } } } else { code.Set(""); char line[4096]; for (;;) { line[0]=0; fgets(line,sizeof(line),fp); if (!line[0]) break; code.Append(line); } if (fp != stdin) fclose(fp); inst.runcode(code.Get(),true,true); } return 0; }