src/misc/str.hpp
changeset 7649 624f2917cad0
parent 7612 3b444f6a973a
child 7751 99bcdf28a226
equal deleted inserted replaced
7648:dde14ba48325 7649:624f2917cad0
   118 	/** Add formated string (like vsprintf) at the end of existing contents. */
   118 	/** Add formated string (like vsprintf) at the end of existing contents. */
   119 	int AddFormatL(const Tchar *format, va_list args)
   119 	int AddFormatL(const Tchar *format, va_list args)
   120 	{
   120 	{
   121 		bsize_t addSize = Api::StrLen(format);
   121 		bsize_t addSize = Api::StrLen(format);
   122 		if (addSize < 16) addSize = 16;
   122 		if (addSize < 16) addSize = 16;
   123 		addSize += addSize > 1;
   123 		addSize += addSize / 2;
   124 		int ret, err;
   124 		int ret;
   125 		do {
   125 		int err = 0;
       
   126 		for (;;) {
   126 			Tchar *buf = MakeFreeSpace(addSize);
   127 			Tchar *buf = MakeFreeSpace(addSize);
   127 			ret = Api::SPrintFL(buf, base::GetReserve(), format, args);
   128 			ret = Api::SPrintFL(buf, base::GetReserve(), format, args);
       
   129 			if (ret >= base::GetReserve()) {
       
   130 				/* Greater return than given count means needed buffer size. */
       
   131 				addSize = ret + 1;
       
   132 				continue;
       
   133 			}
       
   134 			if (ret >= 0) {
       
   135 				/* success */
       
   136 				break;
       
   137 			}
       
   138 			err = errno;
       
   139 			if (err != ERANGE && err != ENOENT && err != 0) {
       
   140 				/* some strange failure */
       
   141 				break;
       
   142 			}
       
   143 			/* small buffer (M$ implementation) */
   128 			addSize *= 2;
   144 			addSize *= 2;
   129 			err = errno;
   145 		}
   130 		} while(ret < 0 && (err == ERANGE || err == ENOENT || err == 0));
       
   131 		if (ret > 0) {
   146 		if (ret > 0) {
   132 			GrowSizeNC(ret);
   147 			GrowSizeNC(ret);
   133 		} else {
   148 		} else {
   134 //			int err = errno;
       
   135 			base::FixTail();
   149 			base::FixTail();
   136 		}
   150 		}
   137 		return ret;
   151 		return ret;
   138 	}
   152 	}
   139 
   153