void ds_put_format_valist(struct ds *ds, const char *format, va_list args_) { va_list args; size_t available; int needed; va_copy(args, args_); available = ds->string ? ds->allocated - ds->length + 1 : 0; needed = vsnprintf(&ds->string[ds->length], available, format, args); va_end(args); if (needed < available) { ds->length += needed; } else { size_t available; ds_reserve(ds, ds->length + needed); va_copy(args, args_); available = ds->allocated - ds->length + 1; needed = vsnprintf(&ds->string[ds->length], available, format, args); va_end(args); assert(needed < available); ds->length += needed; } }
char * ds_put_uninit(struct ds *ds, size_t n) { ds_reserve(ds, ds->length + n); ds->length += n; ds->string[ds->length] = '\0'; return &ds->string[ds->length - n]; }
void print_ipv6_addr(struct ds *string, const struct in6_addr *addr) { char *dst; ds_reserve(string, string->length + INET6_ADDRSTRLEN); dst = string->string + string->length; format_ipv6_addr(dst, addr); string->length += strlen(dst); }
void ds_put_printable(struct ds *ds, const char *s, size_t n) { ds_reserve(ds, ds->length + n); while (n-- > 0) { unsigned char c = *s++; if (c < 0x20 || c > 0x7e || c == '\\' || c == '"') { ds_put_format(ds, "\\%03o", (int) c); } else { ds_put_char(ds, c); } } }