1.1 --- a/ucx/utils.c Tue Aug 13 14:20:12 2013 +0200 1.2 +++ b/ucx/utils.c Wed Aug 14 15:22:35 2013 +0200 1.3 @@ -28,6 +28,9 @@ 1.4 1.5 #include "utils.h" 1.6 #include <math.h> 1.7 +#include <stdio.h> 1.8 +#include <limits.h> 1.9 +#include <errno.h> 1.10 1.11 /* COPY FUCNTIONS */ 1.12 void* ucx_strcpy(void* s, void* data) { 1.13 @@ -75,7 +78,7 @@ 1.14 return ncp; 1.15 } 1.16 1.17 -/* COMPARE FUNCTION */ 1.18 +/* COMPARE FUNCTIONS */ 1.19 1.20 int ucx_strcmp(void *s1, void *s2, void *data) { 1.21 return strcmp((char*)s1, (char*)s2); 1.22 @@ -128,3 +131,80 @@ 1.23 int ucx_memcmp(void *ptr1, void *ptr2, void *n) { 1.24 return memcmp(ptr1, ptr2, *((size_t*)n)); 1.25 } 1.26 + 1.27 +/* PRINTF FUNCTIONS */ 1.28 + 1.29 +#define UCX_PRINTF_BUFSIZE 256 1.30 + 1.31 +int ucx_fprintf(void *stream, write_func wfc, const char *fmt, ...) { 1.32 + va_list ap; 1.33 + int ret; 1.34 + va_start(ap, fmt); 1.35 + ret = ucx_vfprintf(stream, wfc, fmt, ap); 1.36 + va_end(ap); 1.37 + return ret; 1.38 +} 1.39 + 1.40 +int ucx_vfprintf(void *stream, write_func wfc, const char *fmt, va_list ap) { 1.41 + char buf[UCX_PRINTF_BUFSIZE]; 1.42 + int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 1.43 + if (ret < 0) { 1.44 + return ret; 1.45 + } else if (ret < UCX_PRINTF_BUFSIZE) { 1.46 + return (int)wfc(buf, 1, ret, stream); 1.47 + } else { 1.48 + if (ret == INT_MAX) { 1.49 + errno = ENOMEM; 1.50 + return -1; 1.51 + } 1.52 + 1.53 + int len = ret + 1; 1.54 + char *newbuf = (char*)malloc(len); 1.55 + if (!newbuf) { 1.56 + return -1; 1.57 + } 1.58 + 1.59 + ret = vsnprintf(newbuf, len, fmt, ap); 1.60 + if (ret > 0) { 1.61 + ret = (int)wfc(newbuf, 1, ret, stream); 1.62 + } 1.63 + free(newbuf); 1.64 + } 1.65 + return ret; 1.66 +} 1.67 + 1.68 +sstr_t ucx_asprintf(UcxAllocator *allocator, const char *fmt, ...) { 1.69 + va_list ap; 1.70 + sstr_t ret; 1.71 + va_start(ap, fmt); 1.72 + ret = ucx_vasprintf(allocator, fmt, ap); 1.73 + va_end(ap); 1.74 + return ret; 1.75 +} 1.76 + 1.77 +sstr_t ucx_vasprintf(UcxAllocator *a, const char *fmt, va_list ap) { 1.78 + sstr_t s; 1.79 + s.ptr = NULL; 1.80 + s.length = 0; 1.81 + char buf[UCX_PRINTF_BUFSIZE]; 1.82 + int ret = vsnprintf(buf, UCX_PRINTF_BUFSIZE, fmt, ap); 1.83 + if (ret > 0 && ret < UCX_PRINTF_BUFSIZE) { 1.84 + s.ptr = (char*)a->malloc(a->pool, ret + 1); 1.85 + s.length = (size_t)ret; 1.86 + memcpy(s.ptr, buf, ret); 1.87 + s.ptr[s.length] = '\0'; 1.88 + } else if (ret == INT_MAX) { 1.89 + errno = ENOMEM; 1.90 + } else { 1.91 + int len = ret + 1; 1.92 + s.ptr = (char*)a->malloc(a->pool, len); 1.93 + ret = vsnprintf(s.ptr, len, fmt, ap); 1.94 + if (ret < 0) { 1.95 + free(s.ptr); 1.96 + s.ptr = NULL; 1.97 + } else { 1.98 + s.length = (size_t)ret; 1.99 + } 1.100 + } 1.101 + return s; 1.102 +}