#include "internal.h" // grow ensures that the string can encompass at least delta bytes. // if it already can, this is a no op. // if it can't, the string will be reallocated. void str·grow(string *s, vlong delta) { Hdr *h, *newh; vlong cap = str·cap(*s); vlong len = str·len(*s); assert(cap >= len); // To prevent unsigned behavior if (cap - len >= delta) return; h = (Hdr*)(*s - sizeof(Hdr)); vlong newCap = cap + delta; assert(newCap >= cap); // To prevent unsigned behavior if (newCap < MAX_STRING_ALLOC) { newCap *= 2; } else newCap += MAX_STRING_ALLOC; newh = (Hdr*)realloc(h, sizeof(*h) + newCap + 1); if (newh == nil) return; memset(newh->buf + len, '\0', newCap - len); newh->cap = newCap; newh->len = len; *s = newh->buf; }