xref: /freebsd/contrib/ldns/ldns/buffer.h (revision 7b5038d7)
1*7b5038d7SDag-Erling Smørgrav /*
2*7b5038d7SDag-Erling Smørgrav  * buffer.h -- generic memory buffer.
3*7b5038d7SDag-Erling Smørgrav  *
4*7b5038d7SDag-Erling Smørgrav  * Copyright (c) 2005-2008, NLnet Labs. All rights reserved.
5*7b5038d7SDag-Erling Smørgrav  *
6*7b5038d7SDag-Erling Smørgrav  * See LICENSE for the license.
7*7b5038d7SDag-Erling Smørgrav  *
8*7b5038d7SDag-Erling Smørgrav  *
9*7b5038d7SDag-Erling Smørgrav  * The buffer module implements a generic buffer.  The API is based on
10*7b5038d7SDag-Erling Smørgrav  * the java.nio.Buffer interface.
11*7b5038d7SDag-Erling Smørgrav  */
12*7b5038d7SDag-Erling Smørgrav 
13*7b5038d7SDag-Erling Smørgrav #ifndef LDNS_BUFFER_H
14*7b5038d7SDag-Erling Smørgrav #define LDNS_BUFFER_H
15*7b5038d7SDag-Erling Smørgrav 
16*7b5038d7SDag-Erling Smørgrav #include <assert.h>
17*7b5038d7SDag-Erling Smørgrav #include <stdarg.h>
18*7b5038d7SDag-Erling Smørgrav #include <string.h>
19*7b5038d7SDag-Erling Smørgrav 
20*7b5038d7SDag-Erling Smørgrav #include <ldns/error.h>
21*7b5038d7SDag-Erling Smørgrav #include <ldns/common.h>
22*7b5038d7SDag-Erling Smørgrav 
23*7b5038d7SDag-Erling Smørgrav #include "ldns/util.h"
24*7b5038d7SDag-Erling Smørgrav 
25*7b5038d7SDag-Erling Smørgrav #ifdef __cplusplus
26*7b5038d7SDag-Erling Smørgrav extern "C" {
27*7b5038d7SDag-Erling Smørgrav #endif
28*7b5038d7SDag-Erling Smørgrav 
29*7b5038d7SDag-Erling Smørgrav /**
30*7b5038d7SDag-Erling Smørgrav  * number of initial bytes in buffer of
31*7b5038d7SDag-Erling Smørgrav  * which we cannot tell the size before hand
32*7b5038d7SDag-Erling Smørgrav  */
33*7b5038d7SDag-Erling Smørgrav #define LDNS_MIN_BUFLEN	512
34*7b5038d7SDag-Erling Smørgrav 
35*7b5038d7SDag-Erling Smørgrav /**
36*7b5038d7SDag-Erling Smørgrav  * \file buffer.h
37*7b5038d7SDag-Erling Smørgrav  *
38*7b5038d7SDag-Erling Smørgrav  * This file contains the definition of ldns_buffer, and functions to manipulate those.
39*7b5038d7SDag-Erling Smørgrav  */
40*7b5038d7SDag-Erling Smørgrav 
41*7b5038d7SDag-Erling Smørgrav /**
42*7b5038d7SDag-Erling Smørgrav  * implementation of buffers to ease operations
43*7b5038d7SDag-Erling Smørgrav  *
44*7b5038d7SDag-Erling Smørgrav  * ldns_buffers can contain arbitrary information, per octet. You can write
45*7b5038d7SDag-Erling Smørgrav  * to the current end of a buffer, read from the current position, and
46*7b5038d7SDag-Erling Smørgrav  * access any data within it.
47*7b5038d7SDag-Erling Smørgrav  *
48*7b5038d7SDag-Erling Smørgrav  * Example use of buffers is in the source code of \ref host2str.c
49*7b5038d7SDag-Erling Smørgrav  */
50*7b5038d7SDag-Erling Smørgrav struct ldns_struct_buffer
51*7b5038d7SDag-Erling Smørgrav {
52*7b5038d7SDag-Erling Smørgrav 	/** The current position used for reading/writing */
53*7b5038d7SDag-Erling Smørgrav 	size_t   _position;
54*7b5038d7SDag-Erling Smørgrav 
55*7b5038d7SDag-Erling Smørgrav 	/** The read/write limit */
56*7b5038d7SDag-Erling Smørgrav 	size_t   _limit;
57*7b5038d7SDag-Erling Smørgrav 
58*7b5038d7SDag-Erling Smørgrav 	/** The amount of data the buffer can contain */
59*7b5038d7SDag-Erling Smørgrav 	size_t   _capacity;
60*7b5038d7SDag-Erling Smørgrav 
61*7b5038d7SDag-Erling Smørgrav 	/** The data contained in the buffer */
62*7b5038d7SDag-Erling Smørgrav 	uint8_t *_data;
63*7b5038d7SDag-Erling Smørgrav 
64*7b5038d7SDag-Erling Smørgrav 	/** If the buffer is fixed it cannot be resized */
65*7b5038d7SDag-Erling Smørgrav 	unsigned _fixed : 1;
66*7b5038d7SDag-Erling Smørgrav 
67*7b5038d7SDag-Erling Smørgrav 	/** The current state of the buffer. If writing to the buffer fails
68*7b5038d7SDag-Erling Smørgrav 	 * for any reason, this value is changed. This way, you can perform
69*7b5038d7SDag-Erling Smørgrav 	 * multiple writes in sequence and check for success afterwards. */
70*7b5038d7SDag-Erling Smørgrav 	ldns_status _status;
71*7b5038d7SDag-Erling Smørgrav };
72*7b5038d7SDag-Erling Smørgrav typedef struct ldns_struct_buffer ldns_buffer;
73*7b5038d7SDag-Erling Smørgrav 
74*7b5038d7SDag-Erling Smørgrav 
75*7b5038d7SDag-Erling Smørgrav #ifdef NDEBUG
76*7b5038d7SDag-Erling Smørgrav INLINE void
77*7b5038d7SDag-Erling Smørgrav ldns_buffer_invariant(ldns_buffer *ATTR_UNUSED(buffer))
78*7b5038d7SDag-Erling Smørgrav {
79*7b5038d7SDag-Erling Smørgrav }
80*7b5038d7SDag-Erling Smørgrav #else
81*7b5038d7SDag-Erling Smørgrav INLINE void
82*7b5038d7SDag-Erling Smørgrav ldns_buffer_invariant(ldns_buffer *buffer)
83*7b5038d7SDag-Erling Smørgrav {
84*7b5038d7SDag-Erling Smørgrav 	assert(buffer != NULL);
85*7b5038d7SDag-Erling Smørgrav 	assert(buffer->_position <= buffer->_limit);
86*7b5038d7SDag-Erling Smørgrav 	assert(buffer->_limit <= buffer->_capacity);
87*7b5038d7SDag-Erling Smørgrav 	assert(buffer->_data != NULL);
88*7b5038d7SDag-Erling Smørgrav }
89*7b5038d7SDag-Erling Smørgrav #endif
90*7b5038d7SDag-Erling Smørgrav 
91*7b5038d7SDag-Erling Smørgrav /**
92*7b5038d7SDag-Erling Smørgrav  * creates a new buffer with the specified capacity.
93*7b5038d7SDag-Erling Smørgrav  *
94*7b5038d7SDag-Erling Smørgrav  * \param[in] capacity the size (in bytes) to allocate for the buffer
95*7b5038d7SDag-Erling Smørgrav  * \return the created buffer
96*7b5038d7SDag-Erling Smørgrav  */
97*7b5038d7SDag-Erling Smørgrav ldns_buffer *ldns_buffer_new(size_t capacity);
98*7b5038d7SDag-Erling Smørgrav 
99*7b5038d7SDag-Erling Smørgrav /**
100*7b5038d7SDag-Erling Smørgrav  * creates a buffer with the specified data.  The data IS copied
101*7b5038d7SDag-Erling Smørgrav  * and MEMORY allocations are done.  The buffer is not fixed and can
102*7b5038d7SDag-Erling Smørgrav  * be resized using buffer_reserve().
103*7b5038d7SDag-Erling Smørgrav  *
104*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer pointer to the buffer to put the data in
105*7b5038d7SDag-Erling Smørgrav  * \param[in] data the data to encapsulate in the buffer
106*7b5038d7SDag-Erling Smørgrav  * \param[in] size the size of the data
107*7b5038d7SDag-Erling Smørgrav  */
108*7b5038d7SDag-Erling Smørgrav void ldns_buffer_new_frm_data(ldns_buffer *buffer, void *data, size_t size);
109*7b5038d7SDag-Erling Smørgrav 
110*7b5038d7SDag-Erling Smørgrav /**
111*7b5038d7SDag-Erling Smørgrav  * clears the buffer and make it ready for writing.  The buffer's limit
112*7b5038d7SDag-Erling Smørgrav  * is set to the capacity and the position is set to 0.
113*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer to clear
114*7b5038d7SDag-Erling Smørgrav  */
115*7b5038d7SDag-Erling Smørgrav INLINE void ldns_buffer_clear(ldns_buffer *buffer)
116*7b5038d7SDag-Erling Smørgrav {
117*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_invariant(buffer);
118*7b5038d7SDag-Erling Smørgrav 
119*7b5038d7SDag-Erling Smørgrav 	/* reset status here? */
120*7b5038d7SDag-Erling Smørgrav 
121*7b5038d7SDag-Erling Smørgrav 	buffer->_position = 0;
122*7b5038d7SDag-Erling Smørgrav 	buffer->_limit = buffer->_capacity;
123*7b5038d7SDag-Erling Smørgrav }
124*7b5038d7SDag-Erling Smørgrav 
125*7b5038d7SDag-Erling Smørgrav /**
126*7b5038d7SDag-Erling Smørgrav  * makes the buffer ready for reading the data that has been written to
127*7b5038d7SDag-Erling Smørgrav  * the buffer.  The buffer's limit is set to the current position and
128*7b5038d7SDag-Erling Smørgrav  * the position is set to 0.
129*7b5038d7SDag-Erling Smørgrav  *
130*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer to flip
131*7b5038d7SDag-Erling Smørgrav  * \return void
132*7b5038d7SDag-Erling Smørgrav  */
133*7b5038d7SDag-Erling Smørgrav INLINE void ldns_buffer_flip(ldns_buffer *buffer)
134*7b5038d7SDag-Erling Smørgrav {
135*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_invariant(buffer);
136*7b5038d7SDag-Erling Smørgrav 
137*7b5038d7SDag-Erling Smørgrav 	buffer->_limit = buffer->_position;
138*7b5038d7SDag-Erling Smørgrav 	buffer->_position = 0;
139*7b5038d7SDag-Erling Smørgrav }
140*7b5038d7SDag-Erling Smørgrav 
141*7b5038d7SDag-Erling Smørgrav /**
142*7b5038d7SDag-Erling Smørgrav  * make the buffer ready for re-reading the data.  The buffer's
143*7b5038d7SDag-Erling Smørgrav  * position is reset to 0.
144*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer to rewind
145*7b5038d7SDag-Erling Smørgrav  */
146*7b5038d7SDag-Erling Smørgrav INLINE void ldns_buffer_rewind(ldns_buffer *buffer)
147*7b5038d7SDag-Erling Smørgrav {
148*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_invariant(buffer);
149*7b5038d7SDag-Erling Smørgrav 
150*7b5038d7SDag-Erling Smørgrav 	buffer->_position = 0;
151*7b5038d7SDag-Erling Smørgrav }
152*7b5038d7SDag-Erling Smørgrav 
153*7b5038d7SDag-Erling Smørgrav /**
154*7b5038d7SDag-Erling Smørgrav  * returns the current position in the buffer (as a number of bytes)
155*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
156*7b5038d7SDag-Erling Smørgrav  * \return the current position
157*7b5038d7SDag-Erling Smørgrav  */
158*7b5038d7SDag-Erling Smørgrav INLINE size_t
159*7b5038d7SDag-Erling Smørgrav ldns_buffer_position(ldns_buffer *buffer)
160*7b5038d7SDag-Erling Smørgrav {
161*7b5038d7SDag-Erling Smørgrav 	return buffer->_position;
162*7b5038d7SDag-Erling Smørgrav }
163*7b5038d7SDag-Erling Smørgrav 
164*7b5038d7SDag-Erling Smørgrav /**
165*7b5038d7SDag-Erling Smørgrav  * sets the buffer's position to MARK.  The position must be less than
166*7b5038d7SDag-Erling Smørgrav  * or equal to the buffer's limit.
167*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
168*7b5038d7SDag-Erling Smørgrav  * \param[in] mark the mark to use
169*7b5038d7SDag-Erling Smørgrav  */
170*7b5038d7SDag-Erling Smørgrav INLINE void
171*7b5038d7SDag-Erling Smørgrav ldns_buffer_set_position(ldns_buffer *buffer, size_t mark)
172*7b5038d7SDag-Erling Smørgrav {
173*7b5038d7SDag-Erling Smørgrav 	assert(mark <= buffer->_limit);
174*7b5038d7SDag-Erling Smørgrav 	buffer->_position = mark;
175*7b5038d7SDag-Erling Smørgrav }
176*7b5038d7SDag-Erling Smørgrav 
177*7b5038d7SDag-Erling Smørgrav /**
178*7b5038d7SDag-Erling Smørgrav  * changes the buffer's position by COUNT bytes.  The position must not
179*7b5038d7SDag-Erling Smørgrav  * be moved behind the buffer's limit or before the beginning of the
180*7b5038d7SDag-Erling Smørgrav  * buffer.
181*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
182*7b5038d7SDag-Erling Smørgrav  * \param[in] count the count to use
183*7b5038d7SDag-Erling Smørgrav  */
184*7b5038d7SDag-Erling Smørgrav INLINE void
185*7b5038d7SDag-Erling Smørgrav ldns_buffer_skip(ldns_buffer *buffer, ssize_t count)
186*7b5038d7SDag-Erling Smørgrav {
187*7b5038d7SDag-Erling Smørgrav 	assert(buffer->_position + count <= buffer->_limit);
188*7b5038d7SDag-Erling Smørgrav 	buffer->_position += count;
189*7b5038d7SDag-Erling Smørgrav }
190*7b5038d7SDag-Erling Smørgrav 
191*7b5038d7SDag-Erling Smørgrav /**
192*7b5038d7SDag-Erling Smørgrav  * returns the maximum size of the buffer
193*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer
194*7b5038d7SDag-Erling Smørgrav  * \return the size
195*7b5038d7SDag-Erling Smørgrav  */
196*7b5038d7SDag-Erling Smørgrav INLINE size_t
197*7b5038d7SDag-Erling Smørgrav ldns_buffer_limit(ldns_buffer *buffer)
198*7b5038d7SDag-Erling Smørgrav {
199*7b5038d7SDag-Erling Smørgrav 	return buffer->_limit;
200*7b5038d7SDag-Erling Smørgrav }
201*7b5038d7SDag-Erling Smørgrav 
202*7b5038d7SDag-Erling Smørgrav /**
203*7b5038d7SDag-Erling Smørgrav  * changes the buffer's limit.  If the buffer's position is greater
204*7b5038d7SDag-Erling Smørgrav  * than the new limit the position is set to the limit.
205*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
206*7b5038d7SDag-Erling Smørgrav  * \param[in] limit the new limit
207*7b5038d7SDag-Erling Smørgrav  */
208*7b5038d7SDag-Erling Smørgrav INLINE void
209*7b5038d7SDag-Erling Smørgrav ldns_buffer_set_limit(ldns_buffer *buffer, size_t limit)
210*7b5038d7SDag-Erling Smørgrav {
211*7b5038d7SDag-Erling Smørgrav 	assert(limit <= buffer->_capacity);
212*7b5038d7SDag-Erling Smørgrav 	buffer->_limit = limit;
213*7b5038d7SDag-Erling Smørgrav 	if (buffer->_position > buffer->_limit)
214*7b5038d7SDag-Erling Smørgrav 		buffer->_position = buffer->_limit;
215*7b5038d7SDag-Erling Smørgrav }
216*7b5038d7SDag-Erling Smørgrav 
217*7b5038d7SDag-Erling Smørgrav /**
218*7b5038d7SDag-Erling Smørgrav  * returns the number of bytes the buffer can hold.
219*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
220*7b5038d7SDag-Erling Smørgrav  * \return the number of bytes
221*7b5038d7SDag-Erling Smørgrav  */
222*7b5038d7SDag-Erling Smørgrav INLINE size_t
223*7b5038d7SDag-Erling Smørgrav ldns_buffer_capacity(ldns_buffer *buffer)
224*7b5038d7SDag-Erling Smørgrav {
225*7b5038d7SDag-Erling Smørgrav 	return buffer->_capacity;
226*7b5038d7SDag-Erling Smørgrav }
227*7b5038d7SDag-Erling Smørgrav 
228*7b5038d7SDag-Erling Smørgrav /**
229*7b5038d7SDag-Erling Smørgrav  * changes the buffer's capacity.  The data is reallocated so any
230*7b5038d7SDag-Erling Smørgrav  * pointers to the data may become invalid.  The buffer's limit is set
231*7b5038d7SDag-Erling Smørgrav  * to the buffer's new capacity.
232*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
233*7b5038d7SDag-Erling Smørgrav  * \param[in] capacity the capacity to use
234*7b5038d7SDag-Erling Smørgrav  * \return whether this failed or succeeded
235*7b5038d7SDag-Erling Smørgrav  */
236*7b5038d7SDag-Erling Smørgrav bool ldns_buffer_set_capacity(ldns_buffer *buffer, size_t capacity);
237*7b5038d7SDag-Erling Smørgrav 
238*7b5038d7SDag-Erling Smørgrav /**
239*7b5038d7SDag-Erling Smørgrav  * ensures BUFFER can contain at least AMOUNT more bytes.  The buffer's
240*7b5038d7SDag-Erling Smørgrav  * capacity is increased if necessary using buffer_set_capacity().
241*7b5038d7SDag-Erling Smørgrav  *
242*7b5038d7SDag-Erling Smørgrav  * The buffer's limit is always set to the (possibly increased)
243*7b5038d7SDag-Erling Smørgrav  * capacity.
244*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
245*7b5038d7SDag-Erling Smørgrav  * \param[in] amount amount to use
246*7b5038d7SDag-Erling Smørgrav  * \return whether this failed or succeeded
247*7b5038d7SDag-Erling Smørgrav  */
248*7b5038d7SDag-Erling Smørgrav bool ldns_buffer_reserve(ldns_buffer *buffer, size_t amount);
249*7b5038d7SDag-Erling Smørgrav 
250*7b5038d7SDag-Erling Smørgrav /**
251*7b5038d7SDag-Erling Smørgrav  * returns a pointer to the data at the indicated position.
252*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
253*7b5038d7SDag-Erling Smørgrav  * \param[in] at position
254*7b5038d7SDag-Erling Smørgrav  * \return the pointer to the data
255*7b5038d7SDag-Erling Smørgrav  */
256*7b5038d7SDag-Erling Smørgrav INLINE uint8_t *
257*7b5038d7SDag-Erling Smørgrav ldns_buffer_at(const ldns_buffer *buffer, size_t at)
258*7b5038d7SDag-Erling Smørgrav {
259*7b5038d7SDag-Erling Smørgrav 	assert(at <= buffer->_limit);
260*7b5038d7SDag-Erling Smørgrav 	return buffer->_data + at;
261*7b5038d7SDag-Erling Smørgrav }
262*7b5038d7SDag-Erling Smørgrav 
263*7b5038d7SDag-Erling Smørgrav /**
264*7b5038d7SDag-Erling Smørgrav  * returns a pointer to the beginning of the buffer (the data at
265*7b5038d7SDag-Erling Smørgrav  * position 0).
266*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
267*7b5038d7SDag-Erling Smørgrav  * \return the pointer
268*7b5038d7SDag-Erling Smørgrav  */
269*7b5038d7SDag-Erling Smørgrav INLINE uint8_t *
270*7b5038d7SDag-Erling Smørgrav ldns_buffer_begin(const ldns_buffer *buffer)
271*7b5038d7SDag-Erling Smørgrav {
272*7b5038d7SDag-Erling Smørgrav 	return ldns_buffer_at(buffer, 0);
273*7b5038d7SDag-Erling Smørgrav }
274*7b5038d7SDag-Erling Smørgrav 
275*7b5038d7SDag-Erling Smørgrav /**
276*7b5038d7SDag-Erling Smørgrav  * returns a pointer to the end of the buffer (the data at the buffer's
277*7b5038d7SDag-Erling Smørgrav  * limit).
278*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
279*7b5038d7SDag-Erling Smørgrav  * \return the pointer
280*7b5038d7SDag-Erling Smørgrav  */
281*7b5038d7SDag-Erling Smørgrav INLINE uint8_t *
282*7b5038d7SDag-Erling Smørgrav ldns_buffer_end(ldns_buffer *buffer)
283*7b5038d7SDag-Erling Smørgrav {
284*7b5038d7SDag-Erling Smørgrav 	return ldns_buffer_at(buffer, buffer->_limit);
285*7b5038d7SDag-Erling Smørgrav }
286*7b5038d7SDag-Erling Smørgrav 
287*7b5038d7SDag-Erling Smørgrav /**
288*7b5038d7SDag-Erling Smørgrav  * returns a pointer to the data at the buffer's current position.
289*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
290*7b5038d7SDag-Erling Smørgrav  * \return the pointer
291*7b5038d7SDag-Erling Smørgrav  */
292*7b5038d7SDag-Erling Smørgrav INLINE uint8_t *
293*7b5038d7SDag-Erling Smørgrav ldns_buffer_current(ldns_buffer *buffer)
294*7b5038d7SDag-Erling Smørgrav {
295*7b5038d7SDag-Erling Smørgrav 	return ldns_buffer_at(buffer, buffer->_position);
296*7b5038d7SDag-Erling Smørgrav }
297*7b5038d7SDag-Erling Smørgrav 
298*7b5038d7SDag-Erling Smørgrav /**
299*7b5038d7SDag-Erling Smørgrav  * returns the number of bytes remaining between the indicated position and
300*7b5038d7SDag-Erling Smørgrav  * the limit.
301*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
302*7b5038d7SDag-Erling Smørgrav  * \param[in] at indicated position
303*7b5038d7SDag-Erling Smørgrav  * \return number of bytes
304*7b5038d7SDag-Erling Smørgrav  */
305*7b5038d7SDag-Erling Smørgrav INLINE size_t
306*7b5038d7SDag-Erling Smørgrav ldns_buffer_remaining_at(ldns_buffer *buffer, size_t at)
307*7b5038d7SDag-Erling Smørgrav {
308*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_invariant(buffer);
309*7b5038d7SDag-Erling Smørgrav 	assert(at <= buffer->_limit);
310*7b5038d7SDag-Erling Smørgrav 	return buffer->_limit - at;
311*7b5038d7SDag-Erling Smørgrav }
312*7b5038d7SDag-Erling Smørgrav 
313*7b5038d7SDag-Erling Smørgrav /**
314*7b5038d7SDag-Erling Smørgrav  * returns the number of bytes remaining between the buffer's position and
315*7b5038d7SDag-Erling Smørgrav  * limit.
316*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
317*7b5038d7SDag-Erling Smørgrav  * \return the number of bytes
318*7b5038d7SDag-Erling Smørgrav  */
319*7b5038d7SDag-Erling Smørgrav INLINE size_t
320*7b5038d7SDag-Erling Smørgrav ldns_buffer_remaining(ldns_buffer *buffer)
321*7b5038d7SDag-Erling Smørgrav {
322*7b5038d7SDag-Erling Smørgrav 	return ldns_buffer_remaining_at(buffer, buffer->_position);
323*7b5038d7SDag-Erling Smørgrav }
324*7b5038d7SDag-Erling Smørgrav 
325*7b5038d7SDag-Erling Smørgrav /**
326*7b5038d7SDag-Erling Smørgrav  * checks if the buffer has at least COUNT more bytes available.
327*7b5038d7SDag-Erling Smørgrav  * Before reading or writing the caller needs to ensure enough space
328*7b5038d7SDag-Erling Smørgrav  * is available!
329*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
330*7b5038d7SDag-Erling Smørgrav  * \param[in] at indicated position
331*7b5038d7SDag-Erling Smørgrav  * \param[in] count how much is available
332*7b5038d7SDag-Erling Smørgrav  * \return true or false (as int?)
333*7b5038d7SDag-Erling Smørgrav  */
334*7b5038d7SDag-Erling Smørgrav INLINE int
335*7b5038d7SDag-Erling Smørgrav ldns_buffer_available_at(ldns_buffer *buffer, size_t at, size_t count)
336*7b5038d7SDag-Erling Smørgrav {
337*7b5038d7SDag-Erling Smørgrav 	return count <= ldns_buffer_remaining_at(buffer, at);
338*7b5038d7SDag-Erling Smørgrav }
339*7b5038d7SDag-Erling Smørgrav 
340*7b5038d7SDag-Erling Smørgrav /**
341*7b5038d7SDag-Erling Smørgrav  * checks if the buffer has count bytes available at the current position
342*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
343*7b5038d7SDag-Erling Smørgrav  * \param[in] count how much is available
344*7b5038d7SDag-Erling Smørgrav  * \return true or false (as int?)
345*7b5038d7SDag-Erling Smørgrav  */
346*7b5038d7SDag-Erling Smørgrav INLINE int
347*7b5038d7SDag-Erling Smørgrav ldns_buffer_available(ldns_buffer *buffer, size_t count)
348*7b5038d7SDag-Erling Smørgrav {
349*7b5038d7SDag-Erling Smørgrav 	return ldns_buffer_available_at(buffer, buffer->_position, count);
350*7b5038d7SDag-Erling Smørgrav }
351*7b5038d7SDag-Erling Smørgrav 
352*7b5038d7SDag-Erling Smørgrav /**
353*7b5038d7SDag-Erling Smørgrav  * writes the given data to the buffer at the specified position
354*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
355*7b5038d7SDag-Erling Smørgrav  * \param[in] at the position (in number of bytes) to write the data at
356*7b5038d7SDag-Erling Smørgrav  * \param[in] data pointer to the data to write to the buffer
357*7b5038d7SDag-Erling Smørgrav  * \param[in] count the number of bytes of data to write
358*7b5038d7SDag-Erling Smørgrav  */
359*7b5038d7SDag-Erling Smørgrav INLINE void
360*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_at(ldns_buffer *buffer, size_t at, const void *data, size_t count)
361*7b5038d7SDag-Erling Smørgrav {
362*7b5038d7SDag-Erling Smørgrav 	assert(ldns_buffer_available_at(buffer, at, count));
363*7b5038d7SDag-Erling Smørgrav 	memcpy(buffer->_data + at, data, count);
364*7b5038d7SDag-Erling Smørgrav }
365*7b5038d7SDag-Erling Smørgrav 
366*7b5038d7SDag-Erling Smørgrav /**
367*7b5038d7SDag-Erling Smørgrav  * writes count bytes of data to the current position of the buffer
368*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
369*7b5038d7SDag-Erling Smørgrav  * \param[in] data the data to write
370*7b5038d7SDag-Erling Smørgrav  * \param[in] count the lenght of the data to write
371*7b5038d7SDag-Erling Smørgrav  */
372*7b5038d7SDag-Erling Smørgrav INLINE void
373*7b5038d7SDag-Erling Smørgrav ldns_buffer_write(ldns_buffer *buffer, const void *data, size_t count)
374*7b5038d7SDag-Erling Smørgrav {
375*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_write_at(buffer, buffer->_position, data, count);
376*7b5038d7SDag-Erling Smørgrav 	buffer->_position += count;
377*7b5038d7SDag-Erling Smørgrav }
378*7b5038d7SDag-Erling Smørgrav 
379*7b5038d7SDag-Erling Smørgrav /**
380*7b5038d7SDag-Erling Smørgrav  * copies the given (null-delimited) string to the specified position at the buffer
381*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
382*7b5038d7SDag-Erling Smørgrav  * \param[in] at the position in the buffer
383*7b5038d7SDag-Erling Smørgrav  * \param[in] str the string to write
384*7b5038d7SDag-Erling Smørgrav  */
385*7b5038d7SDag-Erling Smørgrav INLINE void
386*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_string_at(ldns_buffer *buffer, size_t at, const char *str)
387*7b5038d7SDag-Erling Smørgrav {
388*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_write_at(buffer, at, str, strlen(str));
389*7b5038d7SDag-Erling Smørgrav }
390*7b5038d7SDag-Erling Smørgrav 
391*7b5038d7SDag-Erling Smørgrav /**
392*7b5038d7SDag-Erling Smørgrav  * copies the given (null-delimited) string to the current position at the buffer
393*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
394*7b5038d7SDag-Erling Smørgrav  * \param[in] str the string to write
395*7b5038d7SDag-Erling Smørgrav  */
396*7b5038d7SDag-Erling Smørgrav INLINE void
397*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_string(ldns_buffer *buffer, const char *str)
398*7b5038d7SDag-Erling Smørgrav {
399*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_write(buffer, str, strlen(str));
400*7b5038d7SDag-Erling Smørgrav }
401*7b5038d7SDag-Erling Smørgrav 
402*7b5038d7SDag-Erling Smørgrav /**
403*7b5038d7SDag-Erling Smørgrav  * writes the given byte of data at the given position in the buffer
404*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
405*7b5038d7SDag-Erling Smørgrav  * \param[in] at the position in the buffer
406*7b5038d7SDag-Erling Smørgrav  * \param[in] data the 8 bits to write
407*7b5038d7SDag-Erling Smørgrav  */
408*7b5038d7SDag-Erling Smørgrav INLINE void
409*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u8_at(ldns_buffer *buffer, size_t at, uint8_t data)
410*7b5038d7SDag-Erling Smørgrav {
411*7b5038d7SDag-Erling Smørgrav 	assert(ldns_buffer_available_at(buffer, at, sizeof(data)));
412*7b5038d7SDag-Erling Smørgrav 	buffer->_data[at] = data;
413*7b5038d7SDag-Erling Smørgrav }
414*7b5038d7SDag-Erling Smørgrav 
415*7b5038d7SDag-Erling Smørgrav /**
416*7b5038d7SDag-Erling Smørgrav  * writes the given byte of data at the current position in the buffer
417*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
418*7b5038d7SDag-Erling Smørgrav  * \param[in] data the 8 bits to write
419*7b5038d7SDag-Erling Smørgrav  */
420*7b5038d7SDag-Erling Smørgrav INLINE void
421*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u8(ldns_buffer *buffer, uint8_t data)
422*7b5038d7SDag-Erling Smørgrav {
423*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_write_u8_at(buffer, buffer->_position, data);
424*7b5038d7SDag-Erling Smørgrav 	buffer->_position += sizeof(data);
425*7b5038d7SDag-Erling Smørgrav }
426*7b5038d7SDag-Erling Smørgrav 
427*7b5038d7SDag-Erling Smørgrav /**
428*7b5038d7SDag-Erling Smørgrav  * writes the given 2 byte integer at the given position in the buffer
429*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
430*7b5038d7SDag-Erling Smørgrav  * \param[in] at the position in the buffer
431*7b5038d7SDag-Erling Smørgrav  * \param[in] data the 16 bits to write
432*7b5038d7SDag-Erling Smørgrav  */
433*7b5038d7SDag-Erling Smørgrav INLINE void
434*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u16_at(ldns_buffer *buffer, size_t at, uint16_t data)
435*7b5038d7SDag-Erling Smørgrav {
436*7b5038d7SDag-Erling Smørgrav 	assert(ldns_buffer_available_at(buffer, at, sizeof(data)));
437*7b5038d7SDag-Erling Smørgrav 	ldns_write_uint16(buffer->_data + at, data);
438*7b5038d7SDag-Erling Smørgrav }
439*7b5038d7SDag-Erling Smørgrav 
440*7b5038d7SDag-Erling Smørgrav /**
441*7b5038d7SDag-Erling Smørgrav  * writes the given 2 byte integer at the current position in the buffer
442*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
443*7b5038d7SDag-Erling Smørgrav  * \param[in] data the 16 bits to write
444*7b5038d7SDag-Erling Smørgrav  */
445*7b5038d7SDag-Erling Smørgrav INLINE void
446*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u16(ldns_buffer *buffer, uint16_t data)
447*7b5038d7SDag-Erling Smørgrav {
448*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_write_u16_at(buffer, buffer->_position, data);
449*7b5038d7SDag-Erling Smørgrav 	buffer->_position += sizeof(data);
450*7b5038d7SDag-Erling Smørgrav }
451*7b5038d7SDag-Erling Smørgrav 
452*7b5038d7SDag-Erling Smørgrav /**
453*7b5038d7SDag-Erling Smørgrav  * writes the given 4 byte integer at the given position in the buffer
454*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
455*7b5038d7SDag-Erling Smørgrav  * \param[in] at the position in the buffer
456*7b5038d7SDag-Erling Smørgrav  * \param[in] data the 32 bits to write
457*7b5038d7SDag-Erling Smørgrav  */
458*7b5038d7SDag-Erling Smørgrav INLINE void
459*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u32_at(ldns_buffer *buffer, size_t at, uint32_t data)
460*7b5038d7SDag-Erling Smørgrav {
461*7b5038d7SDag-Erling Smørgrav 	assert(ldns_buffer_available_at(buffer, at, sizeof(data)));
462*7b5038d7SDag-Erling Smørgrav 	ldns_write_uint32(buffer->_data + at, data);
463*7b5038d7SDag-Erling Smørgrav }
464*7b5038d7SDag-Erling Smørgrav 
465*7b5038d7SDag-Erling Smørgrav /**
466*7b5038d7SDag-Erling Smørgrav  * writes the given 4 byte integer at the current position in the buffer
467*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
468*7b5038d7SDag-Erling Smørgrav  * \param[in] data the 32 bits to write
469*7b5038d7SDag-Erling Smørgrav  */
470*7b5038d7SDag-Erling Smørgrav INLINE void
471*7b5038d7SDag-Erling Smørgrav ldns_buffer_write_u32(ldns_buffer *buffer, uint32_t data)
472*7b5038d7SDag-Erling Smørgrav {
473*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_write_u32_at(buffer, buffer->_position, data);
474*7b5038d7SDag-Erling Smørgrav 	buffer->_position += sizeof(data);
475*7b5038d7SDag-Erling Smørgrav }
476*7b5038d7SDag-Erling Smørgrav 
477*7b5038d7SDag-Erling Smørgrav /**
478*7b5038d7SDag-Erling Smørgrav  * copies count bytes of data at the given position to the given data-array
479*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
480*7b5038d7SDag-Erling Smørgrav  * \param[in] at the position in the buffer to start
481*7b5038d7SDag-Erling Smørgrav  * \param[out] data buffer to copy to
482*7b5038d7SDag-Erling Smørgrav  * \param[in] count the length of the data to copy
483*7b5038d7SDag-Erling Smørgrav  */
484*7b5038d7SDag-Erling Smørgrav INLINE void
485*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_at(ldns_buffer *buffer, size_t at, void *data, size_t count)
486*7b5038d7SDag-Erling Smørgrav {
487*7b5038d7SDag-Erling Smørgrav 	assert(ldns_buffer_available_at(buffer, at, count));
488*7b5038d7SDag-Erling Smørgrav 	memcpy(data, buffer->_data + at, count);
489*7b5038d7SDag-Erling Smørgrav }
490*7b5038d7SDag-Erling Smørgrav 
491*7b5038d7SDag-Erling Smørgrav /**
492*7b5038d7SDag-Erling Smørgrav  * copies count bytes of data at the current position to the given data-array
493*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
494*7b5038d7SDag-Erling Smørgrav  * \param[out] data buffer to copy to
495*7b5038d7SDag-Erling Smørgrav  * \param[in] count the length of the data to copy
496*7b5038d7SDag-Erling Smørgrav  */
497*7b5038d7SDag-Erling Smørgrav INLINE void
498*7b5038d7SDag-Erling Smørgrav ldns_buffer_read(ldns_buffer *buffer, void *data, size_t count)
499*7b5038d7SDag-Erling Smørgrav {
500*7b5038d7SDag-Erling Smørgrav 	ldns_buffer_read_at(buffer, buffer->_position, data, count);
501*7b5038d7SDag-Erling Smørgrav 	buffer->_position += count;
502*7b5038d7SDag-Erling Smørgrav }
503*7b5038d7SDag-Erling Smørgrav 
504*7b5038d7SDag-Erling Smørgrav /**
505*7b5038d7SDag-Erling Smørgrav  * returns the byte value at the given position in the buffer
506*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
507*7b5038d7SDag-Erling Smørgrav  * \param[in] at the position in the buffer
508*7b5038d7SDag-Erling Smørgrav  * \return 1 byte integer
509*7b5038d7SDag-Erling Smørgrav  */
510*7b5038d7SDag-Erling Smørgrav INLINE uint8_t
511*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u8_at(ldns_buffer *buffer, size_t at)
512*7b5038d7SDag-Erling Smørgrav {
513*7b5038d7SDag-Erling Smørgrav 	assert(ldns_buffer_available_at(buffer, at, sizeof(uint8_t)));
514*7b5038d7SDag-Erling Smørgrav 	return buffer->_data[at];
515*7b5038d7SDag-Erling Smørgrav }
516*7b5038d7SDag-Erling Smørgrav 
517*7b5038d7SDag-Erling Smørgrav /**
518*7b5038d7SDag-Erling Smørgrav  * returns the byte value at the current position in the buffer
519*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
520*7b5038d7SDag-Erling Smørgrav  * \return 1 byte integer
521*7b5038d7SDag-Erling Smørgrav  */
522*7b5038d7SDag-Erling Smørgrav INLINE uint8_t
523*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u8(ldns_buffer *buffer)
524*7b5038d7SDag-Erling Smørgrav {
525*7b5038d7SDag-Erling Smørgrav 	uint8_t result = ldns_buffer_read_u8_at(buffer, buffer->_position);
526*7b5038d7SDag-Erling Smørgrav 	buffer->_position += sizeof(uint8_t);
527*7b5038d7SDag-Erling Smørgrav 	return result;
528*7b5038d7SDag-Erling Smørgrav }
529*7b5038d7SDag-Erling Smørgrav 
530*7b5038d7SDag-Erling Smørgrav /**
531*7b5038d7SDag-Erling Smørgrav  * returns the 2-byte integer value at the given position in the buffer
532*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
533*7b5038d7SDag-Erling Smørgrav  * \param[in] at position in the buffer
534*7b5038d7SDag-Erling Smørgrav  * \return 2 byte integer
535*7b5038d7SDag-Erling Smørgrav  */
536*7b5038d7SDag-Erling Smørgrav INLINE uint16_t
537*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u16_at(ldns_buffer *buffer, size_t at)
538*7b5038d7SDag-Erling Smørgrav {
539*7b5038d7SDag-Erling Smørgrav 	assert(ldns_buffer_available_at(buffer, at, sizeof(uint16_t)));
540*7b5038d7SDag-Erling Smørgrav 	return ldns_read_uint16(buffer->_data + at);
541*7b5038d7SDag-Erling Smørgrav }
542*7b5038d7SDag-Erling Smørgrav 
543*7b5038d7SDag-Erling Smørgrav /**
544*7b5038d7SDag-Erling Smørgrav  * returns the 2-byte integer value at the current position in the buffer
545*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
546*7b5038d7SDag-Erling Smørgrav  * \return 2 byte integer
547*7b5038d7SDag-Erling Smørgrav  */
548*7b5038d7SDag-Erling Smørgrav INLINE uint16_t
549*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u16(ldns_buffer *buffer)
550*7b5038d7SDag-Erling Smørgrav {
551*7b5038d7SDag-Erling Smørgrav 	uint16_t result = ldns_buffer_read_u16_at(buffer, buffer->_position);
552*7b5038d7SDag-Erling Smørgrav 	buffer->_position += sizeof(uint16_t);
553*7b5038d7SDag-Erling Smørgrav 	return result;
554*7b5038d7SDag-Erling Smørgrav }
555*7b5038d7SDag-Erling Smørgrav 
556*7b5038d7SDag-Erling Smørgrav /**
557*7b5038d7SDag-Erling Smørgrav  * returns the 4-byte integer value at the given position in the buffer
558*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
559*7b5038d7SDag-Erling Smørgrav  * \param[in] at position in the buffer
560*7b5038d7SDag-Erling Smørgrav  * \return 4 byte integer
561*7b5038d7SDag-Erling Smørgrav  */
562*7b5038d7SDag-Erling Smørgrav INLINE uint32_t
563*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u32_at(ldns_buffer *buffer, size_t at)
564*7b5038d7SDag-Erling Smørgrav {
565*7b5038d7SDag-Erling Smørgrav 	assert(ldns_buffer_available_at(buffer, at, sizeof(uint32_t)));
566*7b5038d7SDag-Erling Smørgrav 	return ldns_read_uint32(buffer->_data + at);
567*7b5038d7SDag-Erling Smørgrav }
568*7b5038d7SDag-Erling Smørgrav 
569*7b5038d7SDag-Erling Smørgrav /**
570*7b5038d7SDag-Erling Smørgrav  * returns the 4-byte integer value at the current position in the buffer
571*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
572*7b5038d7SDag-Erling Smørgrav  * \return 4 byte integer
573*7b5038d7SDag-Erling Smørgrav  */
574*7b5038d7SDag-Erling Smørgrav INLINE uint32_t
575*7b5038d7SDag-Erling Smørgrav ldns_buffer_read_u32(ldns_buffer *buffer)
576*7b5038d7SDag-Erling Smørgrav {
577*7b5038d7SDag-Erling Smørgrav 	uint32_t result = ldns_buffer_read_u32_at(buffer, buffer->_position);
578*7b5038d7SDag-Erling Smørgrav 	buffer->_position += sizeof(uint32_t);
579*7b5038d7SDag-Erling Smørgrav 	return result;
580*7b5038d7SDag-Erling Smørgrav }
581*7b5038d7SDag-Erling Smørgrav 
582*7b5038d7SDag-Erling Smørgrav /**
583*7b5038d7SDag-Erling Smørgrav  * returns the status of the buffer
584*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer
585*7b5038d7SDag-Erling Smørgrav  * \return the status
586*7b5038d7SDag-Erling Smørgrav  */
587*7b5038d7SDag-Erling Smørgrav INLINE ldns_status
588*7b5038d7SDag-Erling Smørgrav ldns_buffer_status(ldns_buffer *buffer)
589*7b5038d7SDag-Erling Smørgrav {
590*7b5038d7SDag-Erling Smørgrav 	return buffer->_status;
591*7b5038d7SDag-Erling Smørgrav }
592*7b5038d7SDag-Erling Smørgrav 
593*7b5038d7SDag-Erling Smørgrav /**
594*7b5038d7SDag-Erling Smørgrav  * returns true if the status of the buffer is LDNS_STATUS_OK, false otherwise
595*7b5038d7SDag-Erling Smørgrav  * \param[in] buffer the buffer
596*7b5038d7SDag-Erling Smørgrav  * \return true or false
597*7b5038d7SDag-Erling Smørgrav  */
598*7b5038d7SDag-Erling Smørgrav INLINE bool
599*7b5038d7SDag-Erling Smørgrav ldns_buffer_status_ok(ldns_buffer *buffer)
600*7b5038d7SDag-Erling Smørgrav {
601*7b5038d7SDag-Erling Smørgrav 	if (buffer) {
602*7b5038d7SDag-Erling Smørgrav 		return ldns_buffer_status(buffer) == LDNS_STATUS_OK;
603*7b5038d7SDag-Erling Smørgrav 	} else {
604*7b5038d7SDag-Erling Smørgrav 		return false;
605*7b5038d7SDag-Erling Smørgrav 	}
606*7b5038d7SDag-Erling Smørgrav }
607*7b5038d7SDag-Erling Smørgrav 
608*7b5038d7SDag-Erling Smørgrav /**
609*7b5038d7SDag-Erling Smørgrav  * prints to the buffer, increasing the capacity if required using
610*7b5038d7SDag-Erling Smørgrav  * buffer_reserve(). The buffer's position is set to the terminating '\\0'
611*7b5038d7SDag-Erling Smørgrav  * Returns the number of characters written (not including the
612*7b5038d7SDag-Erling Smørgrav  * terminating '\\0') or -1 on failure.
613*7b5038d7SDag-Erling Smørgrav  */
614*7b5038d7SDag-Erling Smørgrav int ldns_buffer_printf(ldns_buffer *buffer, const char *format, ...);
615*7b5038d7SDag-Erling Smørgrav /*	ATTR_FORMAT(printf, 2, 3);*/
616*7b5038d7SDag-Erling Smørgrav 
617*7b5038d7SDag-Erling Smørgrav /**
618*7b5038d7SDag-Erling Smørgrav  * frees the buffer.
619*7b5038d7SDag-Erling Smørgrav  * \param[in] *buffer the buffer to be freed
620*7b5038d7SDag-Erling Smørgrav  * \return void
621*7b5038d7SDag-Erling Smørgrav  */
622*7b5038d7SDag-Erling Smørgrav void ldns_buffer_free(ldns_buffer *buffer);
623*7b5038d7SDag-Erling Smørgrav 
624*7b5038d7SDag-Erling Smørgrav /**
625*7b5038d7SDag-Erling Smørgrav  * Makes the buffer fixed and returns a pointer to the data.  The
626*7b5038d7SDag-Erling Smørgrav  * caller is responsible for free'ing the result.
627*7b5038d7SDag-Erling Smørgrav  * \param[in] *buffer the buffer to be exported
628*7b5038d7SDag-Erling Smørgrav  * \return void
629*7b5038d7SDag-Erling Smørgrav  */
630*7b5038d7SDag-Erling Smørgrav void *ldns_buffer_export(ldns_buffer *buffer);
631*7b5038d7SDag-Erling Smørgrav 
632*7b5038d7SDag-Erling Smørgrav /**
633*7b5038d7SDag-Erling Smørgrav  * Copy contents of the other buffer to this buffer. Silently truncated
634*7b5038d7SDag-Erling Smørgrav  * if this buffer is too small.
635*7b5038d7SDag-Erling Smørgrav  * \param[out] *result resulting buffer which is copied to.
636*7b5038d7SDag-Erling Smørgrav  * \param[in] *from what to copy to result.
637*7b5038d7SDag-Erling Smørgrav  */
638*7b5038d7SDag-Erling Smørgrav void ldns_buffer_copy(ldns_buffer* result, ldns_buffer* from);
639*7b5038d7SDag-Erling Smørgrav 
640*7b5038d7SDag-Erling Smørgrav #ifdef __cplusplus
641*7b5038d7SDag-Erling Smørgrav }
642*7b5038d7SDag-Erling Smørgrav #endif
643*7b5038d7SDag-Erling Smørgrav 
644*7b5038d7SDag-Erling Smørgrav #endif /* LDNS_BUFFER_H */
645