145 return ret; |
145 return ret; |
146 } |
146 } |
147 |
147 |
148 int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap) { |
148 int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap) { |
149 char buf[UCX_PRINTF_BUFSIZE]; |
149 char buf[UCX_PRINTF_BUFSIZE]; |
|
150 va_list ap2; |
|
151 va_copy(ap2, ap); |
150 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
152 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
151 if (ret < 0) { |
153 if (ret < 0) { |
152 return ret; |
154 return ret; |
153 } else if (ret < UCX_PRINTF_BUFSIZE) { |
155 } else if (ret < UCX_PRINTF_BUFSIZE) { |
154 return (int)wfc(buf, 1, ret, stream); |
156 return (int)wfc(buf, 1, ret, stream); |
162 char *newbuf = (char*)malloc(len); |
164 char *newbuf = (char*)malloc(len); |
163 if (!newbuf) { |
165 if (!newbuf) { |
164 return -1; |
166 return -1; |
165 } |
167 } |
166 |
168 |
167 ret = vsnprintf(newbuf, len, fmt, ap); |
169 ret = vsnprintf(newbuf, len, fmt, ap2); |
|
170 va_end(ap2); |
168 if (ret > 0) { |
171 if (ret > 0) { |
169 ret = (int)wfc(newbuf, 1, ret, stream); |
172 ret = (int)wfc(newbuf, 1, ret, stream); |
170 } |
173 } |
171 free(newbuf); |
174 free(newbuf); |
172 } |
175 } |
184 |
187 |
185 sstr_t ucx_vasprintf(UcxAllocator *a, const char *fmt, va_list ap) { |
188 sstr_t ucx_vasprintf(UcxAllocator *a, const char *fmt, va_list ap) { |
186 sstr_t s; |
189 sstr_t s; |
187 s.ptr = NULL; |
190 s.ptr = NULL; |
188 s.length = 0; |
191 s.length = 0; |
|
192 va_list ap2; |
|
193 va_copy(ap2, ap); |
189 char buf[UCX_PRINTF_BUFSIZE]; |
194 char buf[UCX_PRINTF_BUFSIZE]; |
190 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
195 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); |
191 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { |
196 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { |
192 s.ptr = (char*)a->malloc(a->pool, ret + 1); |
197 s.ptr = (char*)a->malloc(a->pool, ret + 1); |
193 s.length = (size_t)ret; |
198 s.length = (size_t)ret; |
196 } else if (ret == INT_MAX) { |
201 } else if (ret == INT_MAX) { |
197 errno = ENOMEM; |
202 errno = ENOMEM; |
198 } else { |
203 } else { |
199 int len = ret + 1; |
204 int len = ret + 1; |
200 s.ptr = (char*)a->malloc(a->pool, len); |
205 s.ptr = (char*)a->malloc(a->pool, len); |
201 ret = vsnprintf(s.ptr, len, fmt, ap); |
206 ret = vsnprintf(s.ptr, len, fmt, ap2); |
|
207 va_end(ap2); |
202 if (ret < 0) { |
208 if (ret < 0) { |
203 free(s.ptr); |
209 free(s.ptr); |
204 s.ptr = NULL; |
210 s.ptr = NULL; |
205 } else { |
211 } else { |
206 s.length = (size_t)ret; |
212 s.length = (size_t)ret; |