+void buffer_splice(buffer_t *buf, ssize_t pos, ssize_t len,
+ const void *data, ssize_t dlen)
+{
+ if (dlen >= len)
+ buffer_extend(buf, dlen - len);
+ if (len >= buf->len)
+ len = buf->len;
+ memmove(buf->data + pos + dlen,
+ buf->data + pos + len,
+ buf->len - pos - len);
+ memcpy(buf->data + pos, data, dlen);
+ buffer_setlen(buf, buf->len + dlen - len);
+}