X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Futils.c;h=2b251e31e8518c33e2e33e45320802e85a027c57;hb=06c1a7183754349e29a6f4656d88d3f89e4f448a;hp=3dda9e5ed7e8955053e4e756b087b1056bccacb0;hpb=f2b26d44416abd494ce430659cfbbf254d9c3c55;p=ashd.git diff --git a/lib/utils.c b/lib/utils.c index 3dda9e5..2b251e3 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -163,7 +163,56 @@ void freeca(char **ca) { char **c; + if(ca == NULL) + return; for(c = ca; *c; c++) free(*c); free(ca); } + +int calen(char **a) +{ + int i; + + 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); +}