REORG: channel: move buffer_{replace,insert_line}* to buffer.{c,h}

These functions do not depend on the channel flags anymore thus they're
much better suited to be used on plain buffers. Move them from channel
to buffer.
diff --git a/src/buffer.c b/src/buffer.c
index 764f692..f98da94 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -18,6 +18,78 @@
 
 #include <types/global.h>
 
+/* This function writes the string <str> at position <pos> which must be in
+ * buffer <b>, and moves <end> just after the end of <str>. <b>'s parameters
+ * <l> and <r> are updated to be valid after the shift. The shift value
+ * (positive or negative) is returned. If there's no space left, the move is
+ * not done. The function does not adjust ->o because it does not make sense to
+ * use it on data scheduled to be sent. For the same reason, it does not make
+ * sense to call this function on unparsed data, so <orig> is not updated. The
+ * string length is taken from parameter <len>. If <len> is null, the <str>
+ * pointer is allowed to be null.
+ */
+int buffer_replace2(struct buffer *b, char *pos, char *end, const char *str, int len)
+{
+	int delta;
+
+	delta = len - (end - pos);
+
+	if (bi_end(b) + delta >= b->data + b->size)
+		return 0;  /* no space left */
+
+	if (buffer_not_empty(b) &&
+	    bi_end(b) + delta > bo_ptr(b) &&
+	    bo_ptr(b) >= bi_end(b))
+		return 0;  /* no space left before wrapping data */
+
+	/* first, protect the end of the buffer */
+	memmove(end + delta, end, bi_end(b) - end);
+
+	/* now, copy str over pos */
+	if (len)
+		memcpy(pos, str, len);
+
+	b->i += delta;
+
+	if (buffer_len(b) == 0)
+		b->p = b->data;
+
+	return delta;
+}
+
+/*
+ * Inserts <str> followed by "\r\n" at position <pos> in buffer <b>. The <len>
+ * argument informs about the length of string <str> so that we don't have to
+ * measure it. It does not include the "\r\n". If <str> is NULL, then the buffer
+ * is only opened for len+2 bytes but nothing is copied in. It may be useful in
+ * some circumstances. The send limit is *not* adjusted. Same comments as above
+ * for the valid use cases.
+ *
+ * The number of bytes added is returned on success. 0 is returned on failure.
+ */
+int buffer_insert_line2(struct buffer *b, char *pos, const char *str, int len)
+{
+	int delta;
+
+	delta = len + 2;
+
+	if (bi_end(b) + delta >= b->data + b->size)
+		return 0;  /* no space left */
+
+	/* first, protect the end of the buffer */
+	memmove(pos + delta, pos, bi_end(b) - pos);
+
+	/* now, copy str over pos */
+	if (len && str) {
+		memcpy(pos, str, len);
+		pos[len] = '\r';
+		pos[len + 1] = '\n';
+	}
+
+	b->i += delta;
+	return delta;
+}
+
 /* This function realigns input data in a possibly wrapping buffer so that it
  * becomes contiguous and starts at the beginning of the buffer area. The
  * function may only be used when the buffer's output is empty.
diff --git a/src/channel.c b/src/channel.c
index ce90147..8a8e8c3 100644
--- a/src/channel.c
+++ b/src/channel.c
@@ -297,78 +297,6 @@
 	return len;
 }
 
-/* This function writes the string <str> at position <pos> which must be in
- * buffer <b>, and moves <end> just after the end of <str>. <b>'s parameters
- * <l> and <r> are updated to be valid after the shift. The shift value
- * (positive or negative) is returned. If there's no space left, the move is
- * not done. The function does not adjust ->o because it does not make sense to
- * use it on data scheduled to be sent. For the same reason, it does not make
- * sense to call this function on unparsed data, so <orig> is not updated. The
- * string length is taken from parameter <len>. If <len> is null, the <str>
- * pointer is allowed to be null.
- */
-int buffer_replace2(struct channel *b, char *pos, char *end, const char *str, int len)
-{
-	int delta;
-
-	delta = len - (end - pos);
-
-	if (bi_end(&b->buf) + delta >= b->buf.data + b->buf.size)
-		return 0;  /* no space left */
-
-	if (buffer_not_empty(&b->buf) &&
-	    bi_end(&b->buf) + delta > bo_ptr(&b->buf) &&
-	    bo_ptr(&b->buf) >= bi_end(&b->buf))
-		return 0;  /* no space left before wrapping data */
-
-	/* first, protect the end of the buffer */
-	memmove(end + delta, end, bi_end(&b->buf) - end);
-
-	/* now, copy str over pos */
-	if (len)
-		memcpy(pos, str, len);
-
-	b->buf.i += delta;
-
-	if (buffer_len(&b->buf) == 0)
-		b->buf.p = b->buf.data;
-
-	return delta;
-}
-
-/*
- * Inserts <str> followed by "\r\n" at position <pos> in buffer <b>. The <len>
- * argument informs about the length of string <str> so that we don't have to
- * measure it. It does not include the "\r\n". If <str> is NULL, then the buffer
- * is only opened for len+2 bytes but nothing is copied in. It may be useful in
- * some circumstances. The send limit is *not* adjusted. Same comments as above
- * for the valid use cases.
- *
- * The number of bytes added is returned on success. 0 is returned on failure.
- */
-int buffer_insert_line2(struct channel *b, char *pos, const char *str, int len)
-{
-	int delta;
-
-	delta = len + 2;
-
-	if (bi_end(&b->buf) + delta >= b->buf.data + b->buf.size)
-		return 0;  /* no space left */
-
-	/* first, protect the end of the buffer */
-	memmove(pos + delta, pos, bi_end(&b->buf) - pos);
-
-	/* now, copy str over pos */
-	if (len && str) {
-		memcpy(pos, str, len);
-		pos[len] = '\r';
-		pos[len + 1] = '\n';
-	}
-
-	b->buf.i += delta;
-	return delta;
-}
-
 /*
  * Local variables:
  *  c-indent-level: 8
diff --git a/src/frontend.c b/src/frontend.c
index aa6cb9e..ffd1017 100644
--- a/src/frontend.c
+++ b/src/frontend.c
@@ -389,7 +389,7 @@
 
 	/* remove the PROXY line from the request */
 	len = line - req->buf.data;
