mirror of https://github.com/OpenTTD/OpenTTD
(svn r10427) -Fix: snprintf behaves differently in gcc than in VC causing unreadable artifacts in output. Now CStrT::AddFormatL() should behave correctly also when compiled by gcc (Rubidium)
parent
a85d72c60d
commit
1d5b84d808
|
@ -120,18 +120,32 @@ struct CStrT : public CBlobT<Tchar>
|
||||||
{
|
{
|
||||||
bsize_t addSize = Api::StrLen(format);
|
bsize_t addSize = Api::StrLen(format);
|
||||||
if (addSize < 16) addSize = 16;
|
if (addSize < 16) addSize = 16;
|
||||||
addSize += addSize > 1;
|
addSize += addSize / 2;
|
||||||
int ret, err;
|
int ret;
|
||||||
do {
|
int err = 0;
|
||||||
|
for (;;) {
|
||||||
Tchar *buf = MakeFreeSpace(addSize);
|
Tchar *buf = MakeFreeSpace(addSize);
|
||||||
ret = Api::SPrintFL(buf, base::GetReserve(), format, args);
|
ret = Api::SPrintFL(buf, base::GetReserve(), format, args);
|
||||||
addSize *= 2;
|
if (ret >= base::GetReserve()) {
|
||||||
|
/* Greater return than given count means needed buffer size. */
|
||||||
|
addSize = ret + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (ret >= 0) {
|
||||||
|
/* success */
|
||||||
|
break;
|
||||||
|
}
|
||||||
err = errno;
|
err = errno;
|
||||||
} while(ret < 0 && (err == ERANGE || err == ENOENT || err == 0));
|
if (err != ERANGE && err != ENOENT && err != 0) {
|
||||||
|
/* some strange failure */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* small buffer (M$ implementation) */
|
||||||
|
addSize *= 2;
|
||||||
|
}
|
||||||
if (ret > 0) {
|
if (ret > 0) {
|
||||||
GrowSizeNC(ret);
|
GrowSizeNC(ret);
|
||||||
} else {
|
} else {
|
||||||
// int err = errno;
|
|
||||||
base::FixTail();
|
base::FixTail();
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|
Loading…
Reference in New Issue