ucx/utils.c

changeset 142
ee8cb27d8b8e
parent 140
15f871f50bfd
child 144
b6dcc9d112eb
     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 +}

mercurial