+static bool buffer_wraps(struct buffer *buf) {
+ return buf->size - buf->offset < buf->used;
+}
+
+static bool buffer_resize(struct buffer *buf, uint32_t newsize) {
+ char *newdata = realloc(buf->data, newsize);
+
+ if(!newdata) {
+ return false;
+ }
+
+ buf->data = newdata;
+
+ if(buffer_wraps(buf)) {
+ // Shift the right part of the buffer until it hits the end of the new buffer.
+ // Old situation:
+ // [345......012]
+ // New situation:
+ // [345.........|........012]
+ uint32_t tailsize = buf->size - buf->offset;
+ uint32_t newoffset = newsize - tailsize;
+ memmove(buf + newoffset, buf + buf->offset, tailsize);
+ buf->offset = newoffset;
+ }
+
+ buf->size = newsize;
+ return true;
+}