Fixed insufficient error handling in narrow_to_wide, which caused a crash if the path of the userdata directory contained special characters that were not included in the used charset (which is used because of the font)
parent
62e7912577
commit
b82d3f2744
|
@ -613,11 +613,15 @@ inline v3s16 arealim(v3s16 p, s16 d)
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: There seems to be some problem with this on some systems:
|
||||||
|
// http://pastebin.com/vwJP2GZ6
|
||||||
inline std::wstring narrow_to_wide(const std::string& mbs)
|
inline std::wstring narrow_to_wide(const std::string& mbs)
|
||||||
{
|
{
|
||||||
size_t wcl = mbs.size();
|
size_t wcl = mbs.size();
|
||||||
SharedBuffer<wchar_t> wcs(wcl+1);
|
Buffer<wchar_t> wcs(wcl+1);
|
||||||
size_t l = mbstowcs(*wcs, mbs.c_str(), wcl);
|
size_t l = mbstowcs(*wcs, mbs.c_str(), wcl);
|
||||||
|
if(l == (size_t)(-1))
|
||||||
|
return L"<invalid multibyte string>";
|
||||||
wcs[l] = 0;
|
wcs[l] = 0;
|
||||||
return *wcs;
|
return *wcs;
|
||||||
}
|
}
|
||||||
|
@ -627,7 +631,7 @@ inline std::string wide_to_narrow(const std::wstring& wcs)
|
||||||
size_t mbl = wcs.size()*4;
|
size_t mbl = wcs.size()*4;
|
||||||
SharedBuffer<char> mbs(mbl+1);
|
SharedBuffer<char> mbs(mbl+1);
|
||||||
size_t l = wcstombs(*mbs, wcs.c_str(), mbl);
|
size_t l = wcstombs(*mbs, wcs.c_str(), mbl);
|
||||||
if((int)l == -1)
|
if(l == (size_t)(-1))
|
||||||
mbs[0] = 0;
|
mbs[0] = 0;
|
||||||
else
|
else
|
||||||
mbs[l] = 0;
|
mbs[l] = 0;
|
||||||
|
@ -1312,7 +1316,7 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
FIFO queue
|
FIFO queue (well, actually a FILO also)
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class Queue
|
class Queue
|
||||||
|
@ -1326,13 +1330,23 @@ public:
|
||||||
T pop_front()
|
T pop_front()
|
||||||
{
|
{
|
||||||
if(m_list.size() == 0)
|
if(m_list.size() == 0)
|
||||||
throw ItemNotFoundException("MutexedQueue: queue is empty");
|
throw ItemNotFoundException("Queue: queue is empty");
|
||||||
|
|
||||||
typename core::list<T>::Iterator begin = m_list.begin();
|
typename core::list<T>::Iterator begin = m_list.begin();
|
||||||
T t = *begin;
|
T t = *begin;
|
||||||
m_list.erase(begin);
|
m_list.erase(begin);
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
T pop_back()
|
||||||
|
{
|
||||||
|
if(m_list.size() == 0)
|
||||||
|
throw ItemNotFoundException("Queue: queue is empty");
|
||||||
|
|
||||||
|
typename core::list<T>::Iterator last = m_list.getLast();
|
||||||
|
T t = *last;
|
||||||
|
m_list.erase(last);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
u32 size()
|
u32 size()
|
||||||
{
|
{
|
||||||
|
@ -1344,7 +1358,7 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Thread-safe FIFO queue
|
Thread-safe FIFO queue (well, actually a FILO also)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
|
@ -1390,6 +1404,32 @@ public:
|
||||||
wait_time_ms += 10;
|
wait_time_ms += 10;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
T pop_back(u32 wait_time_max_ms=0)
|
||||||
|
{
|
||||||
|
u32 wait_time_ms = 0;
|
||||||
|
|
||||||
|
for(;;)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
JMutexAutoLock lock(m_mutex);
|
||||||
|
|
||||||
|
if(m_list.size() > 0)
|
||||||
|
{
|
||||||
|
typename core::list<T>::Iterator last = m_list.getLast();
|
||||||
|
T t = *last;
|
||||||
|
m_list.erase(last);
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(wait_time_ms >= wait_time_max_ms)
|
||||||
|
throw ItemNotFoundException("MutexedQueue: queue is empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait a while before trying again
|
||||||
|
sleep_ms(10);
|
||||||
|
wait_time_ms += 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
JMutex & getMutex()
|
JMutex & getMutex()
|
||||||
{
|
{
|
||||||
|
@ -1838,5 +1878,36 @@ inline std::string deSerializeLongString(std::istream &is)
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
|
||||||
|
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;
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
return core::aabbox3d<f32>(
|
||||||
|
(float)p.X * d - 0.5*d,
|
||||||
|
(float)p.Y * d - 0.5*d,
|
||||||
|
(float)p.Z * d - 0.5*d,
|
||||||
|
(float)p.X * d + 0.5*d,
|
||||||
|
(float)p.Y * d + 0.5*d,
|
||||||
|
(float)p.Z * d + 0.5*d
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue