inline void writeU8(std::ostream &os, u8 p)
{
- char buf[1];
+ char buf[1] = {0};
writeU8((u8*)buf, p);
os.write(buf, 1);
}
inline u8 readU8(std::istream &is)
{
- char buf[1];
+ char buf[1] = {0};
is.read(buf, 1);
return readU8((u8*)buf);
}
inline void writeU16(std::ostream &os, u16 p)
{
- char buf[2];
+ char buf[2] = {0};
writeU16((u8*)buf, p);
os.write(buf, 2);
}
inline u16 readU16(std::istream &is)
{
- char buf[2];
+ char buf[2] = {0};
is.read(buf, 2);
return readU16((u8*)buf);
}
inline void writeU32(std::ostream &os, u32 p)
{
- char buf[4];
+ char buf[4] = {0};
writeU32((u8*)buf, p);
os.write(buf, 4);
}
inline u32 readU32(std::istream &is)
{
- char buf[4];
+ char buf[4] = {0};
is.read(buf, 4);
return readU32((u8*)buf);
}
inline void writeS32(std::ostream &os, s32 p)
{
- char buf[4];
+ char buf[4] = {0};
writeS32((u8*)buf, p);
os.write(buf, 4);
}
inline s32 readS32(std::istream &is)
{
- char buf[4];
+ char buf[4] = {0};
is.read(buf, 4);
return readS32((u8*)buf);
}
inline void writeS16(std::ostream &os, s16 p)
{
- char buf[2];
+ char buf[2] = {0};
writeS16((u8*)buf, p);
os.write(buf, 2);
}
inline s16 readS16(std::istream &is)
{
- char buf[2];
+ char buf[2] = {0};
is.read(buf, 2);
return readS16((u8*)buf);
}
inline void writeS8(std::ostream &os, s8 p)
{
- char buf[1];
+ char buf[1] = {0};
writeS8((u8*)buf, p);
os.write(buf, 1);
}
inline s8 readS8(std::istream &is)
{
- char buf[1];
+ char buf[1] = {0};
is.read(buf, 1);
return readS8((u8*)buf);
}
inline void writeF1000(std::ostream &os, f32 p)
{
- char buf[4];
+ char buf[4] = {0};
writeF1000((u8*)buf, p);
os.write(buf, 4);
}
inline f32 readF1000(std::istream &is)
{
- char buf[4];
+ char buf[4] = {0};
is.read(buf, 4);
return readF1000((u8*)buf);
}
inline void writeV2F1000(std::ostream &os, v2f p)
{
- char buf[8];
+ char buf[8] = {0};
writeV2F1000((u8*)buf, p);
os.write(buf, 8);
}
inline v2f readV2F1000(std::istream &is)
{
- char buf[8];
+ char buf[8] = {0};
is.read(buf, 8);
return readV2F1000((u8*)buf);
}
inline void writeV2S16(std::ostream &os, v2s16 p)
{
- char buf[4];
+ char buf[4] = {0};
writeV2S16((u8*)buf, p);
os.write(buf, 4);
}
inline v2s16 readV2S16(std::istream &is)
{
- char buf[4];
+ char buf[4] = {0};
is.read(buf, 4);
return readV2S16((u8*)buf);
}
inline void writeV3S16(std::ostream &os, v3s16 p)
{
- char buf[6];
+ char buf[6] = {0};
writeV3S16((u8*)buf, p);
os.write(buf, 6);
}
inline v3s16 readV3S16(std::istream &is)
{
- char buf[6];
+ char buf[6] = {0};
is.read(buf, 6);
return readV3S16((u8*)buf);
}
u32 *m_result;
};
+// Tests if two strings are equal, optionally case insensitive
+inline bool str_equal(const std::wstring& s1, const std::wstring& s2,
+ bool case_insensitive = false)
+{
+ if(case_insensitive)
+ {
+ if(s1.size() != s2.size())
+ return false;
+ for(size_t i = 0; i < s1.size(); ++i)
+ if(tolower(s1[i]) != tolower(s2[i]))
+ return false;
+ return true;
+ }
+ else
+ {
+ return s1 == s2;
+ }
+}
+
+// Tests if the second string is a prefix of the first, optionally case insensitive
+inline bool str_starts_with(const std::wstring& str, const std::wstring& prefix,
+ bool case_insensitive = false)
+{
+ if(str.size() < prefix.size())
+ return false;
+ if(case_insensitive)
+ {
+ for(size_t i = 0; i < prefix.size(); ++i)
+ if(tolower(str[i]) != tolower(prefix[i]))
+ return false;
+ }
+ else
+ {
+ for(size_t i = 0; i < prefix.size(); ++i)
+ if(str[i] != prefix[i])
+ return false;
+ }
+ return true;
+}
+
// Calculates the borders of a "d-radius" cube
inline void getFacePositions(core::list<v3s16> &list, u16 d)
{
// MSVC2010 includes it's own versions of these
//#if !defined(_MSC_VER) || _MSC_VER < 1600
-inline s32 mystoi(std::string s)
+inline s32 mystoi(const std::string &s)
{
return atoi(s.c_str());
}
-inline s32 mystoi(std::wstring s)
+inline s32 mystoi(const std::wstring &s)
{
return atoi(wide_to_narrow(s).c_str());
}
-inline float mystof(std::string s)
+inline float mystof(const std::string &s)
{
- float f;
+ // This crap causes a segfault in certain cases on MinGW
+ /*float f;
std::istringstream ss(s);
ss>>f;
- return f;
+ return f;*/
+ // This works in that case
+ return atof(s.c_str());
}
//#endif
#define MYMIN(a,b) ((a)<(b)?(a):(b))
#define MYMAX(a,b) ((a)>(b)?(a):(b))
+/*
+ Returns nearest 32-bit integer for given floating point number.
+ <cmath> and <math.h> in VC++ don't provide round().
+*/
+inline s32 myround(f32 f)
+{
+ return floor(f + 0.5);
+}
+
/*
Returns integer position of node in given floating point position
*/
//
-inline u32 time_to_daynight_ratio(u32 time_of_day)
-{
- const s32 daylength = 16;
- const s32 nightlength = 6;
- const s32 daytimelength = 8;
- s32 d = daylength;
- s32 t = (((time_of_day)%24000)/(24000/d));
- if(t < nightlength/2 || t >= d - nightlength/2)
- //return 300;
- return 350;
- else if(t >= d/2 - daytimelength/2 && t < d/2 + daytimelength/2)
- return 1000;
- else
- return 750;
-}
-
// Random helper. Usually d=BS
inline core::aabbox3d<f32> getNodeBox(v3s16 p, float d)
{