Refactoring: Use 'setindentlevel'

This commit is contained in:
Daniel Marjamäki 2008-03-23 07:57:27 +00:00
parent 0d0f562e90
commit 3dfc79d3b6
6 changed files with 58 additions and 98 deletions

View File

@ -16,7 +16,7 @@ static const TOKEN *findfunction(const TOKEN *tok)
int indentlevel = 0, parlevel = 0; int indentlevel = 0, parlevel = 0;
for (; tok; tok = tok->next) for (; tok; tok = tok->next)
{ {
setindentlevel( tok, indentlevel ); setindentlevel( tok, indentlevel, -1 );
if (tok->str[0] == '(') if (tok->str[0] == '(')
parlevel++; parlevel++;
@ -111,10 +111,9 @@ static void CheckBufferOverrun_DynamicData()
int indentlevel = 0; int indentlevel = 0;
for (const TOKEN *tok = ftok; tok; tok = tok->next) for (const TOKEN *tok = ftok; tok; tok = tok->next)
{ {
if (setindentlevel(tok, indentlevel)) if (setindentlevel(tok, indentlevel, 0))
{ {
if (indentlevel <= 0) break;
break;
} }
@ -155,8 +154,7 @@ static void CheckBufferOverrun_LocalVariable()
int indentlevel = 0; int indentlevel = 0;
for (const TOKEN *tok = tokens; tok; tok = tok->next) for (const TOKEN *tok = tokens; tok; tok = tok->next)
{ {
setindentlevel( tok, indentlevel ); if (setindentlevel( tok, indentlevel, -1 ))
if (indentlevel < 0)
break; break;
// Declaring array.. // Declaring array..
@ -172,8 +170,7 @@ static void CheckBufferOverrun_LocalVariable()
int _indentlevel = 0; int _indentlevel = 0;
for (const TOKEN *tok2 = gettok(tok,5); tok2; tok2 = tok2->next) for (const TOKEN *tok2 = gettok(tok,5); tok2; tok2 = tok2->next)
{ {
setindentlevel(tok2, _indentlevel); if ( setindentlevel(tok2, _indentlevel, -1) )
if ( _indentlevel < 0 )
break; break;
// Array index.. // Array index..

View File

@ -91,12 +91,7 @@ void WarningIncludeHeader()
continue; continue;
// I'm only interested in stuff that is declared at indentlevel 0 // I'm only interested in stuff that is declared at indentlevel 0
if (tok1->str[0] == '{') setindentlevel( tok1, indentlevel, -1 );
indentlevel++;
else if (tok1->str[0] == '}')
indentlevel--;
if (indentlevel != 0) if (indentlevel != 0)
continue; continue;

View File

@ -305,17 +305,10 @@ static const TOKEN *GetFunction( const TOKEN *content )
int indentlevel = 0; int indentlevel = 0;
for (const TOKEN *tok = tokens; tok; tok = tok->next) for (const TOKEN *tok = tokens; tok; tok = tok->next)
{ {
if ( tok->str[0] == '{' ) if (setindentlevel(tok, indentlevel, 0))
indentlevel++; func = NULL;
else if ( tok->str[0] == '}' ) if (indentlevel == 0)
{
indentlevel--;
if (indentlevel == 0)
func = NULL;
}
else if (indentlevel == 0)
{ {
if (tok->str[0] == ';') if (tok->str[0] == ';')
func = NULL; func = NULL;
@ -366,34 +359,27 @@ void WarningStrTok()
int indentlevel = 0; int indentlevel = 0;
for ( const TOKEN *tok = *it1; tok; tok = tok->next ) for ( const TOKEN *tok = *it1; tok; tok = tok->next )
{ {
if ( tok->str[0] == '{' ) if (setindentlevel(tok, indentlevel, 0))
indentlevel++; break;
else if ( tok->str[0] == '}' ) if ( indentlevel == 0 )
{ continue;
if ( indentlevel <= 1 )
break;
indentlevel--;
}
else if ( indentlevel >= 1 ) // Only interested in function calls..
if (! match(tok, "var ("))
continue;
// Check if function name is in funclist..
std::list<const TOKEN *>::const_iterator it2;
for (it2 = funclist.begin(); it2 != funclist.end(); it2++)
{ {
// Only interested in function calls.. if ( strcmp( tok->str, (*it2)->str ) )
if (!(IsName(tok->str) && strcmp(getstr(tok,1), "(") == 0))
continue; continue;
// Check if function name is in funclist.. std::ostringstream ostr;
std::list<const TOKEN *>::const_iterator it2; ostr << FileLine(tok) << ": Possible bug. Both '" << (*it1)->str << "' and '" << (*it2)->str << "' uses strtok.";
for (it2 = funclist.begin(); it2 != funclist.end(); it2++) ReportErr(ostr.str());
{ break;
if ( strcmp( tok->str, (*it2)->str ) )
continue;
std::ostringstream ostr;
ostr << FileLine(tok) << ": Possible bug. Both '" << (*it1)->str << "' and '" << (*it2)->str << "' uses strtok.";
ReportErr(ostr.str());
break;
}
} }
} }
} }
@ -436,18 +422,13 @@ void CheckCaseWithoutBreak()
int indentlevel = 0; int indentlevel = 0;
for (const TOKEN *tok2 = tok->next; tok2; tok2 = tok2->next) for (const TOKEN *tok2 = tok->next; tok2; tok2 = tok2->next)
{ {
if (tok2->str[0] == '{') if ( setindentlevel( tok2, indentlevel, -1 ) )
indentlevel++;
else if (tok2->str[0] == '}')
{ {
indentlevel--; std::ostringstream ostr;
if (indentlevel < 0) ostr << FileLine(tok) << ": 'case' without 'break'.";
{ ReportErr(ostr.str());
std::ostringstream ostr;
ostr << FileLine(tok) << ": 'case' without 'break'.";
ReportErr(ostr.str());
}
} }
if (indentlevel==0) if (indentlevel==0)
{ {
if (strcmp(tok2->str,"break")==0) if (strcmp(tok2->str,"break")==0)
@ -464,7 +445,6 @@ void CheckCaseWithoutBreak()
} }
} }
} }
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -561,18 +541,10 @@ void CheckVariableScope()
tok = tok2; tok = tok2;
for (tok = tok2; tok; tok = tok->next) for (tok = tok2; tok; tok = tok->next)
{ {
if ( tok->str[0] == '{' ) if ( setindentlevel( tok, _indentlevel, 0 ) )
{ {
_indentlevel++; tok = tok->next;
} break;
if ( tok->str[0] == '}' )
{
_indentlevel--;
if ( _indentlevel <= 0 )
{
tok = tok->next;
break;
}
} }
} }
break; break;
@ -586,16 +558,11 @@ void CheckVariableScope()
break; break;
} }
if ( tok->str[0] == '{' ) if ( setindentlevel( tok, indentlevel, 0 ) )
{ {
indentlevel++; func = false;
}
if ( tok->str[0] == '}' )
{
indentlevel--;
if ( indentlevel == 0 )
func = false;
} }
if ( indentlevel == 0 && match(tok, ") {") ) if ( indentlevel == 0 && match(tok, ") {") )
{ {
func = true; func = true;
@ -632,25 +599,18 @@ static void CheckVariableScope_LookupVar( const TOKEN *tok1, const char varname[
// Check if the variable is used in this indentlevel.. // Check if the variable is used in this indentlevel..
bool used = false, used1 = false; bool used = false, used1 = false;
int indentlevel = 0;
bool for_or_while = false; bool for_or_while = false;
while ( indentlevel >= 0 && tok ) int indentlevel = 0;
for (; tok; tok = tok->next )
{ {
if ( tok->str[0] == '{' ) if ( setindentlevel( tok, indentlevel, 0 ) )
{ {
indentlevel++; if ( for_or_while && used )
} return;
used1 = used;
else if ( tok->str[0] == '}' ) used = false;
{ if ( indentlevel < 0 )
indentlevel--; break;
if ( indentlevel == 0 )
{
if ( for_or_while && used )
return;
used1 = used;
used = false;
}
} }
else if ( strcmp(tok->str, varname) == 0 ) else if ( strcmp(tok->str, varname) == 0 )
@ -667,8 +627,6 @@ static void CheckVariableScope_LookupVar( const TOKEN *tok1, const char varname[
if ( tok->str[0] == ';' ) if ( tok->str[0] == ';' )
for_or_while = false; for_or_while = false;
} }
tok = tok->next;
} }
// Warning if "used" is true // Warning if "used" is true

View File

@ -58,7 +58,7 @@ bool IsStandardType(const char str[])
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool setindentlevel( const TOKEN *tok, int &indentlevel ) bool setindentlevel( const TOKEN *tok, int &indentlevel, int endlevel )
{ {
if ( tok->str[0] == '{' ) if ( tok->str[0] == '{' )
indentlevel++; indentlevel++;
@ -66,6 +66,6 @@ bool setindentlevel( const TOKEN *tok, int &indentlevel )
else if ( tok->str[0] == '}' ) else if ( tok->str[0] == '}' )
indentlevel--; indentlevel--;
return bool(tok->str[0] == '}'); return bool(tok->str[0]=='}' && indentlevel<=endlevel);
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@ -34,7 +34,7 @@ bool IsStandardType(const char str[]);
// Iterating through tokens.. // Iterating through tokens..
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
bool setindentlevel( const TOKEN *tok, int &indentlevel ); bool setindentlevel( const TOKEN *tok, int &indentlevel, int endlevel );
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------

View File

@ -494,6 +494,16 @@ static void constructors()
"}\n"; "}\n";
check( CheckConstructors, __LINE__, test4, "[test.cpp:8] Uninitialized member variable 'Fred::i'\n" ); check( CheckConstructors, __LINE__, test4, "[test.cpp:8] Uninitialized member variable 'Fred::i'\n" );
const char test5[] = "class Fred\n"
"{\n"
"public:\n"
" unsigned int i;\n"
"};\n";
check( CheckConstructors, __LINE__, test5, "[test.cpp:1] The class 'Fred' has no constructor\n" );
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------