+void buffer_readonly_view(struct buffer_if *buf, const void *data, int32_t len)
+{
+ buf->free=False;
+ buf->owner="READONLY";
+ buf->flags=0;
+ buf->loc.file=NULL;
+ buf->loc.line=0;
+ buf->size=buf->len=len;
+ buf->base=buf->start=(uint8_t*)data;
+}
+
+void buffer_readonly_clone(struct buffer_if *out, const struct buffer_if *in)
+{
+ buffer_readonly_view(out,in->start,in->size);
+}
+
+void buffer_copy(struct buffer_if *dst, const struct buffer_if *src)
+{
+ if (dst->len < src->len) {
+ dst->base=realloc(dst->base,src->len);
+ if (!dst->base) fatal_perror("buffer_copy");
+ dst->len = src->len;
+ }
+ dst->start = dst->base + (src->start - src->base);
+ dst->size = src->size;
+ memcpy(dst->start, src->start, dst->size);
+}
+