(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)

This commit is contained in:
KUDr 2007-07-04 02:35:40 +00:00
parent a85d72c60d
commit 1d5b84d808
1 changed files with 20 additions and 6 deletions

View File

@ -120,18 +120,32 @@ struct CStrT : public CBlobT<Tchar>
{
bsize_t addSize = Api::StrLen(format);
if (addSize < 16) addSize = 16;
addSize += addSize > 1;
int ret, err;
do {
addSize += addSize / 2;
int ret;
int err = 0;
for (;;) {
Tchar *buf = MakeFreeSpace(addSize);
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;
} 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) {
GrowSizeNC(ret);
} else {
// int err = errno;
base::FixTail();
}
return ret;