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)

master
Perttu Ahola 2011-02-23 00:06:45 +02:00
parent 62e7912577
commit b82d3f2744
1 changed files with 76 additions and 5 deletions

View File

@ -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