Beispiel #1
0
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;
}