equal
deleted
inserted
replaced
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 |