]> git.ipfire.org Git - thirdparty/bird.git/blob - lib/buffer.h
Merge branch 'int-new-rpki-squashed' (early part) into int-new
[thirdparty/bird.git] / lib / buffer.h
1 /*
2 * BIRD Library -- Generic Buffer Structure
3 *
4 * (c) 2013 Ondrej Zajicek <santiago@crfreenet.org>
5 * (c) 2013 CZ.NIC z.s.p.o.
6 *
7 * Can be freely distributed and used under the terms of the GNU GPL.
8 */
9
10 #ifndef _BIRD_BUFFER_H_
11 #define _BIRD_BUFFER_H_
12
13 #include "lib/resource.h"
14 #include "sysdep/config.h"
15
16 #define BUFFER(type) struct { type *data; uint used, size; }
17
18 #define BUFFER_SIZE(v) ((v).size * sizeof(* (v).data))
19
20 #define BUFFER_INIT(v,pool,isize) \
21 ({ \
22 (v).used = 0; \
23 (v).size = (isize); \
24 (v).data = mb_alloc(pool, BUFFER_SIZE(v)); \
25 })
26
27 #define BUFFER_SET(v,nsize) \
28 ({ \
29 (v).used = (nsize); \
30 if ((v).used > (v).size) \
31 buffer_realloc((void **) &((v).data), &((v).size), (v).used, sizeof(* (v).data)); \
32 })
33
34 #define BUFFER_INC(v,step) \
35 ({ \
36 uint _o = (v).used; \
37 BUFFER_SET(v, (v).used + (step)); \
38 (v).data + _o; \
39 })
40
41 #define BUFFER_DEC(v,step) ({ (v).used -= (step); })
42
43 #define BUFFER_PUSH(v) (*BUFFER_INC(v,1))
44
45 #define BUFFER_POP(v) BUFFER_DEC(v,1)
46
47 #define BUFFER_FLUSH(v) ({ (v).used = 0; })
48
49 #endif /* _BIRD_BUFFER_H_ */