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; }
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; }
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); } }
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; }