Statements: Removed this bastard from cppcheck
This commit is contained in:
parent
62e06185f8
commit
7b084fb1c4
477
Statements.cpp
477
Statements.cpp
|
@ -1,477 +0,0 @@
|
|||
|
||||
#include "Statements.h"
|
||||
#include "tokenize.h"
|
||||
|
||||
#include "CommonCheck.h" // <- IsName
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
std::vector<std::string> VariableNames;
|
||||
std::list<STATEMENT> Statements;
|
||||
|
||||
extern bool Debug;
|
||||
extern bool ShowAll;
|
||||
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Create statement list
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
static void AppendStatement(STATEMENT::etype Type, TOKEN *tok, std::string Var="")
|
||||
{
|
||||
STATEMENT NewStatement;
|
||||
NewStatement.Type = Type;
|
||||
NewStatement.Token = tok;
|
||||
if (Var.empty())
|
||||
{
|
||||
NewStatement.VarIndex = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool Found = false;
|
||||
for (unsigned int i = 0; i < VariableNames.size(); i++)
|
||||
{
|
||||
if (VariableNames[i] == Var)
|
||||
{
|
||||
Found = true;
|
||||
NewStatement.VarIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if ( ! Found )
|
||||
{
|
||||
NewStatement.VarIndex = VariableNames.size();
|
||||
VariableNames.push_back(Var);
|
||||
}
|
||||
}
|
||||
|
||||
Statements.push_back(NewStatement);
|
||||
}
|
||||
|
||||
static TOKEN *GotoNextStatement(TOKEN *tok)
|
||||
{
|
||||
if (tok && (tok->str[0]=='{' || tok->str[0]=='}'))
|
||||
return tok->next;
|
||||
|
||||
if (tok)
|
||||
tok = tok->next;
|
||||
int parlevel = 0;
|
||||
for (; tok; tok = tok->next)
|
||||
{
|
||||
if (tok->str[0] == '(')
|
||||
parlevel++;
|
||||
else if (tok->str[0] == ')')
|
||||
parlevel--;
|
||||
if (strchr("{}", tok->str[0]))
|
||||
break;
|
||||
if (parlevel==0 && tok->str[0] == ';')
|
||||
{
|
||||
while (tok && tok->str[0] == ';')
|
||||
tok = tok->next;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return tok;
|
||||
}
|
||||
|
||||
|
||||
static void GetVariableName(TOKEN * &Token, std::string &varname)
|
||||
{
|
||||
varname = "";
|
||||
|
||||
if (Token == NULL)
|
||||
return;
|
||||
|
||||
if (!IsName(Token->str))
|
||||
return;
|
||||
|
||||
// Get variable name..
|
||||
std::ostringstream ostr;
|
||||
bool array = false;
|
||||
bool name = false;
|
||||
for (TOKEN *tok = Token; tok; tok = tok->next)
|
||||
{
|
||||
const char *str = tok->str;
|
||||
|
||||
if ((array) || (str[0]=='['))
|
||||
{
|
||||
ostr << str;
|
||||
array = (str[0] != ']');
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
if (name && IsName(str))
|
||||
return;
|
||||
name = IsName(str);
|
||||
if (!name && strcmp(str,".") && strcmp(str,"->") && strcmp(str,"::"))
|
||||
{
|
||||
if (str[0] == '(')
|
||||
return;
|
||||
Token = tok;
|
||||
break;
|
||||
}
|
||||
ostr << str;
|
||||
}
|
||||
}
|
||||
|
||||
varname = ostr.str();
|
||||
}
|
||||
|
||||
|
||||
void CreateStatementList()
|
||||
{
|
||||
// Clear lists..
|
||||
VariableNames.clear();
|
||||
Statements.clear();
|
||||
|
||||
int indentlevel = 0;
|
||||
for (TOKEN *tok = tokens; tok; tok = GotoNextStatement(tok))
|
||||
{
|
||||
if (tok->str[0] == '{')
|
||||
{
|
||||
AppendStatement(STATEMENT::OBRACE, tok);
|
||||
indentlevel++;
|
||||
}
|
||||
else if (tok->str[0] == '}')
|
||||
{
|
||||
AppendStatement(STATEMENT::EBRACE, tok);
|
||||
indentlevel--;
|
||||
}
|
||||
else if (indentlevel >= 1)
|
||||
{
|
||||
bool hasif = false, hasloop = false, hasswitch = false;
|
||||
|
||||
if (strcmp(tok->str,"if")==0)
|
||||
{
|
||||
hasif = true;
|
||||
AppendStatement(STATEMENT::IF, tok);
|
||||
}
|
||||
else if (strcmp(tok->str,"else")==0)
|
||||
{
|
||||
hasif = true;
|
||||
if (strcmp(getstr(tok,1),"if")==0)
|
||||
AppendStatement(STATEMENT::ELSEIF, tok);
|
||||
else
|
||||
AppendStatement(STATEMENT::ELSE, tok);
|
||||
}
|
||||
|
||||
else if (strcmp(tok->str,"do")==0 ||
|
||||
strcmp(tok->str,"while")==0 ||
|
||||
strcmp(tok->str,"for")==0)
|
||||
{
|
||||
AppendStatement(STATEMENT::LOOP, tok);
|
||||
hasloop = true;
|
||||
}
|
||||
|
||||
else if (strcmp(tok->str,"switch")==0)
|
||||
{
|
||||
AppendStatement(STATEMENT::SWITCH, tok);
|
||||
hasswitch = true;
|
||||
}
|
||||
|
||||
// Declaring variables..
|
||||
if (IsName(tok->str) && strcmp(tok->str,"delete") && strcmp(tok->str,"return"))
|
||||
{
|
||||
const char *str1 = getstr(tok, 1);
|
||||
bool decl = IsName(str1) || str1[0]=='*';
|
||||
for (TOKEN *tok2 = decl ? tok->next : NULL; tok2; tok2 = tok2->next)
|
||||
{
|
||||
if (strchr("{};.", tok2->str[0]))
|
||||
break;
|
||||
|
||||
const char *str1 = getstr(tok2, 1);
|
||||
if (IsName(tok2->str) && strchr("[=,;",str1[0]))
|
||||
{
|
||||
AppendStatement(STATEMENT::DECL, tok2, tok2->str);
|
||||
while (tok2 && !strchr(",;", tok2->str[0]))
|
||||
tok2 = tok2->next;
|
||||
if (tok2->str[0] == ';')
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Assign..
|
||||
for (TOKEN *tok2 = tok; tok2; tok2 = tok2->next)
|
||||
{
|
||||
if (strchr("{};", tok2->str[0]))
|
||||
break;
|
||||
|
||||
TOKEN *eq = tok2;
|
||||
std::string varname = "";
|
||||
GetVariableName(eq, varname);
|
||||
|
||||
// Equal with..
|
||||
if (eq && strcmp(eq->str,"=")==0 && !varname.empty())
|
||||
{
|
||||
TOKEN *rs = eq->next;
|
||||
|
||||
bool ismalloc = false;
|
||||
if ( Match(rs, "%var% (") )
|
||||
{
|
||||
ismalloc |= Match(rs, "strdup (");
|
||||
ismalloc |= Match(rs, "malloc (");
|
||||
ismalloc |= Match(rs, "kmalloc (");
|
||||
}
|
||||
else
|
||||
{
|
||||
ismalloc |= Match(rs, "( %type% * ) malloc (");
|
||||
ismalloc |= Match(rs, "( %type% * * ) malloc (");
|
||||
ismalloc |= Match(rs, "( %type% %type% * ) malloc (");
|
||||
ismalloc |= Match(rs, "( %type% %type% * * ) malloc (");
|
||||
ismalloc |= Match(rs, "( %type% * ) kmalloc (");
|
||||
ismalloc |= Match(rs, "( %type% * * ) kmalloc (");
|
||||
ismalloc |= Match(rs, "( %type% %type% * ) kmalloc (");
|
||||
ismalloc |= Match(rs, "( %type% %type% * * ) kmalloc (");
|
||||
}
|
||||
|
||||
if ( ismalloc )
|
||||
AppendStatement(STATEMENT::MALLOC, tok2, varname);
|
||||
|
||||
else if ( Match(rs,"new %type% ;") )
|
||||
AppendStatement(STATEMENT::NEW, tok2, varname);
|
||||
|
||||
else if ( Match(rs, "new %type% (") )
|
||||
AppendStatement(STATEMENT::NEW, tok2, varname);
|
||||
|
||||
else if ( Match(rs, "new %type% [") )
|
||||
AppendStatement(STATEMENT::NEWARRAY, tok2, varname);
|
||||
|
||||
else
|
||||
AppendStatement(STATEMENT::ASSIGN, tok2, varname);
|
||||
|
||||
tok2 = eq;
|
||||
}
|
||||
}
|
||||
|
||||
// Delete..
|
||||
for (TOKEN *tok2 = tok; tok2; tok2 = tok2->next)
|
||||
{
|
||||
if (strchr("{};", tok2->str[0]))
|
||||
break;
|
||||
|
||||
if (Match(tok2, "free ( %var% ) ;"))
|
||||
AppendStatement(STATEMENT::FREE, tok2, getstr(tok2, 2));
|
||||
|
||||
if (Match(tok2, "kfree ( %var% ) ;"))
|
||||
AppendStatement(STATEMENT::FREE, tok2, getstr(tok2, 2));
|
||||
|
||||
if (Match(tok2, "delete %var% ;"))
|
||||
AppendStatement(STATEMENT::DELETE, tok2, getstr(tok2,1));
|
||||
|
||||
if (Match(tok2, "delete [ ] %var% ;"))
|
||||
AppendStatement(STATEMENT::DELETEARRAY, tok2, getstr(tok2,3));
|
||||
}
|
||||
|
||||
// Use..
|
||||
bool UseVar = false;
|
||||
int parlevel = 0;
|
||||
for (TOKEN *tok2 = tok; tok2; tok2 = tok2->next)
|
||||
{
|
||||
if (parlevel==0 && strchr("{};", tok2->str[0]))
|
||||
break;
|
||||
|
||||
if (Match(tok2,"free ( %var% )"))
|
||||
break;
|
||||
|
||||
if (tok2->str[0] == '(')
|
||||
parlevel++;
|
||||
if (tok2->str[0] == ')')
|
||||
parlevel--;
|
||||
if (parlevel == 0 && tok2->str[0] == ',')
|
||||
UseVar = false;
|
||||
|
||||
else if (tok2->str[0]=='=' || tok2->str[0]=='(')
|
||||
UseVar = true;
|
||||
|
||||
else if (UseVar && IsName(tok2->str))
|
||||
{
|
||||
std::string varname = "";
|
||||
GetVariableName(tok2, varname);
|
||||
|
||||
if (!varname.empty() &&
|
||||
varname!="continue" &&
|
||||
varname!="break" &&
|
||||
varname!="return")
|
||||
{
|
||||
AppendStatement(STATEMENT::USE, tok2, varname);
|
||||
}
|
||||
|
||||
if (tok2->str[0] == ')')
|
||||
parlevel--;
|
||||
|
||||
if (parlevel==0 && tok2->str[0]==';')
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Return, continue, break..
|
||||
for (TOKEN *tok2 = tok; tok2; tok2 = tok2->next)
|
||||
{
|
||||
if (strchr("{};", tok2->str[0]))
|
||||
break;
|
||||
|
||||
if (strcmp(tok2->str,"continue")==0)
|
||||
{
|
||||
AppendStatement(STATEMENT::CONTINUE, tok2);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcmp(tok2->str,"break")==0)
|
||||
{
|
||||
AppendStatement(STATEMENT::BREAK, tok2);
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcmp(tok2->str,"return")==0)
|
||||
{
|
||||
if (IsName(getstr(tok2,1)) && strcmp(getstr(tok2,2),";")==0)
|
||||
AppendStatement(STATEMENT::RETURN, tok2, getstr(tok2,1));
|
||||
|
||||
else
|
||||
AppendStatement(STATEMENT::RETURN, tok2, ";");
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasif)
|
||||
{
|
||||
AppendStatement(STATEMENT::ENDIF, tok);
|
||||
}
|
||||
else if (hasloop)
|
||||
{
|
||||
AppendStatement(STATEMENT::ENDLOOP, tok);
|
||||
}
|
||||
else if (hasswitch)
|
||||
{
|
||||
AppendStatement(STATEMENT::ENDSWITCH, tok);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Debug)
|
||||
{
|
||||
OutputStatementList( std::cout );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void OutputStatementList( std::ostream &ostr )
|
||||
{
|
||||
std::list<STATEMENT>::const_iterator it;
|
||||
for (it = Statements.begin(); it != Statements.end(); it++)
|
||||
{
|
||||
STATEMENT s = *it;
|
||||
// ostr << it->Token->linenr << " : ";
|
||||
switch (s.Type)
|
||||
{
|
||||
case STATEMENT::OBRACE:
|
||||
ostr << "{";
|
||||
break;
|
||||
|
||||
case STATEMENT::EBRACE:
|
||||
ostr << "}";
|
||||
break;
|
||||
|
||||
case STATEMENT::DECL:
|
||||
ostr << "decl " << VariableNames[s.VarIndex];
|
||||
break;
|
||||
|
||||
case STATEMENT::ASSIGN:
|
||||
ostr << "assign " << VariableNames[s.VarIndex];
|
||||
break;
|
||||
|
||||
case STATEMENT::MALLOC:
|
||||
ostr << "malloc " << VariableNames[s.VarIndex];
|
||||
break;
|
||||
|
||||
case STATEMENT::FREE:
|
||||
ostr << "free " << VariableNames[s.VarIndex];
|
||||
break;
|
||||
|
||||
case STATEMENT::NEW:
|
||||
ostr << "new " << VariableNames[s.VarIndex];
|
||||
break;
|
||||
|
||||
case STATEMENT::NEWARRAY:
|
||||
ostr << "new[] " << VariableNames[s.VarIndex];
|
||||
break;
|
||||
|
||||
case STATEMENT::DELETE:
|
||||
ostr << "delete " << VariableNames[s.VarIndex];
|
||||
break;
|
||||
|
||||
case STATEMENT::DELETEARRAY:
|
||||
ostr << "delete[] " << VariableNames[s.VarIndex];
|
||||
break;
|
||||
|
||||
case STATEMENT::USE:
|
||||
ostr << "use " << VariableNames[s.VarIndex];
|
||||
break;
|
||||
|
||||
|
||||
case STATEMENT::LOOP:
|
||||
ostr << "loop";
|
||||
break;
|
||||
|
||||
case STATEMENT::ENDLOOP:
|
||||
ostr << "endloop";
|
||||
break;
|
||||
|
||||
|
||||
case STATEMENT::SWITCH:
|
||||
ostr << "switch";
|
||||
break;
|
||||
|
||||
case STATEMENT::ENDSWITCH:
|
||||
ostr << "endswitch";
|
||||
break;
|
||||
|
||||
|
||||
case STATEMENT::IF:
|
||||
ostr << "if";
|
||||
break;
|
||||
|
||||
case STATEMENT::ELSEIF:
|
||||
ostr << "elseif";
|
||||
break;
|
||||
|
||||
case STATEMENT::ELSE:
|
||||
ostr << "else";
|
||||
break;
|
||||
|
||||
case STATEMENT::ENDIF:
|
||||
ostr << "endif";
|
||||
break;
|
||||
|
||||
case STATEMENT::RETURN:
|
||||
ostr << "return " << VariableNames[s.VarIndex];
|
||||
break;
|
||||
|
||||
case STATEMENT::CONTINUE:
|
||||
ostr << "continue";
|
||||
break;
|
||||
|
||||
case STATEMENT::BREAK:
|
||||
ostr << "break";
|
||||
break;
|
||||
|
||||
default:
|
||||
ostr << "ERROR. Unknown code!!";
|
||||
break;
|
||||
}
|
||||
ostr << "\n";
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
39
Statements.h
39
Statements.h
|
@ -1,39 +0,0 @@
|
|||
//---------------------------------------------------------------------------
|
||||
#ifndef StatementsH
|
||||
#define StatementsH
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
extern std::vector<std::string> VariableNames;
|
||||
|
||||
// Forward declaration
|
||||
struct TOKEN;
|
||||
|
||||
struct STATEMENT
|
||||
{
|
||||
enum etype {OBRACE, EBRACE,
|
||||
DECL, ASSIGN, USE,
|
||||
MALLOC, FREE,
|
||||
NEW, DELETE,
|
||||
NEWARRAY, DELETEARRAY,
|
||||
LOOP, ENDLOOP,
|
||||
IF, ELSE, ELSEIF, ENDIF,
|
||||
SWITCH, ENDSWITCH,
|
||||
RETURN, CONTINUE, BREAK};
|
||||
etype Type;
|
||||
unsigned int VarIndex;
|
||||
TOKEN *Token;
|
||||
};
|
||||
|
||||
extern std::list<STATEMENT> Statements;
|
||||
|
||||
void CreateStatementList();
|
||||
|
||||
void OutputStatementList( std::ostream &ostr );
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
#endif
|
||||
//---------------------------------------------------------------------------
|
Loading…
Reference in New Issue