#include <stdlib.h>
#include <stdio.h>

#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);
}
