Esempio n. 1
0
 EEL_F *GetNamedVar(const char *s, bool createIfNotExists)
 {
   if (!*s) return NULL;
   EEL_F *r = m_namedvars.Get(s);
   if (r || !createIfNotExists) return r;
   r=NSEEL_VM_regvar(m_vm,s);
   if (r) m_namedvars.Insert(s,r);
   return r;
 }
Esempio n. 2
0
int EEL_Editor::namedTokenHighlight(const char *tokStart, int len, int state)
{
  if (len == 4 && !strnicmp(tokStart,"this",4)) return SYNTAX_KEYWORD;
  if (len == 7 && !strnicmp(tokStart,"_global",7)) return SYNTAX_KEYWORD;
  if (len == 5 && !strnicmp(tokStart,"local",5)) return SYNTAX_KEYWORD;
  if (len == 8 && !strnicmp(tokStart,"function",8)) return SYNTAX_KEYWORD;
  if (len == 6 && !strnicmp(tokStart,"static",6)) return SYNTAX_KEYWORD;
  if (len == 8 && !strnicmp(tokStart,"instance",8)) return SYNTAX_KEYWORD;
  if (len == 6 && !strnicmp(tokStart,"global",6)) return SYNTAX_KEYWORD;
  if (len == 7 && !strnicmp(tokStart,"globals",7)) return SYNTAX_KEYWORD;

  if (len == 5 && !strnicmp(tokStart,"while",5)) return SYNTAX_KEYWORD;
  if (len == 4 && !strnicmp(tokStart,"loop",4)) return SYNTAX_KEYWORD;


  int x;
  for(x=0;;x++)
  {
    functionType *f = nseel_getFunctionFromTable(x);
    if (!f) break;
    if (f && !strnicmp(tokStart,f->name,len) && (int)strlen(f->name) == len)
    {
      return SYNTAX_FUNC;
    }
  }
#ifdef START_ON_VARS_KEYWORD
  // todo: need to lookahead to see if the next token is (, if so, look at s_declaredFuncs, otherwise s_declaredVars/s_funcDef_vars
  if (state != STATE_BEFORE_CODE && (s_declaredVars.GetSize()||s_declaredFuncs.GetSize()))
  {
    char buf[1024];
    if (len < sizeof(buf))
    {
      lstrcpyn_safe(buf,tokStart,len+1);
      int tl;
      const char *ep = tokStart+len;
      const char *nexttok=sh_tokenize(&ep, ep+strlen(ep), &tl, NULL);
      if (nexttok && nexttok[0] == '(')
      {
        if (!s_declaredFuncs.Get(buf)) return SYNTAX_ERROR;
      }
      else
      {
        if (s_declaredVars.GetSize() && !s_declaredVars.Get(buf)) return SYNTAX_ERROR;
      }
    }
  }
#endif
  return A_NORMAL;
}
Esempio n. 3
0
static void sh_func_ontoken(const char *tok, int toklen)
{
  // todo: track whether we are in a function definition
  if (s_lasttok_wasfunction && (tok[0] == '_' || isalpha(tok[0])))
  {
    char buf[1024];
    if (toklen > sizeof(buf)-1) toklen=sizeof(buf)-1;
    lstrcpyn_safe(buf,tok,toklen+1);
    s_declaredFuncs.Insert(buf,1);
    s_lasttok_wasfunction=false;
  }
  else
  {
    s_lasttok_wasfunction = toklen == 8 && !strnicmp(tok,"function",8);
  }
}
Esempio n. 4
0
int EEL_Editor::GetCommentStateForLineStart(int line)
{
  
#ifdef START_ON_VARS_KEYWORD
  s_declaredFuncs.DeleteAll();
  s_declaredVars.DeleteAll();
#endif
  m_indent_size=2;
  const bool uses_code_start_lines = !!is_code_start_line(NULL);

  int state=0;
  int x=0;

  if (uses_code_start_lines)
  {
    state=STATE_BEFORE_CODE;
    for (;;x++)
    {
      WDL_FastString *t = m_text.Get(x);
      if (!t || is_code_start_line(t->Get())) break;
    
      const char *p=t->Get();

      if (!strnicmp(p,"tabsize:",8))
      {
        int a = atoi(p+8);
        if (a>0 && a < 32) m_indent_size = a;
      }

      #ifdef START_ON_VARS_KEYWORD
      if (!strnicmp(p,"var",3) && isspace(p[3]))
      {
        const char *endp=p + t->GetLength();
        const char *tok;
        int toklen;
        p+=4;
        while (NULL != (tok = sh_tokenize(&p,endp,&toklen,NULL)))
        {
          if (isalpha(tok[0]) || tok[0] == '_' || tok[0] == '#')
          {
            char buf[512];
            if (toklen > sizeof(buf)-1) toklen=sizeof(buf)-1;
            lstrcpyn_safe(buf,tok,toklen+1);
            s_declaredVars.AddUnsorted(buf,1);
          }
        }
      }
      #endif
    }


    // scan backwards to find line starting with @
    for (x=line;x>=0;x--)
    {
      WDL_FastString *t = m_text.Get(x);
      if (!t) break;
      if (is_code_start_line(t->Get()))
      {
        state=0;
        break;
      }
    }
    x++;
  }

  #ifdef START_ON_VARS_KEYWORD
  s_declaredVars.Resort();
  #endif
  s_draw_parentokenstack.Resize(0,false);

  for (;x<line;x++)
  {
    WDL_FastString *t = m_text.Get(x);
    const char *p = t?t->Get():"";
    if (is_code_start_line(p)) 
    {
      s_draw_parentokenstack.Resize(0,false);
      state=0; 
    }
    else if (state != STATE_BEFORE_CODE)
    {
      const int ll=t?t->GetLength():0;
      const char *endp = p+ll;
      int toklen;
      const char *tok;
      while (NULL != (tok=sh_tokenize(&p,endp,&toklen,&state))) // eat all tokens, updating state
      {
        sh_func_ontoken(tok,toklen);
        sh_draw_parentokenstack_update(tok,toklen);
      }
    }
  }
  return state;
}