diff --git a/include/expr.cpp b/include/expr.cpp index cd9174744..346d0279b 100755 --- a/include/expr.cpp +++ b/include/expr.cpp @@ -771,7 +771,7 @@ TCodesym TExpression::tok2fun(const char* tok) const -TCodesym TExpression::__gettoken(bool /* reduct */) +TCodesym TExpression::__gettoken() { TCodesym sym = _invalid; int i = 0; @@ -827,7 +827,7 @@ TCodesym TExpression::__gettoken(bool /* reduct */) _tok[i++] = *(_s++); while (isalnum(*_s) || (*_s == '-') || (*_s == '[') || - (*_s == ':') || (*_s == '_') || + (*_s == ':') || (*_s == '_') || (*_s == '.') || (square_bracket && (*_s == ',' || *_s == ']')) ) { @@ -837,15 +837,15 @@ TCodesym TExpression::__gettoken(bool /* reduct */) break; // Non e' una -> (freccia) _tok[i++] = *(_s++); sym = _variable; - } - else + } else + if (*_s == '[') { - if (*_s == '[') - { - sym = _variable; - square_bracket = TRUE; - } - } + sym = _variable; + square_bracket = TRUE; + } else + if (*_s == '.') + sym = _variable; + _tok[i++] = *(_s++); } _tok[i] = '\0'; @@ -1007,13 +1007,13 @@ TCodesym TExpression::__factor(TCodesym startsym) for (i = numvar()-1 ; i >= 0; i--) if (strcmp(_tok, varname(i)) == 0) break; if (i < 0) _var.add(_tok); - sym = __gettoken(TRUE); + sym = __gettoken(); } break; case _number: case _string: _code.add(startsym, _tok); - sym = __gettoken(TRUE); + sym = __gettoken(); break; case _userfunc: { @@ -1129,24 +1129,24 @@ TCodesym TExpression::__expression(TCodesym startsym) TCodesym TExpression::__function(int nparms, bool fixed_num) { - TCodesym sym = __gettoken(TRUE); + TCodesym sym = __gettoken(); if (sym != _lpar) return _invalid; __parms_found = 0; - sym = __gettoken(TRUE); + sym = __gettoken(); if (sym == _rpar) - return nparms <= 0 || !fixed_num ? __gettoken(TRUE) : _invalid; + return nparms <= 0 || !fixed_num ? __gettoken() : _invalid; __parms_found++; sym = __expression(sym); while (sym == _comma || sym == _semicolon) { - sym = __gettoken(TRUE); + sym = __gettoken(); __parms_found++; sym = __expression(sym); } if (sym == _rpar) return nparms < 0 || __parms_found == nparms || (__parms_found < nparms && !fixed_num) ? - __gettoken(TRUE) : + __gettoken() : _invalid; return _invalid; } diff --git a/include/expr.h b/include/expr.h index ef5d6c8ae..c945bf5f8 100755 --- a/include/expr.h +++ b/include/expr.h @@ -433,7 +433,7 @@ protected: TCodesym tok2fun(const char* tok) const; // @cmember Ritorna il prossimo token dell'espressione (se
e' TRUE interpreta // la virgola come un token) - TCodesym __gettoken(bool reduct = FALSE); + TCodesym __gettoken(); // @cmember Esegue la compilazione di un fattore TCodesym __factor(TCodesym startsym); // @cmember Esegue la compilazione di un termine diff --git a/include/xml.cpp b/include/xml.cpp index 13ca7acea..b9aa072ad 100755 --- a/include/xml.cpp +++ b/include/xml.cpp @@ -203,11 +203,12 @@ bool TXmlItem::GetWord(istream& inf, TString& str) const } if (cFirstChar == EOF) return false; + + str << char(cFirstChar); const bool bIsString = cFirstChar == '"' || cFirstChar == '\''; if (!bIsString) { - str << char(cFirstChar); if (strchr("<=/>", cFirstChar) != NULL) return true; // Simboli terminali if (cFirstChar == '&') @@ -219,11 +220,11 @@ bool TXmlItem::GetWord(istream& inf, TString& str) const int c = inf.get(); if (bIsString) { - if (c == cFirstChar) - break; if (c >= '\0' && c <= ' ') c = ' '; str << char(c); + if (c == cFirstChar) + break; } else { @@ -263,7 +264,8 @@ int TXmlItem::ReadTag(istream& inf) } if (bFirstChar) { - str << ' '; + if (c != ' ') + str << ' '; bFirstChar = false; } if (c == '&') @@ -304,6 +306,9 @@ int TXmlItem::ReadTag(istream& inf) break; // Leggo il valore dell'attributo GetWord(inf, tmp); + const int len = tmp.len(); + if (len >= 2 && (tmp[0] == '"' || tmp[0] == '\'') && tmp[len-1] == tmp[0]) + { tmp.rtrim(1); tmp.ltrim(1); } SetAttr(name, tmp); } return -1;