📄 vbs_context.cpp
字号:
#include "vbs_context.h"#include <iostream>#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <math.h>#include "string_util.h"#include "../inc/tracelog.h"int vbs_parse(Cvbs_context* p);int Cvbs_context::parse(FILE* pf){ nlastCol=1; nlastLeng=0; vbslex_init_extra(this,&scanner); if (pf) vbsset_in(pf,scanner); register int n=vbs_parse(this); vbslex_destroy(scanner); Release(); return n;}int Cvbs_context::parse(const char* szClause){ TRACE(1,"parse:%s",szClause); nlastCol=1; nlastLeng=0; vbslex_init_extra(this,&scanner); YY_BUFFER_STATE buf; buf = vbs_scan_string(szClause, scanner ); vbsset_lineno(1,scanner); register int n=vbs_parse(this); vbs_delete_buffer(buf,scanner); vbslex_destroy(scanner); Release(); return n;}void Cvbs_context::save_func(const char* szName){ string str(szName); toUpperCase(str); sub_table.insert(var_value_type(str,string("Func")));}string Cvbs_context::eval(const char* szExp, vars_table& tvar){ var.clear(); var = tvar; string exp("eval "); exp+= szExp; parse(exp.c_str()); exp="."; exp = get_var("."); if (exp[0]=='$') return string("\"") + string(exp.c_str()+1) + string("\""); if (exp[0]=='#') return string(exp.c_str()+1); return exp;}void Cvbs_context::do_eval(const char* szExp){ set_var(".",szExp);}string Cvbs_context::eval(const char* szExp){ string exp("eval "); exp+= szExp; parse(exp.c_str()); exp="."; exp = get_var("."); if (exp[0]=='$') return string("\"") + string(exp.c_str()+1) + string("\""); if (exp[0]=='#') return string(get_var(".").c_str()+1); return exp;}void Cvbs_context::execute(const char* szExp, vars_table& tvar){ push_var(tvar); try { parse(szExp); } catch(int n) { TRACE(0, "excute exception:%d", n); } pop_var(tvar);}void Cvbs_context::execute(const char* szExp){ try { parse(szExp); } catch(int n) { ; }}void Cvbs_context::push_var(vars_table& g_var){ vars_table::iterator i; i=g_var.begin(); for (i=g_var.begin();i!=g_var.end();i++) { set_var((*i).first.c_str(),(*i).second.c_str()); }}void Cvbs_context::pop_var(vars_table& g_var){ vars_table::iterator i; i=g_var.begin(); for (i=g_var.begin();i!=g_var.end();i++) { string str; str = get_var((*i).first.c_str()); if (!str.empty()) (*i).second = str; }}string Cvbs_context::get_var(const char* name){ vars_table::iterator i; string str(name); toUpperCase(str); i = var.find(str); if (i == var.end() ) { return string(""); } return (*i).second;}bool Cvbs_context::set_var(const char* name, const char* value){ vars_table::iterator i; string str(name); toUpperCase(str); i = var.find(str); if (i == var.end()) { insert_var(name,value); return true; } (*i).second = string(value); return true;}bool Cvbs_context::insert_var(const char* szVarName,const char* value){ string str(szVarName); toUpperCase(str); return var.insert(var_value_type(str,string(value))).second;}string Cvbs_context::namev(const char* szName){ string r(szName); toUpperCase(r); r = get_var(r.c_str()); set_var(".",r.c_str()); return r;}string Cvbs_context::name_av(const char* szName,int idx){ string r(szName); toUpperCase(r); char tmp[32]; sprintf(tmp,"#%u",idx); r+=tmp; r = get_var(r.c_str()); set_var(".",r.c_str()); return r;}string Cvbs_context::eq(const char* s1,const char* s2){ string r((strcmp(s1,s2)==0)?string("True"):string("False")); set_var(".",r.c_str()); return r;}string Cvbs_context::lt(const char* s1,const char* s2){ register bool r; if (s1[0]=='#' && s2[0] == '#') { register long n1,n2; n1 = atol(s1+1); n2 = atol(s2+1); r = (n1 < n2); } else { r = (strcmp(s1,s2)<0)?true:false; } set_var(".",r?"True":"False"); return r?string("True"):string("False");}string Cvbs_context::le(const char* s1,const char* s2){ register bool r; if (s1[0]=='#' && s2[0] == '#') { register long n1,n2; n1 = atol(s1+1); n2 = atol(s2+1); r = (n1 <= n2); } else { r = (strcmp(s1,s2)<=0)?true:false; } set_var(".",r?"True":"False"); return r?string("True"):string("False");}string Cvbs_context::gt(const char* s1,const char* s2){ register bool r; if (s1[0]=='#' && s2[0] == '#') { register long n1,n2; n1 = atol(s1+1); n2 = atol(s2+1); r = (n1 > n2); } else { r = (strcmp(s1,s2)>0)?true:false; } set_var(".",r?"True":"False"); return r?string("True"):string("False");}string Cvbs_context::ge(const char* s1,const char* s2){ register bool r; if (s1[0]=='#' && s2[0] == '#') { register long n1,n2; n1 = atol(s1+1); n2 = atol(s2+1); r = (n1 >= n2); } else { r = (strcmp(s1,s2)>=0)?true:false; } set_var(".",r?"True":"False"); return r?string("True"):string("False");}string Cvbs_context::ne(const char* s1,const char* s2){ string r((eq(s1,s2)=="True")? string("False") : string("True")); set_var(".",r.c_str()); return r;}string Cvbs_context::plus(const char* s1,const char* s2){ if (s1[0]=='$' && s2[0] == '$')//Concatenation strings { string r=string("$")+ string(s1+1)+string(s2+1); set_var(".",r.c_str()); return r; } else { register long n1,n2; char r[32]; r[0]='#'; n1 = atol(s1+1); n2 = atol(s2+1); n1 +=n2; snprintf(r+1,31,"%d",n1); set_var(".",r); return string(r); }}string Cvbs_context::amd(const char* s1,const char* s2){ string r("$"); if (strlen(s1)>0) r += s1+1; if (strlen(s2)>0) r += s2+1; set_var(".",r.c_str()); return r;}string Cvbs_context::minus(const char* s1,const char* s2){ if (s1[0]=='#' && s2[0] == '#') { register long n1,n2; char r[32]; r[0]='#'; n1 = atol(s1+1); n2 = atol(s2+1); n1 -=n2; snprintf(r+1,31,"%d",n1); set_var(".",r); return string(r); } else { set_var(".","$"); return string("$"); }}string Cvbs_context::mult(const char* s1,const char* s2){ if (s1[0]=='#' && s2[0] == '#') { register long n1,n2; char r[32]; r[0]='#'; n1 = atol(s1+1); n2 = atol(s2+1); n1 *=n2; snprintf(r+1,31,"%d",n1); set_var(".",r); return string(r); } else { set_var(".","$"); return string("$"); }}string Cvbs_context::divide(const char* s1,const char* s2){ if (s1[0]=='#' && s2[0] == '#') { register long n1,n2; char r[32]; r[0]='#'; n1 = atol(s1+1); n2 = atol(s2+1); n1 = n1 / n2; snprintf(r+1,31,"%d",n1); set_var(".",r); return string(r); } else { set_var(".","$"); return string("$"); }}string Cvbs_context::neg(const char* s1){ if (s1[0]=='#') { register long n1; char r[32]; r[0]='#'; n1 = atol(s1+1); n1 = -n1; snprintf(r+1,31,"%d",n1); set_var(".",r); return string(r); } else { set_var(".","$"); return string("$"); }}string Cvbs_context::vb_and(const char* s1,const char* s2){ if (s1[0]=='#' && s2[0]=='#') { int n = int_value(s1) & int_value(s2); char tmp[32]={0}; sprintf(tmp,"#%d",n); return string(tmp); } return (true_value(s1) && true_value(s2))?string("True"):string("False");}string Cvbs_context::vb_or(const char* s1,const char* s2){ if (s1[0]=='#' && s2[0]=='#') { int n = int_value(s1) | int_value(s2); char tmp[32]={0}; sprintf(tmp,"#%d",n); return string(tmp); } return (true_value(s1) || true_value(s2))?string("True"):string("False");}string Cvbs_context::vb_xor(const char* s1,const char* s2){ if (s1[0]=='#' && s2[0]=='#') { int n = int_value(s1) ^ int_value(s2); char tmp[32]={0}; sprintf(tmp,"#%d",n); return string(tmp); } return (true_value(s1) ^ true_value(s2))?string("True"):string("False");}string Cvbs_context::vb_not(const char* s1){ if (true_value(s1)) return string("False"); return string("True");}string Cvbs_context::value(const char* s1){ set_var(".",s1); string str; str = s1; return str;}void Cvbs_context::printv(const char* s1){ if (s1[0]=='$' || s1[0]=='#') printf("%s\n",s1+1); else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -