{
char **c;
+ if(ca == NULL)
+ return;
for(c = ca; *c; c++)
free(*c);
free(ca);
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);
+}