src/misc/str.hpp
changeset 7153 149b6649a3e3
parent 7116 6fc23a78df05
child 7255 31eec725265f
--- a/src/misc/str.hpp	Wed Jul 04 01:34:28 2007 +0000
+++ b/src/misc/str.hpp	Wed Jul 04 02:35:40 2007 +0000
@@ -120,18 +120,32 @@
 	{
 		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);
+			if (ret >= base::GetReserve()) {
+				/* Greater return than given count means needed buffer size. */
+				addSize = ret + 1;
+				continue;
+			}
+			if (ret >= 0) {
+				/* success */
+				break;
+			}
+			err = errno;
+			if (err != ERANGE && err != ENOENT && err != 0) {
+				/* some strange failure */
+				break;
+			}
+			/* small buffer (M$ implementation) */
 			addSize *= 2;
-			err = errno;
-		} while(ret < 0 && (err == ERANGE || err == ENOENT || err == 0));
+		}
 		if (ret > 0) {
 			GrowSizeNC(ret);
 		} else {
-//			int err = errno;
 			base::FixTail();
 		}
 		return ret;