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

replace/41b28d7194a279bdc17475d4fbe2ea6ec885a466
KUDr 17 years ago
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…
Cancel
Save