mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 01:53:45 +01:00
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)
This commit is contained in:
parent
62e7912577
commit
b82d3f2744
@ -613,11 +613,15 @@ inline v3s16 arealim(v3s16 p, s16 d)
|
||||
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)
|
||||
{
|
||||
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);
|
||||
if(l == (size_t)(-1))
|
||||
return L"<invalid multibyte string>";
|
||||
wcs[l] = 0;
|
||||
return *wcs;
|
||||
}
|
||||
@ -627,7 +631,7 @@ 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((int)l == -1)
|
||||
if(l == (size_t)(-1))
|
||||
mbs[0] = 0;
|
||||
else
|
||||
mbs[l] = 0;
|
||||
@ -1312,7 +1316,7 @@ private:
|
||||
};
|
||||
|
||||
/*
|
||||
FIFO queue
|
||||
FIFO queue (well, actually a FILO also)
|
||||
*/
|
||||
template<typename T>
|
||||
class Queue
|
||||
@ -1326,13 +1330,23 @@ public:
|
||||
T pop_front()
|
||||
{
|
||||
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();
|
||||
T t = *begin;
|
||||
m_list.erase(begin);
|
||||
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()
|
||||
{
|
||||
@ -1344,7 +1358,7 @@ protected:
|
||||
};
|
||||
|
||||
/*
|
||||
Thread-safe FIFO queue
|
||||
Thread-safe FIFO queue (well, actually a FILO also)
|
||||
*/
|
||||
|
||||
template<typename T>
|
||||
@ -1390,6 +1404,32 @@ public:
|
||||
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()
|
||||
{
|
||||
@ -1838,5 +1878,36 @@ inline std::string deSerializeLongString(std::istream &is)
|
||||
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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user