BUG/MINOR: buffers: Fix bi/bo_contig_space to handle full buffers

These functions was added in commit 637f8f2c ("BUG/MEDIUM: buffers: Fix how
input/output data are injected into buffers").

This patch fixes hidden bugs. When a buffer is full (buf->i + buf->o ==
buf->size), instead of returning 0, these functions can return buf->size. Today,
this never happens because callers already check if the buffer is full before
calling bi/bo_contig_space. But to avoid possible bugs if calling conditions
changed, we slightly refactored these functions.
diff --git a/include/common/buffer.h b/include/common/buffer.h
index 040a26e..f8bd26e 100644
--- a/include/common/buffer.h
+++ b/include/common/buffer.h
@@ -163,12 +163,16 @@
 {
 	const char *left, *right;
 
-	left  = bi_end(b);
-	right = bo_ptr(b);
-
-	if (left >= right)
-		right = b->data + b->size;
-
+	left  = b->p + b->i;
+	right = b->p - b->o;
+	if (left >= b->data + b->size)
+		left -= b->size;
+	else {
+		if (right < b->data)
+			right += b->size;
+		else
+			right = b->data + b->size;
+	}
 	return (right - left);
 }
 
@@ -181,10 +185,11 @@
 {
 	const char *left, *right;
 
-	left  = bo_end(b);
-	right = bo_ptr(b);
-
-	if (left >= right)
+	left  = b->p;
+	right = b->p - b->o;
+	if (right < b->data)
+		right += b->size;
+	else
 		right = b->data + b->size;
 
 	return (right - left);