]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/util/string.cpp
Omnicleanup: header cleanup, add ModApiUtil shared between game and mainmenu
[dragonfireclient.git] / src / util / string.cpp
index c10755ae1dba68d47c314ab9821ead0d06bbb54b..2c1dea49706cb97f899a87b6c5dffc8660a4f91d 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2010-2012 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -18,9 +18,34 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "string.h"
+#include "pointer.h"
 
 #include "../sha1.h"
 #include "../base64.h"
+#include "../porting.h"
+
+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;
+}
+
+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;
+}
 
 // Get an sha-1 hash of the player's name combined with
 // the password entered. That's what the server uses as
@@ -48,6 +73,45 @@ size_t curl_write_data(char *ptr, size_t size, size_t nmemb, void *userdata) {
     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;