From e0027bef6665def2d8bc3bdfc8aedf79ee89e6bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 24 Nov 2008 07:35:03 +0000 Subject: [PATCH] Borland C++: Minor updates so cppcheck compiles with Borland C++ --- cppcheck.cbproj | 43 +++-- token.cpp | 474 ++++++++++++++++++++++++------------------------ 2 files changed, 262 insertions(+), 255 deletions(-) diff --git a/cppcheck.cbproj b/cppcheck.cbproj index 6418c38c2..73389d8c7 100644 --- a/cppcheck.cbproj +++ b/cppcheck.cbproj @@ -18,45 +18,45 @@ Base - exe true - NO_STRICT + exe JPHNE + NO_STRICT true false - C:\cppcheck true - true + C:\cppcheck CppConsoleApplication + true false - vcl.bpi;rtl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;vcldbx.bpi;bdertl.bpi;A407_R110.bpi;DreamEdit_C6.bpi true + vcl.bpi;rtl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;vcldbx.bpi;bdertl.bpi;A407_R110.bpi;DreamEdit_C6.bpi true false $(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;C:\cppcheck $(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;C:\cppcheck - true true + true - false false - _DEBUG;$(Defines) + false true + _DEBUG;$(Defines) true false true None DEBUG true - bcb_debug false + bcb_debug bcb_Debug true true true - $(BDS)\lib\debug;$(ILINK_LibraryPath) true + $(BDS)\lib\debug;$(ILINK_LibraryPath) Full true @@ -84,6 +84,10 @@ CheckClass.h 1 + + CheckFunctionUsage.h + 11 + CheckHeaders.h 2 @@ -96,29 +100,28 @@ CheckOther.h 4 - - CommonCheck.h - 5 - - 11 + 10 - 8 + 7 - 6 + 5 preprocessor.h - 9 + 8 - 10 + 9 + + + 12 tokenize.h - 7 + 6 Cfg_1 diff --git a/token.cpp b/token.cpp index 462304d48..9d93e19c4 100644 --- a/token.cpp +++ b/token.cpp @@ -1,235 +1,239 @@ -/* - * c++check - c/c++ syntax checking - * Copyright (C) 2007-2008 Daniel Marjamäki and Reijo Tomperi - * - * 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 - -TOKEN::TOKEN() -{ - FileIndex = 0; - _str = 0; - linenr = 0; - next = 0; - _isName = false; - _isNumber = false; -} - -TOKEN::~TOKEN() -{ - std::free(_str); -} - -void TOKEN::setstr( const char s[] ) -{ - std::free(_str); -#ifndef _MSC_VER - _str = strdup(s); -#else - _str = _strdup(s); -#endif - str = _str ? _str : ""; - - _isName = bool(str[0]=='_' || isalpha(str[0])); - _isNumber = bool(isdigit(str[0]) != 0); -} - -void TOKEN::combineWithNext(const char str1[], const char str2[]) -{ - if (!(next)) - return; - if (strcmp(str,str1) || strcmp(next->str,str2)) - return; - - std::string newstr(std::string(str1) + std::string(str2)); - setstr( newstr.c_str() ); - deleteNext(); -} - -void TOKEN::deleteNext() -{ - TOKEN *n = next; - next = n->next; - delete n; -} - -const TOKEN *TOKEN::tokAt(int index) const -{ - const TOKEN *tok = this; - while (index>0 && tok) - { - tok = tok->next; - index--; - } - return tok; -} - -const char *TOKEN::strAt(int index) const -{ - const TOKEN *tok = this->tokAt(index); - return tok ? tok->str : ""; -} - -bool TOKEN::Match(const TOKEN *tok, const char pattern[], const char *varname1[], const char *varname2[]) -{ - if (!tok) - return false; - - const char *p = pattern; - while (*p) - { - // Skip spaces in pattern.. - while ( *p == ' ' ) - p++; - - // Extract token from pattern.. - char str[50]; - char *s = str; - while (*p && *p!=' ') - { - *s = *p; - s++; - p++; - } - *s = 0; - - // No token => Success! - if (str[0] == 0) - return true; - - // Any symbolname.. - if (strcmp(str,"%var%")==0 || strcmp(str,"%type%")==0) - { - if (!tok->isName()) - return false; - } - - // Variable name.. - else if (strcmp(str,"%var1%")==0 || strcmp(str,"%var2%")==0) - { - const char **varname = (strcmp(str,"%var1%")==0) ? varname1 : varname2; - - if ( ! varname ) - return false; - - if (strcmp(tok->str, varname[0]) != 0) - return false; - - for ( int i = 1; varname[i]; i++ ) - { - if ( !(tok->tokAt(2)) ) - return false; - - if ( strcmp(tok->strAt( 1), ".") ) - return false; - - if ( strcmp(tok->strAt( 2), varname[i]) ) - return false; - - tok = tok->tokAt(2); - } - } - - else if (strcmp(str,"%num%")==0) - { - if ( ! tok->isNumber() ) - return false; - } - - - else if (strcmp(str,"%str%")==0) - { - if ( tok->str[0] != '\"' ) - return false; - } - - // [.. => search for a one-character token.. - else if (str[0]=='[' && strchr(str, ']') && tok->str[1] == 0) - { - *strrchr(str, ']') = 0; - if ( strchr( str + 1, tok->str[0] ) == 0 ) - return false; - } - - else if (strcmp(str, tok->str) != 0) - return false; - - tok = tok->next; - if (!tok && *p) - return false; - } - - // The end of the pattern has been reached and nothing wrong has been found - return true; -} - -bool TOKEN::isName() const -{ - return _isName; -} - -bool TOKEN::isNumber() const -{ - return _isNumber; -} - - -bool TOKEN::IsStandardType(const char str[]) -{ - if (!str) - return false; - bool Ret = false; - const char *type[] = {"bool","char","short","int","long","float","double",0}; - for (int i = 0; type[i]; i++) - Ret |= (strcmp(str,type[i])==0); - return Ret; -} - -//--------------------------------------------------------------------------- - -const TOKEN *TOKEN::findmatch(const TOKEN *tok, const char pattern[], const char *varname1[], const char *varname2[]) -{ - for ( ; tok; tok = tok->next) - { - if ( TOKEN::Match(tok, pattern, varname1, varname2) ) - return tok; - } - return 0; -} - -const TOKEN *TOKEN::findtoken(const TOKEN *tok1, const char *tokenstr[]) -{ - for (const TOKEN *ret = tok1; ret; ret = ret->next) - { - unsigned int i = 0; - const TOKEN *tok = ret; - while (tokenstr[i]) - { - if (!tok) - return NULL; - if (*(tokenstr[i]) && strcmp(tokenstr[i],tok->str)) - break; - tok = tok->next; - i++; - } - if (!tokenstr[i]) - return ret; - } - return NULL; -} +/* + * c++check - c/c++ syntax checking + * Copyright (C) 2007-2008 Daniel Marjamäki and Reijo Tomperi + * + * 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 + +#ifdef __BORLANDC__ +#include // isalpha, isdigit +#endif + +TOKEN::TOKEN() +{ + FileIndex = 0; + _str = 0; + linenr = 0; + next = 0; + _isName = false; + _isNumber = false; +} + +TOKEN::~TOKEN() +{ + std::free(_str); +} + +void TOKEN::setstr( const char s[] ) +{ + std::free(_str); +#ifndef _MSC_VER + _str = strdup(s); +#else + _str = _strdup(s); +#endif + str = _str ? _str : ""; + + _isName = bool(str[0]=='_' || isalpha(str[0])); + _isNumber = bool(isdigit(str[0]) != 0); +} + +void TOKEN::combineWithNext(const char str1[], const char str2[]) +{ + if (!(next)) + return; + if (strcmp(str,str1) || strcmp(next->str,str2)) + return; + + std::string newstr(std::string(str1) + std::string(str2)); + setstr( newstr.c_str() ); + deleteNext(); +} + +void TOKEN::deleteNext() +{ + TOKEN *n = next; + next = n->next; + delete n; +} + +const TOKEN *TOKEN::tokAt(int index) const +{ + const TOKEN *tok = this; + while (index>0 && tok) + { + tok = tok->next; + index--; + } + return tok; +} + +const char *TOKEN::strAt(int index) const +{ + const TOKEN *tok = this->tokAt(index); + return tok ? tok->str : ""; +} + +bool TOKEN::Match(const TOKEN *tok, const char pattern[], const char *varname1[], const char *varname2[]) +{ + if (!tok) + return false; + + const char *p = pattern; + while (*p) + { + // Skip spaces in pattern.. + while ( *p == ' ' ) + p++; + + // Extract token from pattern.. + char str[50]; + char *s = str; + while (*p && *p!=' ') + { + *s = *p; + s++; + p++; + } + *s = 0; + + // No token => Success! + if (str[0] == 0) + return true; + + // Any symbolname.. + if (strcmp(str,"%var%")==0 || strcmp(str,"%type%")==0) + { + if (!tok->isName()) + return false; + } + + // Variable name.. + else if (strcmp(str,"%var1%")==0 || strcmp(str,"%var2%")==0) + { + const char **varname = (strcmp(str,"%var1%")==0) ? varname1 : varname2; + + if ( ! varname ) + return false; + + if (strcmp(tok->str, varname[0]) != 0) + return false; + + for ( int i = 1; varname[i]; i++ ) + { + if ( !(tok->tokAt(2)) ) + return false; + + if ( strcmp(tok->strAt( 1), ".") ) + return false; + + if ( strcmp(tok->strAt( 2), varname[i]) ) + return false; + + tok = tok->tokAt(2); + } + } + + else if (strcmp(str,"%num%")==0) + { + if ( ! tok->isNumber() ) + return false; + } + + + else if (strcmp(str,"%str%")==0) + { + if ( tok->str[0] != '\"' ) + return false; + } + + // [.. => search for a one-character token.. + else if (str[0]=='[' && strchr(str, ']') && tok->str[1] == 0) + { + *strrchr(str, ']') = 0; + if ( strchr( str + 1, tok->str[0] ) == 0 ) + return false; + } + + else if (strcmp(str, tok->str) != 0) + return false; + + tok = tok->next; + if (!tok && *p) + return false; + } + + // The end of the pattern has been reached and nothing wrong has been found + return true; +} + +bool TOKEN::isName() const +{ + return _isName; +} + +bool TOKEN::isNumber() const +{ + return _isNumber; +} + + +bool TOKEN::IsStandardType(const char str[]) +{ + if (!str) + return false; + bool Ret = false; + const char *type[] = {"bool","char","short","int","long","float","double",0}; + for (int i = 0; type[i]; i++) + Ret |= (strcmp(str,type[i])==0); + return Ret; +} + +//--------------------------------------------------------------------------- + +const TOKEN *TOKEN::findmatch(const TOKEN *tok, const char pattern[], const char *varname1[], const char *varname2[]) +{ + for ( ; tok; tok = tok->next) + { + if ( TOKEN::Match(tok, pattern, varname1, varname2) ) + return tok; + } + return 0; +} + +const TOKEN *TOKEN::findtoken(const TOKEN *tok1, const char *tokenstr[]) +{ + for (const TOKEN *ret = tok1; ret; ret = ret->next) + { + unsigned int i = 0; + const TOKEN *tok = ret; + while (tokenstr[i]) + { + if (!tok) + return NULL; + if (*(tokenstr[i]) && strcmp(tokenstr[i],tok->str)) + break; + tok = tok->next; + i++; + } + if (!tokenstr[i]) + return ret; + } + return NULL; +}