211 va_list ap2; |
211 va_list ap2; |
212 va_copy(ap2, ap); |
212 va_copy(ap2, ap); |
213 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
213 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
214 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { |
214 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { |
215 s.ptr = (char*)almalloc(a, ret + 1); |
215 s.ptr = (char*)almalloc(a, ret + 1); |
216 s.length = (size_t)ret; |
216 if (s.ptr) { |
217 memcpy(s.ptr, buf, ret); |
217 s.length = (size_t)ret; |
218 s.ptr[s.length] = '\0'; |
218 memcpy(s.ptr, buf, ret); |
|
219 s.ptr[s.length] = '\0'; |
|
220 } |
219 } else if (ret == INT_MAX) { |
221 } else if (ret == INT_MAX) { |
220 errno = ENOMEM; |
222 errno = ENOMEM; |
221 } else { |
223 } else { |
222 int len = ret + 1; |
224 int len = ret + 1; |
223 s.ptr = (char*)almalloc(a, len); |
225 s.ptr = (char*)almalloc(a, len); |
224 ret = vsnprintf(s.ptr, len, fmt, ap2); |
226 if (s.ptr) { |
225 if (ret < 0) { |
227 ret = vsnprintf(s.ptr, len, fmt, ap2); |
226 free(s.ptr); |
228 if (ret < 0) { |
227 s.ptr = NULL; |
229 free(s.ptr); |
228 } else { |
230 s.ptr = NULL; |
229 s.length = (size_t)ret; |
231 } else { |
|
232 s.length = (size_t)ret; |
|
233 } |
230 } |
234 } |
231 } |
235 } |
232 #else |
236 #else |
233 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
237 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
234 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { |
238 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { |
235 s.ptr = (char*)almalloc(a, ret + 1); |
239 s.ptr = (char*)almalloc(a, ret + 1); |
236 s.length = (size_t)ret; |
240 if (s.ptr) { |
237 memcpy(s.ptr, buf, ret); |
241 s.length = (size_t)ret; |
238 s.ptr[s.length] = '\0'; |
242 memcpy(s.ptr, buf, ret); |
|
243 s.ptr[s.length] = '\0'; |
|
244 } |
239 } else { |
245 } else { |
240 errno = ENOMEM; |
246 errno = ENOMEM; |
241 } |
247 } |
242 #endif |
248 #endif |
243 return s; |
249 return s; |