summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am1
-rw-r--r--src/rulebase.cpp19
-rw-r--r--src/rulebase.h3
-rw-r--r--src/rules/copyconstructor.cpp78
-rw-r--r--src/rules/final.cpp2
-rw-r--r--src/stringutils.cpp13
-rw-r--r--src/stringutils.h9
-rw-r--r--src/template.hpp1
8 files changed, 117 insertions, 9 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 4992044..0375ff2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -19,6 +19,7 @@ mplint_SOURCES = \
template.hpp \
rules/brackets.cpp \
rules/constructor.cpp \
+ rules/copyconstructor.cpp \
rules/debug.cpp \
rules/dump.cpp \
rules/final.cpp \
diff --git a/src/rulebase.cpp b/src/rulebase.cpp
index f44421c..207d116 100644
--- a/src/rulebase.cpp
+++ b/src/rulebase.cpp
@@ -35,10 +35,21 @@ RuleBase::RuleBase() :
void RuleBase::print(const std::string &text) const
{
- printf("[%s:%d]: V%s: %s\n", file.c_str(), line,
- ruleName.c_str(), text.c_str());
-// printf("%s [%s:%d]: V%s: %s\n", ruleName.c_str(),
-// file.c_str(), line, ruleName.c_str(), text.c_str());
+ printf("[%s:%d]: V%s: %s\n",
+ file.c_str(),
+ line,
+ ruleName.c_str(),
+ text.c_str());
+}
+
+void RuleBase::print(const std::string &text,
+ const int lineNumber) const
+{
+ printf("[%s:%d]: V%s: %s\n",
+ file.c_str(),
+ lineNumber,
+ ruleName.c_str(),
+ text.c_str());
}
void RuleBase::printRaw(const std::string &text) const
diff --git a/src/rulebase.h b/src/rulebase.h
index 3263a8c..e8da0d0 100644
--- a/src/rulebase.h
+++ b/src/rulebase.h
@@ -73,6 +73,9 @@ class RuleBase
void print(const std::string &text) const;
+ void print(const std::string &text,
+ const int lineNumber) const;
+
void printRaw(const std::string &text) const;
std::string getFile() const
diff --git a/src/rules/copyconstructor.cpp b/src/rules/copyconstructor.cpp
new file mode 100644
index 0000000..3aeeccb
--- /dev/null
+++ b/src/rules/copyconstructor.cpp
@@ -0,0 +1,78 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2014 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * 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
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "template.hpp"
+
+registerRuleExt(copyConstructor, "016", "(.+)[.](cpp|h)")
+
+namespace
+{
+ std::set<std::string> mClasses;
+ std::map<std::string, int> mLines;
+} // namespace
+
+startRule(copyConstructor)
+{
+ if (strEndWith(file, "debug/debug_new.cpp")
+ || strEndWith(file, "debug/fast_mutex.h")
+ || strEndWith(file, "debug/debug_new.h"))
+ {
+ terminateRule();
+ }
+}
+
+endRule(copyConstructor)
+{
+ FOR_EACH(std::set<std::string>::const_iterator, it, mClasses)
+ {
+ print("Missing copy constructor marker A_DELETE_COPY / A_DEFAULT_COPY"
+ " for class " + *it, mLines[*it]);
+ }
+ mClasses.clear();
+ mLines.clear();
+}
+
+parseLineRule(copyConstructor)
+{
+ std::smatch m;
+ if (isMatch(data, "(.*)(class|struct) ([a-zA-Z_0123456789]+)"
+ " (|not)final(.*)",
+ m))
+ {
+ const std::string str = m.str(3);
+ mClasses.insert(str);
+ mLines[str] = line;
+ }
+ else if (isMatch(data, "([ ]*)(A_DELETE_COPY|A_DEFAULT_COPY)[(]"
+ "([a-zA-Z_0123456789]+)[)](.*)",
+ m))
+ {
+ const std::string str = m.str(3);
+ if (mClasses.find(str) != mClasses.end())
+ {
+ mClasses.erase(str);
+ mLines.erase(str);
+ }
+ else
+ {
+ print("Wrong A_DELETE_COPY or A_DEFAULT_COPY marker");
+ }
+ }
+}
diff --git a/src/rules/final.cpp b/src/rules/final.cpp
index a3ef501..bc2acb7 100644
--- a/src/rules/final.cpp
+++ b/src/rules/final.cpp
@@ -38,7 +38,7 @@ endRule(finalCheck)
parseLineRule(finalCheck)
{
- if (isMatch(data, "([ ]*)(class|struct) ([a-zA-Z_0123456789]+)"
+ if (isMatch(data, "([ ]*)(static |)(class|struct) ([a-zA-Z_0123456789]+)"
"($|( [:])([^;]+)(.*))"))
{
print("Need add final or notfinal into class declaration");
diff --git a/src/stringutils.cpp b/src/stringutils.cpp
index 1f5ff47..e903941 100644
--- a/src/stringutils.cpp
+++ b/src/stringutils.cpp
@@ -22,14 +22,12 @@
#include "stringutils.h"
-#include <string>
#include <algorithm>
#include <cctype>
#include <cstdarg>
#include <cstdio>
#include <ctime>
#include <list>
-#include <regex>
#include <sys/stat.h>
@@ -708,12 +706,21 @@ void secureChatCommand(std::string &str)
str = "_" + str;
}
-bool isMatch(const std::string &str, const std::string &exp)
+bool isMatch(const std::string &str,
+ const std::string &exp)
{
std::regex regExp(exp);
return std::regex_match(str, regExp);
}
+bool isMatch(const std::string &str,
+ const std::string &exp,
+ std::smatch &m)
+{
+ std::regex regExp(exp);
+ return std::regex_match(str, m, regExp);
+}
+
bool fileExists(const std::string &name)
{
struct stat statbuf;
diff --git a/src/stringutils.h b/src/stringutils.h
index 3cbcdb9..c34b8c7 100644
--- a/src/stringutils.h
+++ b/src/stringutils.h
@@ -25,9 +25,11 @@
#include "stringvector.h"
+#include <string>
#include <sstream>
#include <list>
#include <set>
+#include <regex>
#include "localconsts.h"
@@ -237,7 +239,12 @@ bool isDigit(const std::string &str);
void secureChatCommand(std::string &str);
-bool isMatch(const std::string &str, const std::string &exp);
+bool isMatch(const std::string &str,
+ const std::string &exp);
+
+bool isMatch(const std::string &str,
+ const std::string &exp,
+ std::smatch &m);
bool fileExists(const std::string &name);
diff --git a/src/template.hpp b/src/template.hpp
index 25c7b88..cf67ebe 100644
--- a/src/template.hpp
+++ b/src/template.hpp
@@ -21,6 +21,7 @@
#include "rulebase.h"
#include "stringutils.h"
+#include <map>
#include <regex>
#include "localconsts.h"