ucx/utils.c

changeset 144
b6dcc9d112eb
parent 142
ee8cb27d8b8e
child 150
1cf2eabf94ed
equal deleted inserted replaced
143:b843d463ac58 144:b6dcc9d112eb
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;

mercurial