-	buffer_replace2(req, req->buf.data, line, NULL, 0);
+	buffer_replace2(&req->buf, req->buf.data, line, NULL, 0);
 	req->total -= len; /* don't count the header line */
 
 	req->analysers &= ~an_bit;
diff --git a/src/proto_http.c b/src/proto_http.c
index a3b9f34..a047bc1 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -421,7 +421,7 @@
 	int bytes, len;
 
 	len = strlen(text);
-	bytes = buffer_insert_line2(msg->buf, msg->buf->buf.p + msg->eoh, text, len);
+	bytes = buffer_insert_line2(&msg->buf->buf, msg->buf->buf.p + msg->eoh, text, len);
 	if (!bytes)
 		return -1;
 	http_msg_move_end(msg, bytes);
@@ -441,7 +441,7 @@
 {
 	int bytes;
 
-	bytes = buffer_insert_line2(msg->buf, msg->buf->buf.p + msg->eoh, text, len);
+	bytes = buffer_insert_line2(&msg->buf->buf, msg->buf->buf.p + msg->eoh, text, len);
 	if (!bytes)
 		return -1;
 	http_msg_move_end(msg, bytes);
@@ -610,7 +610,7 @@
 	hdr = &idx->v[cur_idx];
 	if (sol[ctx->del] == ':' && ctx->val + ctx->vlen + ctx->tws == hdr->len) {
 		/* This was the only value of the header, we must now remove it entirely. */
-		delta = buffer_replace2(msg->buf, sol, sol + hdr->len + hdr->cr + 1, NULL, 0);
+		delta = buffer_replace2(&msg->buf->buf, sol, sol + hdr->len + hdr->cr + 1, NULL, 0);
 		http_msg_move_end(msg, delta);
 		idx->used--;
 		hdr->len = 0;   /* unused entry */
@@ -630,7 +630,7 @@
 	 */
 
 	skip_comma = (ctx->val + ctx->vlen + ctx->tws == hdr->len) ? 0 : 1;
-	delta = buffer_replace2(msg->buf, sol + ctx->del + skip_comma,
+	delta = buffer_replace2(&msg->buf->buf, sol + ctx->del + skip_comma,
 				sol + ctx->val + ctx->vlen + ctx->tws + skip_comma,
 				NULL, 0);
 	hdr->len += delta;
@@ -1608,12 +1608,12 @@
 
 	if (msg->sl.rq.u_l == 0) {
 		/* if no URI was set, add "/" */
-		delta = buffer_replace2(msg->buf, cur_end, cur_end, " /", 2);
+		delta = buffer_replace2(&msg->buf->buf, cur_end, cur_end, " /", 2);
 		cur_end += delta;
 		http_msg_move_end(msg, delta);
 	}
 	/* add HTTP version */
-	delta = buffer_replace2(msg->buf, cur_end, cur_end, " HTTP/1.0\r\n", 11);
+	delta = buffer_replace2(&msg->buf->buf, cur_end, cur_end, " HTTP/1.0\r\n", 11);
 	http_msg_move_end(msg, delta);
 	cur_end += delta;
 	cur_end = (char *)http_parse_reqline(msg,
@@ -5588,7 +5588,7 @@
 
 			case ACT_REPLACE:
 				len = exp_replace(trash, cur_ptr, exp->replace, pmatch);
-				delta = buffer_replace2(req, cur_ptr, cur_end, trash, len);
+				delta = buffer_replace2(&req->buf, cur_ptr, cur_end, trash, len);
 				/* FIXME: if the user adds a newline in the replacement, the
 				 * index will not be recalculated for now, and the new line
 				 * will not be counted as a new header.
@@ -5601,7 +5601,7 @@
 				break;
 
 			case ACT_REMOVE:
-				delta = buffer_replace2(req, cur_ptr, cur_next, NULL, 0);
+				delta = buffer_replace2(&req->buf, cur_ptr, cur_next, NULL, 0);
 				cur_next += delta;
 
 				http_msg_move_end(&txn->req, delta);
@@ -5713,7 +5713,7 @@
 		case ACT_REPLACE:
 			*cur_end = term; /* restore the string terminator */
 			len = exp_replace(trash, cur_ptr, exp->replace, pmatch);
-			delta = buffer_replace2(req, cur_ptr, cur_end, trash, len);
+			delta = buffer_replace2(&req->buf, cur_ptr, cur_end, trash, len);
 			/* FIXME: if the user adds a newline in the replacement, the
 			 * index will not be recalculated for now, and the new line
 			 * will not be counted as a new header.
@@ -5914,7 +5914,7 @@
  *   - there are non-space chars before <from> ;
  *   - there is a CR/LF at or after <next>.
  */
-int del_hdr_value(struct channel *buf, char **from, char *next)
+int del_hdr_value(struct buffer *buf, char **from, char *next)
 {
 	char *prev = *from;
 
@@ -6094,7 +6094,7 @@
 				 */
 				preserve_hdr = 1;
 				if (del_from != NULL) {
-					int delta = del_hdr_value(req, &del_from, prev);
+					int delta = del_hdr_value(&req->buf, &del_from, prev);
 					val_end  += delta;
 					next     += delta;
 					hdr_end  += delta;
@@ -6117,13 +6117,13 @@
 				int stripped_after = 0;
 
 				if (att_end != equal) {
-					stripped_before = buffer_replace2(req, att_end, equal, NULL, 0);
+					stripped_before = buffer_replace2(&req->buf, att_end, equal, NULL, 0);
 					equal   += stripped_before;
 					val_beg += stripped_before;
 				}
 
 				if (val_beg > equal + 1) {
-					stripped_after = buffer_replace2(req, equal + 1, val_beg, NULL, 0);
+					stripped_after = buffer_replace2(&req->buf, equal + 1, val_beg, NULL, 0);
 					val_beg += stripped_after;
 					stripped_before += stripped_after;
 				}
@@ -6304,7 +6304,7 @@
 				if ((t->be->ck_opts & PR_CK_PFX) && (delim != val_end)) {
 					int delta; /* negative */
 
-					delta = buffer_replace2(req, val_beg, delim + 1, NULL, 0);
+					delta = buffer_replace2(&req->buf, val_beg, delim + 1, NULL, 0);
 					val_end  += delta;
 					next     += delta;
 					hdr_end  += delta;
@@ -6327,7 +6327,7 @@
 				preserve_hdr = 1;
 
 				if (del_from != NULL) {
-					int delta = del_hdr_value(req, &del_from, prev);
+					int delta = del_hdr_value(&req->buf, &del_from, prev);
 					if (att_beg >= del_from)
 						att_beg += delta;
 					if (att_end >= del_from)
@@ -6380,11 +6380,11 @@
 		if (del_from) {
 			int delta;
 			if (preserve_hdr) {
-				delta = del_hdr_value(req, &del_from, hdr_end);
+				delta = del_hdr_value(&req->buf, &del_from, hdr_end);
 				hdr_end = del_from;
 				cur_hdr->len += delta;
 			} else {
-				delta = buffer_replace2(req, hdr_beg, hdr_next, NULL, 0);
+				delta = buffer_replace2(&req->buf, hdr_beg, hdr_next, NULL, 0);
 
 				/* FIXME: this should be a separate function */
 				txn->hdr_idx.v[old_idx].next = cur_hdr->next;
@@ -6462,7 +6462,7 @@
 
 			case ACT_REPLACE:
 				len = exp_replace(trash, cur_ptr, exp->replace, pmatch);
-				delta = buffer_replace2(rtr, cur_ptr, cur_end, trash, len);
+				delta = buffer_replace2(&rtr->buf, cur_ptr, cur_end, trash, len);
 				/* FIXME: if the user adds a newline in the replacement, the
 				 * index will not be recalculated for now, and the new line
 				 * will not be counted as a new header.
@@ -6475,7 +6475,7 @@
 				break;
 
 			case ACT_REMOVE:
-				delta = buffer_replace2(rtr, cur_ptr, cur_next, NULL, 0);
+				delta = buffer_replace2(&rtr->buf, cur_ptr, cur_next, NULL, 0);
 				cur_next += delta;
 
 				http_msg_move_end(&txn->rsp, delta);
@@ -6552,7 +6552,7 @@
 		case ACT_REPLACE:
 			*cur_end = term; /* restore the string terminator */
 			len = exp_replace(trash, cur_ptr, exp->replace, pmatch);
-			delta = buffer_replace2(rtr, cur_ptr, cur_end, trash, len);
+			delta = buffer_replace2(&rtr->buf, cur_ptr, cur_end, trash, len);
 			/* FIXME: if the user adds a newline in the replacement, the
 			 * index will not be recalculated for now, and the new line
 			 * will not be counted as a new header.
@@ -6807,13 +6807,13 @@
 				int stripped_after = 0;
 
 				if (att_end != equal) {
-					stripped_before = buffer_replace2(res, att_end, equal, NULL, 0);
+					stripped_before = buffer_replace2(&res->buf, att_end, equal, NULL, 0);
 					equal   += stripped_before;
 					val_beg += stripped_before;
 				}
 
 				if (val_beg > equal + 1) {
-					stripped_after = buffer_replace2(res, equal + 1, val_beg, NULL, 0);
+					stripped_after = buffer_replace2(&res->buf, equal + 1, val_beg, NULL, 0);
 					val_beg += stripped_after;
 					stripped_before += stripped_after;
 				}
@@ -6871,7 +6871,7 @@
 					/* this cookie must be deleted */
 					if (*prev == ':' && next == hdr_end) {
 						/* whole header */
-						delta = buffer_replace2(res, hdr_beg, hdr_next, NULL, 0);
+						delta = buffer_replace2(&res->buf, hdr_beg, hdr_next, NULL, 0);
 						txn->hdr_idx.v[old_idx].next = cur_hdr->next;
 						txn->hdr_idx.used--;
 						cur_hdr->len = 0;
@@ -6883,7 +6883,7 @@
 						 */
 					} else {
 						/* just remove the value */
-						int delta = del_hdr_value(res, &prev, next);
+						int delta = del_hdr_value(&res->buf, &prev, next);
 						next      = prev;
 						hdr_end  += delta;
 						hdr_next += delta;
@@ -6898,7 +6898,7 @@
 					/* replace bytes val_beg->val_end with the cookie name associated
 					 * with this server since we know it.
 					 */
-					delta = buffer_replace2(res, val_beg, val_end, srv->cookie, srv->cklen);
+					delta = buffer_replace2(&res->buf, val_beg, val_end, srv->cookie, srv->cklen);
 					next     += delta;
 					hdr_end  += delta;
 					hdr_next += delta;
@@ -6912,7 +6912,7 @@
 					/* insert the cookie name associated with this server
 					 * before existing cookie, and insert a delimiter between them..
 					 */
-					delta = buffer_replace2(res, val_beg, val_beg, srv->cookie, srv->cklen + 1);
+					delta = buffer_replace2(&res->buf, val_beg, val_beg, srv->cookie, srv->cklen + 1);
 					next     += delta;
 					hdr_end  += delta;
 					hdr_next += delta;