X-Git-Url: http://dolda2000.com/gitweb/?p=mctap.git;a=blobdiff_plain;f=src%2Futils.c;fp=src%2Futils.c;h=d0219a066e5c88859e8246e308babd26c20f18e2;hp=0000000000000000000000000000000000000000;hb=b5038e157d54458fe2145e4ac06f0c2567382624;hpb=3415540feb47f1c379767c984620f8a7a3c4e2b1 diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..d0219a0 --- /dev/null +++ b/src/utils.c @@ -0,0 +1,67 @@ +#include +#include + +#include "utils.h" + +void _sizebuf2(void **buf, size_t *sz, size_t wanted, size_t el) +{ + size_t n; + + n = *sz; + if(n == 0) + n = 1; + while(n < wanted) + n <<= 1; + if(n <= *sz) + return; + if(*buf != NULL) + *buf = srealloc(*buf, n * el); + else + *buf = smalloc(n * el); + *sz = n; +} + +void _sizebuf(struct buffer *buf, size_t wanted, size_t el) +{ + size_t n; + + n = buf->s; + if(n == 0) + n = 1; + while(n < wanted) + n <<= 1; + if(n <= buf->s) + return; + if(buf->b != NULL) + buf->b = srealloc(buf->b, n * el); + else + buf->b = smalloc(n * el); + buf->s = n; +} + +char *vsprintf2(char *format, va_list al) +{ + int ret; + char *buf; + va_list al2; + + va_copy(al2, al); + ret = vsnprintf(NULL, 0, format, al2); + va_end(al2); + buf = smalloc(ret + 1); + va_copy(al2, al); + vsnprintf(buf, ret + 1, format, al2); + va_end(al2); + return(buf); +} + +char *sprintf2(char *format, ...) +{ + va_list args; + char *buf; + + va_start(args, format); + buf = vsprintf2(format, args); + va_end(args); + return(buf); +}