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;
+}