buffer: New functions buffer_reserve(), buffer_push(),
authorBen Pfaff <blp@nicira.com>
Mon, 14 Jul 2008 20:51:46 +0000 (13:51 -0700)
committerBen Pfaff <blp@nicira.com>
Fri, 18 Jul 2008 20:42:37 +0000 (13:42 -0700)
buffer_try_pull().

include/buffer.h
lib/buffer.c

index 16183f6e67445830799c4f714c7e6c583be67a24..2fe05c33a0e03900aba1629f43a33a0c0f87dbda 100644 (file)
@@ -69,7 +69,9 @@ void *buffer_end(const struct buffer *);
 
 void *buffer_put_uninit(struct buffer *, size_t);
 void *buffer_put(struct buffer *, const void *, size_t);
+void buffer_reserve(struct buffer *, size_t);
 void *buffer_push_uninit(struct buffer *b, size_t);
+void *buffer_push(struct buffer *b, const void *, size_t);
 
 size_t buffer_headroom(struct buffer *);
 size_t buffer_tailroom(struct buffer *);
@@ -78,5 +80,6 @@ void buffer_prealloc_tailroom(struct buffer *, size_t);
 
 void buffer_clear(struct buffer *);
 void *buffer_pull(struct buffer *, size_t);
+void *buffer_try_pull(struct buffer *, size_t);
 
 #endif /* buffer.h */
index 8604913f14018342e85477cd0a90c6aed9d76397..637828d44a65c59270777c40dded7b906d5835a0 100644 (file)
@@ -181,6 +181,16 @@ buffer_put(struct buffer *b, const void *p, size_t size)
     return dst;
 }
 
+/* Reserves 'size' bytes of headroom so that they can be later allocated with
+ * buffer_push_uninit() without reallocating the buffer. */
+void
+buffer_reserve(struct buffer *b, size_t size) 
+{
+    assert(!b->size);
+    buffer_prealloc_tailroom(b, size);
+    b->data += size;
+}
+
 void *
 buffer_push_uninit(struct buffer *b, size_t size) 
 {
@@ -190,6 +200,14 @@ buffer_push_uninit(struct buffer *b, size_t size)
     return b->data;
 }
 
+void *
+buffer_push(struct buffer *b, const void *p, size_t size) 
+{
+    void *dst = buffer_push_uninit(b, size);
+    memcpy(dst, p, size);
+    return dst;
+}
+
 /* If 'b' contains at least 'offset + size' bytes of data, returns a pointer to
  * byte 'offset'.  Otherwise, returns a null pointers. */
 void *
@@ -242,3 +260,11 @@ buffer_pull(struct buffer *b, size_t size)
     return data;
 }
 
+/* If 'b' has at least 'size' bytes of data, removes that many bytes from the
+ * head end of 'b' and returns the first byte removed.  Otherwise, returns a
+ * null pointer without modifying 'b'. */
+void *
+buffer_try_pull(struct buffer *b, size_t size) 
+{
+    return b->size >= size ? buffer_pull(b, size) : NULL;
+}