From ca0f007ca4682f46eb1afb65d3aeafbcb33b6df6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 26 Jan 2009 16:38:08 +0000 Subject: [PATCH] tokenizer: simplify redundant paranthesis --- src/tokenize.cpp | 34 +++++ src/tokenize.h | 298 +++++++++++++++++++++--------------------- test/testtokenize.cpp | 2 +- 3 files changed, 187 insertions(+), 147 deletions(-) diff --git a/src/tokenize.cpp b/src/tokenize.cpp index 9779a3576..1641782a0 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -915,6 +915,7 @@ void Tokenizer::simplifyTokenList() modified |= simplifyFunctionReturn(); modified |= simplifyKnownVariables(); modified |= removeReduntantConditions(); + modified |= simplifyRedundantParanthesis(); } } //--------------------------------------------------------------------------- @@ -1367,6 +1368,39 @@ bool Tokenizer::simplifyKnownVariables() return ret; } +bool Tokenizer::simplifyRedundantParanthesis() +{ + bool ret = false; + for (Token *tok = _tokens; tok; tok = tok->next()) + { + if (Token::simpleMatch(tok, "( (")) + { + int parlevel = 0; + for (Token *tok2 = tok; tok2; tok2 = tok2->next()) + { + if (tok2->str() == "(") + ++parlevel; + + else if (tok2->str() == ")") + { + --parlevel; + if (parlevel == 1) + { + if (Token::simpleMatch(tok2, ") )")) + { + tok->deleteNext(); + tok2->deleteNext(); + } + break; + } + } + } + } + } + return ret; +} + + //--------------------------------------------------------------------------- // Helper functions for handling the tokens list //--------------------------------------------------------------------------- diff --git a/src/tokenize.h b/src/tokenize.h index ea94a6ee0..b27dc4a99 100644 --- a/src/tokenize.h +++ b/src/tokenize.h @@ -1,146 +1,152 @@ -/* - * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2009 Daniel Marjamäki, Reijo Tomperi, Nicolas Le Cam, - * Leandro Penz, Kimmo Varis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see -#include -#include -#include -#include "settings.h" -#include "errorlogger.h" -#include "token.h" - -class Tokenizer -{ -private: - // Deallocate lists.. - void DeallocateTokens(); - -public: - Tokenizer(); - ~Tokenizer(); - - /** - * Tokenize code - * @param code input stream for code - * @param FileName The filename - */ - void tokenize(std::istream &code, const char FileName[]); - - /** Set variable id */ - void setVarId(); - - /** Simplify tokenlist */ - void simplifyTokenList(); - - - // Helper functions for handling the tokens list.. - - static void deleteTokens(Token *tok); - static const char *getParameterName(const Token *ftok, int par); - - static bool SameFileName(const char fname1[], const char fname2[]); - - - std::string fileLine(const Token *tok) const; - - // Return size. - int SizeOfType(const char type[]) const; - - void initTokens(); - - const std::vector *getFiles() const; - - void fillFunctionList(); - const Token *GetFunctionTokenByName(const char funcname[]) const; - const Token *tokens() const; - - -#ifndef UNIT_TESTING -private: -#endif - - - /** - * Finds matching "end" for "start". - * @param tok The start tag - * @param start e.g. "{" - * @param end e.g. "}" - * @return The end tag that matches given parameter or 0 if not found. - */ - static const Token *findClosing(const Token *tok, const char *start, const char *end); - - void addtoken(const char str[], const unsigned int lineno, const unsigned int fileno); - - /** Add braces to an if-block - * @return true if something is modified - * false if nothing is done. - */ - bool simplifyIfAddBraces(); - - /** Simplify conditions - * @return true if something is modified - * false if nothing is done. - */ - bool simplifyConditions(); - - /** Remove reduntant code, e.g. if( false ) { int a; } should be - * removed, because it is never executed. - * @return true if something is modified - * false if nothing is done. - */ - bool removeReduntantConditions(); - - /** Simplify casts - * @return true if something is modified - * false if nothing is done. - */ - bool simplifyCasts(); - - /** Simplify function calls - constant return value - * @return true if something is modified - * false if nothing is done. - */ - bool simplifyFunctionReturn(); - - /** - * A simplify function that replaces a variable with its value in cases - * when the value is known. e.g. "x=10; if(x)" => "x=10;if(10)" - * - * @param token The token list to check and modify. - * @return true if modifications to token-list are done. - * false if no modifications are done. - */ - bool simplifyKnownVariables(); - - void InsertTokens(Token *dest, Token *src, unsigned int n); - - Token *_tokensBack; - std::map _typeSize; - std::vector _functionList; - std::vector _files; - Token *_tokens; -}; - -//--------------------------------------------------------------------------- -#endif +/* + * Cppcheck - A tool for static C/C++ code analysis + * Copyright (C) 2007-2009 Daniel Marjamäki, Reijo Tomperi, Nicolas Le Cam, + * Leandro Penz, Kimmo Varis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see +#include +#include +#include +#include "settings.h" +#include "errorlogger.h" +#include "token.h" + +class Tokenizer +{ +private: + // Deallocate lists.. + void DeallocateTokens(); + +public: + Tokenizer(); + ~Tokenizer(); + + /** + * Tokenize code + * @param code input stream for code + * @param FileName The filename + */ + void tokenize(std::istream &code, const char FileName[]); + + /** Set variable id */ + void setVarId(); + + /** Simplify tokenlist */ + void simplifyTokenList(); + + + // Helper functions for handling the tokens list.. + + static void deleteTokens(Token *tok); + static const char *getParameterName(const Token *ftok, int par); + + static bool SameFileName(const char fname1[], const char fname2[]); + + + std::string fileLine(const Token *tok) const; + + // Return size. + int SizeOfType(const char type[]) const; + + void initTokens(); + + const std::vector *getFiles() const; + + void fillFunctionList(); + const Token *GetFunctionTokenByName(const char funcname[]) const; + const Token *tokens() const; + + +#ifndef UNIT_TESTING +private: +#endif + + + /** + * Finds matching "end" for "start". + * @param tok The start tag + * @param start e.g. "{" + * @param end e.g. "}" + * @return The end tag that matches given parameter or 0 if not found. + */ + static const Token *findClosing(const Token *tok, const char *start, const char *end); + + void addtoken(const char str[], const unsigned int lineno, const unsigned int fileno); + + /** Add braces to an if-block + * @return true if something is modified + * false if nothing is done. + */ + bool simplifyIfAddBraces(); + + /** Simplify conditions + * @return true if something is modified + * false if nothing is done. + */ + bool simplifyConditions(); + + /** Remove reduntant code, e.g. if( false ) { int a; } should be + * removed, because it is never executed. + * @return true if something is modified + * false if nothing is done. + */ + bool removeReduntantConditions(); + + /** Simplify casts + * @return true if something is modified + * false if nothing is done. + */ + bool simplifyCasts(); + + /** Simplify function calls - constant return value + * @return true if something is modified + * false if nothing is done. + */ + bool simplifyFunctionReturn(); + + /** + * A simplify function that replaces a variable with its value in cases + * when the value is known. e.g. "x=10; if(x)" => "x=10;if(10)" + * + * @return true if modifications to token-list are done. + * false if no modifications are done. + */ + bool simplifyKnownVariables(); + + /** + * Remove redundant paranthesis: "((x))" => "(x)" + * @return true if modifications to token-list are done. + * false if no modifications are done. + */ + bool simplifyRedundantParanthesis(); + + void InsertTokens(Token *dest, Token *src, unsigned int n); + + Token *_tokensBack; + std::map _typeSize; + std::vector _functionList; + std::vector _files; + Token *_tokens; +}; + +//--------------------------------------------------------------------------- +#endif diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index eb9ff4760..39eed0a99 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -75,7 +75,7 @@ private: // TODO TEST_CASE(simplify_function_parameters); - // TODO TEST_CASE(reduce_redundant_paranthesis); // Ticket #61 + TEST_CASE(reduce_redundant_paranthesis); // Ticket #61 }