]> git.lizzy.rs Git - minetest.git/blobdiff - src/util/string.h
Standardize tooltip row detection
[minetest.git] / src / util / string.h
index 6c48adeb3d70b0368f4f62b5a7a13d4ebcd03081..54a5a458eaa5124ebfe7aaf1f6e03a1234235b00 100644 (file)
@@ -21,18 +21,24 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define UTIL_STRING_HEADER
 
 #include "../irrlichttypes.h"
-#include "../strfnd.h" // For trim()
-#include "pointer.h"
+#include <stdlib.h>
 #include <string>
 #include <cstring>
 #include <vector>
 #include <sstream>
+#include <cctype>
+
+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
 
 struct FlagDesc {
        const char *name;
        u32 flag;
 };
 
+std::wstring narrow_to_wide(const std::string& mbs);
+std::string wide_to_narrow(const std::wstring& wcs);
+
 static inline std::string padStringRight(std::string s, size_t len)
 {
        if(len > s.size())
@@ -95,29 +101,6 @@ inline bool str_starts_with(const std::wstring& str, const std::wstring& prefix,
        return true;
 }
 
-inline std::wstring narrow_to_wide(const std::string& mbs)
-{
-       size_t wcl = mbs.size();
-       Buffer<wchar_t> wcs(wcl+1);
-       size_t l = mbstowcs(*wcs, mbs.c_str(), wcl);
-       if(l == (size_t)(-1))
-               return L"<invalid multibyte string>";
-       wcs[l] = 0;
-       return *wcs;
-}
-
-inline std::string wide_to_narrow(const std::wstring& wcs)
-{
-       size_t mbl = wcs.size()*4;
-       SharedBuffer<char> mbs(mbl+1);
-       size_t l = wcstombs(*mbs, wcs.c_str(), mbl);
-       if(l == (size_t)(-1))
-               mbs[0] = 0;
-       else
-               mbs[l] = 0;
-       return *mbs;
-}
-
 // Split a string using the given delimiter. Returns a vector containing
 // the component parts.
 inline std::vector<std::wstring> str_split(const std::wstring &str, wchar_t delimiter)
@@ -130,6 +113,16 @@ inline std::vector<std::wstring> str_split(const std::wstring &str, wchar_t deli
        return parts;
 }
 
+inline std::vector<std::string> str_split(const std::string &str, char delimiter) {
+
+       std::vector<std::string> parts;
+       std::stringstream sstr(str);
+       std::string part;
+       while(std::getline(sstr, part, delimiter))
+               parts.push_back(part);
+       return parts;
+}
+
 inline std::string lowercase(const std::string &s)
 {
        std::string s2;
@@ -143,10 +136,33 @@ inline std::string lowercase(const std::string &s)
        return s2;
 }
 
+inline std::string trim(const std::string &s)
+{
+       size_t front = 0;
+       while(s[front] == ' '    ||
+             s[front] == '\t'   ||
+             s[front] == '\r'   ||
+             s[front] == '\n'
+            )
+               ++front;
+
+       size_t back = s.size();
+       while(back > front &&
+             (s[back-1] == ' '  ||
+              s[back-1] == '\t' ||
+              s[back-1] == '\r' ||
+              s[back-1] == '\n'
+             )
+            )
+               --back;
+
+       return s.substr(front, back - front);
+}
+
 inline bool is_yes(const std::string &s)
 {
        std::string s2 = lowercase(trim(s));
-       if(s2 == "y" || s2 == "yes" || s2 == "true" || s2 == "1")
+       if(s2 == "y" || s2 == "yes" || s2 == "true" || atoi(s2.c_str()) != 0)
                return true;
        return false;
 }
@@ -161,6 +177,12 @@ inline s32 mystoi(const std::string &s, s32 min, s32 max)
        return i;
 }
 
+inline s64 stoi64(const std::string &s) {
+       std::stringstream tmp(s);
+       s64 t;
+       tmp >> t;
+       return t;
+}
 
 // MSVC2010 includes it's own versions of these
 //#if !defined(_MSC_VER) || _MSC_VER < 1600
@@ -198,6 +220,12 @@ inline std::string itos(s32 i)
        return o.str();
 }
 
+inline std::string i64tos(s64 i) {
+       std::ostringstream o;
+       o<<i;
+       return o.str();
+}
+
 inline std::string ftos(float f)
 {
        std::ostringstream o;
@@ -293,7 +321,7 @@ inline std::string unescape_string(std::string &s)
 {
        std::string res;
        
-       for (size_t i = 0; i <= s.length(); i++) {
+       for (size_t i = 0; i < s.length(); i++) {
                if (s[i] == '\\')
                        i++;
                res += s[i];
@@ -302,11 +330,25 @@ inline std::string unescape_string(std::string &s)
        return res;
 }
 
+inline bool is_number(const std::string& tocheck)
+{
+       std::string::const_iterator iter = tocheck.begin();
+
+       while (iter != tocheck.end() && std::isdigit(*iter)) {
+               ++iter;
+       }
+
+       return ((!tocheck.empty()) && (iter == tocheck.end()));
+}
+
 std::string translatePassword(std::string playername, std::wstring password);
-size_t curl_write_data(char *ptr, size_t size, size_t nmemb, void *userdata);
-u32 readFlagString(std::string str, FlagDesc *flagdesc);
-std::string writeFlagString(u32 flags, FlagDesc *flagdesc);
+std::string urlencode(std::string str);
+std::string urldecode(std::string str);
+u32 readFlagString(std::string str, const FlagDesc *flagdesc, u32 *flagmask);
+std::string writeFlagString(u32 flags, const FlagDesc *flagdesc, u32 flagmask);
+size_t mystrlcpy(char *dst, const char *src, size_t size);
 char *mystrtok_r(char *s, const char *sep, char **lasts);
+u64 read_seed(const char *str);
 
 #endif