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 } |