Patch level : 2.1 nopatch

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :

Corretta lettura file xml


git-svn-id: svn://10.65.10.50/trunk@11948 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2004-04-08 15:06:56 +00:00
parent 591c49e4c5
commit 829f30e2be
3 changed files with 27 additions and 22 deletions

View File

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

View File

@ -433,7 +433,7 @@ protected:
TCodesym tok2fun(const char* tok) const;
// @cmember Ritorna il prossimo token dell'espressione (se <p reduct> 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

View File

@ -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;