xref: /freebsd/contrib/ntp/libntp/lib/isc/include/isc/buffer.h (revision a466cc55373fc3cf86837f09da729535b57e69a1)
1 /*
2  * Copyright (C) 2004-2008, 2010  Internet Systems Consortium, Inc. ("ISC")
3  * Copyright (C) 1998-2002  Internet Software Consortium.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15  * PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 /* $Id: buffer.h,v 1.55 2010/12/20 23:47:21 tbox Exp $ */
19 
20 #ifndef ISC_BUFFER_H
21 #define ISC_BUFFER_H 1
22 
23 /*****
24  ***** Module Info
25  *****/
26 
27 /*! \file isc/buffer.h
28  *
29  * \brief A buffer is a region of memory, together with a set of related subregions.
30  * Buffers are used for parsing and I/O operations.
31  *
32  * The 'used region' and the 'available' region are disjoint, and their
33  * union is the buffer's region.  The used region extends from the beginning
34  * of the buffer region to the last used byte.  The available region
35  * extends from one byte greater than the last used byte to the end of the
36  * buffer's region.  The size of the used region can be changed using various
37  * buffer commands.  Initially, the used region is empty.
38  *
39  * The used region is further subdivided into two disjoint regions: the
40  * 'consumed region' and the 'remaining region'.  The union of these two
41  * regions is the used region.  The consumed region extends from the beginning
42  * of the used region to the byte before the 'current' offset (if any).  The
43  * 'remaining' region the current pointer to the end of the used
44  * region.  The size of the consumed region can be changed using various
45  * buffer commands.  Initially, the consumed region is empty.
46  *
47  * The 'active region' is an (optional) subregion of the remaining region.
48  * It extends from the current offset to an offset in the remaining region
49  * that is selected with isc_buffer_setactive().  Initially, the active region
50  * is empty.  If the current offset advances beyond the chosen offset, the
51  * active region will also be empty.
52  *
53  * \verbatim
54  *  /------------entire length---------------\
55  *  /----- used region -----\/-- available --\
56  *  +----------------------------------------+
57  *  | consumed  | remaining |                |
58  *  +----------------------------------------+
59  *  a           b     c     d                e
60  *
61  * a == base of buffer.
62  * b == current pointer.  Can be anywhere between a and d.
63  * c == active pointer.  Meaningful between b and d.
64  * d == used pointer.
65  * e == length of buffer.
66  *
67  * a-e == entire length of buffer.
68  * a-d == used region.
69  * a-b == consumed region.
70  * b-d == remaining region.
71  * b-c == optional active region.
72  *\endverbatim
73  *
74  * The following invariants are maintained by all routines:
75  *
76  *\code
77  *	length > 0
78  *
79  *	base is a valid pointer to length bytes of memory
80  *
81  *	0 <= used <= length
82  *
83  *	0 <= current <= used
84  *
85  *	0 <= active <= used
86  *	(although active < current implies empty active region)
87  *\endcode
88  *
89  * \li MP:
90  *	Buffers have no synchronization.  Clients must ensure exclusive
91  *	access.
92  *
93  * \li Reliability:
94  *	No anticipated impact.
95  *
96  * \li Resources:
97  *	Memory: 1 pointer + 6 unsigned integers per buffer.
98  *
99  * \li Security:
100  *	No anticipated impact.
101  *
102  * \li Standards:
103  *	None.
104  */
105 
106 /***
107  *** Imports
108  ***/
109 
110 #include <isc/lang.h>
111 #include <isc/magic.h>
112 #include <isc/types.h>
113 
114 /*!
115  * To make many functions be inline macros (via \#define) define this.
116  * If it is undefined, a function will be used.
117  */
118 /* #define ISC_BUFFER_USEINLINE */
119 
120 ISC_LANG_BEGINDECLS
121 
122 /*@{*/
123 /*!
124  *** Magic numbers
125  ***/
126 #define ISC_BUFFER_MAGIC		0x42756621U	/* Buf!. */
127 #define ISC_BUFFER_VALID(b)		ISC_MAGIC_VALID(b, ISC_BUFFER_MAGIC)
128 /*@}*/
129 
130 /*
131  * The following macros MUST be used only on valid buffers.  It is the
132  * caller's responsibility to ensure this by using the ISC_BUFFER_VALID
133  * check above, or by calling another isc_buffer_*() function (rather than
134  * another macro.)
135  */
136 
137 /*@{*/
138 /*!
139  * Fundamental buffer elements.  (A through E in the introductory comment.)
140  */
141 #define isc_buffer_base(b)    ((void *)(b)->base)			  /*a*/
142 #define isc_buffer_current(b) \
143 		((void *)((unsigned char *)(b)->base + (b)->current))     /*b*/
144 #define isc_buffer_active(b)  \
145 		((void *)((unsigned char *)(b)->base + (b)->active))      /*c*/
146 #define isc_buffer_used(b)    \
147 		((void *)((unsigned char *)(b)->base + (b)->used))        /*d*/
148 #define isc_buffer_length(b)  ((b)->length)				  /*e*/
149 /*@}*/
150 
151 /*@{*/
152 /*!
153  * Derived lengths.  (Described in the introductory comment.)
154  */
155 #define isc_buffer_usedlength(b)	((b)->used)		      /* d-a */
156 #define isc_buffer_consumedlength(b)	((b)->current)		      /* b-a */
157 #define isc_buffer_remaininglength(b)	((b)->used - (b)->current)    /* d-b */
158 #define isc_buffer_activelength(b)	((b)->active - (b)->current)  /* c-b */
159 #define isc_buffer_availablelength(b)	((b)->length - (b)->used)     /* e-d */
160 /*@}*/
161 
162 /*!
163  * Note that the buffer structure is public.  This is principally so buffer
164  * operations can be implemented using macros.  Applications are strongly
165  * discouraged from directly manipulating the structure.
166  */
167 
168 struct isc_buffer {
169 	unsigned int		magic;
170 	void		       *base;
171 	/*@{*/
172 	/*! The following integers are byte offsets from 'base'. */
173 	unsigned int		length;
174 	unsigned int		used;
175 	unsigned int 		current;
176 	unsigned int 		active;
177 	/*@}*/
178 	/*! linkable */
179 	ISC_LINK(isc_buffer_t)	link;
180 	/*! private internal elements */
181 	isc_mem_t	       *mctx;
182 };
183 
184 /***
185  *** Functions
186  ***/
187 
188 isc_result_t
189 isc_buffer_allocate(isc_mem_t *mctx, isc_buffer_t **dynbuffer,
190 		    unsigned int length);
191 /*!<
192  * \brief Allocate a dynamic linkable buffer which has "length" bytes in the
193  * data region.
194  *
195  * Requires:
196  *\li	"mctx" is valid.
197  *
198  *\li	"dynbuffer" is non-NULL, and "*dynbuffer" is NULL.
199  *
200  * Returns:
201  *\li	ISC_R_SUCCESS		- success
202  *\li	ISC_R_NOMEMORY		- no memory available
203  *
204  * Note:
205  *\li	Changing the buffer's length field is not permitted.
206  */
207 
208 void
209 isc_buffer_free(isc_buffer_t **dynbuffer);
210 /*!<
211  * \brief Release resources allocated for a dynamic buffer.
212  *
213  * Requires:
214  *\li	"dynbuffer" is not NULL.
215  *
216  *\li	"*dynbuffer" is a valid dynamic buffer.
217  *
218  * Ensures:
219  *\li	"*dynbuffer" will be NULL on return, and all memory associated with
220  *	the dynamic buffer is returned to the memory context used in
221  *	isc_buffer_allocate().
222  */
223 
224 void
225 isc__buffer_init(isc_buffer_t *b, const void *base, unsigned int length);
226 /*!<
227  * \brief Make 'b' refer to the 'length'-byte region starting at base.
228  *
229  * Requires:
230  *
231  *\li	'length' > 0
232  *
233  *\li	'base' is a pointer to a sequence of 'length' bytes.
234  *
235  */
236 
237 void
238 isc__buffer_initnull(isc_buffer_t *b);
239 /*!<
240  *\brief Initialize a buffer 'b' with a null data and zero length/
241  */
242 
243 void
244 isc_buffer_reinit(isc_buffer_t *b, void *base, unsigned int length);
245 /*!<
246  * \brief Make 'b' refer to the 'length'-byte region starting at base.
247  * Any existing data will be copied.
248  *
249  * Requires:
250  *
251  *\li	'length' > 0 AND length >= previous length
252  *
253  *\li	'base' is a pointer to a sequence of 'length' bytes.
254  *
255  */
256 
257 void
258 isc__buffer_invalidate(isc_buffer_t *b);
259 /*!<
260  * \brief Make 'b' an invalid buffer.
261  *
262  * Requires:
263  *\li	'b' is a valid buffer.
264  *
265  * Ensures:
266  *\li	If assertion checking is enabled, future attempts to use 'b' without
267  *	calling isc_buffer_init() on it will cause an assertion failure.
268  */
269 
270 void
271 isc__buffer_region(isc_buffer_t *b, isc_region_t *r);
272 /*!<
273  * \brief Make 'r' refer to the region of 'b'.
274  *
275  * Requires:
276  *
277  *\li	'b' is a valid buffer.
278  *
279  *\li	'r' points to a region structure.
280  */
281 
282 void
283 isc__buffer_usedregion(isc_buffer_t *b, isc_region_t *r);
284 /*!<
285  * \brief Make 'r' refer to the used region of 'b'.
286  *
287  * Requires:
288  *
289  *\li	'b' is a valid buffer.
290  *
291  *\li	'r' points to a region structure.
292  */
293 
294 void
295 isc__buffer_availableregion(isc_buffer_t *b, isc_region_t *r);
296 /*!<
297  * \brief Make 'r' refer to the available region of 'b'.
298  *
299  * Requires:
300  *
301  *\li	'b' is a valid buffer.
302  *
303  *\li	'r' points to a region structure.
304  */
305 
306 void
307 isc__buffer_add(isc_buffer_t *b, unsigned int n);
308 /*!<
309  * \brief Increase the 'used' region of 'b' by 'n' bytes.
310  *
311  * Requires:
312  *
313  *\li	'b' is a valid buffer
314  *
315  *\li	used + n <= length
316  *
317  */
318 
319 void
320 isc__buffer_subtract(isc_buffer_t *b, unsigned int n);
321 /*!<
322  * \brief Decrease the 'used' region of 'b' by 'n' bytes.
323  *
324  * Requires:
325  *
326  *\li	'b' is a valid buffer
327  *
328  *\li	used >= n
329  *
330  */
331 
332 void
333 isc__buffer_clear(isc_buffer_t *b);
334 /*!<
335  * \brief Make the used region empty.
336  *
337  * Requires:
338  *
339  *\li	'b' is a valid buffer
340  *
341  * Ensures:
342  *
343  *\li	used = 0
344  *
345  */
346 
347 void
348 isc__buffer_consumedregion(isc_buffer_t *b, isc_region_t *r);
349 /*!<
350  * \brief Make 'r' refer to the consumed region of 'b'.
351  *
352  * Requires:
353  *
354  *\li	'b' is a valid buffer.
355  *
356  *\li	'r' points to a region structure.
357  */
358 
359 void
360 isc__buffer_remainingregion(isc_buffer_t *b, isc_region_t *r);
361 /*!<
362  * \brief Make 'r' refer to the remaining region of 'b'.
363  *
364  * Requires:
365  *
366  *\li	'b' is a valid buffer.
367  *
368  *\li	'r' points to a region structure.
369  */
370 
371 void
372 isc__buffer_activeregion(isc_buffer_t *b, isc_region_t *r);
373 /*!<
374  * \brief Make 'r' refer to the active region of 'b'.
375  *
376  * Requires:
377  *
378  *\li	'b' is a valid buffer.
379  *
380  *\li	'r' points to a region structure.
381  */
382 
383 void
384 isc__buffer_setactive(isc_buffer_t *b, unsigned int n);
385 /*!<
386  * \brief Sets the end of the active region 'n' bytes after current.
387  *
388  * Requires:
389  *
390  *\li	'b' is a valid buffer.
391  *
392  *\li	current + n <= used
393  */
394 
395 void
396 isc__buffer_first(isc_buffer_t *b);
397 /*!<
398  * \brief Make the consumed region empty.
399  *
400  * Requires:
401  *
402  *\li	'b' is a valid buffer
403  *
404  * Ensures:
405  *
406  *\li	current == 0
407  *
408  */
409 
410 void
411 isc__buffer_forward(isc_buffer_t *b, unsigned int n);
412 /*!<
413  * \brief Increase the 'consumed' region of 'b' by 'n' bytes.
414  *
415  * Requires:
416  *
417  *\li	'b' is a valid buffer
418  *
419  *\li	current + n <= used
420  *
421  */
422 
423 void
424 isc__buffer_back(isc_buffer_t *b, unsigned int n);
425 /*!<
426  * \brief Decrease the 'consumed' region of 'b' by 'n' bytes.
427  *
428  * Requires:
429  *
430  *\li	'b' is a valid buffer
431  *
432  *\li	n <= current
433  *
434  */
435 
436 void
437 isc_buffer_compact(isc_buffer_t *b);
438 /*!<
439  * \brief Compact the used region by moving the remaining region so it occurs
440  * at the start of the buffer.  The used region is shrunk by the size of
441  * the consumed region, and the consumed region is then made empty.
442  *
443  * Requires:
444  *
445  *\li	'b' is a valid buffer
446  *
447  * Ensures:
448  *
449  *\li	current == 0
450  *
451  *\li	The size of the used region is now equal to the size of the remaining
452  *	region (as it was before the call).  The contents of the used region
453  *	are those of the remaining region (as it was before the call).
454  */
455 
456 isc_uint8_t
457 isc_buffer_getuint8(isc_buffer_t *b);
458 /*!<
459  * \brief Read an unsigned 8-bit integer from 'b' and return it.
460  *
461  * Requires:
462  *
463  *\li	'b' is a valid buffer.
464  *
465  *\li	The length of the available region of 'b' is at least 1.
466  *
467  * Ensures:
468  *
469  *\li	The current pointer in 'b' is advanced by 1.
470  *
471  * Returns:
472  *
473  *\li	A 8-bit unsigned integer.
474  */
475 
476 void
477 isc__buffer_putuint8(isc_buffer_t *b, isc_uint8_t val);
478 /*!<
479  * \brief Store an unsigned 8-bit integer from 'val' into 'b'.
480  *
481  * Requires:
482  *\li	'b' is a valid buffer.
483  *
484  *\li	The length of the unused region of 'b' is at least 1.
485  *
486  * Ensures:
487  *\li	The used pointer in 'b' is advanced by 1.
488  */
489 
490 isc_uint16_t
491 isc_buffer_getuint16(isc_buffer_t *b);
492 /*!<
493  * \brief Read an unsigned 16-bit integer in network byte order from 'b', convert
494  * it to host byte order, and return it.
495  *
496  * Requires:
497  *
498  *\li	'b' is a valid buffer.
499  *
500  *\li	The length of the available region of 'b' is at least 2.
501  *
502  * Ensures:
503  *
504  *\li	The current pointer in 'b' is advanced by 2.
505  *
506  * Returns:
507  *
508  *\li	A 16-bit unsigned integer.
509  */
510 
511 void
512 isc__buffer_putuint16(isc_buffer_t *b, isc_uint16_t val);
513 /*!<
514  * \brief Store an unsigned 16-bit integer in host byte order from 'val'
515  * into 'b' in network byte order.
516  *
517  * Requires:
518  *\li	'b' is a valid buffer.
519  *
520  *\li	The length of the unused region of 'b' is at least 2.
521  *
522  * Ensures:
523  *\li	The used pointer in 'b' is advanced by 2.
524  */
525 
526 isc_uint32_t
527 isc_buffer_getuint32(isc_buffer_t *b);
528 /*!<
529  * \brief Read an unsigned 32-bit integer in network byte order from 'b', convert
530  * it to host byte order, and return it.
531  *
532  * Requires:
533  *
534  *\li	'b' is a valid buffer.
535  *
536  *\li	The length of the available region of 'b' is at least 4.
537  *
538  * Ensures:
539  *
540  *\li	The current pointer in 'b' is advanced by 4.
541  *
542  * Returns:
543  *
544  *\li	A 32-bit unsigned integer.
545  */
546 
547 void
548 isc__buffer_putuint32(isc_buffer_t *b, isc_uint32_t val);
549 /*!<
550  * \brief Store an unsigned 32-bit integer in host byte order from 'val'
551  * into 'b' in network byte order.
552  *
553  * Requires:
554  *\li	'b' is a valid buffer.
555  *
556  *\li	The length of the unused region of 'b' is at least 4.
557  *
558  * Ensures:
559  *\li	The used pointer in 'b' is advanced by 4.
560  */
561 
562 isc_uint64_t
563 isc_buffer_getuint48(isc_buffer_t *b);
564 /*!<
565  * \brief Read an unsigned 48-bit integer in network byte order from 'b',
566  * convert it to host byte order, and return it.
567  *
568  * Requires:
569  *
570  *\li	'b' is a valid buffer.
571  *
572  *\li	The length of the available region of 'b' is at least 6.
573  *
574  * Ensures:
575  *
576  *\li	The current pointer in 'b' is advanced by 6.
577  *
578  * Returns:
579  *
580  *\li	A 48-bit unsigned integer (stored in a 64-bit integer).
581  */
582 
583 void
584 isc__buffer_putuint48(isc_buffer_t *b, isc_uint64_t val);
585 /*!<
586  * \brief Store an unsigned 48-bit integer in host byte order from 'val'
587  * into 'b' in network byte order.
588  *
589  * Requires:
590  *\li	'b' is a valid buffer.
591  *
592  *\li	The length of the unused region of 'b' is at least 6.
593  *
594  * Ensures:
595  *\li	The used pointer in 'b' is advanced by 6.
596  */
597 
598 void
599 isc__buffer_putuint24(isc_buffer_t *b, isc_uint32_t val);
600 /*!<
601  * Store an unsigned 24-bit integer in host byte order from 'val'
602  * into 'b' in network byte order.
603  *
604  * Requires:
605  *\li	'b' is a valid buffer.
606  *
607  *	The length of the unused region of 'b' is at least 3.
608  *
609  * Ensures:
610  *\li	The used pointer in 'b' is advanced by 3.
611  */
612 
613 void
614 isc__buffer_putmem(isc_buffer_t *b, const unsigned char *base,
615 		   unsigned int length);
616 /*!<
617  * \brief Copy 'length' bytes of memory at 'base' into 'b'.
618  *
619  * Requires:
620  *\li	'b' is a valid buffer.
621  *
622  *\li	'base' points to 'length' bytes of valid memory.
623  *
624  */
625 
626 void
627 isc__buffer_putstr(isc_buffer_t *b, const char *source);
628 /*!<
629  * \brief Copy 'source' into 'b', not including terminating NUL.
630  *
631  * Requires:
632  *\li	'b' is a valid buffer.
633  *
634  *\li	'source' to be a valid NULL terminated string.
635  *
636  *\li	strlen(source) <= isc_buffer_available(b)
637  */
638 
639 isc_result_t
640 isc_buffer_copyregion(isc_buffer_t *b, const isc_region_t *r);
641 /*!<
642  * \brief Copy the contents of 'r' into 'b'.
643  *
644  * Requires:
645  *\li	'b' is a valid buffer.
646  *
647  *\li	'r' is a valid region.
648  *
649  * Returns:
650  *
651  *\li	ISC_R_SUCCESS
652  *\li	ISC_R_NOSPACE			The available region of 'b' is not
653  *					big enough.
654  */
655 
656 ISC_LANG_ENDDECLS
657 
658 /*
659  * Inline macro versions of the functions.  These should never be called
660  * directly by an application, but will be used by the functions within
661  * buffer.c.  The callers should always use "isc_buffer_*()" names, never
662  * ones beginning with "isc__"
663  */
664 
665 /*! \note
666  * XXXDCL Something more could be done with initializing buffers that
667  * point to const data.  For example, a new function, isc_buffer_initconst,
668  * could be used, and a new boolean flag in the buffer structure could
669  * indicate whether the buffer was initialized with that function.
670  * (isc_bufer_init itself would be reprototyped to *not* have its "base"
671  * parameter be const.)  Then if the boolean were true, the isc_buffer_put*
672  * functions could assert a contractual requirement for a non-const buffer.
673  * One drawback is that the isc_buffer_* functions (macros) that return
674  * pointers would still need to return non-const pointers to avoid compiler
675  * warnings, so it would be up to code that uses them to have to deal
676  * with the possibility that the buffer was initialized as const --
677  * a problem that they *already* have to deal with but have absolutely
678  * no ability to.  With a new isc_buffer_isconst() function returning
679  * true/false, they could at least assert a contractual requirement for
680  * non-const buffers when needed.
681  */
682 #define ISC__BUFFER_INIT(_b, _base, _length) \
683 	do { \
684 		union { \
685 			const void *	konst; \
686 			void *		var; \
687 		} _u; \
688 		_u.konst = (_base); \
689 		(_b)->base = _u.var; \
690 		(_b)->length = (_length); \
691 		(_b)->used = 0; \
692 		(_b)->current = 0; \
693 		(_b)->active = 0; \
694 		(_b)->mctx = NULL; \
695 		ISC_LINK_INIT(_b, link); \
696 		(_b)->magic = ISC_BUFFER_MAGIC; \
697 	} while (0)
698 
699 #define ISC__BUFFER_INITNULL(_b) ISC__BUFFER_INIT(_b, NULL, 0)
700 
701 #define ISC__BUFFER_INVALIDATE(_b) \
702 	do { \
703 		(_b)->magic = 0; \
704 		(_b)->base = NULL; \
705 		(_b)->length = 0; \
706 		(_b)->used = 0; \
707 		(_b)->current = 0; \
708 		(_b)->active = 0; \
709 	} while (0)
710 
711 #define ISC__BUFFER_REGION(_b, _r) \
712 	do { \
713 		(_r)->base = (_b)->base; \
714 		(_r)->length = (_b)->length; \
715 	} while (0)
716 
717 #define ISC__BUFFER_USEDREGION(_b, _r) \
718 	do { \
719 		(_r)->base = (_b)->base; \
720 		(_r)->length = (_b)->used; \
721 	} while (0)
722 
723 #define ISC__BUFFER_AVAILABLEREGION(_b, _r) \
724 	do { \
725 		(_r)->base = isc_buffer_used(_b); \
726 		(_r)->length = isc_buffer_availablelength(_b); \
727 	} while (0)
728 
729 #define ISC__BUFFER_ADD(_b, _n) \
730 	do { \
731 		(_b)->used += (_n); \
732 	} while (0)
733 
734 #define ISC__BUFFER_SUBTRACT(_b, _n) \
735 	do { \
736 		(_b)->used -= (_n); \
737 		if ((_b)->current > (_b)->used) \
738 			(_b)->current = (_b)->used; \
739 		if ((_b)->active > (_b)->used) \
740 			(_b)->active = (_b)->used; \
741 	} while (0)
742 
743 #define ISC__BUFFER_CLEAR(_b) \
744 	do { \
745 		(_b)->used = 0; \
746 		(_b)->current = 0; \
747 		(_b)->active = 0; \
748 	} while (0)
749 
750 #define ISC__BUFFER_CONSUMEDREGION(_b, _r) \
751 	do { \
752 		(_r)->base = (_b)->base; \
753 		(_r)->length = (_b)->current; \
754 	} while (0)
755 
756 #define ISC__BUFFER_REMAININGREGION(_b, _r) \
757 	do { \
758 		(_r)->base = isc_buffer_current(_b); \
759 		(_r)->length = isc_buffer_remaininglength(_b); \
760 	} while (0)
761 
762 #define ISC__BUFFER_ACTIVEREGION(_b, _r) \
763 	do { \
764 		if ((_b)->current < (_b)->active) { \
765 			(_r)->base = isc_buffer_current(_b); \
766 			(_r)->length = isc_buffer_activelength(_b); \
767 		} else { \
768 			(_r)->base = NULL; \
769 			(_r)->length = 0; \
770 		} \
771 	} while (0)
772 
773 #define ISC__BUFFER_SETACTIVE(_b, _n) \
774 	do { \
775 		(_b)->active = (_b)->current + (_n); \
776 	} while (0)
777 
778 #define ISC__BUFFER_FIRST(_b) \
779 	do { \
780 		(_b)->current = 0; \
781 	} while (0)
782 
783 #define ISC__BUFFER_FORWARD(_b, _n) \
784 	do { \
785 		(_b)->current += (_n); \
786 	} while (0)
787 
788 #define ISC__BUFFER_BACK(_b, _n) \
789 	do { \
790 		(_b)->current -= (_n); \
791 	} while (0)
792 
793 #define ISC__BUFFER_PUTMEM(_b, _base, _length) \
794 	do { \
795 		memcpy(isc_buffer_used(_b), (_base), (_length)); \
796 		(_b)->used += (_length); \
797 	} while (0)
798 
799 #define ISC__BUFFER_PUTSTR(_b, _source) \
800 	do { \
801 		unsigned int _length; \
802 		unsigned char *_cp; \
803 		_length = strlen(_source); \
804 		_cp = isc_buffer_used(_b); \
805 		memcpy(_cp, (_source), _length); \
806 		(_b)->used += (_length); \
807 	} while (0)
808 
809 #define ISC__BUFFER_PUTUINT8(_b, _val) \
810 	do { \
811 		unsigned char *_cp; \
812 		isc_uint8_t _val2 = (_val); \
813 		_cp = isc_buffer_used(_b); \
814 		(_b)->used++; \
815 		_cp[0] = _val2 & 0x00ff; \
816 	} while (0)
817 
818 #define ISC__BUFFER_PUTUINT16(_b, _val) \
819 	do { \
820 		unsigned char *_cp; \
821 		isc_uint16_t _val2 = (_val); \
822 		_cp = isc_buffer_used(_b); \
823 		(_b)->used += 2; \
824 		_cp[0] = (unsigned char)((_val2 & 0xff00U) >> 8); \
825 		_cp[1] = (unsigned char)(_val2 & 0x00ffU); \
826 	} while (0)
827 
828 #define ISC__BUFFER_PUTUINT24(_b, _val) \
829 	do { \
830 		unsigned char *_cp; \
831 		isc_uint32_t _val2 = (_val); \
832 		_cp = isc_buffer_used(_b); \
833 		(_b)->used += 3; \
834 		_cp[0] = (unsigned char)((_val2 & 0xff0000U) >> 16); \
835 		_cp[1] = (unsigned char)((_val2 & 0xff00U) >> 8); \
836 		_cp[2] = (unsigned char)(_val2 & 0x00ffU); \
837 	} while (0)
838 
839 #define ISC__BUFFER_PUTUINT32(_b, _val) \
840 	do { \
841 		unsigned char *_cp; \
842 		isc_uint32_t _val2 = (_val); \
843 		_cp = isc_buffer_used(_b); \
844 		(_b)->used += 4; \
845 		_cp[0] = (unsigned char)((_val2 & 0xff000000) >> 24); \
846 		_cp[1] = (unsigned char)((_val2 & 0x00ff0000) >> 16); \
847 		_cp[2] = (unsigned char)((_val2 & 0x0000ff00) >> 8); \
848 		_cp[3] = (unsigned char)((_val2 & 0x000000ff)); \
849 	} while (0)
850 
851 #if defined(ISC_BUFFER_USEINLINE)
852 #define isc_buffer_init			ISC__BUFFER_INIT
853 #define isc_buffer_initnull		ISC__BUFFER_INITNULL
854 #define isc_buffer_invalidate		ISC__BUFFER_INVALIDATE
855 #define isc_buffer_region		ISC__BUFFER_REGION
856 #define isc_buffer_usedregion		ISC__BUFFER_USEDREGION
857 #define isc_buffer_availableregion	ISC__BUFFER_AVAILABLEREGION
858 #define isc_buffer_add			ISC__BUFFER_ADD
859 #define isc_buffer_subtract		ISC__BUFFER_SUBTRACT
860 #define isc_buffer_clear		ISC__BUFFER_CLEAR
861 #define isc_buffer_consumedregion	ISC__BUFFER_CONSUMEDREGION
862 #define isc_buffer_remainingregion	ISC__BUFFER_REMAININGREGION
863 #define isc_buffer_activeregion		ISC__BUFFER_ACTIVEREGION
864 #define isc_buffer_setactive		ISC__BUFFER_SETACTIVE
865 #define isc_buffer_first		ISC__BUFFER_FIRST
866 #define isc_buffer_forward		ISC__BUFFER_FORWARD
867 #define isc_buffer_back			ISC__BUFFER_BACK
868 #define isc_buffer_putmem		ISC__BUFFER_PUTMEM
869 #define isc_buffer_putstr		ISC__BUFFER_PUTSTR
870 #define isc_buffer_putuint8		ISC__BUFFER_PUTUINT8
871 #define isc_buffer_putuint16		ISC__BUFFER_PUTUINT16
872 #define isc_buffer_putuint24		ISC__BUFFER_PUTUINT24
873 #define isc_buffer_putuint32		ISC__BUFFER_PUTUINT32
874 #else
875 #define isc_buffer_init			isc__buffer_init
876 #define isc_buffer_initnull		isc__buffer_initnull
877 #define isc_buffer_invalidate		isc__buffer_invalidate
878 #define isc_buffer_region		isc__buffer_region
879 #define isc_buffer_usedregion		isc__buffer_usedregion
880 #define isc_buffer_availableregion	isc__buffer_availableregion
881 #define isc_buffer_add			isc__buffer_add
882 #define isc_buffer_subtract		isc__buffer_subtract
883 #define isc_buffer_clear		isc__buffer_clear
884 #define isc_buffer_consumedregion	isc__buffer_consumedregion
885 #define isc_buffer_remainingregion	isc__buffer_remainingregion
886 #define isc_buffer_activeregion		isc__buffer_activeregion
887 #define isc_buffer_setactive		isc__buffer_setactive
888 #define isc_buffer_first		isc__buffer_first
889 #define isc_buffer_forward		isc__buffer_forward
890 #define isc_buffer_back			isc__buffer_back
891 #define isc_buffer_putmem		isc__buffer_putmem
892 #define isc_buffer_putstr		isc__buffer_putstr
893 #define isc_buffer_putuint8		isc__buffer_putuint8
894 #define isc_buffer_putuint16		isc__buffer_putuint16
895 #define isc_buffer_putuint24		isc__buffer_putuint24
896 #define isc_buffer_putuint32		isc__buffer_putuint32
897 #endif
898 
899 /*
900  * No inline method for this one (yet).
901  */
902 #define isc_buffer_putuint48		isc__buffer_putuint48
903 
904 #endif /* ISC_BUFFER_H */
905