blob: feac6fd053e7a2258c9368b00edf8f80c2333283 [file] [log] [blame]
James Kuszmaul82f6c042021-01-17 11:30:16 -08001/**
2 * @file re_mbuf.h Interface to memory buffers
3 *
4 * Copyright (C) 2010 Creytiv.com
5 */
6
7
8#include <stdarg.h>
9
10
11#ifndef RELEASE
12#define MBUF_DEBUG 1 /**< Mbuf debugging (0 or 1) */
13#endif
14
15#if MBUF_DEBUG
16/** Check that mbuf position does not exceed end */
17#define MBUF_CHECK_POS(mb) \
18 if ((mb) && (mb)->pos > (mb)->end) { \
19 BREAKPOINT; \
20 }
21/** Check that mbuf end does not exceed size */
22#define MBUF_CHECK_END(mb) \
23 if ((mb) && (mb)->end > (mb)->size) { \
24 BREAKPOINT; \
25 }
26#else
27#define MBUF_CHECK_POS(mb)
28#define MBUF_CHECK_END(mb)
29#endif
30
31/** Defines a memory buffer */
32struct mbuf {
33 uint8_t *buf; /**< Buffer memory */
34 size_t size; /**< Size of buffer */
35 size_t pos; /**< Position in buffer */
36 size_t end; /**< End of buffer */
37};
38
39
40struct pl;
41struct re_printf;
42
43struct mbuf *mbuf_alloc(size_t size);
44struct mbuf *mbuf_alloc_ref(struct mbuf *mbr);
45void mbuf_init(struct mbuf *mb);
46void mbuf_reset(struct mbuf *mb);
47int mbuf_resize(struct mbuf *mb, size_t size);
48void mbuf_trim(struct mbuf *mb);
49int mbuf_shift(struct mbuf *mb, ssize_t shift);
50int mbuf_write_mem(struct mbuf *mb, const uint8_t *buf, size_t size);
51int mbuf_write_u8(struct mbuf *mb, uint8_t v);
52int mbuf_write_u16(struct mbuf *mb, uint16_t v);
53int mbuf_write_u32(struct mbuf *mb, uint32_t v);
54int mbuf_write_u64(struct mbuf *mb, uint64_t v);
55int mbuf_write_str(struct mbuf *mb, const char *str);
56int mbuf_write_pl(struct mbuf *mb, const struct pl *pl);
57int mbuf_read_mem(struct mbuf *mb, uint8_t *buf, size_t size);
58uint8_t mbuf_read_u8(struct mbuf *mb);
59uint16_t mbuf_read_u16(struct mbuf *mb);
60uint32_t mbuf_read_u32(struct mbuf *mb);
61uint64_t mbuf_read_u64(struct mbuf *mb);
62int mbuf_read_str(struct mbuf *mb, char *str, size_t size);
63int mbuf_strdup(struct mbuf *mb, char **strp, size_t len);
64int mbuf_vprintf(struct mbuf *mb, const char *fmt, va_list ap);
65int mbuf_printf(struct mbuf *mb, const char *fmt, ...);
66int mbuf_write_pl_skip(struct mbuf *mb, const struct pl *pl,
67 const struct pl *skip);
68int mbuf_fill(struct mbuf *mb, uint8_t c, size_t n);
69int mbuf_debug(struct re_printf *pf, const struct mbuf *mb);
70
71
72/**
73 * Get the buffer from the current position
74 *
75 * @param mb Memory buffer
76 *
77 * @return Current buffer
78 */
79static inline uint8_t *mbuf_buf(const struct mbuf *mb)
80{
81 return mb ? mb->buf + mb->pos : (uint8_t *)NULL;
82}
83
84
85/**
86 * Get number of bytes left in a memory buffer, from current position to end
87 *
88 * @param mb Memory buffer
89 *
90 * @return Number of bytes left
91 */
92static inline size_t mbuf_get_left(const struct mbuf *mb)
93{
94 return (mb && (mb->end > mb->pos)) ? (mb->end - mb->pos) : 0;
95}
96
97
98/**
99 * Get available space in buffer (size - pos)
100 *
101 * @param mb Memory buffer
102 *
103 * @return Number of bytes available in buffer
104 */
105static inline size_t mbuf_get_space(const struct mbuf *mb)
106{
107 return (mb && (mb->size > mb->pos)) ? (mb->size - mb->pos) : 0;
108}
109
110
111/**
112 * Set absolute position
113 *
114 * @param mb Memory buffer
115 * @param pos Position
116 */
117static inline void mbuf_set_pos(struct mbuf *mb, size_t pos)
118{
119 mb->pos = pos;
120 MBUF_CHECK_POS(mb);
121}
122
123
124/**
125 * Set absolute end
126 *
127 * @param mb Memory buffer
128 * @param end End position
129 */
130static inline void mbuf_set_end(struct mbuf *mb, size_t end)
131{
132 mb->end = end;
133 MBUF_CHECK_END(mb);
134}
135
136
137/**
138 * Advance position +/- N bytes
139 *
140 * @param mb Memory buffer
141 * @param n Number of bytes to advance
142 */
143static inline void mbuf_advance(struct mbuf *mb, ssize_t n)
144{
145 mb->pos += n;
146 MBUF_CHECK_POS(mb);
147}
148
149
150/**
151 * Rewind position and end to the beginning of buffer
152 *
153 * @param mb Memory buffer
154 */
155static inline void mbuf_rewind(struct mbuf *mb)
156{
157 mb->pos = mb->end = 0;
158}
159
160
161/**
162 * Set position to the end of the buffer
163 *
164 * @param mb Memory buffer
165 */
166static inline void mbuf_skip_to_end(struct mbuf *mb)
167{
168 mb->pos = mb->end;
169}