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:
alex 1996-08-23 14:49:47 +00:00
parent a1c00c753f
commit 43ac216bfd
2 changed files with 176 additions and 103 deletions

View File

@ -15,27 +15,22 @@ 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)
@ -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:
{
if (type == _strexpr)
{ {
s1 = (TString&)evalstack.pop(); s1 = (TString&)evalstack.pop();
s2 = (TString&)evalstack.pop(); s2 = (TString&)evalstack.pop();
const real cond = (real&) evalstack.pop();; const real cond = (real) (TString&) evalstack.pop();;
evalstack.push(cond.is_zero() ? s1 : s2); 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:
@ -569,7 +590,30 @@ void TExpression::eval()
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 '"' :
case '\'' :
{
const char sep = *_s;
_s++; _s++;
while ((*_s) && (*_s != '"')) while ((*_s) && (*_s != sep))
_tok[i++] = *(_s++); _tok[i++] = *(_s++);
_tok[i] = '\0'; _tok[i] = '\0';
if (*_s == '"') _s++; if (*_s == sep) _s++;
return _string; 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;
} }
@ -961,6 +1024,7 @@ 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))

View File

@ -57,7 +57,9 @@ 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
@ -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
@ -415,6 +420,8 @@ protected: // TObject
// @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()
{} {}