diff options
author | Andrei Karas <akaras@inbox.ru> | 2014-05-24 15:26:07 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2014-05-24 15:26:07 +0300 |
commit | c2c287aff27ad1f665338e746e7ecd4309094b0a (patch) | |
tree | 80106ab2e7847c12dd453bbbd543805dd5702ef0 /src | |
parent | 008f60f47bb9be7a456ed754b45ab4bb14ec436c (diff) | |
download | mplint-c2c287aff27ad1f665338e746e7ecd4309094b0a.tar.gz mplint-c2c287aff27ad1f665338e746e7ecd4309094b0a.tar.bz2 mplint-c2c287aff27ad1f665338e746e7ecd4309094b0a.tar.xz mplint-c2c287aff27ad1f665338e746e7ecd4309094b0a.zip |
Add string utils from manaplus.
update localconsts.
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 3 | ||||
-rw-r--r-- | src/localconsts.h | 15 | ||||
-rw-r--r-- | src/main.cpp | 16 | ||||
-rw-r--r-- | src/rulebase.h | 4 | ||||
-rw-r--r-- | src/stringutils.cpp | 696 | ||||
-rw-r--r-- | src/stringutils.h | 237 | ||||
-rw-r--r-- | src/stringvector.h | 31 | ||||
-rw-r--r-- | src/template.hpp | 7 |
8 files changed, 1000 insertions, 9 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index b90361d..0eeb762 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -13,6 +13,9 @@ mplint_SOURCES = \ main.cpp \ rulebase.cpp \ rulebase.h \ + stringutils.cpp \ + stringutils.h \ + stringvector.h \ template.hpp \ rules/dump.cpp diff --git a/src/localconsts.h b/src/localconsts.h index 7967c02..4086301 100644 --- a/src/localconsts.h +++ b/src/localconsts.h @@ -23,6 +23,8 @@ #define nullptr 0 #define final #define override +#define constexpr +#define noexcept #define A_DELETE(func) #define A_DELETE_COPY(func) #else @@ -32,11 +34,16 @@ #if GCC_VERSION < 40700 #define final #define override -//#define A_DELETE -//#define A_DELETE_COPY +#define constexpr +#define noexcept +// #define A_DELETE +// #define A_DELETE_COPY +#else +#define ADVGCC #endif #undef Z_NULL #define Z_NULL nullptr +#define M_TCPOK #define A_DELETE(func) func = delete #define A_DELETE_COPY(name) name(const name &) = delete; \ name &operator=(const name&) = delete; @@ -45,10 +52,14 @@ #ifdef __GNUC__ #define A_UNUSED __attribute__ ((unused)) #define A_WARN_UNUSED __attribute__ ((warn_unused_result)) +#define DEPRECATED __attribute__ ((deprecated)) +#define restrict __restrict__ #else #define A_UNUSED #define A_WARN_UNUSED #define gnu_printf printf +#define DEPRECATED +#define restrict #endif #ifdef __clang__ #define gnu_printf printf diff --git a/src/main.cpp b/src/main.cpp index af3dbb9..edcb5ce 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,8 +22,20 @@ #include "localconsts.h" -int main(int argc A_UNUSED, char *argv[] A_UNUSED) +static void showHelp() { - lint.run(".."); + printf("mplint - ManaPlus source code lint\n"); + printf("Usage:\n"); + printf("mplint dir\n"); +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) + { + showHelp(); + return 1; + } + lint.run(argv[1]); return 0; } diff --git a/src/rulebase.h b/src/rulebase.h index 6b41445..d205b7d 100644 --- a/src/rulebase.h +++ b/src/rulebase.h @@ -40,10 +40,10 @@ class RuleBase virtual void end() { } - virtual void parseLine(const std::string &data A_UNUSED) + virtual void parseLine(std::string data A_UNUSED) { } - virtual void parseFile(const std::string &data A_UNUSED) + virtual void parseFile(std::string data A_UNUSED) { } const std::set<std::string> &getMasks() const diff --git a/src/stringutils.cpp b/src/stringutils.cpp new file mode 100644 index 0000000..f580266 --- /dev/null +++ b/src/stringutils.cpp @@ -0,0 +1,696 @@ +/* + * The ManaPlus Client + * Copyright (C) 2007-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-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 "stringutils.h" + +#include <string> +#include <algorithm> +#include <cstdarg> +#include <cstdio> +#include <cctype> +#include <list> +#include <ctime> + +std::string &trim(std::string &str) +{ + size_t pos = str.find_last_not_of(' '); + if (pos != std::string::npos) + { + str.erase(pos + 1); + pos = str.find_first_not_of(' '); + + if (pos != std::string::npos) + str.erase(0, pos); + } + else + { + // There is nothing else but whitespace in the string + str.clear(); + } + return str; +} + +std::string &toLower(std::string &str) +{ + std::transform(str.begin(), str.end(), str.begin(), &tolower); + return str; +} + +std::string &toUpper(std::string &str) +{ + std::transform(str.begin(), str.end(), str.begin(), &toupper); + return str; +} + +unsigned int atox(const std::string &str) +{ + unsigned int value; + sscanf(str.c_str(), "0x%06x", &value); + + return value; +} + +const char *ipToString(const uint32_t address) +{ + static char asciiIP[18]; + + snprintf(asciiIP, sizeof(asciiIP), "%i.%i.%i.%i", + static_cast<unsigned char>(address), + static_cast<unsigned char>(address >> 8), + static_cast<unsigned char>(address >> 16), + static_cast<unsigned char>(address >> 24)); + asciiIP[17] = 0; + + return asciiIP; +} + +std::string strprintf(const char *const format, ...) +{ + char buf[257]; + va_list(args); + va_start(args, format); + size_t nb = vsnprintf(buf, 256, format, args); + buf[256] = 0; + va_end(args); + if (nb < 256) + return buf; + + // The static size was not big enough, try again with a dynamic allocation. + ++nb; + char *buf2 = new char[nb]; + va_start(args, format); + vsnprintf(buf2, nb, format, args); + va_end(args); + std::string res(buf2); + delete [] buf2; + return res; +} + +std::string removeColors(std::string msg) +{ + for (unsigned int f = 0; f < msg.length() - 2 && msg.length() > 2; f++) + { + while (msg.length() > f + 2 && msg.at(f) == '#' + && msg.at(f + 1) == '#') + { + msg = msg.erase(f, 3); + } + } + return msg; +} + +int compareStrI(const std::string &a, const std::string &b) +{ + std::string::const_iterator itA = a.begin(); + const std::string::const_iterator endA = a.end(); + std::string::const_iterator itB = b.begin(); + const std::string::const_iterator endB = b.end(); + + for (; itA < endA && itB < endB; ++itA, ++itB) + { + const int comp = tolower(*itA) - tolower(*itB); + if (comp) + return comp; + } + + // Check string lengths + if (itA == endA && itB == endB) + return 0; + else if (itA == endA) + return -1; + else + return 1; +} + + +bool isWordSeparator(const signed char chr) +{ + return (chr == ' ' || chr == ',' || chr == '.' || chr == '"'); +} + +const std::string findSameSubstring(const std::string &restrict str1, + const std::string &restrict str2) +{ + const int minLength = str1.length() > str2.length() + ? static_cast<int>(str2.length()) : static_cast<int>(str1.length()); + for (int f = 0; f < minLength; f ++) + { + if (str1.at(f) != str2.at(f)) + return str1.substr(0, f); + } + return str1.substr(0, minLength); +} + +const std::string findSameSubstringI(const std::string &restrict s1, + const std::string &restrict s2) +{ + std::string str1 = s1; + std::string str2 = s2; + toLower(str1); + toLower(str2); + + const size_t minLength = str1.length() > str2.length() + ? str2.length() : str1.length(); + for (size_t f = 0; f < minLength; f ++) + { + if (str1.at(f) != str2.at(f)) + return s1.substr(0, f); + } + return s1.substr(0, minLength); +} + +size_t findI(std::string str, std::string subStr) +{ + str = toLower(str); + subStr = toLower(subStr); + return str.find(subStr); +} + +size_t findI(std::string text, const StringVect &list) +{ + toLower(text); + FOR_EACH (StringVectCIter, i, list) + { + std::string subStr = *i; + subStr = toLower(subStr); + const size_t idx = text.find(subStr); + if (idx != std::string::npos) + return idx; + } + return std::string::npos; +} + +int base = 94; +int start = 33; + +const std::string encodeStr(unsigned int value, const unsigned int size) +{ + std::string buf; + + do + { + buf += static_cast<signed char>(value % base + start); + value /= base; + } + while (value); + + while (buf.length() < size) + buf += static_cast<signed char>(start); + return buf; +} + + +unsigned int decodeStr(const std::string &str) +{ + if (str.empty()) + return 0; + + int res = str[0] - start; + int mult = 1; + for (unsigned int f = 1; f < str.length(); f ++) + { + mult *= base; + res = res + (str[f] - start) * mult; + } + return res; +} + +std::string extractNameFromSprite(std::string str) +{ + const size_t pos1 = str.rfind("."); + if (pos1 != std::string::npos) + { + size_t pos2 = str.rfind("/"); + const size_t pos3 = str.rfind("\\"); + if (pos3 != std::string::npos) + { + if (pos2 == std::string::npos || pos3 > pos2) + pos2 = pos3; + } + if (pos2 == std::string::npos) + pos2 = static_cast<size_t>(-1); + + const int size = static_cast<int>(pos1) - static_cast<int>(pos2) - 1; + if (size > 0) + str = str.substr(pos2 + 1, size); + } + return str; +} + +std::string removeSpriteIndex(std::string str) +{ + const size_t pos1 = str.rfind("["); + + if (pos1 != std::string::npos) + { + size_t pos2 = str.rfind("/"); + const size_t pos3 = str.rfind("\\"); + if (pos3 != std::string::npos) + { + if (pos2 == std::string::npos || pos3 > pos2) + pos2 = pos3; + } + if (pos2 == std::string::npos) + pos2 = static_cast<size_t>(-1); + + const int size = static_cast<int>(pos1) - static_cast<int>(pos2) - 1; + if (size > 0) + str = str.substr(pos2 + 1, size); + } + return str; +} + +std::string getFileName(const std::string &path) +{ + size_t pos1 = path.rfind("/"); + const size_t pos2 = path.rfind("\\"); + if (pos1 == std::string::npos) + pos1 = pos2; + else if (pos2 != std::string::npos && pos2 > pos1) + pos1 = pos2; + + if (pos1 == std::string::npos) + return path; + return path.substr(pos1 + 1); +} + +std::string getFileDir(const std::string &path) +{ + size_t pos1 = path.rfind("/"); + const size_t pos2 = path.rfind("\\"); + if (pos1 == std::string::npos) + pos1 = pos2; + else if (pos2 != std::string::npos && pos2 > pos1) + pos1 = pos2; + + if (pos1 == std::string::npos) + return path; + return path.substr(0, pos1); +} + +std::string& replaceAll(std::string& context, const std::string &restrict from, + const std::string &restrict to) +{ + if (from.empty()) + return context; + size_t lookHere = 0; + size_t foundHere; + const size_t fromSize = from.size(); + const size_t toSize = to.size(); + while ((foundHere = context.find(from, lookHere)) != std::string::npos) + { + context.replace(foundHere, fromSize, to); + lookHere = foundHere + toSize; + } + return context; +} + +bool getBoolFromString(const std::string &text) +{ + std::string txt = text; + toLower(trim(txt)); + if (txt == "true" || txt == "yes" || txt == "on" || txt == "1") + return true; + else if (txt == "false" || txt == "no" || txt == "off" || txt == "0") + return false; + else + return static_cast<bool>(atoi(txt.c_str())); +} + +void replaceSpecialChars(std::string &text) +{ + size_t pos1 = text.find("&"); + while (pos1 != std::string::npos) + { + const size_t idx = pos1 + 1; + const size_t sz = text.size(); + if (idx >= sz) + break; + + size_t f; + for (f = idx; f < sz; f ++) + { + if (text[f] < '0' || text[f] > '9') + break; + } + if (idx + 1 < f && text[f] == ';') + { + std::string str(" "); + str[0] = static_cast<signed char>(atoi(text.substr( + idx, f - idx).c_str())); + text = text.substr(0, pos1) + str + text.substr(f + 1); + pos1 += 1; + } + else + { + pos1 = f + 1; + } + + pos1 = text.find("&", pos1); + } +} + +std::string normalize(const std::string &name) +{ + std::string normalized = name; + return toLower(trim(normalized)); +} + +void splitToIntSet(std::set<int> &tokens, + const std::string &text, + const char separator) +{ + std::stringstream ss(text); + std::string item; + while (std::getline(ss, item, separator)) + tokens.insert(atoi(item.c_str())); +} + +std::list<int> splitToIntList(const std::string &text, + const char separator) +{ + std::list<int> tokens; + std::stringstream ss(text); + std::string item; + while (std::getline(ss, item, separator)) + tokens.push_back(atoi(item.c_str())); + + return tokens; +} + +std::list<std::string> splitToStringList(const std::string &text, + const char separator) +{ + std::list<std::string> tokens; + std::stringstream ss(text); + std::string item; + while (std::getline(ss, item, separator)) + tokens.push_back(item); + + return tokens; +} + +void splitToStringVector(StringVect &tokens, const std::string &text, + const char separator) +{ + std::stringstream ss(text); + std::string item; + while (std::getline(ss, item, separator)) + { + item = trim(item); + if (!item.empty()) + tokens.push_back(item); + } +} + +void splitToStringSet(std::set<std::string> &tokens, const std::string &text, + const char separator) +{ + std::stringstream ss(text); + std::string item; + while (std::getline(ss, item, separator)) + { + item = trim(item); + if (!item.empty()) + tokens.insert(item); + } +} + +void splitToIntVector(std::vector<int> &tokens, const std::string &text, + const char separator) +{ + std::stringstream ss(text); + std::string item; + while (std::getline(ss, item, separator)) + { + item = trim(item); + if (!item.empty()) + tokens.push_back(atoi(item.c_str())); + } +} + +std::string combineDye(std::string file, const std::string &dye) +{ + if (dye.empty()) + return file; + const size_t pos = file.find_last_of("|"); + if (pos != std::string::npos) + return file.substr(0, pos).append("|").append(dye); + return file.append("|").append(dye); +} + +std::string combineDye2(std::string file, const std::string &dye) +{ + if (dye.empty()) + return file; + + const size_t pos = file.find_last_of("|"); + if (pos != std::string::npos) + { + const std::string dye1 = file.substr(pos + 1); + std::string str; + file = file.substr(0, pos); + const std::list<std::string> list1 = splitToStringList(dye1, ';'); + const std::list<std::string> list2 = splitToStringList(dye, ';'); + for (std::list<std::string>::const_iterator it1 = list1.begin(), + it2 = list2.begin(), it1_end = list1.end(), it2_end = list2.end(); + it1 != it1_end && it2 != it2_end; ++it1, ++it2) + { + str.append(*it1).append(":").append(*it2).append(";"); + } + return file.append("|").append(str); + } + else + { + return file; + } +} + +std::string combineDye3(std::string file, const std::string &dye) +{ + if (dye.empty()) + return file; + + const size_t pos = file.find_last_of("|"); + if (pos != std::string::npos) + { + const std::string dye1 = file.substr(pos + 1); + std::string str; + file = file.substr(0, pos); + const std::list<std::string> list1 = splitToStringList(dye1, ';'); + const std::list<std::string> list2 = splitToStringList(dye, ';'); + for (std::list<std::string>::const_iterator it1 = list1.begin(), + it2 = list2.begin(), it1_end = list1.end(), it2_end = list2.end(); + it1 != it1_end && it2 != it2_end; ++it1, ++it2) + { + str.append(*it1).append(":").append(*it2).append(";"); + } + return file.append("|").append(str); + } + else + { + if (dye.empty() || file.empty()) + return file; + else + return file.append("|").append(dye); + } +} + +std::string packList(const std::list<std::string> &list) +{ + std::list<std::string>::const_iterator i = list.begin(); + std::string str; + while (i != list.end()) + { + str.append(*i).append("|"); + ++ i; + } + const size_t sz = str.size(); + if (sz > 1) + str = str.substr(0, sz - 1); + return str; +} + +std::list<std::string> unpackList(const std::string &str) +{ + return splitToStringList(str, '|'); +} + +std::string stringToHexPath(const std::string &str) +{ + if (str.empty()) + return ""; + + std::string hex = strprintf("%%%2x/", static_cast<int>(str[0])); + for (unsigned f = 1, sz = static_cast<unsigned>(str.size()); f < sz; f ++) + hex.append(strprintf("%%%2x", static_cast<int>(str[f]))); + return hex; +} + +void deleteCharLeft(std::string &str, unsigned *const pos) +{ + if (!pos) + return; + + while (*pos > 0) + { + (*pos)--; + const int v = str[*pos]; + str.erase(*pos, 1); + if ((v & 192) != 128) + break; + } +} + +bool findLast(const std::string &restrict str1, + const std::string &restrict str2) +{ + const size_t s1 = str1.size(); + const size_t s2 = str2.size(); + if (s1 < s2) + return false; + if (str1.substr(s1 - s2) == str2) + return true; + return false; +} + +bool findFirst(const std::string &restrict str1, + const std::string &restrict str2) +{ + const size_t s1 = str1.size(); + const size_t s2 = str2.size(); + if (s1 < s2) + return false; + if (str1.substr(0, s2) == str2) + return true; + return false; +} + +bool findCutLast(std::string &restrict str1, const std::string &restrict str2) +{ + const size_t s1 = str1.size(); + const size_t s2 = str2.size(); + if (s1 < s2) + return false; + if (str1.substr(s1 - s2) == str2) + { + str1 = str1.substr(0, s1 - s2); + return true; + } + return false; +} + +bool findCutFirst(std::string &restrict str1, const std::string &restrict str2) +{ + const size_t s1 = str1.size(); + const size_t s2 = str2.size(); + if (s1 < s2) + return false; + if (str1.substr(0, s2) == str2) + { + str1 = str1.substr(s2); + return true; + } + return false; +} + +std::string &removeProtocol(std::string &url) +{ + const size_t i = url.find("://"); + if (i != std::string::npos) + url = url.substr(i + 3); + return url; +} + +bool strStartWith(const std::string &restrict str1, + const std::string &restrict str2) +{ + const size_t sz2 = str2.size(); + if (str1.size() < sz2) + return false; + return str1.substr(0, sz2) == str2; +} + +std::string getDateString() +{ + char buffer[80]; + time_t rawtime; + time(&rawtime); + const tm *const timeinfo = localtime(&rawtime); + + strftime(buffer, 79, "%Y-%m-%d", timeinfo); + return std::string(buffer); +} + +signed char parseBoolean(const std::string &value) +{ + const std::string opt = value.substr(0, 1); + + if (opt == "1" || + opt == "y" || opt == "Y" || + opt == "t" || opt == "T") + return 1; + else if (opt == "0" || + opt == "n" || opt == "N" || + opt == "f" || opt == "F") + return 0; + else + return -1; +} + +std::string encodeLinkText(std::string data) +{ + return replaceAll(data, "|", "\342\235\230"); +} + +std::string decodeLinkText(std::string data) +{ + return replaceAll(data, "\342\235\230", "|"); +} + +std::string toStringPrint(const unsigned int val) +{ + static char str[100]; + snprintf(str, sizeof(str), "%u 0x%x", val, val); + str[99] = 0; + return str; +} + +bool isDigit(const std::string &str) +{ + if (str.empty()) + return false; + const size_t sz = str.size(); + for (size_t f = 0; f < sz; f ++) + { + const char &chr = str[f]; + if (chr < '0' || chr > '9') + return false; + } + return true; +} + +void secureChatCommand(std::string &str) +{ + if (str[0] == '/' || str[0] == '@' || str[0] == '#') + str = "_" + str; +} diff --git a/src/stringutils.h b/src/stringutils.h new file mode 100644 index 0000000..8943317 --- /dev/null +++ b/src/stringutils.h @@ -0,0 +1,237 @@ +/* + * The ManaPlus Client + * Copyright (C) 2007-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-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/>. + */ + +#ifndef STRINGUTILS_H +#define STRINGUTILS_H + +#include "stringvector.h" + +#include <sstream> +#include <list> +#include <set> + +#include "localconsts.h" + +/** + * Trims spaces off the end and the beginning of the given string. + * + * @param str the string to trim spaces off + * @return a reference to the trimmed string + */ +std::string &trim(std::string &str); + +/** + * Converts the given string to lower case. + * + * @param str the string to convert to lower case + * @return a reference to the given string converted to lower case + */ +std::string &toLower(std::string &str); + +/** + * Converts the given string to upper case. + * + * @param str the string to convert to upper case + * @return a reference to the given string converted to upper case + */ +std::string &toUpper(std::string &str); + + +/** + * Converts an ascii hexidecimal string to an integer + * + * @param str the hex string to convert to an int + * @return the integer representation of the hex string + */ +unsigned int atox(const std::string &str) A_WARN_UNUSED; + +template<typename T> std::string toString(const T &arg) A_WARN_UNUSED; + +/** + * Converts the given value to a string using std::stringstream. + * + * @param arg the value to convert to a string + * @return the string representation of arg + */ +template<typename T> std::string toString(const T &arg) +{ + std::stringstream ss; + ss << arg; + return ss.str(); +} + +std::string toStringPrint(const unsigned int val); + +/** + * Converts the given IP address to a string. + * + * The returned string is statically allocated, and shouldn't be freed. It is + * changed upon the next use of this method. + * + * @param address the address to convert to a string + * @return the string representation of the address + */ +const char *ipToString(const uint32_t address) A_WARN_UNUSED; + +/** + * A safe version of sprintf that returns a std::string of the result. + */ +std::string strprintf(const char *const format, ...) A_WARN_UNUSED +#ifdef __GNUC__ + /* This attribute is nice: it even works through gettext invokation. For + example, gcc will complain that strprintf(_("%s"), 42) is ill-formed. */ +#ifdef __OpenBSD__ + __attribute__((__format__(printf, 1, 2))) +#else + __attribute__((__format__(gnu_printf, 1, 2))) +#endif +#endif +; + +/** + * Removes colors from a string + * + * @param msg the string to remove the colors from + * @return string without colors + */ +std::string removeColors(std::string msg) A_WARN_UNUSED; + +const std::string findSameSubstring(const std::string &restrict str1, + const std::string &restrict str2); + +const std::string findSameSubstringI(const std::string &restrict str1, + const std::string &restrict str2); + +/** + * Compares the two strings case-insensitively. + * + * @param a the first string in the comparison + * @param b the second string in the comparison + * @return 0 if the strings are equal, positive if the first is greater, + * negative if the second is greater + */ +int compareStrI(const std::string &a, const std::string &b) A_WARN_UNUSED; + +/** + * Tells wether the character is a word separator. + */ +bool isWordSeparator(const signed char chr) A_WARN_UNUSED; + +size_t findI(std::string str, std::string subStr) A_WARN_UNUSED; + +size_t findI(std::string text, const StringVect &list) A_WARN_UNUSED; + +const std::string encodeStr(unsigned int value, + const unsigned int size = 0) A_WARN_UNUSED; + +unsigned int decodeStr(const std::string &str) A_WARN_UNUSED; + +std::string extractNameFromSprite(std::string str) A_WARN_UNUSED; + +std::string removeSpriteIndex(std::string str) A_WARN_UNUSED; + +std::string getFileName(const std::string &path) A_WARN_UNUSED; + +std::string getFileDir(const std::string &path) A_WARN_UNUSED; + +std::string& replaceAll(std::string& context, const std::string &restrict from, + const std::string &restrict to); + +/** + * Returns a bool value depending on the given string value. + * + * @param text the string used to get the bool value + * @return a boolean value.. + */ +bool getBoolFromString(const std::string &text) A_WARN_UNUSED; + +void replaceSpecialChars(std::string &text); + +/** + * Normalize a string, which means lowercase and trim it. + */ +std::string normalize(const std::string &name) A_WARN_UNUSED; + +void splitToIntSet(std::set<int> &tokens, const std::string &text, + const char separator); + +std::list<int> splitToIntList(const std::string &text, + const char separator) A_WARN_UNUSED; + +std::list<std::string> splitToStringList(const std::string &text, + const char separator) A_WARN_UNUSED; + +void splitToStringVector(StringVect &tokens, + const std::string &text, const char separator); + +void splitToStringSet(std::set<std::string> &tokens, + const std::string &text, const char separator); + +void splitToIntVector(std::vector<int> &tokens, + const std::string &text, const char separator); + +std::string combineDye(std::string file, const std::string &dye) A_WARN_UNUSED; + +std::string combineDye2(std::string file, + const std::string &dye) A_WARN_UNUSED; + +std::string combineDye3(std::string file, + const std::string &dye) A_WARN_UNUSED; + +std::string packList(const std::list<std::string> &list) A_WARN_UNUSED; + +std::list<std::string> unpackList(const std::string &str) A_WARN_UNUSED; + +std::string stringToHexPath(const std::string &str) A_WARN_UNUSED; + +void deleteCharLeft(std::string &str, unsigned *const pos); + +bool findLast(const std::string &restrict str1, + const std::string &restrict str2) A_WARN_UNUSED; + +bool findFirst(const std::string &restrict str1, + const std::string &restrict str2) A_WARN_UNUSED; + +bool findCutLast(std::string &restrict str1, + const std::string &restrict str2) A_WARN_UNUSED; + +bool findCutFirst(std::string &restrict str1, + const std::string &restrict str2) A_WARN_UNUSED; + +std::string &removeProtocol(std::string &url); + +bool strStartWith(const std::string &restrict str, + const std::string &restrict start) A_WARN_UNUSED; + +std::string getDateString() A_WARN_UNUSED; + +signed char parseBoolean(const std::string &value); + +std::string encodeLinkText(std::string data); + +std::string decodeLinkText(std::string data); + +bool isDigit(const std::string &str); + +void secureChatCommand(std::string &str); + +#endif // STRINGUTILS_H diff --git a/src/stringvector.h b/src/stringvector.h new file mode 100644 index 0000000..1aced69 --- /dev/null +++ b/src/stringvector.h @@ -0,0 +1,31 @@ +/* + * The ManaPlus Client + * Copyright (C) 2012-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/>. + */ + +#ifndef STRINGVECTOR_H +#define STRINGVECTOR_H + +#include <string> +#include <vector> + +typedef std::vector<std::string> StringVect; +typedef StringVect::iterator StringVectIter; +typedef StringVect::const_iterator StringVectCIter; + +#endif // STRINGVECTOR_H diff --git a/src/template.hpp b/src/template.hpp index 7345fff..0002a35 100644 --- a/src/template.hpp +++ b/src/template.hpp @@ -19,6 +19,7 @@ */ #include "rulebase.h" +#include "stringutils.h" #include "localconsts.h" @@ -32,7 +33,7 @@ class name : public RuleBase \ \ void end(); \ \ - void parseLine(const std::string &data); \ + void parseLine(std::string data); \ }; \ \ namespace \ @@ -54,7 +55,7 @@ class name : public RuleBase \ \ void end(); \ \ - void parseLine(const std::string &data); \ + void parseLine(std::string data); \ }; \ \ namespace \ @@ -66,4 +67,4 @@ namespace \ #define constructRule(name) name::name() #define startRule(name) void name::start() #define endRule(name) void name::end() -#define parseLineRule(name) void name::parseLine(const std::string &data) +#define parseLineRule(name) void name::parseLine(std::string data) |