Squashed 'third_party/rawrtc/re/' content from commit f3163ce8b

Change-Id: I6a235e6ac0f03269d951026f9d195da05c40fdab
git-subtree-dir: third_party/rawrtc/re
git-subtree-split: f3163ce8b526a13b35ef71ce4dd6f43585064d8a
diff --git a/include/re_mbuf.h b/include/re_mbuf.h
new file mode 100644
index 0000000..feac6fd
--- /dev/null
+++ b/include/re_mbuf.h
@@ -0,0 +1,169 @@
+/**
+ * @file re_mbuf.h  Interface to memory buffers
+ *
+ * Copyright (C) 2010 Creytiv.com
+ */
+
+
+#include <stdarg.h>
+
+
+#ifndef RELEASE
+#define MBUF_DEBUG 1  /**< Mbuf debugging (0 or 1) */
+#endif
+
+#if MBUF_DEBUG
+/** Check that mbuf position does not exceed end */
+#define MBUF_CHECK_POS(mb)						\
+	if ((mb) && (mb)->pos > (mb)->end) {				\
+		BREAKPOINT;						\
+	}
+/** Check that mbuf end does not exceed size */
+#define MBUF_CHECK_END(mb)						\
+	if ((mb) && (mb)->end > (mb)->size) {				\
+		BREAKPOINT;						\
+	}
+#else
+#define MBUF_CHECK_POS(mb)
+#define MBUF_CHECK_END(mb)
+#endif
+
+/** Defines a memory buffer */
+struct mbuf {
+	uint8_t *buf;   /**< Buffer memory      */
+	size_t size;    /**< Size of buffer     */
+	size_t pos;     /**< Position in buffer */
+	size_t end;     /**< End of buffer      */
+};
+
+
+struct pl;
+struct re_printf;
+
+struct mbuf *mbuf_alloc(size_t size);
+struct mbuf *mbuf_alloc_ref(struct mbuf *mbr);
+void     mbuf_init(struct mbuf *mb);
+void     mbuf_reset(struct mbuf *mb);
+int      mbuf_resize(struct mbuf *mb, size_t size);
+void     mbuf_trim(struct mbuf *mb);
+int      mbuf_shift(struct mbuf *mb, ssize_t shift);
+int      mbuf_write_mem(struct mbuf *mb, const uint8_t *buf, size_t size);
+int      mbuf_write_u8(struct mbuf *mb, uint8_t v);
+int      mbuf_write_u16(struct mbuf *mb, uint16_t v);
+int      mbuf_write_u32(struct mbuf *mb, uint32_t v);
+int      mbuf_write_u64(struct mbuf *mb, uint64_t v);
+int      mbuf_write_str(struct mbuf *mb, const char *str);
+int      mbuf_write_pl(struct mbuf *mb, const struct pl *pl);
+int      mbuf_read_mem(struct mbuf *mb, uint8_t *buf, size_t size);
+uint8_t  mbuf_read_u8(struct mbuf *mb);
+uint16_t mbuf_read_u16(struct mbuf *mb);
+uint32_t mbuf_read_u32(struct mbuf *mb);
+uint64_t mbuf_read_u64(struct mbuf *mb);
+int      mbuf_read_str(struct mbuf *mb, char *str, size_t size);
+int      mbuf_strdup(struct mbuf *mb, char **strp, size_t len);
+int      mbuf_vprintf(struct mbuf *mb, const char *fmt, va_list ap);
+int      mbuf_printf(struct mbuf *mb, const char *fmt, ...);
+int      mbuf_write_pl_skip(struct mbuf *mb, const struct pl *pl,
+			    const struct pl *skip);
+int      mbuf_fill(struct mbuf *mb, uint8_t c, size_t n);
+int      mbuf_debug(struct re_printf *pf, const struct mbuf *mb);
+
+
+/**
+ * Get the buffer from the current position
+ *
+ * @param mb Memory buffer
+ *
+ * @return Current buffer
+ */
+static inline uint8_t *mbuf_buf(const struct mbuf *mb)
+{
+	return mb ? mb->buf + mb->pos : (uint8_t *)NULL;
+}
+
+
+/**
+ * Get number of bytes left in a memory buffer, from current position to end
+ *
+ * @param mb Memory buffer
+ *
+ * @return Number of bytes left
+ */
+static inline size_t mbuf_get_left(const struct mbuf *mb)
+{
+	return (mb && (mb->end > mb->pos)) ? (mb->end - mb->pos) : 0;
+}
+
+
+/**
+ * Get available space in buffer (size - pos)
+ *
+ * @param mb Memory buffer
+ *
+ * @return Number of bytes available in buffer
+ */
+static inline size_t mbuf_get_space(const struct mbuf *mb)
+{
+	return (mb && (mb->size > mb->pos)) ? (mb->size - mb->pos) : 0;
+}
+
+
+/**
+ * Set absolute position
+ *
+ * @param mb  Memory buffer
+ * @param pos Position
+ */
+static inline void mbuf_set_pos(struct mbuf *mb, size_t pos)
+{
+	mb->pos = pos;
+	MBUF_CHECK_POS(mb);
+}
+
+
+/**
+ * Set absolute end
+ *
+ * @param mb  Memory buffer
+ * @param end End position
+ */
+static inline void mbuf_set_end(struct mbuf *mb, size_t end)
+{
+	mb->end = end;
+	MBUF_CHECK_END(mb);
+}
+
+
+/**
+ * Advance position +/- N bytes
+ *
+ * @param mb  Memory buffer
+ * @param n   Number of bytes to advance
+ */
+static inline void mbuf_advance(struct mbuf *mb, ssize_t n)
+{
+	mb->pos += n;
+	MBUF_CHECK_POS(mb);
+}
+
+
+/**
+ * Rewind position and end to the beginning of buffer
+ *
+ * @param mb  Memory buffer
+ */
+static inline void mbuf_rewind(struct mbuf *mb)
+{
+	mb->pos = mb->end = 0;
+}
+
+
+/**
+ * Set position to the end of the buffer
+ *
+ * @param mb  Memory buffer
+ */
+static inline void mbuf_skip_to_end(struct mbuf *mb)
+{
+	mb->pos = mb->end;
+}