X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Futils.c;h=2b251e31e8518c33e2e33e45320802e85a027c57;hb=c3b910928f34306f34ee6a9c3c13debbf8ff67f4;hp=e0dc22cf8d8dd200242254183f2a19e03fcde6fa;hpb=d1bd343cd855cb9b5815d5e636b4e70e766c1f6a;p=ashd.git diff --git a/lib/utils.c b/lib/utils.c index e0dc22c..2b251e3 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -163,6 +163,8 @@ void freeca(char **ca) { char **c; + if(ca == NULL) + return; for(c = ca; *c; c++) free(*c); free(ca); @@ -175,3 +177,42 @@ int calen(char **a) for(i = 0; *a; a++, i++); return(i); } + +void bvprintf(struct charbuf *buf, char *format, va_list al) +{ + va_list al2; + int ret; + + while(1) { + va_copy(al2, al); + ret = vsnprintf(buf->b + buf->d, buf->s - buf->d, format, al2); + va_end(al2); + if(ret < buf->s - buf->d) { + buf->d += ret; + return; + } + sizebuf(*buf, buf->d + ret + 1); + } +} + +void bprintf(struct charbuf *buf, char *format, ...) +{ + va_list args; + + va_start(args, format); + bvprintf(buf, format, args); + va_end(args); +} + +void replstr(char **p, char *n) +{ + char *tmp; + + tmp = *p; + if(n) + *p = sstrdup(n); + else + *p = NULL; + if(tmp) + free(tmp); +}