ucx/utils.c

changeset 150
1cf2eabf94ed
parent 144
b6dcc9d112eb
child 173
31a8682fffb7
equal deleted inserted replaced
149:3bf87676d42d 150:1cf2eabf94ed
132 return memcmp(ptr1, ptr2, *((size_t*)n)); 132 return memcmp(ptr1, ptr2, *((size_t*)n));
133 } 133 }
134 134
135 /* PRINTF FUNCTIONS */ 135 /* PRINTF FUNCTIONS */
136 136
137 #ifdef va_copy
137 #define UCX_PRINTF_BUFSIZE 256 138 #define UCX_PRINTF_BUFSIZE 256
139 #else
140 #pragma message("WARNING: C99 va_copy macro not supported by this platform" \
141 " - limiting ucx_*printf to 2 KiB")
142 #define UCX_PRINTF_BUFSIZE 0x800
143 #endif
138 144
139 int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...) { 145 int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...) {
146 int ret;
140 va_list ap; 147 va_list ap;
141 int ret;
142 va_start(ap, fmt); 148 va_start(ap, fmt);
143 ret = ucx_vfprintf(stream, wfc, fmt, ap); 149 ret = ucx_vfprintf(stream, wfc, fmt, ap);
144 va_end(ap); 150 va_end(ap);
145 return ret; 151 return ret;
146 } 152 }
147 153
148 int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap) { 154 int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap) {
149 char buf[UCX_PRINTF_BUFSIZE]; 155 char buf[UCX_PRINTF_BUFSIZE];
156 #ifdef va_copy
150 va_list ap2; 157 va_list ap2;
151 va_copy(ap2, ap); 158 va_copy(ap2, ap);
152 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 159 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
153 if (ret < 0) { 160 if (ret < 0) {
154 return ret; 161 return ret;
165 if (!newbuf) { 172 if (!newbuf) {
166 return -1; 173 return -1;
167 } 174 }
168 175
169 ret = vsnprintf(newbuf, len, fmt, ap2); 176 ret = vsnprintf(newbuf, len, fmt, ap2);
170 va_end(ap2);
171 if (ret > 0) { 177 if (ret > 0) {
172 ret = (int)wfc(newbuf, 1, ret, stream); 178 ret = (int)wfc(newbuf, 1, ret, stream);
173 } 179 }
174 free(newbuf); 180 free(newbuf);
175 } 181 }
176 return ret; 182 return ret;
183 #else
184 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
185 if (ret < 0) {
186 return ret;
187 } else if (ret < UCX_PRINTF_BUFSIZE) {
188 return (int)wfc(buf, 1, ret, stream);
189 } else {
190 errno = ENOMEM;
191 return -1;
192 }
193 #endif
177 } 194 }
178 195
179 sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...) { 196 sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...) {
180 va_list ap; 197 va_list ap;
181 sstr_t ret; 198 sstr_t ret;
187 204
188 sstr_t ucx_vasprintf(UcxAllocator *a, const char *fmt, va_list ap) { 205 sstr_t ucx_vasprintf(UcxAllocator *a, const char *fmt, va_list ap) {
189 sstr_t s; 206 sstr_t s;
190 s.ptr = NULL; 207 s.ptr = NULL;
191 s.length = 0; 208 s.length = 0;
209 char buf[UCX_PRINTF_BUFSIZE];
210 #ifdef va_copy
192 va_list ap2; 211 va_list ap2;
193 va_copy(ap2, ap); 212 va_copy(ap2, ap);
194 char buf[UCX_PRINTF_BUFSIZE];
195 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 213 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
196 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { 214 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) {
197 s.ptr = (char*)a->malloc(a->pool, ret + 1); 215 s.ptr = (char*)a->malloc(a->pool, ret + 1);
198 s.length = (size_t)ret; 216 s.length = (size_t)ret;
199 memcpy(s.ptr, buf, ret); 217 memcpy(s.ptr, buf, ret);
202 errno = ENOMEM; 220 errno = ENOMEM;
203 } else { 221 } else {
204 int len = ret + 1; 222 int len = ret + 1;
205 s.ptr = (char*)a->malloc(a->pool, len); 223 s.ptr = (char*)a->malloc(a->pool, len);
206 ret = vsnprintf(s.ptr, len, fmt, ap2); 224 ret = vsnprintf(s.ptr, len, fmt, ap2);
207 va_end(ap2);
208 if (ret < 0) { 225 if (ret < 0) {
209 free(s.ptr); 226 free(s.ptr);
210 s.ptr = NULL; 227 s.ptr = NULL;
211 } else { 228 } else {
212 s.length = (size_t)ret; 229 s.length = (size_t)ret;
213 } 230 }
214 } 231 }
232 #else
233 int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap);
234 if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) {
235 s.ptr = (char*)a->malloc(a->pool, ret + 1);
236 s.length = (size_t)ret;
237 memcpy(s.ptr, buf, ret);
238 s.ptr[s.length] = '\0';
239 } else {
240 errno = ENOMEM;
241 }
242 #endif
215 return s; 243 return s;
216 } 244 }

mercurial