diff options
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/numeric.h | 1 | ||||
-rw-r--r-- | src/util/string.cpp | 65 | ||||
-rw-r--r-- | src/util/string.h | 8 |
3 files changed, 74 insertions, 0 deletions
diff --git a/src/util/numeric.h b/src/util/numeric.h index 5ed4d0e99..a028f1ff2 100644 --- a/src/util/numeric.h +++ b/src/util/numeric.h @@ -120,6 +120,7 @@ inline s16 rangelim(s16 i, s16 max) } #define rangelim(d, min, max) ((d) < (min) ? (min) : ((d)>(max)?(max):(d))) +#define myfloor(x) ((x) > 0.0 ? (int)(x) : (int)(x) - 1) inline v3s16 arealim(v3s16 p, s16 d) { diff --git a/src/util/string.cpp b/src/util/string.cpp index 215ac299d..61b307c60 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "../sha1.h" #include "../base64.h" +#include "../porting.h" // Get an sha-1 hash of the player's name combined with // the password entered. That's what the server uses as @@ -47,3 +48,67 @@ size_t curl_write_data(char *ptr, size_t size, size_t nmemb, void *userdata) { stream->write(ptr, count); return count; } + +u32 readFlagString(std::string str, FlagDesc *flagdesc) { + u32 result = 0; + char *s = &str[0]; + char *flagstr, *strpos = NULL; + + while ((flagstr = strtok_r(s, ",", &strpos))) { + s = NULL; + + while (*flagstr == ' ' || *flagstr == '\t') + flagstr++; + + for (int i = 0; flagdesc[i].name; i++) { + if (!strcasecmp(flagstr, flagdesc[i].name)) { + result |= flagdesc[i].flag; + break; + } + } + } + + return result; +} + +std::string writeFlagString(u32 flags, FlagDesc *flagdesc) { + std::string result; + + for (int i = 0; flagdesc[i].name; i++) { + if (flags & flagdesc[i].flag) { + result += flagdesc[i].name; + result += ", "; + } + } + + size_t len = result.length(); + if (len >= 2) + result.erase(len - 2, 2); + + return result; +} + +char *mystrtok_r(char *s, const char *sep, char **lasts) { + char *t; + + if (!s) + s = *lasts; + + while (*s && strchr(sep, *s)) + s++; + + if (!*s) + return NULL; + + t = s; + while (*t) { + if (strchr(sep, *t)) { + *t++ = '\0'; + break; + } + t++; + } + + *lasts = t; + return s; +} diff --git a/src/util/string.h b/src/util/string.h index 58274c677..a469a074a 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -28,6 +28,11 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <vector> #include <sstream> +struct FlagDesc { + const char *name; + u32 flag; +}; + static inline std::string padStringRight(std::string s, size_t len) { if(len > s.size()) @@ -283,6 +288,9 @@ inline std::string wrap_rows(const std::string &from, u32 rowlen) 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); +char *mystrtok_r(char *s, const char *sep, char **lasts); #endif |