Aggiunte funzioni num e str
git-svn-id: svn://10.65.10.50/trunk@3431 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
a1c00c753f
commit
43ac216bfd
218
include/expr.cpp
218
include/expr.cpp
@ -15,29 +15,24 @@ TValue::TValue(const real& val)
|
|||||||
_t = _numexpr;
|
_t = _numexpr;
|
||||||
}
|
}
|
||||||
|
|
||||||
TCodearray::TCodearray(int size) : _rpn(size)
|
|
||||||
{
|
|
||||||
clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void TCodearray::clear()
|
void TCodearray::clear()
|
||||||
{
|
{
|
||||||
_rpn.destroy();
|
destroy();
|
||||||
_last = 0;
|
TArray::add(new TCode(_endsym));
|
||||||
TCode *c = new TCode(_endsym);
|
|
||||||
_rpn.add(c, _last);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void TCodearray::add(TCodesym sym, const TValue& val)
|
void TCodearray::add(TCodesym sym, const TValue& val)
|
||||||
{
|
{
|
||||||
TCode *c = new TCode(sym, val);
|
TArray::insert(new TCode(sym, val), last());
|
||||||
_rpn.add(c, _last++);
|
|
||||||
TCode *c1 = new TCode(_endsym);
|
|
||||||
_rpn.add(c1, _last);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TObject * TCode::dup() const
|
||||||
|
{
|
||||||
|
TCode * o = new TCode(*this);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
TCode& TCode::operator =(const TCode& b)
|
TCode& TCode::operator =(const TCode& b)
|
||||||
{
|
{
|
||||||
_sym = b._sym;
|
_sym = b._sym;
|
||||||
@ -45,26 +40,24 @@ TCode& TCode::operator =(const TCode& b)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
TVararray::TVararray(int size) : _array(size)
|
TObject * TVar::dup() const
|
||||||
{
|
{
|
||||||
clear();
|
TVar * o = new TVar(*this);
|
||||||
}
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
void TVararray::add(const char* name, const TValue& val)
|
void TVararray::add(const char* name, const TValue& val)
|
||||||
{
|
{
|
||||||
TVar* v = new TVar(name, val);
|
TArray::add(new TVar(name, val));
|
||||||
_array.add(v, _last++);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TVararray::set(const char* name, const real& val)
|
void TVararray::set(const char* name, const real& val)
|
||||||
|
|
||||||
{
|
{
|
||||||
for (int i = 0; i < _array.items(); i++)
|
for (int i = 0; i < items(); i++)
|
||||||
if (strcmp(((TVar&) _array[i]).getname(), name) == 0)
|
if (strcmp(((TVar *) objptr(i))->getname(), name) == 0)
|
||||||
{
|
{
|
||||||
TValue tempval( val );
|
TArray::add(new TValue(val), i);
|
||||||
((TVar&) _array[i]) = tempval;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -73,11 +66,10 @@ void TVararray::set(const char* name, const real& val)
|
|||||||
void TVararray::set(const char* name, const char* val)
|
void TVararray::set(const char* name, const char* val)
|
||||||
|
|
||||||
{
|
{
|
||||||
for (int i = 0; i < _array.items(); i++)
|
for (int i = 0; i < items(); i++)
|
||||||
if (strcmp(((TVar&) _array[i]).getname(), name) == 0)
|
if (strcmp(((TVar *) objptr(i))->getname(), name) == 0)
|
||||||
{
|
{
|
||||||
TValue tempval( val );
|
TArray::add(new TValue(val), i);
|
||||||
((TVar&) _array[i]) = tempval;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -90,11 +82,11 @@ const real& TVararray::getnum(const char* name)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < _array.items(); i++)
|
for (i = 0; i < items(); i++)
|
||||||
{
|
{
|
||||||
if (strcmp(((TVar*) _array.objptr(i))->getname(), name) == 0)
|
if (strcmp(((TVar*) objptr(i))->getname(), name) == 0)
|
||||||
{
|
{
|
||||||
__r = ((TVar*) _array.objptr(i))->number();
|
__r = ((TVar*) objptr(i))->number();
|
||||||
return __r;
|
return __r;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -106,9 +98,9 @@ const real& TVararray::getnum(const char* name)
|
|||||||
const real& TVararray::getnum(int varnum)
|
const real& TVararray::getnum(int varnum)
|
||||||
|
|
||||||
{
|
{
|
||||||
if (varnum >= _array.items())
|
if (varnum >= items())
|
||||||
fatal_box("invalid variable number : %d", varnum);
|
fatal_box("invalid variable number : %d", varnum);
|
||||||
__r = ((TVar*) _array.objptr(varnum))->number();
|
__r = ((TVar*) objptr(varnum))->number();
|
||||||
return __r;
|
return __r;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,10 +111,10 @@ const char* TVararray::getstring(const char* name)
|
|||||||
const char* s = NULL;
|
const char* s = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < _array.items(); i++)
|
for (i = 0; i < items(); i++)
|
||||||
{
|
{
|
||||||
if (strcmp(((TVar*) _array.objptr(i))->getname(), name) == 0)
|
if (strcmp(((TVar*) objptr(i))->getname(), name) == 0)
|
||||||
return ((TVar*) _array.objptr(i))->string();
|
return ((TVar*) objptr(i))->string();
|
||||||
}
|
}
|
||||||
fatal_box("Unknown variable : %s", name);
|
fatal_box("Unknown variable : %s", name);
|
||||||
return s;
|
return s;
|
||||||
@ -132,9 +124,9 @@ const char* TVararray::getstring(const char* name)
|
|||||||
const char* TVararray::getstring(int varnum)
|
const char* TVararray::getstring(int varnum)
|
||||||
|
|
||||||
{
|
{
|
||||||
if (varnum >= _array.items())
|
if (varnum >= items())
|
||||||
fatal_box("invalid variable number : %d", varnum);
|
fatal_box("invalid variable number : %d", varnum);
|
||||||
return ((TVar*) _array.objptr(varnum))->string();
|
return ((TVar*) objptr(varnum))->string();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -167,11 +159,24 @@ TExpression::TExpression(TTypeexp type)
|
|||||||
_code.clear();
|
_code.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TExpression::TExpression(const TExpression & expr)
|
||||||
|
: _code(expr._code), _var(expr._var),
|
||||||
|
_val(expr._val), _dirty(expr._dirty),
|
||||||
|
_type(expr._type), _original(expr._original)
|
||||||
|
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
TObject* TExpression::dup() const
|
||||||
|
{
|
||||||
|
TExpression* o = new TExpression(*this);
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
TExpression::operator const real&()
|
TExpression::operator const real&()
|
||||||
|
|
||||||
{
|
{
|
||||||
if (_dirty) eval();
|
if (user_func_dirty() || _dirty) eval();
|
||||||
_dirty = FALSE;
|
_dirty = FALSE;
|
||||||
return _val.number();
|
return _val.number();
|
||||||
}
|
}
|
||||||
@ -180,7 +185,7 @@ TExpression::operator const real&()
|
|||||||
TExpression::operator const char*()
|
TExpression::operator const char*()
|
||||||
|
|
||||||
{
|
{
|
||||||
if (_dirty) eval();
|
if (user_func_dirty() || _dirty) eval();
|
||||||
_dirty = FALSE;
|
_dirty = FALSE;
|
||||||
return _val.string();
|
return _val.string();
|
||||||
}
|
}
|
||||||
@ -201,7 +206,7 @@ void TExpression::evaluate_user_func(const char * name, int nparms, TStack & sta
|
|||||||
TExpression::operator bool()
|
TExpression::operator bool()
|
||||||
|
|
||||||
{
|
{
|
||||||
if (_dirty) eval();
|
if (user_func_dirty() || _dirty) eval();
|
||||||
_dirty = FALSE;
|
_dirty = FALSE;
|
||||||
const real& r = _val.number();
|
const real& r = _val.number();
|
||||||
return !r.is_zero();
|
return !r.is_zero();
|
||||||
@ -244,10 +249,16 @@ void TExpression::eval()
|
|||||||
|
|
||||||
{
|
{
|
||||||
TStack evalstack(50);
|
TStack evalstack(50);
|
||||||
|
TBit_array types;
|
||||||
|
int type_pointer = 0;
|
||||||
TCode instr;
|
TCode instr;
|
||||||
real o1, o2;
|
real o1, o2;
|
||||||
TString s1, s2;
|
TString s1, s2;
|
||||||
|
|
||||||
|
types.set(type_pointer, (_type == _numexpr));
|
||||||
|
|
||||||
|
TTypeexp type = _type;
|
||||||
|
|
||||||
_code.begin();
|
_code.begin();
|
||||||
while (!_code.end())
|
while (!_code.end())
|
||||||
{
|
{
|
||||||
@ -258,7 +269,7 @@ void TExpression::eval()
|
|||||||
case _endsym:
|
case _endsym:
|
||||||
break;
|
break;
|
||||||
case _variable:
|
case _variable:
|
||||||
if (_type == _strexpr)
|
if (type == _strexpr)
|
||||||
{
|
{
|
||||||
s1 = _var.getstring(instr.string());
|
s1 = _var.getstring(instr.string());
|
||||||
evalstack.push(s1);
|
evalstack.push(s1);
|
||||||
@ -278,7 +289,7 @@ void TExpression::eval()
|
|||||||
evalstack.push(s1);
|
evalstack.push(s1);
|
||||||
break;
|
break;
|
||||||
case _plus:
|
case _plus:
|
||||||
if (_type == _strexpr)
|
if (type == _strexpr)
|
||||||
{
|
{
|
||||||
s2 = (TString&) evalstack.pop();
|
s2 = (TString&) evalstack.pop();
|
||||||
s1 = (TString&) evalstack.pop();
|
s1 = (TString&) evalstack.pop();
|
||||||
@ -312,7 +323,7 @@ void TExpression::eval()
|
|||||||
evalstack.push(-o1);
|
evalstack.push(-o1);
|
||||||
break;
|
break;
|
||||||
case _and:
|
case _and:
|
||||||
if (_type == _strexpr)
|
if (type == _strexpr)
|
||||||
{
|
{
|
||||||
o2 = real((const char*)(TString&)evalstack.pop());
|
o2 = real((const char*)(TString&)evalstack.pop());
|
||||||
o1 = real((const char*)(TString&)evalstack.pop());
|
o1 = real((const char*)(TString&)evalstack.pop());
|
||||||
@ -326,7 +337,7 @@ void TExpression::eval()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case _or:
|
case _or:
|
||||||
if (_type == _strexpr)
|
if (type == _strexpr)
|
||||||
{
|
{
|
||||||
o2 = real((const char*) (TString&)evalstack.pop());
|
o2 = real((const char*) (TString&)evalstack.pop());
|
||||||
o1 = real((const char*) (TString&)evalstack.pop());
|
o1 = real((const char*) (TString&)evalstack.pop());
|
||||||
@ -344,7 +355,7 @@ void TExpression::eval()
|
|||||||
evalstack.push(real((o1 == ZERO) ? 1.0 : 0.0));
|
evalstack.push(real((o1 == ZERO) ? 1.0 : 0.0));
|
||||||
break;
|
break;
|
||||||
case _equal:
|
case _equal:
|
||||||
if (_type == _strexpr)
|
if (type == _strexpr)
|
||||||
{
|
{
|
||||||
s2 = (TString&) evalstack.pop();
|
s2 = (TString&) evalstack.pop();
|
||||||
s1 = (TString&) evalstack.pop();
|
s1 = (TString&) evalstack.pop();
|
||||||
@ -363,7 +374,7 @@ void TExpression::eval()
|
|||||||
evalstack.push(TString((s1.match(s2)) ? "1" : "0"));
|
evalstack.push(TString((s1.match(s2)) ? "1" : "0"));
|
||||||
break;
|
break;
|
||||||
case _noteq:
|
case _noteq:
|
||||||
if (_type == _strexpr)
|
if (type == _strexpr)
|
||||||
{
|
{
|
||||||
s2 = (TString&) evalstack.pop();
|
s2 = (TString&) evalstack.pop();
|
||||||
s1 = (TString&) evalstack.pop();
|
s1 = (TString&) evalstack.pop();
|
||||||
@ -377,7 +388,7 @@ void TExpression::eval()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case _lt:
|
case _lt:
|
||||||
if (_type == _strexpr)
|
if (type == _strexpr)
|
||||||
{
|
{
|
||||||
s2 = (TString&) evalstack.pop();
|
s2 = (TString&) evalstack.pop();
|
||||||
s1 = (TString&) evalstack.pop();
|
s1 = (TString&) evalstack.pop();
|
||||||
@ -391,7 +402,7 @@ void TExpression::eval()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case _gt:
|
case _gt:
|
||||||
if (_type == _strexpr)
|
if (type == _strexpr)
|
||||||
{
|
{
|
||||||
s2 = (TString&) evalstack.pop();
|
s2 = (TString&) evalstack.pop();
|
||||||
s1 = (TString&) evalstack.pop();
|
s1 = (TString&) evalstack.pop();
|
||||||
@ -405,7 +416,7 @@ void TExpression::eval()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case _lteq:
|
case _lteq:
|
||||||
if (_type == _strexpr)
|
if (type == _strexpr)
|
||||||
{
|
{
|
||||||
s2 = (TString&) evalstack.pop();
|
s2 = (TString&) evalstack.pop();
|
||||||
s1 = (TString&) evalstack.pop();
|
s1 = (TString&) evalstack.pop();
|
||||||
@ -419,7 +430,7 @@ void TExpression::eval()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case _gteq:
|
case _gteq:
|
||||||
if (_type == _strexpr)
|
if (type == _strexpr)
|
||||||
{
|
{
|
||||||
s2 = (TString&) evalstack.pop();
|
s2 = (TString&) evalstack.pop();
|
||||||
s1 = (TString&) evalstack.pop();
|
s1 = (TString&) evalstack.pop();
|
||||||
@ -549,18 +560,28 @@ void TExpression::eval()
|
|||||||
case _scorp:
|
case _scorp:
|
||||||
{
|
{
|
||||||
const real percent = (real&)evalstack.pop();
|
const real percent = (real&)evalstack.pop();
|
||||||
real imponibile = (real&)evalstack.pop();
|
real val = (real&)evalstack.pop();
|
||||||
const real imposta = imponibile * percent / (percent + 100.0);
|
const real calc = val * percent / (percent + 100.0);
|
||||||
imponibile -= imposta;
|
val -= calc;
|
||||||
evalstack.push(imponibile);
|
evalstack.push(val);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case _if:
|
case _if:
|
||||||
{
|
{
|
||||||
s1 = (TString&)evalstack.pop();
|
if (type == _strexpr)
|
||||||
s2 = (TString&)evalstack.pop();
|
{
|
||||||
const real cond = (real&) evalstack.pop();;
|
s1 = (TString&)evalstack.pop();
|
||||||
evalstack.push(cond.is_zero() ? s1 : s2);
|
s2 = (TString&)evalstack.pop();
|
||||||
|
const real cond = (real) (TString&) evalstack.pop();;
|
||||||
|
evalstack.push(cond.is_zero() ? s1 : s2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
o1 = (real&)evalstack.pop();
|
||||||
|
o2 = (real&)evalstack.pop();
|
||||||
|
const real cond = (real&) evalstack.pop();;
|
||||||
|
evalstack.push(cond.is_zero() ? o1 : o2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case _ansi:
|
case _ansi:
|
||||||
@ -568,8 +589,31 @@ void TExpression::eval()
|
|||||||
const TDate d((const TString&)evalstack.pop());
|
const TDate d((const TString&)evalstack.pop());
|
||||||
const TString16 s(d.string(ANSI));
|
const TString16 s(d.string(ANSI));
|
||||||
evalstack.push(s);
|
evalstack.push(s);
|
||||||
}
|
}
|
||||||
|
case _num:
|
||||||
|
type_pointer++;
|
||||||
|
types.set(type_pointer, FALSE);
|
||||||
|
type = _strexpr;
|
||||||
|
break;
|
||||||
|
case _endnum:
|
||||||
|
type_pointer--;
|
||||||
|
type = types[type_pointer] ? _numexpr : _strexpr;
|
||||||
|
if (type == _numexpr)
|
||||||
|
evalstack.push(real((TString &) evalstack.pop()));
|
||||||
|
break;
|
||||||
|
case _str:
|
||||||
|
type_pointer++;
|
||||||
|
types.set(type_pointer, TRUE);
|
||||||
|
type = _numexpr;
|
||||||
|
break;
|
||||||
|
case _endstr:
|
||||||
|
type_pointer--;
|
||||||
|
type = types[type_pointer] ? _numexpr : _strexpr;
|
||||||
|
if (type == _strexpr)
|
||||||
|
evalstack.push(TString(((real &) evalstack.pop()).string()));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
|
NFCHECK("operazione non valida %d", (int) instr.getsym());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -586,18 +630,20 @@ HIDDEN char _tok[81];
|
|||||||
|
|
||||||
TCodesym TExpression::tok2fun(const char* tok) const
|
TCodesym TExpression::tok2fun(const char* tok) const
|
||||||
{
|
{
|
||||||
const int MAX_TOK = 24;
|
const int MAX_TOK = 26;
|
||||||
HIDDEN const char* fnstr[MAX_TOK] = { "ANSI", "CEIL", "COS", "EXP", "EXP10",
|
HIDDEN const char* fnstr[MAX_TOK] = { "ANSI", "CEIL", "COS", "EXP", "EXP10",
|
||||||
"IF", "LEFT", "LOG", "LOG10", "MAX",
|
"IF", "LEFT", "LOG", "LOG10", "MAX",
|
||||||
"MID", "MIN", "PERC", "POW", "RIGHT",
|
"MID", "MIN", "NUM", "PERC", "POW",
|
||||||
"ROUND", "SCORP", "SIN", "SQR", "SQRT",
|
"RIGHT", "ROUND", "SCORP", "SIN", "SQR",
|
||||||
"SUBSTR", "TAN", "TRUNC", "UPPER" };
|
"SQRT", "STR", "SUBSTR","TAN", "TRUNC",
|
||||||
|
"UPPER"};
|
||||||
|
|
||||||
HIDDEN TCodesym fntok[MAX_TOK] = { _ansi, _ceil, _cos, _exp, _exp10,
|
HIDDEN TCodesym fntok[MAX_TOK] = { _ansi, _ceil, _cos, _exp, _exp10,
|
||||||
_if, _left, _log, _log10, _max,
|
_if, _left, _log, _log10, _max,
|
||||||
_mid, _min, _perc, _pow, _right,
|
_mid, _min, _num, _perc, _pow,
|
||||||
_round, _scorp, _sin, _sqr, _sqrt,
|
_right, _round, _scorp, _sin, _sqr,
|
||||||
_substr, _tan, _trunc, _upper };
|
_sqrt, _str, _substr, _tan, _trunc,
|
||||||
|
_upper};
|
||||||
|
|
||||||
int f = 0, l = MAX_TOK-1, i;
|
int f = 0, l = MAX_TOK-1, i;
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
@ -684,12 +730,16 @@ TCodesym TExpression::__gettoken(bool reduct)
|
|||||||
switch (*_s)
|
switch (*_s)
|
||||||
{
|
{
|
||||||
case '"' :
|
case '"' :
|
||||||
_s++;
|
case '\'' :
|
||||||
while ((*_s) && (*_s != '"'))
|
{
|
||||||
_tok[i++] = *(_s++);
|
const char sep = *_s;
|
||||||
_tok[i] = '\0';
|
_s++;
|
||||||
if (*_s == '"') _s++;
|
while ((*_s) && (*_s != sep))
|
||||||
return _string;
|
_tok[i++] = *(_s++);
|
||||||
|
_tok[i] = '\0';
|
||||||
|
if (*_s == sep) _s++;
|
||||||
|
return _string;
|
||||||
|
}
|
||||||
case ',' :
|
case ',' :
|
||||||
_s++;
|
_s++;
|
||||||
return _comma;
|
return _comma;
|
||||||
@ -805,6 +855,7 @@ TCodesym TExpression::__factor(TCodesym startsym)
|
|||||||
sym = __gettoken();
|
sym = __gettoken();
|
||||||
if (sym == _lpar)
|
if (sym == _lpar)
|
||||||
{
|
{
|
||||||
|
sym = __gettoken();
|
||||||
int nparms = 0;
|
int nparms = 0;
|
||||||
while ((sym = __expression(sym)) != _rpar && sym == _comma)
|
while ((sym = __expression(sym)) != _rpar && sym == _comma)
|
||||||
nparms++;
|
nparms++;
|
||||||
@ -812,6 +863,7 @@ TCodesym TExpression::__factor(TCodesym startsym)
|
|||||||
{
|
{
|
||||||
_code.add(_number, real(nparms));
|
_code.add(_number, real(nparms));
|
||||||
_code.add(startsym, val);
|
_code.add(startsym, val);
|
||||||
|
_user_func_defined = TRUE;
|
||||||
sym = __gettoken();
|
sym = __gettoken();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -898,6 +950,17 @@ TCodesym TExpression::__factor(TCodesym startsym)
|
|||||||
else break;
|
else break;
|
||||||
_code.add(startsym);
|
_code.add(startsym);
|
||||||
break;
|
break;
|
||||||
|
case _num:
|
||||||
|
case _str:
|
||||||
|
_code.add(startsym);
|
||||||
|
sym = __gettoken();
|
||||||
|
if (sym == _lpar) sym = __gettoken();
|
||||||
|
else break;
|
||||||
|
sym = __expression(sym);
|
||||||
|
if (sym == _rpar) sym = __gettoken();
|
||||||
|
else break;
|
||||||
|
_code.add(startsym == _num ? _endnum : _endstr);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -960,7 +1023,8 @@ bool TExpression::compile(const char* expression, TTypeexp type)
|
|||||||
{
|
{
|
||||||
TString sc(256);
|
TString sc(256);
|
||||||
TCodesym currsym;
|
TCodesym currsym;
|
||||||
|
|
||||||
|
_user_func_defined = FALSE;
|
||||||
_s = expression;
|
_s = expression;
|
||||||
_type = type;
|
_type = type;
|
||||||
while (((currsym = __gettoken()) != _endsym) && (currsym != _invalid))
|
while (((currsym = __gettoken()) != _endsym) && (currsym != _invalid))
|
||||||
|
@ -57,12 +57,14 @@ enum TCodesym {
|
|||||||
_ansi, // @emem Data in ansi
|
_ansi, // @emem Data in ansi
|
||||||
_if, // @emem Se(expr, val TRUE, val FALSE)
|
_if, // @emem Se(expr, val TRUE, val FALSE)
|
||||||
_num, // @emem Converte una stringa in numero
|
_num, // @emem Converte una stringa in numero
|
||||||
|
_endnum, // @emem Termine della funzione num
|
||||||
_str, // @emem Converte un numero in stringa
|
_str, // @emem Converte un numero in stringa
|
||||||
|
_endstr, // @emem Termine della funzione str
|
||||||
_ceil, // @emem Arrotonda un numero all'intero successivo
|
_ceil, // @emem Arrotonda un numero all'intero successivo
|
||||||
_trunc, // @emem Tronca i decimali
|
_trunc, // @emem Tronca i decimali
|
||||||
_perc, // @emem Calcola la percentuale
|
_perc, // @emem Calcola la percentuale
|
||||||
_scorp, // @emem Scorpora una percentuale
|
_scorp, // @emem Scorpora una percentuale
|
||||||
_substr, // @emem Estrae una sottostringa
|
_substr, // @emem Estrae una sottostringa
|
||||||
} ;
|
} ;
|
||||||
// @doc INTERNAL
|
// @doc INTERNAL
|
||||||
|
|
||||||
@ -159,6 +161,8 @@ class TCode : public TObject
|
|||||||
|
|
||||||
// @access Public Member
|
// @access Public Member
|
||||||
public:
|
public:
|
||||||
|
// @cmember Duplica il codice
|
||||||
|
virtual TObject* dup() const;
|
||||||
// @cmember Assegnamento tra oggetti TCode
|
// @cmember Assegnamento tra oggetti TCode
|
||||||
TCode& operator =(const TCode& b);
|
TCode& operator =(const TCode& b);
|
||||||
// @cmember Inizializza simbolo e valore
|
// @cmember Inizializza simbolo e valore
|
||||||
@ -181,6 +185,10 @@ public:
|
|||||||
TCode(TCodesym sym, const TValue& val = nulltvalue)
|
TCode(TCodesym sym, const TValue& val = nulltvalue)
|
||||||
// @cmember Costruttore, inizializza simbolo con <p sym> e valore con <p val>
|
// @cmember Costruttore, inizializza simbolo con <p sym> e valore con <p val>
|
||||||
{ set(sym, val);}
|
{ set(sym, val);}
|
||||||
|
// @cmember Costruttore
|
||||||
|
TCode(const TCode & c)
|
||||||
|
// @cmember Costruttore, inizializza simbolo con <p c>
|
||||||
|
{ set(c._sym, c._val);}
|
||||||
// @cmember Distruttore
|
// @cmember Distruttore
|
||||||
virtual ~TCode()
|
virtual ~TCode()
|
||||||
{}
|
{}
|
||||||
@ -191,20 +199,16 @@ public:
|
|||||||
// @class TCodearray | Classe per la definizione di un array di istruzioni da valutare
|
// @class TCodearray | Classe per la definizione di un array di istruzioni da valutare
|
||||||
// passo per passo in una espressione
|
// passo per passo in una espressione
|
||||||
//
|
//
|
||||||
// @base public | TObject
|
// @base public | TArray
|
||||||
class TCodearray : public TObject
|
class TCodearray : public TArray
|
||||||
|
|
||||||
// @author:(INTERNAL) Sandro
|
// @author:(INTERNAL) Sandro
|
||||||
|
|
||||||
// @access:(INTERNAL) Private Member
|
// @access:(INTERNAL) Private Member
|
||||||
{
|
{
|
||||||
|
|
||||||
// @cmember:(INTERNAL) Numero di istruzioni
|
|
||||||
int _last;
|
|
||||||
// @cmember:(INTERNAL) Puntatore all'istruzione corrente (Istruction pointer)
|
// @cmember:(INTERNAL) Puntatore all'istruzione corrente (Istruction pointer)
|
||||||
int _ip;
|
int _ip;
|
||||||
// @cmember:(INTERNAL) Array
|
|
||||||
TArray _rpn;
|
|
||||||
|
|
||||||
// @access Public Member
|
// @access Public Member
|
||||||
public:
|
public:
|
||||||
@ -217,16 +221,16 @@ public:
|
|||||||
{ _ip = 0;}
|
{ _ip = 0;}
|
||||||
// @cmember Incrementa l'istruction pointer
|
// @cmember Incrementa l'istruction pointer
|
||||||
TCode& step()
|
TCode& step()
|
||||||
{ return (TCode&) _rpn[end() ? _ip : _ip++];}
|
{ return *((TCode *) objptr(end() ? _ip : _ip++));}
|
||||||
// @cmember Ritorna TRUE se l'istruction pointer ha raggiunto il simbolo di fine codice
|
// @cmember Ritorna TRUE se l'istruction pointer ha raggiunto il simbolo di fine codice
|
||||||
bool end() const
|
bool end() const
|
||||||
{ return ((TCode&) _rpn[_ip]).getsym() == _endsym;}
|
{ return ((TCode *) objptr(_ip))->getsym() == _endsym;}
|
||||||
// @cmember Sposta indietro l'istruction pointer di <p step> passi (si ferma
|
// @cmember Sposta indietro l'istruction pointer di <p step> passi (si ferma
|
||||||
// quando trova l'inizio del puntatore)
|
// quando trova l'inizio del puntatore)
|
||||||
void backtrace(int step = 1)
|
void backtrace(int step = 1)
|
||||||
{ if (_ip > step) _ip -= step; else begin(); }
|
{ if (_ip > step) _ip -= step; else begin(); }
|
||||||
// @cmember Costruttore. Crea un array di 10 elementi
|
// @cmember Costruttore. Crea un array di 50 elementi
|
||||||
TCodearray(int size = 50);
|
TCodearray(int size = 50) : TArray(size), _ip(0) {}
|
||||||
// @cmember Distruttore
|
// @cmember Distruttore
|
||||||
virtual ~TCodearray()
|
virtual ~TCodearray()
|
||||||
{}
|
{}
|
||||||
@ -251,6 +255,8 @@ class TVar : public TObject
|
|||||||
|
|
||||||
// @access Public Member
|
// @access Public Member
|
||||||
public:
|
public:
|
||||||
|
// @cmember Duplica la variabile
|
||||||
|
virtual TObject* dup() const;
|
||||||
|
|
||||||
// @cmember Assegnamento di una stringa all'oggetto Tval
|
// @cmember Assegnamento di una stringa all'oggetto Tval
|
||||||
const char* operator =(const char* val)
|
const char* operator =(const char* val)
|
||||||
@ -291,7 +297,7 @@ public:
|
|||||||
TVar(const char* name, const TValue& val = nulltvalue)
|
TVar(const char* name, const TValue& val = nulltvalue)
|
||||||
{ _name = name; _val = val;}
|
{ _name = name; _val = val;}
|
||||||
// @cmember Costruttore (assegna l'oggetto TVal passato)
|
// @cmember Costruttore (assegna l'oggetto TVal passato)
|
||||||
TVar(TVar& v)
|
TVar(const TVar & v)
|
||||||
{ _name = v._name; _val = v._val;}
|
{ _name = v._name; _val = v._val;}
|
||||||
// @cmember Distruttore
|
// @cmember Distruttore
|
||||||
virtual ~TVar()
|
virtual ~TVar()
|
||||||
@ -303,31 +309,26 @@ public:
|
|||||||
// @class TVararray | Classe per la definizione di un array di variabili da
|
// @class TVararray | Classe per la definizione di un array di variabili da
|
||||||
// valutare nell'esspressione
|
// valutare nell'esspressione
|
||||||
//
|
//
|
||||||
// @base public | TObject
|
// @base public | TArray
|
||||||
class TVararray : public TObject
|
class TVararray : public TArray
|
||||||
|
|
||||||
// @author:(INTERNAL) Sandro
|
// @author:(INTERNAL) Sandro
|
||||||
|
|
||||||
// @access:(INTERNAL) Private Member
|
// @access:(INTERNAL) Private Member
|
||||||
{
|
{
|
||||||
|
|
||||||
// @cmember:(INTERNAL) Numero di variabili
|
|
||||||
int _last;
|
|
||||||
// @cmember:(INTERNAL) Array
|
|
||||||
TArray _array;
|
|
||||||
|
|
||||||
// @access Public Member
|
// @access Public Member
|
||||||
public:
|
public:
|
||||||
// @cmember Cancella il contenuto dell'array
|
// @cmember Cancella il contenuto dell'array
|
||||||
void clear()
|
void clear()
|
||||||
{ _last = 0; }
|
{ destroy();}
|
||||||
// @cmember Aggiunge un oggetto TVar
|
// @cmember Aggiunge un oggetto TVar
|
||||||
void add(const TVar& var);
|
void add(const TVar& var);
|
||||||
// @cmember Aggiunge un nome di variabile e il suo valore
|
// @cmember Aggiunge un nome di variabile e il suo valore
|
||||||
void add(const char* name, const TValue& val = nulltvalue);
|
void add(const char* name, const TValue& val = nulltvalue);
|
||||||
// @cmember Ritorna il nome della variabile di posto varnum
|
// @cmember Ritorna il nome della variabile di posto varnum
|
||||||
const char* varname(int varnum) const
|
const char* varname(int varnum) const
|
||||||
{ return varnum < _array.items() ? ((TVar&) _array[varnum]).getname() : "";}
|
{ return varnum < items() ? ((TVar *) objptr(varnum))->getname() : "";}
|
||||||
|
|
||||||
// @cmember Setta l'oggetto TVararray con il nome e il valore della variabile
|
// @cmember Setta l'oggetto TVararray con il nome e il valore della variabile
|
||||||
void set(const char* varname, const real& val);
|
void set(const char* varname, const real& val);
|
||||||
@ -336,11 +337,11 @@ public:
|
|||||||
void set(const char* varname, const char* val);
|
void set(const char* varname, const char* val);
|
||||||
// @cmember Setta l'elemnto dell varaibile <p varnum>-esima al valore passato
|
// @cmember Setta l'elemnto dell varaibile <p varnum>-esima al valore passato
|
||||||
void set(int varnum, const real& val)
|
void set(int varnum, const real& val)
|
||||||
{ if (varnum < _array.items()) ((TVar&) _array[varnum]) = val;}
|
{ if (varnum < items()) *((TVar *) objptr(varnum)) = val;}
|
||||||
// @cmember Setta l'elemnto dell varaibile <p varnum>-esima al valore passato
|
// @cmember Setta l'elemnto dell varaibile <p varnum>-esima al valore passato
|
||||||
// come stringa
|
// come stringa
|
||||||
void set(int varnum, const char* val)
|
void set(int varnum, const char* val)
|
||||||
{ if (varnum < _array.items()) ((TVar&) _array[varnum]) = val;}
|
{ if (varnum < items()) *((TVar *) objptr(varnum)) = val;}
|
||||||
|
|
||||||
// @cmember Ritorna il valore della variabile con nome <p varname>
|
// @cmember Ritorna il valore della variabile con nome <p varname>
|
||||||
const real& getnum(const char* varname);
|
const real& getnum(const char* varname);
|
||||||
@ -353,10 +354,10 @@ public:
|
|||||||
|
|
||||||
// @cmember Ritorna il numero di variabili utilizzate
|
// @cmember Ritorna il numero di variabili utilizzate
|
||||||
int numvar() const
|
int numvar() const
|
||||||
{ return _last;}
|
{ return items();}
|
||||||
|
|
||||||
// @cmember Costruttore
|
// @cmember Costruttore
|
||||||
TVararray(int size = 10);
|
TVararray(int size = 10) : TArray(size) {}
|
||||||
// @cmember Distruttore
|
// @cmember Distruttore
|
||||||
virtual ~TVararray()
|
virtual ~TVararray()
|
||||||
{}
|
{}
|
||||||
@ -385,6 +386,8 @@ class TExpression : public TObject
|
|||||||
TValue _val;
|
TValue _val;
|
||||||
// @cmember:(INTERNAL) TRUE se l'espressione e' stata modificata
|
// @cmember:(INTERNAL) TRUE se l'espressione e' stata modificata
|
||||||
bool _dirty;
|
bool _dirty;
|
||||||
|
// @cmember:(INTERNAL) TRUE se l'espressione ha almeno una funzione urente
|
||||||
|
bool _user_func_defined;
|
||||||
// @cmember:(INTERNAL) Tipo dell'espressione
|
// @cmember:(INTERNAL) Tipo dell'espressione
|
||||||
TTypeexp _type;
|
TTypeexp _type;
|
||||||
// @cmember:(INTERNAL) Stringa originale
|
// @cmember:(INTERNAL) Stringa originale
|
||||||
@ -392,6 +395,8 @@ class TExpression : public TObject
|
|||||||
|
|
||||||
// @access Protected Member
|
// @access Protected Member
|
||||||
protected:
|
protected:
|
||||||
|
// @cmember funzione utente da ricalcolare
|
||||||
|
virtual bool user_func_dirty() { return _user_func_defined;}
|
||||||
// @cmember Valuta (calcola) l'espressione
|
// @cmember Valuta (calcola) l'espressione
|
||||||
void eval();
|
void eval();
|
||||||
// @cmember Converte una stringa in un nome di funzione o _invalid se non esiste
|
// @cmember Converte una stringa in un nome di funzione o _invalid se non esiste
|
||||||
@ -411,10 +416,12 @@ protected:
|
|||||||
protected: // TObject
|
protected: // TObject
|
||||||
// @cmember Stampa l'espressione su <p out> (serve per implementare l'insertore)
|
// @cmember Stampa l'espressione su <p out> (serve per implementare l'insertore)
|
||||||
virtual void print_on(ostream& out) const ;
|
virtual void print_on(ostream& out) const ;
|
||||||
virtual void evaluate_user_func(const char* name, int nparms, TStack& stack) const;
|
virtual void evaluate_user_func(const char * name, int nparms, TStack & stack) const ;
|
||||||
|
|
||||||
// @access Public Member
|
// @access Public Member
|
||||||
public:
|
public:
|
||||||
|
// @cmember Duplica l'espressione
|
||||||
|
virtual TObject* dup() const;
|
||||||
// @cmember operator const | real& | | Ritorna il valore real dell'espressione
|
// @cmember operator const | real& | | Ritorna il valore real dell'espressione
|
||||||
operator const real&();
|
operator const real&();
|
||||||
// @cmember operator const | char* | | Ritorna il valore dell'espressione come stringa
|
// @cmember operator const | char* | | Ritorna il valore dell'espressione come stringa
|
||||||
@ -456,6 +463,8 @@ public:
|
|||||||
TExpression(const char* expression, TTypeexp type = _numexpr);
|
TExpression(const char* expression, TTypeexp type = _numexpr);
|
||||||
// @cmember Costruttore (assegna il tipo dell'istruzione)
|
// @cmember Costruttore (assegna il tipo dell'istruzione)
|
||||||
TExpression(TTypeexp type = _numexpr);
|
TExpression(TTypeexp type = _numexpr);
|
||||||
|
// @cmember Costruttore di copia
|
||||||
|
TExpression(const TExpression & expr);
|
||||||
// @cmember Distruttore
|
// @cmember Distruttore
|
||||||
virtual ~TExpression()
|
virtual ~TExpression()
|
||||||
{}
|
{}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user