+/*
+ * Creates and initializes a BUFFER*. If passed an existing BUFFER*,
+ * just initializes. Frees anything already in the buffer.
+ *
+ * Disregards the 'destroy' flag, which seems reserved for caller.
+ * This is bad, but there's no apparent protocol for it.
+ */
+BUFFER *mutt_buffer_init (BUFFER * b)
+{
+ if (!b) {
+ b = safe_malloc (sizeof (BUFFER));
+ if (!b)
+ return NULL;
+ }
+ else {
+ FREE(&b->data);
+ }
+ memset (b, 0, sizeof (BUFFER));
+ return b;
+}
+
+/*
+ * Creates and initializes a BUFFER*. If passed an existing BUFFER*,
+ * just initializes. Frees anything already in the buffer. Copies in
+ * the seed string.
+ *
+ * Disregards the 'destroy' flag, which seems reserved for caller.
+ * This is bad, but there's no apparent protocol for it.
+ */
+BUFFER *mutt_buffer_from (BUFFER * b, char *seed)
+{
+ if (!seed)
+ return NULL;
+
+ b = mutt_buffer_init (b);
+ b->data = safe_strdup (seed);
+ b->dsize = mutt_strlen (seed);
+ b->dptr = (char *) b->data + b->dsize;
+ return b;
+}
+
+void mutt_buffer_addstr (BUFFER * buf, const char *s)